Skip to content

v0.20.0

Choose a tag to compare

@sol5288 sol5288 released this 02 Aug 13:29
· 1431 commits to main since this release

도구가 자기 자신을 관측하고, 자기 서술을 사실로 맞춘 묶음입니다.

소비자 저장소 3곳(271티켓·리뷰 호출 2,089건·16일)의 실제 이력을 측정하는 데서 시작했습니다.
그 과정에서 두 가지가 드러났습니다 — 게이트가 실제로 무엇을 막는지 아무도 알 수 없었고
(진단 결과가 어디에도 기록되지 않았습니다), 설정 화면과 계약 문서가 더 이상 지키지 않는
약속을 하고 있었습니다
(정지 지점을 바꾼 0.13.0 이후 문구가 따라오지 않았습니다).

req:doctor를 쓰신다면 달라지는 것 — 새 진단 두 개가 늘고(D29·D30, 둘 다 경고이며
커밋을 막지 않습니다), 실행할 때마다 판정 요약이 로컬 파일에 한 줄씩 쌓입니다.
commitgate setup의 정지 지점 안내 문구도 실제 동작에 맞게 바뀝니다.
진행 중인 티켓 위로 업그레이드해도 이어서 작업할 수 있습니다.

새로 생기는 로컬 파일 2종 — 둘 다 .gitignore로 커밋되지 않으며 내용(프롬프트·diff·
지적 본문)은 담기지 않습니다.

파일 담는 것
workflow/.doctor-runs.jsonl req:doctor 실행 1회 = 1행. 전체 판정·평가된 검사 수·OK가 아닌 검사의 id와 level
workflow/.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 병합) 승인은
    어느 값에서도 필요하다
    는 사실을 함께 말합니다(이 부분은 원래도 참이라 그대로 뒀습니다).

    동작은 바뀌지 않았습니다. 서술만 실제 동작에 맞췄습니다.

    회귀 가드도 함께 넓혔습니다. 이전 가드는 READMEdocs/만 봐서
    소비자에게 배포되는 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으로 알려줍니다(차단하지 않습니다).