# task-2711 완료 보고 — ANU_CODEX_REVIEW_LOOP_DECIDER

- **task_id**: task-2711
- **team**: dev1-team (헤르메스 · Hermes)
- **chair_authorization_id**: CHAIR-AUTH-TASK-2711-ANU-CODEX-REVIEW-LOOP-DECIDER-260530
- **검증 레벨**: normal · 게이트 Lv.2 (G1/G2/G3)
- **작성일**: 2026-05-30
- **완료 상태**: ⚠️ **IMPLEMENTATION_COMPLETE · COMPLETION_BLOCKED_BY_INFRA_DEFECT2** (self-contamination 0 · §9 escalation 참조)

---

## SCQA 요약

**S (Situation)**: task-2710 v1~v8 lifecycle 동안 Codex independent review 7 round가 진행되었고, 매 round마다 회장이 직접 verbatim instruction을 복붙해 ANU에 R1~R5 매핑을 지시했다.

**C (Complication)**: 이로 인해 회장 인지 부하가 누적되고, minor refinement 사이클(risk 0)까지 회장 결정 영역으로 잘못 escalate되어 ANU bounded loop 자동화가 미흡했다.

**Q (Question)**: Codex review verdict + remaining_recommendations + risk surface를 입력받아 회장 복붙 없이 자동 revision loop를 돌릴 수 있는 영역과, 회장 escalate가 필요한 영역을 결정론적으로 분류하는 runner를 구현할 수 있는가?

**A (Answer)**: 5 enum decision runner(`codex_review_loop_decider.py`)를 5-step risk gating precedence로 구현. 14개 test scenario 전부 PASS(18 passed, 0.11s), input/output JSON schema validation 8/8 fixture OK, L1 CLI 실동작 확인 완료. AUTO_REVISION_CONTINUE 영역만 silent loop로 자동 처리하고 나머지 4 영역은 회장에 escalate. forbidden 12개 파일 sha256 0 변경, PR/push/merge 0.

---

## 1. 생성 파일 목록 (§9 affected_files 15개)

| # | 파일 | 비고 |
|---|---|---|
| 1 | `scripts/anu/codex_review_loop_decider.py` | 신규 runner (표준 라이브러리만) |
| 2 | `tests/test_codex_review_loop_decider_2711.py` | 14 scenario + 메타 2 = 18 test |
| 3 | `schemas/codex_review_input_schema.json` | draft-07 input schema |
| 4 | `schemas/codex_review_decision_output_schema.json` | draft-07 output schema |
| 5 | `tests/fixtures/codex_review_2711/task-2710_round1.json` | §7.1 |
| 6 | `tests/fixtures/codex_review_2711/task-2710_round6.json` | §7.2 |
| 7 | `tests/fixtures/codex_review_2711/task-2710_round7_chair_minor_false.json` | §7.3 |
| 8 | `tests/fixtures/codex_review_2711/task-2710_round7_chair_minor_true.json` | §7.3-B |
| 9 | `tests/fixtures/codex_review_2711/task-2710_v8_lock_ready.json` | §7.4 |
| 10 | `tests/fixtures/codex_review_2711/critical_escalation_evidence_reclassify.json` | §7.5 |
| 11 | `tests/fixtures/codex_review_2711/loop_boundary_same_blocker_3.json` | §7.6 |
| 12 | `tests/fixtures/codex_review_2711/loop_boundary_fail_2_same_axis.json` | §7.7 |
| 13 | `memory/reports/task-2711.md` | 본 보고서 |
| 14 | `memory/events/task-2711.formalization-commit-260530.json` | formalization 마커 |
| 15 | `memory/events/task-2711.callback-envelope.json` | ANU envelope (≤3900 bytes) |

★ T-8~T-14 신규 시나리오는 별도 fixture 파일이 아닌 **테스트 내 inline dict**로 구성하여 expected_files 15개 contract를 정확히 유지함. `allowed_existing_file_edits=[]` (기존 파일 edit 0).

## 2. 결정 로직 — 5-step risk gating precedence (§5.2 정합)

```
Step 1: CRITICAL_ESCALATION (§4.3 trigger 1,4,5,6)
Step 2: CHAIR_DECISION_REQUIRED (trigger 2,3 + §5.4 loop boundary)
Step 3: LOCK_READY (verdict PASS/PWR + remaining==0 + locked_status==False)
Step 4: PILOT_READY_BUT_NEEDS_CHAIR (pilot READY/READY_WITH_REC + chair_minor=False)
Step 5: AUTO_REVISION_CONTINUE (default · silent loop · chair_facing_summary="")
```

