# task-2712+1 — task-2712 FAILURE_CALLBACK_BEFORE_EXIT_GUARD 독립 verifier (FINAL · DISPATCH_AUTHORIZED · READ_ONLY)

★ READ_ONLY VERIFIER · 회장 verbatim 인가 · dev2 Odin · 5 enum verdict · `.done` 강제 생성 금지 · `finish-task.sh` Item 9 sandbox 1회 인가 · 13 verification items · 3 caveat 유지 strict.

---

## 레벨

Lv.2 READ_ONLY verifier — **코드 수정 없음** (§0 `task_type: read_only`, §5.2 `allowed_existing_file_edits: NONE`). 산출물은 verifier artifacts(decision.json / report / callback-envelope)만이며, 타겟 worktree·forbidden 파일은 read-only로 무수정. scope/git 게이트는 non-code task로 SKIP 처리(공유 workspace repo가 타 task 브랜치에 있어 main..HEAD diff가 타 task 파일을 오탐하는 것을 방지).

---

## 0. Header / Authorization Anchor

- **task_id**: `task-2712+1`
- **task_type**: `read_only` (★ Maat 독립 verifier lineage 정합)
- **chair_authorization_id**: `CHAIR-AUTH-TASK-2712PLUS1-FAILURE-CALLBACK-INDEPENDENT-VERIFIER-260530` (★ 회장 verbatim 발급 · task-2712 chair_authorization_id 재사용 0 strict)
- **dispatch_status**: ★ **DISPATCH_AUTHORIZED · DISPATCH_PENDING**
- **parent_task**: `task-2712`
- **parent_classification_chair_verbatim_confirmed**: `PASS_WITH_PREEXISTING_REGRESSION_CAVEAT`
- **executor_team**: `dev2-team` (오딘 · Odin) (★ 회장 verbatim 결정)
- **executor_selection_rationale_chair_verbatim**: "dev4 Vishnu=task-2712 원작자 독립성 결격 · dev1 Hermes=task-2711 contamination 제외 · dev3 Dagda=stale task-2697 정리 전 제외 · dev2 Odin 독립 verifier 배정"
- **anu_collector_key**: `c119085addb0f8b7`
- **callback_envelope_prompt_byte_limit**: UTF-8 ≤ 3900 bytes hard (★ wc -c)
- **target_worktree_path**: `/home/jay/.cokacdir/workspace/AA8CB448/wt-2712-dev4` (★ read-only)
- **target_worktree_branch**: `task/task-2712-dev4`
- **target_head_commit**: `58a15618`

---

## 1. Background — task-2712 처리 정합 (★ 회장 verbatim 6 근거)

1. ★ task-2712 self-files 23개 · contamination 0
2. ★ tests/test_dispatch.py 59 failed + 7 errors는 3 case 모두 동일 (★ preexisting)
3. ★ task-2712 tests 23/23 PASS · F-1~F-14 fixture PASS · byte limit · SELF_COLLECTOR_FORBIDDEN · exactly-one terminal marker · dispatch false OK handoff 검증
4. ★ normal callback envelope 1,478 bytes · collector_role=ANU · self_key_used=false · schedule_id 256F1B6A 등록
5. ★ task-2712 변경 신규 regression evidence 0
6. ★ 3 caveat 유지 (preexisting / surgical-change / failure-path coverage)

**본 task-2712+1 = task-2712 독립 verifier** (★ 회장 verbatim 목표)

---

## 2. Verification Scope — 13 items (★ 회장 verbatim 1:1)

### Item 1: Track A/B/C/D evidence 재검토

- `memory/events/task-2712.parallel-verification-4track-synthesis-codex-pass-with-preexisting-caveat-260530.json` 박제 정합 검토
- `memory/events/task-2712.pass-with-preexisting-regression-caveat-closeout-chair-confirmed-260530.json` 회장 verbatim 확정 정합
- 4 track 결과 sha256 박제 검증

### Item 2: 23 self-files sha256 + expected_files 확인

- target_head_commit = `58a15618` 기준 baseline
- 23 self-files 모두 존재 + sha256 박제
- task-2712.md §10.3 expected_files 정합 검증

