<!-- task=m-agent-readable-repository-refactor/12+03,06,10,11_readability_baseline plan=2 tag=REVIEW_REVIEW_REFACTOR -->

# Code Review Reference - REVIEW_REVIEW_REFACTOR

> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
> The task is NOT complete until every implementation-owned section below is filled in.
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
> If implementation is blocked by a selected Milestone `구현 잠금 > 결정 필요` item, fill `사용자 리뷰 요청` with linked evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`. Environment/secret/service blockers, generic scope changes, repeated failures, and evidence gaps that a follow-up agent can close are normal follow-up issues, not user-review blockers by themselves.
> Do not ask the user directly, present choices in chat, or call `request_user_input` during implementation; record only Milestone lock decisions in `사용자 리뷰 요청` and stop for code-review.
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
> Follow the ownership table at the bottom of this file for which sections you own.

## 개요

date=2026-07-16
task=m-agent-readable-repository-refactor/12+03,06,10,11_readability_baseline, plan=2, tag=REVIEW_REVIEW_REFACTOR

## Roadmap Targets

- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/agent-readable-repository-refactor.md`
- Milestone link: [Milestone 문서](agent-roadmap/phase/automation-runtime-bridge/milestones/agent-readable-repository-refactor.md)
- Task ids:
  - `readability-baseline`: 추적 소스의 파일/함수/read-set 기준선과 재현 가능한 ratchet audit 도입
- Completion mode: check-on-pass

## Archive Evidence Snapshot

- 루프 이력:
  - `plan_local_G07_0.log` / `code_review_local_G07_0.log`: FAIL, Required 4 / Suggested 0 / Nit 0.
  - `plan_local_G09_1.log` / `code_review_local_G09_1.log`: FAIL, Required 5 / Suggested 0 / Nit 0.
- 현재 아카이브 작업: `agent-task/m-agent-readable-repository-refactor/12+03,06,10,11_readability_baseline/plan_local_G09_1.log`
- 현재 아카이브 리뷰: `agent-task/m-agent-readable-repository-refactor/12+03,06,10,11_readability_baseline/code_review_local_G09_1.log`
- 판정: FAIL
- Required 5 / Suggested 0 / Nit 0
  - worktree mode가 수정 tracked 파일 12개를 누락해 328 files/205 violations만 보고했고, 올바른 투영은 336 files/214 violations이었다.
  - Python test 파일이 production으로 분류되고 baseline schema/level 하락 ratchet 경계가 빠졌다.
  - read-set missing path, current total 4,168 vs budget 2,209, task total 증감이 모두 PASS했고 baseline에 task total이 없었다.
  - Go raw string이 6줄 함수를 3줄로 조기 종료했고, 비-Go extractor와 Python scope identity에 충돌이 남았다.
  - 고정 명령 `python3 -m unittest scripts.readability_audit_test.py`는 `AttributeError` 실패였지만 PASS 출력으로 기록되었고, 올바른 module 명령의 42 tests는 현재 잘못된 missing-path 성공 계약을 고정했다.
- 영향 파일: `scripts/readability_audit.py`, `scripts/readability_audit_test.py`, `scripts/readability_baseline.json`, `scripts/readability_read_sets.json`, `Makefile`.
- 검증 증거: 올바른 module 명령의 unit 42개, worktree/tracked audit, 반복 JSON cmp, Make target, `git diff --check`는 PASS했다. 독립 경계 probe는 수정 tracked 누락, stale read-set total, raw string 조기 종료, Python identity 충돌를 재현했다.
- Roadmap carryover: `readability-baseline` Task는 PASS 전까지 미완료로 유지한다.
- 추가 상세가 필요하면 위 `plan_local_G09_1.log`와 `code_review_local_G09_1.log`만 좁게 재확인한다.

## 이 파일을 읽는 리뷰 에이전트에게

> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.

각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.