- **§5.4 loop boundary**: max round > 7 / 동일 blocker 3회 반복(N·N-1·N-2 핵심토큰 ≥2/3 매치) / FAIL 2회 같은 axis(fail_axes 교집합) / stagnation → CHAIR_DECISION_REQUIRED
- **trigger 6 false-positive 방지**: evidence-reference 토큰(marker/evidence/recorded_at/task-2706~2710) + mutation 동사(reclassify/overwrite/덮어/재분류) **동시** 조합일 때만 발동. "정정"·"변경" 단독은 미발동(§7.2 `G8 reference 정정`이 CRITICAL로 오분류되지 않음을 검증).
- **회장 verbatim 강화 §5.3**: PILOT_READINESS READY_WITH_RECOMMENDATIONS 도달 시 기본값 PILOT_READY_BUT_NEEDS_CHAIR. `chair_minor_doc_cleanup_authorized=True` 명시 시에만 AUTO_REVISION_CONTINUE.

## 3. 테스트 결과 (§8 14 scenario + 메타 2 = 18 test)

`python3 -m pytest tests/test_codex_review_loop_decider_2711.py` → **18 passed, 0 failed (0.11s)**

| test | fixture/inline | expected | 실제 |
|---|---|---|---|
| T-1 | §7.1 | AUTO_REVISION_CONTINUE | ✅ |
| T-2 | §7.2 | AUTO_REVISION_CONTINUE | ✅ |
| T-3a | §7.3 | PILOT_READY_BUT_NEEDS_CHAIR | ✅ |
| T-3b | §7.3-B | AUTO_REVISION_CONTINUE | ✅ |
| T-4 | §7.4 | LOCK_READY | ✅ |
| T-5 | §7.5 | CRITICAL_ESCALATION (trigger 6) | ✅ |
| T-6 | inline (locked_status=True) | PILOT_READY_BUT_NEEDS_CHAIR | ✅ |
| T-7a | §7.6 | CHAIR_DECISION_REQUIRED | ✅ |
| T-7b | §7.7 | CHAIR_DECISION_REQUIRED | ✅ |
| T-8 | inline (Critical 7) | CRITICAL_ESCALATION (trigger 1) | ✅ |
| T-9 | inline (forbidden path) | CHAIR_DECISION_REQUIRED (trigger 3) | ✅ |
| T-10 | inline (dispatch.py/bot_settings) | CRITICAL_ESCALATION (trigger 4) | ✅ |
| T-11 | inline (권한 확대) | CHAIR_DECISION_REQUIRED (trigger 2) | ✅ |
| T-12 | inline (PR/push/merge) | CRITICAL_ESCALATION (trigger 4) | ✅ |
| T-13 | inline (immutable scope) | CRITICAL_ESCALATION (trigger 5) | ✅ |
| T-14 | inline (round_number=8) | CHAIR_DECISION_REQUIRED (max round) | ✅ |

추가: input schema + output schema meta-valid(Draft7Validator) + 8 fixture 모두 input/output schema validate OK.

## 4. L1 스모크테스트 결과 (필수 기록)

- **서버 재시작**: 해당없음 (system_hook runner · 서버 컴포넌트 아님)
- **API 응답 확인**: 해당없음 (HTTP API 아님). 대신 **runner CLI 실제 프로세스 실행**으로 대체:
  - `python3 scripts/anu/codex_review_loop_decider.py tests/fixtures/codex_review_2711/critical_escalation_evidence_reclassify.json` → `{"decision":"CRITICAL_ESCALATION","risk_triggers_matched":[6],...}` 정상 출력 (exit 0)
  - `... task-2710_round1.json` → `decision=AUTO_REVISION_CONTINUE`, `chair_facing_summary==""` (빈 문자열 strict 확인)
- **스크린샷**: 해당없음 (프론트엔드 아님 · CLI/순수 로직)
- **L1 통과**: subprocess/CLI 실동작 1건 이상 실제 실행 + 통과 ✅ (pytest PASS와 별개로 실 프로세스 동작 확인)

## 5. 모델 사용 기록

| 팀원 | 역할 | 모델 | 정당성 |
|---|---|---|---|
| 불칸 | 백엔드 (runner + schema + fixture) | sonnet | 일반 코딩/로직 구현 |
| 아르고스 | 테스터 (14 scenario) | sonnet | 테스트 로직 작성 |
| 헤르메스 | 팀장 (설계/분배/검토/통합/보고) | opus | 판단·검토·SCQA 보고 |

haiku 미사용. 팀장 직접 코딩 0 (Edit 1건은 테스트 lint 정리로 위임 결과의 미세 보정 — unused importlib 제거).

## 6. 발견 이슈 및 해결

- **이슈 1**: Pyright `reportMissingImports` — `codex_review_loop_decider`가 비패키지 스크립트(`scripts/anu/`)라 동적 `sys.path.insert` import를 정적 분석이 해석 못 함. **해결**: 런타임 무관(pytest 18 passed가 실동작 증명). 비패키지 스크립트 테스트의 표준 패턴이며 기능 영향 0. 자체 import 메타테스트는 `sys.modules[__name__]`로 교체해 self-import 경고 + unused importlib 제거.
- **이슈 2**: LOCK_READY vs PILOT vs AUTO 경계 모호성. **해결**: 14 fixture 역산으로 결정론적 규칙 확정 — LOCK_READY는 `remaining==[] AND locked_status==False`, locked 후 pilot READY는 PILOT_READY_BUT_NEEDS_CHAIR(T-6).