### Item 3: finish-task.sh +18/-1 코드 리뷰

- `git diff main..task/task-2712-dev4 -- scripts/finish-task.sh` 실 diff 검토
- §5.1 6 inner hook + §3.1.2 trap 3 line 정합
- 회장 목표치 ~9 lines 대비 2배 overrun 정당화 가능성

### Item 4: dispatch.py +56/-1 코드 리뷰

- `git diff main..task/task-2712-dev4 -- dispatch.py` 실 diff 검토
- §5.2 5 entry + §5.2.1 spawn verification + `_main_with_failure_guard` fail-closed wrapper 정합
- 회장 목표치 ~10/15 lines 대비 3.7/5.6배 overrun 정당화 가능성

### Item 5: surgical-change 원칙 위반 여부 판단

- 회장 verbatim "verifier code review 에서 반드시 최소화 가능성 확인 필요"
- overrun 정당화 가능성 분석
- caveat 2 (surgical-change) 정합 evidence 박제

### Item 6: tests/test_failure_callback_before_exit_guard_2712.py 23/23 재실행

- `python3 -m pytest tests/test_failure_callback_before_exit_guard_2712.py -v` 재실행
- 23/23 PASS 재현 + runtime 박제 + 각 test verbatim

### Item 7: tests/test_dispatch.py 59 failed + 7 errors preexisting 재확인

- task-2712-dev4 branch 실행 → 결과 박제
- origin/main dispatch.py 복원 후 동일 실행 → 결과 박제
- 두 결과 동일 (59+114+7) 재확인 + caveat 1 정합 evidence

### Item 8: L1 hook smoke 재현 — 5 sub-bullets (★ 회장 verbatim)

- **SCOPE_GUARD_FAIL**: `_emit_failure_envelope SCOPE_GUARD_FAIL` → `<task>.failure-envelope.json` WRITTEN
- **QC_FAIL**: `_emit_failure_envelope QC_FAIL` → `<task>.failure-envelope.json` WRITTEN
- **CRASH emit**: trap → `<task>.supervisor-crash-marker.json` 또는 envelope WRITTEN
- **SUCCESS no-op**: `.done` 존재 시 hook no-op (★ failure marker 0)
- **exactly-one terminal marker**: 4 marker class 동시 0 / 1 정합 (★ §6.3.3.A VIOLATION 1/2/3 검증)

### Item 9: 실 finish-task.sh failure-path full run (★ 회장 verbatim 1회 인가 · sandbox strict)

★ 회장 verbatim "실 finish-task.sh failure-path full run을 인가한다 · 단, 반드시 sandbox / isolated temp worktree / no PR / no push / no merge / no GitHub write 조건에서 수행 · 실행 목적은 failure terminal state에서 .done 없이 failure envelope 또는 handoff marker가 생성되는지 확인"

#### Item 9 Sandbox 조건 5 (★ 회장 verbatim strict)

1. **sandbox**: dev2 verifier worktree 내부 격리 영역
2. **isolated temp worktree**: dev2 worktree 별도 temp dir (★ task-2712-dev4 worktree 직접 수정 금지)
3. **no PR**: GitHub PR 생성 0
4. **no push**: git push origin 0
5. **no merge**: branch merge 0 / GitHub write 0

#### Item 9 검증 목표

- failure terminal state (★ SCOPE_GUARD_FAIL 또는 QC_FAIL) 시:
  - `.done` 생성 **0** 확인
  - `failure-envelope.json` 또는 `failure-handoff-marker.json` 생성 **확인**
  - exactly-one terminal marker rule 정합
- caveat 3 (failure-path coverage) 정합 evidence 박제

### Item 10: SUCCESS path `.done` 보존 확인

- success path 에서 `.done` 정상 생성 + failure envelope 0
- task-2712 자체 `.done` 박제 확인 (★ 회장 verbatim 정합)

### Item 11: failure path `.done` 미생성 + handoff marker 생성 확인

- failure terminal state 시 `.done` 강제 0 verify (★ Item 9 결과 정합)
- failure-envelope.json 또는 failure-handoff-marker.json 박제 확인
- §3.2 exactly-one terminal marker rule 정합