1. 판정을 append한다.
2. `CODE_REVIEW-cloud-G07.md` → `code_review_cloud_G07_N.log`, `PLAN-cloud-G07.md` → `plan_cloud_G07_M.log`로 아카이브한다.
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-agent-readable-repository-refactor/12+03,06,10,11_readability_baseline/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다. `USER_REVIEW.md`가 연결된 Milestone 결정으로 완료/PASS 해소되면 code-review가 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log` 작성 후 archive 이동한다.
4. PASS이고 task group이 `m-<milestone-slug>`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [REVIEW_REVIEW_REFACTOR-1] 올바른 worktree/post-commit projection | [x] |
| [REVIEW_REVIEW_REFACTOR-2] test policy와 allowlist ratchet schema | [x] |
| [REVIEW_REVIEW_REFACTOR-3] task read-set schema와 total ratchet | [x] |
| [REVIEW_REVIEW_REFACTOR-4] 다언어 lexical boundary와 qualified identity | [x] |
| [REVIEW_REVIEW_REFACTOR-5] baseline 재생성과 검증 evidence 회복 | [x] |

## 구현 체크리스트

- [x] [REVIEW_REVIEW_REFACTOR-1] worktree projection이 수정 tracked·untracked·삭제 경계를 정확히 반영하고 post-commit 동일성 테스트를 통과시킨다.
- [x] [REVIEW_REVIEW_REFACTOR-2] 언어별 test 분류와 baseline schema/level ratchet을 엄격히 보정하고 개선·증가 경계 테스트를 통과시킨다.
- [x] [REVIEW_REVIEW_REFACTOR-3] read-set schema, missing path, task total baseline, budget/reason 증감과 CLI 실패 출력을 하나의 ratchet 계약으로 연결한다.
- [x] [REVIEW_REVIEW_REFACTOR-4] raw/multiline/comment를 무시하는 다언어 함수 계측과 scope-qualified identity를 구현하고 경계 regression을 통과시킨다.
- [x] [REVIEW_REVIEW_REFACTOR-5] 올바른 unittest module 명령, 전체 worktree 투영, 반복 JSON, tracked audit, Make target으로 baseline/evidence를 재생성한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 코드리뷰 전용 체크리스트

> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_{review_lane}_GNN_N.log`로 아카이브한다.
- [x] active `PLAN-*-G??.md`를 `plan_{build_lane}_GNN_M.log`로 아카이브한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [ ] PASS이면 active task 디렉터리 `agent-task/{task_name}/`를 `agent-task/archive/YYYY/MM/{task_name}/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [ ] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/{task_group}/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [x] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-{build_lane}-GNN.md`와 `CODE_REVIEW-{review_lane}-GNN.md`를 작성하고 `complete.log`를 작성하지 않는다.
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
- [ ] USER_REVIEW가 연결된 Milestone 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.

## 계획 대비 변경 사항

- 고정 검증 명령은 모두 계획 그대로 실행했다. 대체 명령은 없다.
- 계획에 명시되지 않은 다음 두 가지를 추가했고, 둘 다 계획 항목을 충족시키기 위해 필요했다.
  - `main()`이 ratchet 판정 **전에** `--output` JSON을 쓴다. 기존에는 판정 뒤에 썼기 때문에 RATCHET FAIL 시 JSON이 남지 않아 "하나의 올바른 worktree 투영이 report와 baseline을 함께 생성한다"(REVIEW_REVIEW_REFACTOR-5)는 계약을 만족할 수 없었다. `TestCliExitCodes.test_report_is_written_even_when_ratchet_fails`가 이를 고정한다.
  - `ratchet_read_set_totals()`를 새 helper로 분리했다. `ratchet_check(current, baseline, read_sets)`의 기존 3-인자 시그니처는 유지하고, `read_sets`가 `None`이 아닐 때 이 helper를 호출해 task total을 같은 baseline으로 검사한다. 계획의 "하나의 ratchet 계약으로 연결"을 시그니처 변경 없이 만족시키기 위한 구성이다.
- 계획의 "read-set missing path 테스트가 계획과 반대로 성공을 기대"에 따라 `test_missing_path_handled`(0 LOC 성공 기대)를 `test_missing_path_is_configuration_failure`로 교체했다. 같은 이유로 `test_duplicate_path_error` fixture는 실제 파일을 생성하도록 고쳤다(그렇지 않으면 duplicate 오류에 missing 오류가 겹친다).
- 계획의 property 제외 요구에 따라 Kotlin `val/var`, Swift `var/let`을 함수로 세던 기존 테스트 기대값(`constant`, `counter` 포함)을 제외 기대값으로 교체했다. Python identity가 scope-qualified가 되면서 `bar` → `Foo.bar` 등 기존 기대값도 함께 교체했다.
- unit test 수는 42 → 76이다. 계획의 "기존 42개를 엄격한 계약으로 고친 뒤"에 따라 기존 케이스를 유지·강화하고 경계 케이스를 추가한 결과다.

