# task-2708 P2-A Draft Review — 8 Axis × 4 Enum (260529)

★ **READ-ONLY DRAFT REVIEW** — 회장 verbatim "task-2708 초안 검토 · 코드 수정 금지 · finish-task.sh 수정 금지 · dispatch 금지" 정합. ANU 자체 분류 결정 0 · evidence-only.

---

## 0. Context

- **target draft**: `memory/tasks/task-2708.md` (★ sha `4ec809a668b2acc9305a3d5010f920a40c929d14e62d2431389e890cebea22f9` · 18,855 bytes · 413 lines · 19 sections)
- **chair_verbatim_review_8_axes**: §1 (finish-task scope) / §2 (R6~R14) / §3 (Layer 1/2) / §4 (exit × kind matrix) / §5 (OPTION A) / §6 (regression 5) / §7 (safety) / §8 (forbidden scope)
- **classification_4_enum**: A READY_FOR_IMPLEMENTATION / B NEEDS_DRAFT_REVISION / C HOLD_FOR_CHAIR / D REJECT
- **chair_verbatim_fixed_state_8_items**: task-2703/2704/P1-A/P1-B/C1 accepted · P1-C design refined / P2-A not started / task-2708 draft exists

---

## 1. Axis 1 — finish-task.sh 수정 필요 범위

### 1.1 confirmed_fact

- §9.1: P2-A 가 finish-task.sh 수정을 요구 = **YES (명시)**
- §9.2: 회장 별도 승인 필수 1:1 박제 ("finish-task.sh 수정이 필요하면 구현 발사 전 별도 회장 승인 필요" verbatim)
- §9.3: MINIMAL scope 명시 — pre-registration layer 1 block + Layer 2 fallback trigger 1 block (★ 추정 수십 라인)
- §9.3: 위치 후보 = 진입 직후 L20 영역 (★ task-2705+1 lineage helper 패턴 정합)
- §9.3: forbidden_changes 명시 — 기존 fail-fast logic / scope-guard / QC 검증 logic 변경 0

### 1.2 gap

- **G1-1**: 정확한 수정 라인 범위 미명시 (★ "진입 직후 L20 영역" 단일 후보만 박제 · L1106 Layer 1 vs L1532 Layer 2 의 재배치 결정 0)
- **G1-2**: before/after 코드 snippet 미박제 (★ 봇이 독자 판단 시 wording drift 위험)
- **G1-3**: 변경 라인 카운트 추정만 명시 ("수십 라인") · 회장 acceptance criteria 와 매칭 부재
- **G1-4**: Layer 1 (L1106-1160) 의 재배치 여부 / 동일 위치 유지 여부 결정 미박제 (★ §4.1 "위치 (P2-A 이후): 회장 결정 영역" 으로 미해소)

### 1.3 risk

- 봇 독자 판단 시 정상 exit path 변경 위험 (★ 28+ fail-fast logic 중 일부 의도치 않게 영향 가능)
- L20 영역에 pre-registration layer 삽입 시 기존 변수 scope (TASK_ID / EVENTS_DIR 등) 가 초기화 전이면 NameError cascade

---

## 2. Axis 2 — R6~R14 반영 여부

### 2.1 confirmed_fact (★ §3 R6~R14 결정표 박제)