### Item 12: SELF_COLLECTOR_FORBIDDEN 정합

- `_validate_collector_strict()` 5 checkpoint 정합 확인
- callback envelope collector_role=ANU + collector_key=ANU_KEY + self_key_used=false 검증
- D1~D5 bypass defense 정합

### Item 13: PR 진입 가능 여부 판정

- §3 5 enum verdict 박제
- 3 caveat 유지 evidence 박제
- PR 진입 가능 여부 별도 권고 박제

---

## 3. 5 enum classification (★ 회장 verbatim 1:1)

| enum | 정의 | next action |
|---|---|---|
| **PASS_READY_FOR_PR** | 13 items 모두 PASS + 3 caveat 정상 + Item 9 sandbox full run 성공 + Codex Track D 정합 | 회장 PR 인가 대기 |
| **PASS_WITH_PREEXISTING_REGRESSION_CAVEAT** | 13 items 모두 PASS + 3 caveat 유지 + Codex Track D 정합 | 회장 PR 인가 대기 |
| **NEEDS_FIX** | 13 items 중 task-2712 변경 자체 결함 검출 | dev fix dispatch |
| **BLOCKED_BY_BASELINE_REGRESSION** | 59 preexisting failures 가 실제 task-2712 induced 판명 | task-2712 변경 fix 필요 |
| **CRITICAL_ESCALATION** | Critical 7 / 권한 확대 / forbidden target / evidence 위반 | 즉시 회장 보고 |

★ ANU 자체 분류 결정 0 — verifier evidence-only 선택.

---

## 4. 3 Caveats 유지 strict (★ 삭제 0 회장 verbatim)

| # | caveat | preservation |
|---|---|---|
| 1 | preexisting regression (★ 59 failed + 7 errors) | 삭제 0 · Item 7 정합 |
| 2 | surgical-change (★ finish-task.sh 2x / dispatch.py 3.7-5.6x overrun) | 삭제 0 · Item 3/4/5 정합 |
| 3 | failure-path coverage (★ fixture + L1 smoke 만) | 삭제 0 · Item 8/9 정합 |

---

## 5. Allowed / Forbidden Files

### 5.1 expected_files (★ verifier artifacts only)

1. `memory/events/task-2712+1.decision.json` (★ final verdict + 13 items 박제)
2. `memory/reports/task-2712+1.md` (★ 5 형식)
3. `memory/events/task-2712+1.dispatched-20260530.json` (★ dispatch.py 자동)
4. `memory/events/task-2712+1.callback-envelope.json` (★ ANU normal callback envelope · UTF-8 ≤ 3900 bytes)

### 5.2 allowed_existing_file_edits

- **NONE** (★ read-only verifier)

### 5.3 forbidden_files (★ 강제 sha256 동일)

- `scripts/finish-task.sh` (★ task-2712 산물 보존)
- `dispatch.py` (★ task-2712 산물 보존)
- `scripts/harness/v36/failure_envelope_writer.py` / `failure_callback_dispatcher.py` / `terminal_state_classifier.py` / `before_exit_guard_hook.sh` (★ task-2712 산물 보존)
- `schemas/failure_envelope_schema.json`
- `tests/test_failure_callback_before_exit_guard_2712.py` + 14 fixture
- `bot_settings.json` / `memory/bot_settings.json`
- `.claude/settings.json` / `/home/jay/.claude/settings.json`
- `scripts/session-watchdog.sh` / `scripts/task-scope-guard.sh`
- task-2706~2709+1 모든 산출물 (★ immutable)
- task-2710 / task-2711 모든 산출물 (★ immutable)
- `memory/tasks/task-2712.md` + spec lineage v1~v6 (★ immutable)
- 모든 task-2712 events (★ 본 verifier artifacts 외)
- **dev1 오염 브랜치** (★ 재사용 0)

### 5.4 forbidden_actions (★ 회장 verbatim 8 강제)