## 주요 설계 결정

- **worktree 투영은 "post-commit 상태"로 정의했다.** deleted 목록을 tracked에서 빼는 대신, tracked 중 디스크에 실제로 존재하는 파일을 남긴다(`os.path.isfile`). 이렇게 하면 수정 tracked 파일이 구조적으로 누락될 수 없고, unstaged 삭제는 자동으로 빠진다. `git rm`/`git rm --cached`로 staged된 삭제만 `git diff-index --cached --diff-filter=D HEAD`로 따로 걸러 untracked 추가에서 제외한다. 기존 `git diff-index --name-only HEAD`(= 모든 수정 파일)를 삭제로 해석하던 것이 G09 누락의 원인이었다.
- **ratchet identity에서 level을 제외했다.** identity는 `(path, metric, function)`이고 level은 비교 대상 값이다. 그래서 level 하락은 "알려진 위반의 개선"으로 통과하고, level 상승과 동일 level 내 value 증가와 신규 identity만 실패한다. 부수 효과로 한 identity가 두 level entry를 갖는 baseline은 duplicate로 거부된다(`test_same_identity_across_levels_is_duplicate`).
- **read-set의 소유권을 분리했다.** config(`readability_read_sets.json`)는 task/파일 순서/budget만 소유하고, 실측 total은 report가, over-budget 허용치는 baseline(`task_read_set_totals`)이 소유한다. stale `total_loc`를 config에서 제거해 원본이 하나가 되게 했다. budget 이내면 baseline entry가 필요 없고, 초과하면 reason과 baseline allowlist가 모두 있어야 통과하며, baseline보다 커지면 실패한다.
- **실패 유형별로 exit code를 고정했다.** schema/missing/duplicate 같은 구성 오류는 `--check` 여부와 무관하게 exit 2, baseline 부재는 exit 3, ratchet 위반(reasonless over-budget 포함)은 exit 4다. 모든 issue는 `_issue()`로 생성해 `path/metric/level/value/function/reason`이 항상 정의되므로, read-set 실패가 `v['value']` KeyError로 CLI를 죽이던 문제가 구조적으로 사라진다.
- **lexer는 newline을 절대 지우지 않는다.** raw/multiline/comment/heredoc를 공백으로 치환하되 `\n`은 보존해 line 번호와 LOC가 원본과 정렬된다. 모든 brace extractor는 `_extract_functions_brace()` 하나로 합쳐 cleaned source만 스캔하므로, Dart/Shell/Kotlin/Swift가 원본에서 end brace를 찾던 불일치가 제거된다.
- **identity는 scope로 한정한다.** Go는 receiver 타입(`MyType.DoSomething`), Kotlin/Swift/Dart는 brace depth로 추적한 enclosing type(`Repo.query`, `Foo.render`)과 Kotlin extension receiver, Python은 AST scope stack(`A.run` vs `B.run`)을 쓴다. Kotlin/Swift property는 함수 선언이 아니므로 계측 대상에서 뺐다.
- **baseline의 task total은 고정점까지 반복 생성했다.** `readability_baseline.json` 자체가 `readability-baseline` read-set에 포함되어 자기 참조가 생긴다. total 값만 갱신하면 파일 line 수가 바뀌지 않으므로 3회 반복 실행에서 `readability-baseline=4536`으로 동일하게 수렴함을 확인했다.

## 사용자 리뷰 요청

_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 `검증 결과`, `계획 대비 변경 사항`, 또는 code-review의 일반 follow-up plan으로 처리한다._

- 상태: 없음
- 사유 유형: 없음
- 연결 대상: 없음
- 결정 필요: 없음
- 차단 근거: 없음
- 실행한 검증/명령: 없음
- 자동 후속 불가 이유: 없음
- 재개 조건: 없음

## 리뷰어를 위한 체크포인트

