교훈 — 깨졌던 변경 모음
요약. 자율 개선 에이전트의 변경이 깨뜨린 것들 23건 — 머지 뒤 CI 실패, 되돌림, 릴리즈 워크플로 반복 실패, 롤백. 다음 회차 프롬프트에 프로젝트별로 주입된다.
- 11rejected-by-human
- 6review-rejected
- 2release-workflow-failed
- 2demoted
- 1rolled-back
- 1verify-false-positive
| 날짜 | 프로젝트 | 종류 | 내용 |
|---|---|---|---|
| 2026-09-10 | AgentHub | review-rejected | 가이드 문서의 API 메서드를 소스에서 확인하지 않아 GET/POST 가 어긋났고, 옛 통합 가이드를 그대로 둬 정본이 둘이 됐으며, 캡처 스크립트가 전역 설정을 백업 없이 덮어썼다. 링크 |
| 2026-09-10 | igame | release-workflow-failed | 릴리즈 워크플로가 2회 실패(Audit locked Node dependencies). 릴리즈 관련 검증은 머지 전에 로컬에서 재현할 것. |
| 2026-09-10 | appstore | rejected-by-human | 사람이 PR 을 반려함. 같은 접근은 피할 것. 링크 |
| 2026-09-10 | Vendra | rejected-by-human | 사람이 PR 을 반려함. 같은 접근은 피할 것. 링크 |
| 2026-09-09 | AgentHub | review-rejected | DLP 스캔 범위를 넓힐 때 두 가지를 같이 볼 것. (1) SendDecision 은 record 를 값으로 받으므로 호출자의 record.<field> 는 스크럽 이전 문자열이다 — 그 값을 recordContentScan 의 details 로 넘기면 audit_events.details 에 원문이 저장되고 AuditTrailEach 가 다시 내보낸다. 감사에는 식별자(AgentID)만 넘길 것. (2) store/provenance.go 가 Category = Agent 로 복사하므로 두 필드를 각각 스캔하면 같은 값이 두 번 보고된다. 클래스별로 병합하거나 사본으로 취급할 것 — 다만 Category 를 스캔 목록에서 빼면 원문이 스크럽되지 않고 나간다. 링크 |
| 2026-09-09 | ptium | review-rejected | figures.Of 가 공백에서 숫자를 끊는 동작은 라인 차트 계열('- 전환 전 | 120, 118, 121, 119')이 의존하는 계약이다. 구분자 처리를 넓히면 값이 붙어 1.20118121119e+11 이 되고 inspect.go 의 감사 출력까지 새어 나간다. docs/deck/compile 세 곳의 숫자 파서를 통합하려 하지 말 것 — 각자 다른 계약을 지키고 있다. 분류기 쪽을 좁히는 방향으로만 고칠 것. 링크 |
| 2026-09-09 | ptium | review-rejected | docs 의 amountOf/allNumeric(분류기)과 deck 의 bareNumber(렌더러)는 서로 다른 숫자 파서다. 분류기만 넓히면 시트가 ::table 대신 ::columns 로 넘어가면서 렌더러가 같은 값을 다르게 읽어 차트가 망가진다(고정 공백 '1\u00a0200' → 분류기 1200, 렌더러 1). 파서 한쪽만 고치지 말고 두 경로가 같은 값을 같은 숫자로 읽는지 end-to-end 로 검증할 것. 또한 pptx/blocks.go 는 math.Abs 로 높이를 잡으므로 음수 파싱을 추가해도 렌더링은 안 바뀐다 — 커밋 메시지에 실제로 일어나지 않는 사용자 가시 효과를 쓰지 말 것. 링크 |
| 2026-09-09 | moyro | verify-false-positive | webapp/tsconfig.json 에 "types" 가 없어 node_modules/@types/* 가 전부 스코프에 들어온다. @types/node 가 끼면 window.setInterval 이 Node 의 Timeout 반환으로 해석돼 useDraft.test.tsx:196 이 TS2345 로 깨진다. main 은 깨끗하다(clean npm ci 후 typecheck exit 0). webapp 을 건드리지 않은 Go 전용 회차도 이 오류로 폐기되므로, 이 오류가 보이면 자기 변경 탓으로 여기지 말 것. |
| 2026-09-09 | aiportal-py | review-rejected | 백그라운드 task 종료 판정을 task 상태('cancelled')로 잡으면 CancelledError 를 삼키고 정상 반환하는 루프에서 cancelled()==False·exception()==None 이라 'stopped' 로 보여 정상 종료마다 오탐 ERROR 가 난다. shutdown 여부는 _shutting_down 플래그로 판정할 것. 또한 cancel() 이 곧 cancelled()==True 라고 가정하는 FakeTask 대역은 이 결함을 구조적으로 못 보므로 진짜 asyncio.Task 로 검증할 것. /health 같은 폴링 경로에서는 상태 전이 시점에만 로깅할 것. 링크 |
| 2026-09-09 | AgentHub | review-rejected | 정책 규칙의 행위자(actor)를 agent.OwnerID 로 잡았다 — 이 플랫폼의 정책 지점은 모두 작업 소유자(task.OwnerID)를 쓴다. 자격증명 조회(SCMTokenFor)만 agent.OwnerID 가 맞으므로 두 값을 분리할 것. 또한 ContentGuard 를 손으로 만들어 주입하는 테스트는 배선 결함을 못 본다 — 프로덕션 배선을 통과하는 테스트로 증명할 것. 소스 문자열 검사는 증거가 아니다. 링크 |
| 2026-09-08 | git-ctx | rejected-by-human | 사람이 PR 을 반려함. 같은 접근은 피할 것. 링크 |
| 2026-09-08 | appstore | rejected-by-human | 사람이 PR 을 반려함. 같은 접근은 피할 것. 링크 |
| 2026-09-08 | ReSSO | rejected-by-human | 사람이 PR 을 반려함. 같은 접근은 피할 것. 링크 |
| 2026-09-08 | AgentHub | rejected-by-human | 사람이 PR 을 반려함. 같은 접근은 피할 것. 링크 |
| 2026-09-08 | aiportal-front | demoted | 자율화 단계 release → low-risk: 회귀(reverted) 2026-09-08T00:00:35+09:00 |
| 2026-09-07 | releasedock | rejected-by-human | 사람이 PR 을 반려함. 같은 접근은 피할 것. 링크 |
| 2026-09-07 | muni | rejected-by-human | 사람이 PR 을 반려함. 같은 접근은 피할 것. 링크 |
| 2026-09-07 | jikim | rejected-by-human | 사람이 PR 을 반려함. 같은 접근은 피할 것. 링크 |
| 2026-09-07 | git-ctx | rejected-by-human | 사람이 PR 을 반려함. 같은 접근은 피할 것. 링크 |
| 2026-09-07 | Clustara | rejected-by-human | 사람이 PR 을 반려함. 같은 접근은 피할 것. 링크 |
| 2026-09-06 | relio | rolled-back | 머지 60601bd 이 릴리즈를 반복해서 깨뜨려 되돌림 PR 을 열었다. 같은 접근은 피할 것. |
| 2026-09-06 | relio | demoted | 자율화 단계 release → low-risk: 롤백 PR |
| 2026-09-06 | relio | release-workflow-failed | 릴리즈 워크플로가 2회 실패(Verify upgrade from previous release). 릴리즈 관련 검증은 머지 전에 로컬에서 재현할 것. |