v0.20.0
도구가 자기 자신을 관측하고, 자기 서술을 사실로 맞춘 묶음입니다.
소비자 저장소 3곳(271티켓·리뷰 호출 2,089건·16일)의 실제 이력을 측정하는 데서 시작했습니다.
그 과정에서 두 가지가 드러났습니다 — 게이트가 실제로 무엇을 막는지 아무도 알 수 없었고
(진단 결과가 어디에도 기록되지 않았습니다), 설정 화면과 계약 문서가 더 이상 지키지 않는
약속을 하고 있었습니다(정지 지점을 바꾼 0.13.0 이후 문구가 따라오지 않았습니다).
req:doctor를 쓰신다면 달라지는 것 — 새 진단 두 개가 늘고(D29·D30, 둘 다 경고이며
커밋을 막지 않습니다), 실행할 때마다 판정 요약이 로컬 파일에 한 줄씩 쌓입니다.
commitgate setup의 정지 지점 안내 문구도 실제 동작에 맞게 바뀝니다.
진행 중인 티켓 위로 업그레이드해도 이어서 작업할 수 있습니다.
새로 생기는 로컬 파일 2종 — 둘 다
.gitignore로 커밋되지 않으며 내용(프롬프트·diff·
지적 본문)은 담기지 않습니다.
파일 담는 것 workflow/.doctor-runs.jsonlreq:doctor실행 1회 = 1행. 전체 판정·평가된 검사 수·OK가 아닌 검사의 id와 levelworkflow/.review-calls.jsonl(기존)행에 델타 모드 여부·전체 재리뷰 요청 여부가 추가됩니다 기존 설치본에
.gitignore규칙이 아직 없다면 D22가 경고로 알려줍니다(차단하지 않습니다).
-
(내부) 검사 하나의 존재 이유를 사실대로 적고 테스트로 고정했습니다 (REQ-2026-115).
동작은 바뀌지 않습니다 — 주석과 테스트만 손봤습니다.D15(리뷰 응답이 "고쳐라"인데 지적이 비어 있으면 커밋을 막는 검사)의 주석이 스스로를
"스키마와 중복"이라고 적고 있었는데, 사실이 아니었습니다. 스키마는 그 경우를 막지 않아서
커밋 직전에는 D15만 잡습니다. 잘못된 자기 서술은 나중에 이 검사를 정리 대상으로 오해하게
만들 수 있어 고쳤고, 그 주장을 테스트로 고정했습니다(스키마 통과 ↔ D15 차단 대비).함께:
req:doctor관측 로그 테스트가 종료 코드까지 대조하도록 했습니다. -
병합하지 않은 티켓의 리뷰 증거를 진단이 알려줍니다 (REQ-2026-114, 새 검사 D30).
승인 증거는 그 티켓의 feature 브랜치에 커밋됩니다. 브랜치를 병합하지 않으면 증거는
메인라인에 남지 않습니다. 파괴되는 건 아니지만(브랜치에 그대로 있습니다) 보이지 않고,
브랜치를 지우면 함께 사라집니다.이제
req:doctor가 리뷰를 받았는데 증거가 trunk에 없는 티켓을 리뷰 횟수와 함께 알려줍니다.
진행 중이면 정상이므로 차단하지 않습니다(WARN). 리뷰 8회를 받고 남아 있는 티켓과 오늘
1회 받은 티켓은 횟수로 구별하시면 됩니다.왜 넣었나: 소비자 저장소 3곳(리뷰 호출 2,089건·16일)을 조사해 보니 3.1%(65건) 의 응답이
메인라인에 없었고, 그중 66.2%가 반려 기록이었습니다(남은 것은 47.9%). 아카이브만 보고
회고하면 실패가 체계적으로 적게 잡힙니다. 보장 문서(한/영)에도 이 경계를 명시했습니다. -
리뷰 호출 로그가 델타 리뷰 정보를 함께 남깁니다 (REQ-2026-113).
workflow/.review-calls.jsonl의 각 행에 두 값이 추가됩니다 — 그 호출이 델타 모드였는지
(delta_mode), 리뷰어가 전체 재리뷰를 요청했는지(full_review_requested).왜: 델타 리뷰의 전체 재리뷰 요청이 실측 0회인데, 그게 "필요한 상황이 없었다"인지
"쓰이지 않는다"인지 판단하려면 분모(델타 호출이 몇 번이었나) 가 필요합니다. 그런데 로그에
델타 여부가 없어policy_version해시를 역산해야 했습니다. 이제 로그가 직접 답합니다.동작은 바뀌지 않았습니다. 담기는 것은 boolean 두 개이고, 프롬프트·diff·지적 본문은 여전히
담기지 않습니다. 기존 행은 이 필드가 없어도 그대로 유효합니다.설계 문서(
docs/ssot-design/gaps-and-decisions.md)의 낡은 서술 두 건도 함께 고쳤습니다 —
델타 리뷰를 아직 없는 기능처럼 적어 둔 항목과, 관측 로그가 하나도 없다고 적어 둔 항목입니다. -
설정 화면과 계약 문서가 더 이상 지키지 않는 약속을 하지 않습니다 (REQ-2026-112).
commitgate setup에서 정지 지점(stopGate)을 고를 때 뜨던 고지가 사실과 달랐습니다.
0.13.0(REQ-2026-071)이 위험도에 따른 별도 백스톱을 걷어내고 정지 지점을 이 설정 하나로 모았는데,
화면 문구·AGENTS.md템플릿·설계 문서·코드 주석이 옛 서술 그대로 남아 있었습니다.
사용자가 보호받는다고 믿는 자리에서 실제로는 보호받지 않았습니다.이제 고지가 이 값이 무엇을 정하는지를 말합니다 —
phase(매 phase 커밋 전) ·
req(REQ를 끝내는 커밋 전) ·merge(커밋에서는 멈추지 않음). 그리고 통합(main 병합) 승인은
어느 값에서도 필요하다는 사실을 함께 말합니다(이 부분은 원래도 참이라 그대로 뒀습니다).동작은 바뀌지 않았습니다. 서술만 실제 동작에 맞췄습니다.
회귀 가드도 함께 넓혔습니다. 이전 가드는
README와docs/만 봐서
소비자에게 배포되는AGENTS.md템플릿·스킬·페르소나가 검사 밖이었고, 같은 주장을 다른 문장으로
쓰면 그대로 통과했습니다. 이제 배포되는 지침 파일과 해당 코드 표면까지 검사하고, 표현 변형도 등재합니다. -
이미 설치된 저장소의 낡은
AGENTS.md를 진단이 알려줍니다 (REQ-2026-112, 새 검사 D29).AGENTS.md는 여러분 소유의 파일이라init도 없을 때만 만들고sync도 손대지 않습니다.
그래서 위 정정이 이미 설치된 저장소에는 자동으로 닿지 않습니다. 대신req:doctor가
계약 파일(AGENTS.md·AGENTS.commitgate.md)에 더 이상 사실이 아닌 서술이 있으면
그 문장과 이유를 WARN으로 알려줍니다.파일을 고치지 않습니다. 커밋을 막지도 않습니다(WARN이지 FAIL이 아닙니다) —
서술 문제로 여러분의 작업이 멈추면 안 되기 때문입니다. 안내를 보고 해당 문장을 지우거나
현재 동작으로 갱신하시면 됩니다. -
req:doctor가 자기 판정을 기록합니다 (REQ-2026-111, 새 파일workflow/.doctor-runs.jsonl).실행할 때마다 그 회차의 판정 요약 한 줄이 append됩니다 — 티켓 id·시각·전체 판정(PASS/FAIL)·
평가된 검사 개수·OK가 아닌 검사의 id와 level. 검사 메시지 본문은 담지 않습니다(경로·파일명이
섞이지 않게).왜 넣었나: 등록부에 검사가 22개 있는데(차단 10 · 진단 12), 그중 실제로 무엇이 무엇을 막았는지
기록이 전혀 없었습니다. 발화를 실측할 수 있던 게이트는 리뷰·응답구조·리뷰예산 셋뿐이었고,
그 셋의 공통점은 각자 로그를 남긴다는 것이었습니다. 기록이 없으면 검사를 더하는 것도 빼는 것도
근거 없이 하게 됩니다.동작에는 영향이 없습니다. 출력·FAIL 개수·exit code가 그대로이고, 로그 기록이 실패해도
(권한 없음·디스크 가득 참 등) 판정은 동일하게 진행됩니다 — 관측은 게이트가 아닙니다.커밋되지 않습니다.
workflow/.review-calls.jsonl과 같은 자리·같은 성격의 로컬 관측 파일이며
.gitignore규칙이 루트와 배포 템플릿 양쪽에 함께 들어갑니다. 기존 설치본에 템플릿이 아직
없다면 D22가 WARN으로 알려줍니다(차단하지 않습니다).