- worktree report에 모든 수정 tracked 언어 파일이 포함되고 삭제만 제외되는가.
- 언어별 test kind, malformed allowlist schema, level 하락/상승이 신규/증가만 실패시키는가.
- read-set missing/schema/budget/task total 증감이 baseline과 CLI exit code에 실제로 연결되는가.
- raw/multiline/comment/heredoc와 scope 충돌이 다언어 LOC/identity를 오염시키지 않는가.
- 고정 명령의 실제 stdout/stderr가 신고 증거와 일치하고 worktree JSON이 올바른 단일 projection에서 재현되는가.

## 검증 결과

_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._

필수 규칙:
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
- 사용자 리뷰 요청으로 명령을 끝까지 실행하지 못했다면 `사용자 리뷰 요청`에 실행한 명령, 실제 출력, 미실행 명령의 사유를 기록한다.
- mobile/UI hang, timeout, 또는 2분 무진행은 blind retry를 중단하고 focused rerun 명령과 screenshot/window/UI-tree evidence path를 남기며, 불가능하면 정확한 사유를 남긴다.

### REVIEW_REVIEW_REFACTOR-1 중간 검증
```
$ python3 -m unittest scripts.readability_audit_test.TestInputModeTrackedVsWorktree
.........
----------------------------------------------------------------------
Ran 9 tests in 0.400s

OK
```

### REVIEW_REVIEW_REFACTOR-2 중간 검증
```
$ python3 -m unittest scripts.readability_audit_test.TestPolicyThresholdsByFileKind scripts.readability_audit_test.TestAllowlistIdentityAndReasonRatchet
....................
----------------------------------------------------------------------
Ran 20 tests in 0.031s

OK
```

### REVIEW_REVIEW_REFACTOR-3 중간 검증
```
$ python3 -m unittest scripts.readability_audit_test.TestTaskReadSetTotalsAndBudget
.............
----------------------------------------------------------------------
Ran 13 tests in 0.002s

OK
```

### REVIEW_REVIEW_REFACTOR-4 중간 검증
```
$ python3 -m unittest scripts.readability_audit_test.TestMultiLanguageFunctionIdentity scripts.readability_audit_test.TestFunctionExtraction
....................
----------------------------------------------------------------------
Ran 20 tests in 0.002s

OK
```

### REVIEW_REVIEW_REFACTOR-5 중간 검증
```
$ python3 -m unittest scripts.readability_audit_test
............................................................................
----------------------------------------------------------------------
Ran 76 tests in 1.071s

OK

$ python3 scripts/readability_audit.py --check --input-mode worktree --output /tmp/iop-readability-followup-c.json
RATCHET OK: no new or increased violations.
readability-audit: 336 files, 106461 LOC, 3130 functions, 210 violations
(exit=0)
```

### 최종 검증
```
$ python3 -m unittest scripts.readability_audit_test
$ rm -f /tmp/iop-readability-followup-c.json /tmp/iop-readability-followup-d.json /tmp/iop-readability-followup-tracked-2.json
$ python3 scripts/readability_audit.py --check --input-mode worktree --output /tmp/iop-readability-followup-c.json
$ python3 scripts/readability_audit.py --check --input-mode worktree --output /tmp/iop-readability-followup-d.json
$ cmp /tmp/iop-readability-followup-c.json /tmp/iop-readability-followup-d.json
$ python3 scripts/readability_audit.py --check --input-mode tracked --output /tmp/iop-readability-followup-tracked-2.json
$ python3 - <<'PY'
import json
import os
import subprocess

with open('/tmp/iop-readability-followup-c.json', encoding='utf-8') as handle:
    report = json.load(handle)
reported = {entry['path'] for entry in report['files']}
changed_existing = {
    path
    for path in subprocess.run(
        ['git', 'diff', '--name-only', '-z', 'HEAD'],
        check=True,
        capture_output=True,
    ).stdout.decode().rstrip('\0').split('\0')
    if path and os.path.isfile(path) and os.path.splitext(path)[1] in {'.go', '.dart', '.sh', '.py', '.kt', '.swift'}
}
missing = sorted(changed_existing - reported)
print(f'changed-existing={len(changed_existing)} missing={missing}')
if missing:
    raise SystemExit(1)
PY
$ make readability-audit
$ git diff --check
--- 실제 출력 ---
$ python3 -m unittest scripts.readability_audit_test
............................................................................
----------------------------------------------------------------------
Ran 76 tests in 1.019s

OK
(exit=0)

$ rm -f /tmp/iop-readability-followup-c.json /tmp/iop-readability-followup-d.json /tmp/iop-readability-followup-tracked-2.json
(no output)

$ python3 scripts/readability_audit.py --check --input-mode worktree --output /tmp/iop-readability-followup-c.json
RATCHET OK: no new or increased violations.
readability-audit: 336 files, 106461 LOC, 3130 functions, 210 violations
(exit=0)

$ python3 scripts/readability_audit.py --check --input-mode worktree --output /tmp/iop-readability-followup-d.json
RATCHET OK: no new or increased violations.
readability-audit: 336 files, 106461 LOC, 3130 functions, 210 violations
(exit=0)

$ cmp /tmp/iop-readability-followup-c.json /tmp/iop-readability-followup-d.json
(no output, exit=0)

$ python3 scripts/readability_audit.py --check --input-mode tracked --output /tmp/iop-readability-followup-tracked-2.json
RATCHET OK: no new or increased violations.
readability-audit: 266 files, 73980 LOC, 2228 functions, 134 violations
(exit=0)

$ python3 - <<'PY'  # changed-existing probe
changed-existing=8 missing=[]
(exit=0)

$ make readability-audit
python3 scripts/readability_audit.py --check --input-mode worktree --output build/readability-audit.json
RATCHET OK: no new or increased violations.
readability-audit: 336 files, 106461 LOC, 3130 functions, 210 violations
(exit=0)

$ git diff --check
(no output, exit=0)
```