## 7. 게이트 / 4-doctrine compliance

- **G1 설계 게이트**: 15 파일 전부 신규(겹침 0) · `allowed_existing_file_edits=[]` → 다른 팀 충돌 0 ✅
- **G2 구현 게이트**: 팀 테스터(아르고스) 기능 테스트 18 passed + 팀장 독립 재실행 + schema validation ✅
- **G3 머지 게이트**: 본 task는 PR/push/merge/GitHub write **0** (§10.4 회장 verbatim 강제) → 로컬 commit만 수행. PR 생성하지 않음.
- **forbidden_files sha256 동일**: 12개 존재 파일 0 변경 (§9 검증 섹션 참조, baseline `/tmp/task-2711-forbidden-baseline.txt`)
- **forbidden_actions 9 위반 0**: task-2710 변경 0 / task-2706~2709+1 evidence 변경 0 / bot_settings·dispatch.py·settings.json·finish-task.sh 변경 0 / PR·push·merge 0 / pilot dispatch 0 / 모델 설정 변경 0
- **ANU callback**: collector_role=ANU, owner_key=c119085addb0f8b7 (self-key `c38...` 미사용). 실제 cron 등록은 finish-task.sh의 launcher 게이트(ANU key)가 처리.

## 8. 머지 판단

- **머지 필요**: No (PR/push/merge 금지 영역 · 로컬 commit only)
- **브랜치**: 현재 작업 브랜치(`task/task-2703-v36-harness-dev1`)에 로컬 commit. worktree 미사용(system_hook · project_id 없음).
- **머지 의견**: verifier task-2711+1 별도 결정 영역(dev2 Odin 또는 독립 verifier). 본 task는 구현 + 로컬 테스트까지만 수행(§12 회장 verbatim "dev1은 구현과 로컬 테스트까지만").

## 9. ⚠️ Escalation — COMPLETION_BLOCKED_BY_INFRA_DEFECT2 (shared branch contamination)

**상태**: 구현·테스트·스키마·L1·forbidden 검증 전부 완료. 단 `finish-task.sh`가 scope-guard(line 457 `git diff --name-only main..HEAD`)에서 FAIL → `.escalate` 생성 후 `exit 1`(line 473)로 ANU callback launcher gate 도달 전 종료.

**근본 원인**: 작업 브랜치 `task/task-2703-v36-harness-dev1`는 task-2703 v36-harness 작업이 이미 커밋된 **재사용(공유) 브랜치**. `main..HEAD` diff 79파일 중 **66파일이 task-2703 누적 산출물**, 13파일만 task-2711. scope-guard가 commit-scoped가 아닌 branch-accumulated diff를 검사하여 task-2703 파일 61건을 task-2711 scope 외 위반으로 분류.

**self-contamination 0 증거**:
- 위반 61건 중 task-2711/codex_review 파일 = **0건**
- 내 13개 파일 전부 `allowed_resources.paths` 인정 → 위반 미발생
- forbidden_paths 위반 5건은 전부 task-2703가 만진 시스템 파일(finish-task.sh / dispatch/__init__.py / session-watchdog.sh / task-scope-guard.sh) — task-2711 미변경 (forbidden 12개 sha256 0 변경 재확인)

**dev1 조치 범위 준수**: §12 회장 verbatim "dev1은 구현과 로컬 테스트까지만 수행" + forbidden_actions(PR/push/merge 0)에 따라, 공유 task-2703 브랜치에 대한 branch 수술/stash/강제 머지/수동 .done 생성 **미시도**(활성 task-2703 작업 손상 위험 회피).

**선례**: task-2709+1 동일 infra defect2(shared branch contamination 65건·self 0) → `ACCEPT_WITH_KNOWN_CAVEATS` 처리.

**ANU callback**: finish-task.sh가 scope-guard에서 차단되어 callback launcher gate(ANU key) 미도달 → NOT_REGISTERED. self-key 수동 등록은 SELF_COLLECTOR_FORBIDDEN이라 미시도. 본 보고서 + `.escalate` + `task-2711.escalation-detail-260530.json` + 회장 직접 보고가 surfacing 경로(SENDFILE_ONLY 우회 아님 — 등록 자체가 infra defect2로 차단된 사실을 충실히 보고).

**요청 회장 결정**: (1) infra defect2 해소(task-2711 전용 clean branch 재dispatch 또는 scope-guard를 commit-scoped diff로 보정) 후 정상 완료, 또는 (2) task-2709+1 선례대로 ACCEPT_WITH_KNOWN_CAVEATS 수용.

## 세션 통계
- 총 도구 호출: 0회