1. PR/push/merge/GitHub write 0
2. Gemini/merge 라인 진입 0
3. task-2712 산출물 수정 0
4. task-2710/task-2711/task-2706~2709+1 evidence 변경 0
5. preexisting regression caveat 삭제 0
6. surgical-change caveat 삭제 0
7. dev1 오염 브랜치 재사용 0
8. **dev4 원작 worktree에서 직접 수정 0** (★ 회장 verbatim · target worktree read-only strict)

### 5.5 59 preexisting failure 후속 task 금지 (★ 회장 verbatim)

★ 회장 verbatim "59 preexisting failure 별도 후속 task는 지금 만들지 않는다 · task-2712+1 verifier 결과에서 실제 blocker 인지 재확인한 뒤 별도 결정한다"

- task-2712+1 본 round 에서 별도 후속 task 작성 0
- Item 7 결과로 caveat 1 정합/blocker 분리만 판정

### 5.6 Capability Scope YAML

```yaml
allowed_resources:
  paths:
    - memory/events/task-2712+1.decision.json
    - memory/reports/task-2712+1.md
    - memory/events/task-2712+1.callback-envelope.json
  expected_files:
    - memory/events/task-2712+1.decision.json
    - memory/reports/task-2712+1.md
    - memory/events/task-2712+1.callback-envelope.json
  allowed_existing_file_edits: []
  forbidden_paths:
    - scripts/finish-task.sh
    - dispatch.py
    - scripts/harness/v36/failure_envelope_writer.py
    - scripts/harness/v36/failure_callback_dispatcher.py
    - scripts/harness/v36/terminal_state_classifier.py
    - scripts/harness/v36/before_exit_guard_hook.sh
    - schemas/failure_envelope_schema.json
    - tests/test_failure_callback_before_exit_guard_2712.py
    - bot_settings.json
    - memory/bot_settings.json
    - .claude/settings.json
    - /home/jay/.claude/settings.json
    - scripts/session-watchdog.sh
    - scripts/task-scope-guard.sh
```

---

## 6. Step-by-Step Verification Plan

### Step 1 — pre-state 박제 (★ read-only)

- `cd /home/jay/.cokacdir/workspace/AA8CB448/wt-2712-dev4` (★ read-only)
- `git log -7 --oneline HEAD` 박제 (★ 58a15618 ~ c45fb554)
- 23 self-files sha256 박제

### Step 2 — 13 verification items 실행 (★ read-only)

§2 13 items 각각 실행 + 결과 박제.

### Step 3 — Item 9 sandbox full run (★ 회장 verbatim 1회 인가)

- dev2 verifier 별도 isolated temp worktree 생성
- failure terminal state (SCOPE_GUARD_FAIL 또는 QC_FAIL) trigger
- `.done` 0 + failure marker 박제 확인
- 5 sandbox 조건 strict (★ §2 Item 9)

### Step 4 — 5 enum verdict 결정 (★ evidence-only)

13 items 결과 cross-reference + 3 caveat 유지 검증 + selection rationale 박제.

### Step 5 — `memory/events/task-2712+1.decision.json` 박제

verifier final verdict + 13 items 결과 + 3 caveat 유지 evidence.

### Step 6 — `memory/reports/task-2712+1.md` 박제 (★ 5 형식)

confirmed_fact / caveat / blocker / verdict / recommendation

### Step 7 — ANU normal callback envelope 박제

- collector_role=ANU strict
- collector_key=`c119085addb0f8b7` strict
- owner_key=`c119085addb0f8b7` strict
- self_key_used=false strict
- UTF-8 ≤ 3900 bytes hard

### Step 8 — finish-task.sh 정상 종료 (★ scope-guard PASS + callback registration)

---

## 7. Acceptance Criteria

1. ★ §2 13 verification items 모두 실행 + 결과 박제
2. ★ §3 5 enum verdict 박제 (★ evidence-only)
3. ★ §4 3 caveat 유지 strict (★ 삭제 0)
4. ★ Item 9 sandbox full run 5 조건 strict 정합
5. ★ §5.3 forbidden_files sha256 동일 (★ 0 변경)
6. ★ §5.4 forbidden_actions 8 위반 0
7. ★ §5.5 59 preexisting failure 후속 task 생성 0
8. ★ ANU normal callback envelope ANU key strict
9. ★ task-2710/task-2711/task-2706~2709+1 evidence 변경 0