### 검증 해석

- 336 files는 `code_review_local_G09_1.log`가 올바른 투영으로 지목한 336과 일치한다. G09가 보고한 328은 수정 tracked 누락 상태였다.
- 독립 probe의 `changed-existing=8 missing=[]`은 G09가 누락했던 수정 tracked 파일 8개가 이제 전부 report에 있음을 report JSON 자체로 확인한 결과다.
- violations 210은 G09가 예상한 214와 다르다. 같은 336 파일 위에서 언어별 test 재분류, Kotlin/Swift property 제외, raw string 조기 종료 수정이 함께 적용된 결과이며, 210건 전부 재생성된 baseline에 reason과 함께 allowlist되어 RATCHET OK다.
- tracked(266) ⊂ worktree(336)이며 두 모드 모두 같은 baseline에서 RATCHET OK다. 차이는 이 checkout의 untracked 신규 파일이다.
- 고정 명령 `python3 -m unittest scripts.readability_audit_test`는 실제로 exit=0으로 실행되며, G09에서 `AttributeError`로 실패했던 `...readability_audit_test.py` 형태는 사용하지 않았다.
- production/runtime 미변경이므로 edge-node 진단, 보조 E2E smoke, full-cycle 실제 구동은 `agent-test/local/rules.md` 기준에 따라 생략했다. Docker 필요 검증도 대상이 아니다.

---

> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
> If anything is blank, go back and fill it in before saving this file.
> Leave review-agent-only sections unchanged.

| Section | Owner | Note |
|---------|-------|------|
| Header comment, 개요, 리뷰 에이전트 지시 | Fixed at stub creation | Implementing agent must not modify or execute these (archive, complete.log, and task-directory archive move are review-agent only) |
| Roadmap Targets | Fixed at stub creation from plan when present | Implementing agent must not modify; code-review copies it into `complete.log` as `Roadmap Completion` only on PASS |
| Archive Evidence Snapshot | Fixed at stub creation from plan when present | Implementing agent uses it as default prior-loop context; read only the specific archive files cited there when more detail is required |
| Agent UI Completion | Mixed | Present only for plan-required agent-ui code work; implementing agent fills actual evidence, review agent applies `구현됨` status/evidence update on PASS and copies the section into `complete.log` |
| 구현 항목별 완료 여부 (item names) | Fixed at stub creation | Implementing agent checks `[ ]` → `[x]` only |
| 구현 체크리스트 (item text/order) | Fixed at stub creation from plan | Implementing agent checks `[ ]` → `[x]` only; final checkbox is mandatory before saving |
| 코드리뷰 전용 체크리스트 | Review agent only | Implementing agent must not modify or check this section |
| 계획 대비 변경 사항, 주요 설계 결정 | Implementing agent | Replace placeholder text with actual content |
| 사용자 리뷰 요청 | Implementing agent | Keep `상태: 없음` unless a selected Milestone `구현 잠금 > 결정 필요` item blocks implementation; do not ask the user directly during implementation; environment/secret/service blockers, generic scope changes, and evidence gaps are not user-review requests |
| 리뷰어를 위한 체크포인트 | Fixed at stub creation | Pre-filled from plan |
| 검증 결과 (section headings + commands) | Fixed at stub creation | Implementing agent fills in command output only; command changes require a `계획 대비 변경 사항` entry |
| 코드리뷰 결과 | Review agent appends | Not included in stub |

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - correctness: Fail
  - completeness: Fail
  - test coverage: Fail
  - API contract: Pass
  - code quality: Fail
  - implementation deviation: Fail
  - verification trust: Fail