- R6 = MODIFY (★ cancellation/BLOCKED/ESCALATED 3 sub-case 분리)
- R7 = ACCEPT (★ python helper sys.exit() 8건 제외)
- R8 = ACCEPT (★ Layer 1/2 분리 · §4 1:1)
- R9 = MODIFY (★ exit × kind 매핑 — §5 default 박제)
- R10 = ACCEPT (★ self-fail recursion 금지 · §4.3 #3)
- R11 = ACCEPT (★ "결정성 1회 통과" 정의 · §7 박제)
- R12 = MODIFY (★ OPTION A · §6 박제)
- R13 = ACCEPT (★ in_scope / out_of_scope · §10/§15 박제)
- R14 = ACCEPT (★ callback / escalation marker 동시 발행 · §8.3 박제)

### 2.2 gap

- **G2-1**: R6 MODIFY 의 3 sub-case 분리 미실현 — §5 default 에서 `cancellation / BLOCKED / ESCALATED → skip` 한 category 로 묶음 (★ MODIFY = "3 sub-case 분리" verbatim 정합 0)
- **G2-2**: R9 MODIFY 의 conditional cell 매핑 미실현 — §5 default 9 cell 만 박제 · 9 exit × 7 kind = 63 cell 중 default 외 cell 매핑 미박제
- **G2-3**: R12 MODIFY OPTION A 의 "N exception cell" 의 N 결정 0 — §6.2 에 `formalization_commit_only × qc_fail` 1건만 박제 · 추가 exception 후보 (★ read_only × qc_fail / system_hook × scope_guard_fail / callback_only × callback_path 등) 미박제

### 2.3 risk

- 봇이 R6/R9/R12 MODIFY 의 미반영 영역을 독자 판단 시 doctrine drift cascade
- §5 default 만으로 63 cell coverage 가정 시 task_type aware exception 누락 cascade

---

## 3. Axis 3 — Layer 1 / Layer 2 구조

### 3.1 confirmed_fact

- §4.1: Layer 1 validator 역할 = bot self-register 검증 + 4-source 정합
- §4.2: Layer 2 registrar 역할 = finish-task 직접 helper launch + callback-launch.json 발행 + safety-net role
- §4.3: 회장 4 강제 1:1 박제 — (1) Layer 1 failure 영구 차단 금지 (2) registrar failure marker + safe-fail (3) self-fail recursion 금지 (4) Layer 1 first + Layer 2 fallback

### 3.2 gap

- **G3-1**: validator failure → Layer 2 fallback 호출 메커니즘 구체화 0 (★ 호출 시점 / argument 전달 방식 / Layer 1 self-fail 감지 hook 미spec)
- **G3-2**: recursion lock 메커니즘 미spec — §11.5 RS-5 "recursion guard: Layer 1 의 Layer 2 fallback 호출 시 Layer 1 재진입 차단" 1줄만 명시 · 실제 구현 방식 (★ 환경변수 / lock file / counter / re-entrant guard) 미박제
- **G3-3**: Layer 1 위치 재배치 결정 미박제 (★ §4.1 "P2-A 이후 위치: 회장 결정 영역")

### 3.3 risk

- recursion lock 구체화 부재 → Layer 1 ↔ Layer 2 무한 cycle 위험 (★ RS-5 fail criteria 정합 위험)
- validator failure 시 Layer 2 자동 트리거 vs 명시적 SKIP 결정 미박제 → 봇 독자 판단 시 정합 0

---

## 4. Axis 4 — exit × callback_kind matrix

### 4.1 confirmed_fact (★ §5 박제)

- 9 exit category 모두 박제 (★ success_exit / qc_fail / scope_guard_fail / taskctl_fail / dirty_workspace_fail / escalation_path / callback_path / fail_fast_generic / cancellation/BLOCKED/ESCALATED)
- 7 callback_kind 매핑 (★ normal / fail_fast / escalate / hold_for_chair / verifier_result / fallback / skip)
- skip 조건: cancellation/BLOCKED/ESCALATED → skip 명시

### 4.2 gap

- **G4-1**: cancellation/BLOCKED/ESCALATED 한 category 로 묶음 (★ R6 MODIFY 의 3 sub-case 분리 미반영)
- **G4-2**: conditional cell 매핑 0 (★ 9 × 7 = 63 cell 중 default 9 만 박제)
- **G4-3**: callback_path → hold_for_chair default + conditional fallback 의 조건 미박제 (★ §5 표 footnote 부재)

### 4.3 risk

- R6/R9 미반영 cascade 위험 (★ Axis 2 G2-1/G2-2 와 동일 root)

---

## 5. Axis 5 — task_type OPTION A

### 5.1 confirmed_fact (★ §6 박제)

- §6.1: 7 default policy 박제 (★ code / system_hook / local_runtime / formalization_commit_only / read_only / callback_only / closeout_marker_only)
- §6.2: 고정 exception cell — `formalization_commit_only × qc_fail` = YES/escalate/chair_required=YES/marker=YES (★ 회장 verbatim 1:1)
- 63 cell 전체 하드코딩 회피 (★ default + 1 exception only 명시)

### 5.2 gap

- **G5-1**: N exception cell 의 N = 1 (★ 회장 verbatim "N exception" 의 N 결정 0)
- **G5-2**: 다른 task_type × exit category 의 exception 후보 미박제 — `read_only × qc_fail` / `system_hook × scope_guard_fail` / `callback_only × callback_path` 등 잠재 exception 미spec
- **G5-3**: §6.1 "별도 cell 0" 의 6 task_type (code/system_hook/local_runtime/read_only/callback_only/closeout_marker_only) 가 모두 §5 default 그대로 적용 = 의도된 것인지 확인 미박제

### 5.3 risk

- read_only task (★ Maat / verifier) 의 qc_fail 시 escalate default 적용 → 의도된 결과 / 의도 외 결과 모호 (★ task-2707+1 자체 evidence 정합 확인 필요)
- callback_only task 의 callback_path → hold_for_chair default 적용 시 recursion 위험과 정합 0

---

## 6. Axis 6 — regression scenarios

### 6.1 confirmed_fact (★ §11 박제)

- RS-1: task-2707 tdd_check fail-fast → callback 등록 보장 (★ setup + expected + marker + fail criteria)
- RS-2: scope_guard fail-fast → callback 등록 보장 + escalate kind + 양 marker 동시 발행
- RS-3: success_exit normal callback 유지 + 기존 task-2626/2661/2705+4/2706/2706+1 baseline 회귀 0
- RS-4: duplicate callback idempotent skip + idempotency key 정합
- RS-5: Layer 1 validator self-fail recursion 방지 + recursion guard 명시

### 6.2 gap

- **G6-1**: regression 측정 방식 미명시 (★ pytest fixture / shell script / manual / playwright 중 어느 것 인지 0)
- **G6-2**: RS-1 의 setup "task-2707 와 동일 patterns" 의 fixture 데이터 위치 미박제 (★ envelope 800 bytes 재현 방식 0)
- **G6-3**: RS-3 의 baseline 5건 회귀 0 측정 방식 미박제 (★ task-2626/2661/2705+4/2706/2706+1 baseline 정상 populate 패턴 자동 검증 0)
- **G6-4**: RS-4 의 idempotency key 매치 자동 검증 fixture 미박제

### 6.3 risk

- 봇 독자 판단 시 regression 측정 방식 drift (★ ad-hoc 측정 시 자체 fixture 양산 위험)
- regression PASS 자가 attestation 시 evidence level L1 fallback 위험

---

## 7. Axis 7 — safety

### 7.1 confirmed_fact

- §7.1: idempotency key primary 패턴 `task_id::callback_kind` (★ task-2626 baseline 정합)
- §7.1: extended `task_id::callback_kind::executor_attempt_n` (★ re-registration 영역)
- §7.2: "결정성 1회 통과" 정의 = (a) 시도 횟수 1회 (b) 시간 한계 30s (c) idempotency key 패턴
- §8.1: success marker schema 박제 (★ task-2626 baseline 정합)
- §8.2: failure marker schema 박제 (★ R5 정합)
- §8.3: 동시 발행 spec 박제 (★ R14 정합)
- §14: safe-fail strategy 박제 (★ unexpected error / forbidden_files sha 변화 / regression FAIL / minimal scope 벗어남 각 .escalate 박제)

### 7.2 gap

- **G7-1**: duplicate callback enforcement 메커니즘 구체화 0 (★ §7.1 primary key 만 명시 · 실제 enforcement 가 helper launch 전 idempotency check 인지 / cron registration 단계인지 / marker check 인지 0)
- **G7-2**: idempotency key 패턴 vs cron_id 패턴 동일성 / 분리 명시 미박제 (★ task-2626 cron_id=task-2626::normal 정합 OK · 단 extended pattern 의 cron_id 의미 미박제)
- **G7-3**: callback marker 와 escalation marker 동시 발행 시 marker file 명 collision 회피 spec 미박제 (★ §8.3 "양 marker 동시 발행 · 우선순위 callback marker 우선" 만 명시 · 파일명 namespace 0)

### 7.3 risk

- duplicate enforcement 메커니즘 미spec → race condition 발생 시 duplicate cron 등록 위험
- marker file 명 collision 시 evidence 덮어쓰기 위험

---

## 8. Axis 8 — forbidden scope

### 8.1 confirmed_fact

- §10.3 forbidden_files 5건 (★ dispatch.py / dispatch/__init__.py / session-watchdog.sh / settings.json / dispatch_marker_writer.py + 기타 production code)
- §10.4 forbidden_actions 8건 (★ 코드 수정 / finish-task.sh 수정 / helper 수정 / dispatch / cron 수동 / .done / PR/push/merge / GitHub write)
- §10.5 Capability Scope YAML — `forbidden_paths` 10건 박제
- §15 out-of-scope — P2-B/C/D / tdd_check 자체 수정 / dispatch.py 수정 / Goal-to-Done/PHASE_AUTO/Core-Work 이원화

### 8.2 gap

- **G8-1**: §15 "tdd_check 자체 수정 (qc_verify.py / FORMALIZATION_COMMIT_ONLY 인식 추가) — 회장 별도 인가 영역" = P2-D 의존성과 정합성 정합 0 (★ P2-A 만으로 task-2707 routing fail 회복 가능한지 명확 0)
- **G8-2**: forbidden_files 5건 외 다른 production code 의 식별 기준 미박제 (★ §10.3 "기타 production code" 광범위 표현)

### 8.3 risk

- P2-A 만으로 task-2707 정확한 routing fail 회복 가능성 미확정 (★ tdd_check verifier 자체는 P2-A 영역 밖)
- "기타 production code" 광범위 표현 → 봇 독자 판단 시 보호 영역 모호

---

## 9. Strengths Summary (★ 16 회장 verbatim 항목 1:1 박제)

- 19 섹션 / 413 라인 / 18,855 bytes
- 회장 verbatim 6 영역 + 16 mandatory items 1:1 박제
- R6~R14 결정표 (★ 회장 verbatim 9 결정)
- Layer 1 / Layer 2 분리 spec (★ 회장 verbatim 4 강제)
- exit × callback_kind default 9 (★ 회장 verbatim)
- task_type 7 + exception cell (★ 회장 verbatim formalization × qc_fail 고정)
- idempotency key 3축 정의 (★ R11 정합)
- callback marker schema 2건 (★ R5/R14 정합)
- 5 regression scenarios (★ 회장 verbatim 1:1)
- forbidden scope 8 (★ 회장 verbatim 8 1:1)
- ANU doctrine compliance + lineage preservation 박제
- finish-task.sh 수정 필요 = YES 명시 + 회장 별도 승인 필수 명시

---

## 10. Gaps Summary — 8 GAP 박제

| GAP ID | axis | 항목 | 영향 |
|---|---|---|---|
| G1 | 1 | finish-task.sh 정확한 수정 라인 / before-after snippet / 라인 카운트 / Layer 1 재배치 결정 | HIGH (★ 봇 독자 판단 시 정상 logic 변경 위험) |
| G2 | 2 | R6 MODIFY 3 sub-case 분리 미반영 + R9 conditional cell 매핑 0 + R12 N exception N 결정 0 | HIGH (★ doctrine drift cascade) |
| G3 | 3 | validator failure → Layer 2 fallback 호출 메커니즘 + recursion lock 구체화 | HIGH (★ RS-5 fail 위험) |
| G4 | 4 | cancellation/BLOCKED/ESCALATED 묶임 + conditional cell 0 + callback_path conditional 조건 0 | MEDIUM (★ G2 cascade) |
| G5 | 5 | N exception N = 1 만 / 추가 exception 후보 미박제 / 6 task_type 의도 확인 | MEDIUM (★ task_type aware drift) |
| G6 | 6 | regression 측정 방식 미명시 (pytest/shell/manual) + fixture 위치 0 + baseline 회귀 측정 0 | MEDIUM (★ L1 self-attestation fallback 위험) |
| G7 | 7 | duplicate enforcement 메커니즘 + cron_id vs idempotency key 동일성 + marker file 명 collision | MEDIUM (★ race condition / 덮어쓰기 위험) |
| G8 | 8 | P2-A vs tdd_check 의존성 + "기타 production code" 광범위 | LOW (★ scope 명확화 가능) |

---

## 11. Risk Summary

### 11.1 high-risk areas (★ 3건)

- **R-HIGH-1**: 봇 독자 판단 시 finish-task.sh 정상 logic 변경 위험 (G1 cascade)
- **R-HIGH-2**: doctrine drift cascade — R6/R9/R12 MODIFY 미반영 영역 implicit 결정 (G2 cascade)
- **R-HIGH-3**: Layer 1 ↔ Layer 2 recursion lock 미spec 으로 RS-5 fail 위험 (G3 cascade)

### 11.2 medium-risk areas (★ 4건)

- doctrine drift cascade (G4)
- task_type aware drift (G5)
- regression 측정 self-attestation 위험 (G6)
- race condition / marker collision (G7)

### 11.3 low-risk areas (★ 1건)

- forbidden scope 범위 모호 (G8)

---

## 12. Hypothesis Separation (★ evidence 아님)

- **H1**: G1 의 정확한 라인 결정은 finish-task.sh source code 직접 read-only audit 후에만 가능 (★ ANU read-only 별도 round 필요)
- **H2**: G5 의 추가 exception cell 후보 결정은 task-2707+1 verifier 결과 (12/12 PASS) lineage 와 정합성 검토 필요
- **H3**: G3 의 recursion lock 메커니즘은 P2-A 단독 vs P2-C (idempotency marker enforcement) 의존 분리 영역

---

## 13. Verdict 4 enum 판정

| verdict | 선택 | rationale |
|---|---|---|
| A READY_FOR_IMPLEMENTATION | REJECTED | ★ 8 GAP 중 3 HIGH risk + 4 MEDIUM risk 미해소 · 봇 독자 판단 시 doctrine drift cascade 위험 |
| **B NEEDS_DRAFT_REVISION** | **SELECTED** | ★ 16 회장 verbatim 1:1 박제는 강점 · 8 GAP 모두 spec 수준 보강으로 READY 전환 가능 · HOLD/REJECT 까지 갈 필요 없음 |
| C HOLD_FOR_CHAIR | REJECTED | ★ 결정 모호 영역 아님 · 8 GAP 모두 evidence 기반 보강 path 명확 |
| D REJECT | REJECTED | ★ 핵심 FAIL 0 · doctrine 위반 0 · 16 회장 verbatim 정합 |

**verdict = B NEEDS_DRAFT_REVISION**

★ ANU 자체 분류 결정 0 — 회장 verbatim 4 enum 중 evidence-only 선택.

---

## 14. Required Revisions (★ 8 GAP 별 보강 영역)

### 14.1 G1 보강 — finish-task.sh 정확한 수정안

- §9.3 에 정확한 라인 범위 명시 (★ before/after snippet 박제)
- 변경 라인 카운트 hard limit (예: ≤ 80 라인)
- Layer 1 (L1106-1160) 재배치 vs 동일 위치 유지 결정 명시

### 14.2 G2 보강 — R6/R9/R12 MODIFY 실현

- R6: §5 default 에서 cancellation / BLOCKED / ESCALATED 3 sub-case 분리 spec
- R9: §5 default 외 conditional cell 매핑 박제 (★ task_type aware cell)
- R12: §6 N exception cell 의 N 결정 + 추가 exception 후보 박제

### 14.3 G3 보강 — Layer 1 ↔ Layer 2 구체화

- §4 validator failure 시 Layer 2 fallback 호출 메커니즘 (★ 환경변수 / lock file / counter / re-entrant guard 선택)
- §4 recursion lock 메커니즘 구체화 (★ §11.5 RS-5 1줄 명시 → 실제 구현 spec)
- §4.1 Layer 1 위치 재배치 결정 명시

### 14.4 G4 보강 — matrix 정밀화

- §5 default 표에 cancellation / BLOCKED / ESCALATED 3 sub-case 분리
- §5 conditional cell footnote
- callback_path conditional 조건 박제

### 14.5 G5 보강 — task_type OPTION A N exception

- §6.2 외 추가 exception 후보 (★ read_only × qc_fail / system_hook × scope_guard_fail / callback_only × callback_path 등) 검토 + 박제
- §6.1 "별도 cell 0" 6 task_type 의도 명시

### 14.6 G6 보강 — regression 측정 방식

- §11 RS-1~RS-5 측정 방식 명시 (★ pytest fixture 명시 추천)
- RS-1 envelope 800 bytes fixture path 박제
- RS-3 baseline 5건 자동 검증 fixture 박제
- RS-4 idempotency key 매치 자동 검증 fixture 박제

### 14.7 G7 보강 — duplicate enforcement

- §7.1 / §8 에 duplicate enforcement 단계 명시 (★ helper launch 전 / cron registration / marker check 중 선택)
- cron_id vs idempotency key 동일성 / 분리 명시
- marker file 명 namespace 박제 (★ `{task_id}.callback-{kind}-launch.json` 패턴 등)

### 14.8 G8 보강 — P2-A 의존성 / scope 명확화

- §15 P2-A vs P2-D (tdd_check 인식) 의존성 명시 — P2-A 만으로 task-2707 routing fail 회복 가능성 확정
- §10.3 "기타 production code" 명확한 식별 기준 (★ glob pattern 또는 명시적 list)

---

## 15. Recommendation (★ 6 영역)

1. ★ verdict B NEEDS_DRAFT_REVISION 회장 확정 후 ANU 가 8 GAP 보강 draft v2 작성 (★ ANU 자체 dispatch 0 · revised draft 도 검토 후 재dispatch 인가 회장 영역)
2. ★ G1 의 정확한 라인 결정 = ANU read-only finish-task.sh L1106-1160 + L1532-1558 + L20 영역 source audit 별도 round 추천 (★ H1 정합)
3. ★ G3 의 recursion lock 메커니즘 결정 = P2-A 단독 vs P2-C 의존 분리 회장 결정 (★ H3 정합)
4. ★ G5 의 N exception cell 결정 = task-2707+1 verifier 12/12 PASS lineage 정합 + read_only / system_hook / callback_only task_type 의 잠재 routing fail 패턴 회장 검토 (★ H2 정합)
5. ★ G6 의 regression 측정 방식 결정 = pytest fixture vs shell script 회장 우선순위 결정
6. ★ revised draft v2 작성 후 본 8 axis × 4 enum 재검토 → READY_FOR_IMPLEMENTATION 전환 가능성 평가

---

## 16. ANU Doctrine Compliance

- ★ ANU 자체 draft revision 0 (★ 본 round = 검토 만 · revision 은 회장 verdict 확정 후 별도 round)
- ★ ANU 자체 분류 결정 0 (★ 4 enum 회장 verbatim 매핑만)
- ★ ANU 자체 P2-A 구현 0
- ★ ANU 자체 코드 수정 0 / finish-task.sh 수정 0 / dispatch 0
- ★ hypothesis 분리 박제 (★ H1/H2/H3)
- ★ evidence-only (★ §9.1/9.2/9.3 + §3~§15 source verbatim 인용)

---

## 17. Linked Markers

- `memory/tasks/task-2708.md` (★ 본 검토 대상 draft)
- `memory/events/task-2708.draft-review-decision-260529.json` (★ 본 검토 decision marker)
- `memory/specs/p2_contract_refinement_r6_r14_260529.md` (★ R6~R14 + Layer + matrix refinement)
- `memory/events/p2_contract_refinement_decision_260529.json` (★ refinement decision)
- `memory/specs/p2_exit_path_coverage_audit_260529.md` (★ 41 exit + R1~R5 NOT_COVERED)
- `memory/events/p2_exit_path_coverage_decision_260529.json` (★ NEEDS_REFINEMENT 판정)
- `memory/events/c1_dispatch_marker_writer_formalization_accepted_with_known_caveats_chair_closeout_260529.json` (★ C1 closeout)
- `memory/events/task-2707+1.decision.json` (★ verifier 12/12 PASS · ACCEPT_WITH_KNOWN_CAVEATS)
- `memory/events/task-2707.implementation-pass-routing-fail-260529.json` (★ P2 trigger evidence 1호)
- `memory/events/p1b_finish_task_profile_contract_accepted_with_known_caveats_260529.json` (★ C1 origin caveat)

---

## 18. Sentinel

★ 본 review = read-only 8 axis × 4 enum 판정. P2-A 구현 0 · 코드 수정 0 · finish-task.sh 수정 0 · dispatch 0. 끝