---

## 8. dev2 Odin 실행 지침

### 8.1 단계

1. §6 Step 1 pre-state 박제
2. §2 Item 1~8 read-only 검증 (★ target worktree read-only)
3. §2 Item 9 sandbox full run (★ isolated temp worktree + 5 조건 strict)
4. §2 Item 10~13 마무리 검증
5. §3 5 enum verdict 결정 (★ evidence-only · §4 caveat 유지 정합)
6. `memory/events/task-2712+1.decision.json` 박제
7. `memory/reports/task-2712+1.md` SCQA report (★ 5 형식)
8. `memory/events/task-2712+1.callback-envelope.json` (★ ANU key + UTF-8 ≤ 3900 bytes)
9. finish-task.sh 정상 종료 (★ scope-guard PASS + callback registration)

### 8.2 callback envelope mandatory

- collector_role=ANU strict
- collector_key=`c119085addb0f8b7` strict
- owner_key=`c119085addb0f8b7` strict
- self_key_used=false strict
- registration_mode="normal_callback_via_finish_task_sh_launcher_gate"
- UTF-8 ≤ 3900 bytes hard

### 8.3 완료 후 흐름

dev2 → ANU normal callback → ANU 회장 보고 → 회장 verdict 정합 평가 + PR 진입 timing 결정

---

## 9. ANU Doctrine Compliance (★ 본 dispatch round)

- ★ ANU 자체 코드 구현 0 (★ dev2 위임)
- ★ ANU 자체 chair_authorization_id 발급 0 (★ 회장 verbatim 발급)
- ★ ANU 자체 executor 결정 0 (★ 회장 verbatim 결정)
- ★ task-2710/task-2711/task-2712/task-2706~2709+1 evidence 변경 0
- ★ ANU 자체 새 forbidden target 추가 0
- ★ ANU 자체 새 chair_authorization scope 확장 0
- ★ ANU 자체 OVERALL PASS / IMPLEMENTATION_DISPATCH_READY / FULL_ACCEPT 선언 0
- ★ ANU 자체 verdict 박제 0 (★ verifier verdict + Codex evidence 만 신뢰)
- ★ ANU autonomous loop quality doctrine 5 strict (★ self PASS claim 0)

---

## 10. Sentinel

★ task-2712+1 = FINAL · DISPATCH_AUTHORIZED · READ_ONLY VERIFIER · chair_authorization_id CHAIR-AUTH-TASK-2712PLUS1-FAILURE-CALLBACK-INDEPENDENT-VERIFIER-260530 · executor dev2 Odin (★ dev4 원작자 + dev1 contamination + dev3 stale 모두 제외) · target task-2712 worktree read-only · 13 verification items (★ 4 track evidence / 23 sha256 / finish-task.sh +18/-1 review / dispatch.py +56/-1 review / surgical-change 판단 / 23 tests 재실행 / baseline regression 재확인 / L1 hook smoke 5 sub-bullets / 실 failure-path full run 5 sandbox 조건 strict / SUCCESS path .done 보존 / failure path .done 0 + handoff marker / SELF_COLLECTOR_FORBIDDEN / PR 진입 판정) · 5 enum verdict 후보 · 3 caveat 유지 strict (★ 삭제 0) · forbidden_files sha256 동일 · forbidden_actions 8 (★ PR/Gemini/task-2712 산출물/evidence/caveat 삭제/dev1 contamination/dev4 worktree 직접 수정 0) · 59 preexisting failure 후속 task 생성 0 (★ Item 7 결과 정합 후 별도 결정) · ANU normal callback envelope ANU key strict · 완료 후 ANU 보고 → 회장 PR 진입 timing 결정. 끝

## goal_assertions (auto-generated)
- `python3 -m pytest /home/jay/.cokacdir/workspace/AA8CB448/wt-2712-dev4/tests/test_failure_callback_before_exit_guard_2712.py -v`