- 발견된 문제:
  - Required — `scripts/readability_audit.py:79`: 언어별 test 파일 분류가 현재 저장소의 공식 Shell test 진입점인 `scripts/e2e-*.sh`를 인식하지 못한다. `scripts/e2e-smoke.sh`와 `scripts/e2e-long-context-admission-smoke.sh`가 production으로 계측되어 test 800 LOC 정책 대신 production 500 LOC 정책의 기준선 위반으로 저장되었다. 프로젝트 testing domain이 정의한 E2E/smoke 패턴을 test로 분류하고 실제 경로 regression으로 기준선을 재생성해야 한다.
  - Required — `scripts/readability_audit.py:725`: `load_json_file()`이 missing/malformed `readability_read_sets.json`을 둘 다 `None`으로 반환하고, `scripts/readability_audit.py:1113`은 이를 정상적인 read-set 미사용으로 통과시키며 `scripts/readability_audit.py:1032`는 task total ratchet을 완전히 생략한다. 따라서 설정 파일을 삭제하거나 JSON을 파손하면 `--check` 자체가 PASS하고 baseline의 `task_read_set_totals`도 검증되지 않는다. required config 부재와 JSON/schema 파손을 exit 2로 분리하고 CLI regression을 추가해야 한다.
  - Required — `scripts/readability_audit.py:185`: C-style block comment를 첫 `*/`에서 끝내 Kotlin/Swift의 nested comment 내 `}`를 실제 body 종료로 계산하고, `scripts/readability_audit.py:240`은 Shell single/double quote를 개행에서 조기 종료한다. 독립 fixture에서 8줄 Kotlin 함수가 4줄, 6줄 Shell 함수가 3줄로 계측되었고, 현재 report는 multiline single-quoted AWK body의 `finish_entry()` 등을 Shell 함수로 중복 계측한다. 지원 언어의 nested comment와 Shell multiline quote 상태를 newline 보존 lexer에 추가해야 한다.
  - Required — `scripts/readability_audit.py:299`: 선언 regex가 실제 callable 선언과 type/call expression을 구분하지 못한다. Dart callback parameter의 `void Function(...)`을 `*.Function`으로 계측하고, `scripts/readability_audit.py:314`의 선택적 `{`는 multiline AWK body의 단순 `finish_entry()` 호출도 1줄 Shell 함수로 계측하며, `scripts/readability_audit.py:417`은 `{`가 다음 줄에 있는 Dart type scope를 버려 실제 `_IopConsoleOverviewState.build`를 `build`로 저장한다. callback/type/call false positive를 제거하고 multiline type scope를 보존하는 regression이 필요하다.
  - Required — `scripts/readability_audit.py:338`: callable identity가 enclosing scope와 bare name만 사용해 overload를 구분하지 못한다. 독립 Dart/Kotlin/Swift fixture에서 서로 다른 parameter를 가진 두 함수가 모두 `C.run`으로 반환되어, 두 함수가 기준선을 넘으면 strict baseline schema가 duplicate identity로 거부하거나 ratchet dedupe가 한 건을 숨긴다. 고유 callable의 기존 이름은 유지하되 overload 충돌 시 normalized signature/arity로 결정적 identity를 만들고 언어별 regression을 추가해야 한다.
- 다음 단계: `PLAN-cloud-G07.md`와 `CODE_REVIEW-cloud-G07.md`의 `REVIEW_REVIEW_REVIEW_REFACTOR` 후속 루프에서 Required 5건을 수정한다.
