# task-2712 v2 — FAILURE_CALLBACK_BEFORE_EXIT_GUARD (READ_ONLY_SPEC_REVIEW_PHASE · v2)

★ **READ_ONLY_SPEC_REVIEW_PHASE v2** — 회장 verbatim "task-2712 Codex round 1 결과 수용 · AXIS_4 finish-task.sh inner-script hook 방향 승인 · AXIS_5 dispatch.py inner instrumentation 방향 승인 · 단 아직 실제 코드 구현 dispatch 불허 · task-2712 v2 spec revision 인가 · v2 작성 후 Codex round 2 재검토 요청" 정합.

- **v1 lineage**: `memory/tasks/task-2712.md` sha `18e400ee...` (★ 보존)
- **draft lineage**: `memory/tasks/task-2712_draft.md` sha `bae3a142...` (★ 보존)
- **v2 origin**: Codex round 1 remaining 5 recommendations + 회장 verbatim R1~R7 1:1

---

## 0. Header / Authorization Anchor

- **task_id**: `task-2712`
- **task_type**: `policy_design_only` (★ READ_ONLY_SPEC_REVIEW_PHASE v2)
- **chair_authorization_id**: `CHAIR-AUTH-TASK-2712-FAILURE-CALLBACK-BEFORE-EXIT-GUARD-READ-ONLY-SPEC-REVIEW-260530`
- **draft_version**: `v2`
- **dispatch_status**: ★ **NOT_DISPATCHED · CODEX_SPEC_REVIEW_ROUND_2_PENDING**
- **anu_collector_key**: `c119085addb0f8b7`
- **anu_codex_auto_loop_principle**: ★ ENABLED (★ 회장 verbatim)
- **chair_authorized_scope**: "spec v2에서 변경 방향과 최소 변경 범위를 명확히 하는 것까지 (★ 실제 파일 수정 금지)"

---

## 1. Problem Statement (★ v1 §1 verbatim 유지)

---

## 2. Goal (★ v1 §2 verbatim 유지)

---

## 3. Terminal State 9 — **crash/abort 명시** (★ R7 일부)

| # | terminal state | 정의 | callback/handoff |
|---|---|---|---|
| 1 | **SUCCESS** | 정상 closeout | `.done` + success callback |
| 2 | **FAILURE** | 봇 self-judgment 실패 | failure envelope · `.done` 0 |
| 3 | **BLOCKED** | 외부 의존 | handoff envelope · `.done` 0 |
| 4 | **SCOPE_GUARD_FAIL** | finish-task scope-guard violation | failure envelope · `.done` 0 |
| 5 | **QC_FAIL** | qc HIGH/CRITICAL | failure envelope · `.done` 0 |
| 6 | **INFRA_DEFECT** | shared branch contamination / paths_null / worktree corruption | handoff envelope · `.done` 0 |
| 7 | **PERMISSION_FAIL** | chair_auth / forbidden / allowed_resources 위반 | failure envelope · `.done` 0 |
| 8 | **API_FAIL** | API 500/429/network | handoff envelope (recoverable) · `.done` 0 |
| 9 | **CRITICAL_ESCALATION** | Critical 7 / 권한확대 / forbidden target 침해 / evidence 변경 시도 | failure envelope + 즉시 회장 보고 · `.done` 0 |
| **10** | **CRASH_NO_EXIT_CODE** (★ v2 신규 · R7) | session crash / SIGKILL / OOM / kernel panic — clean exit_code 0 | **handoff marker via supervisor/post-mortem hook** · exit_code=-1 sentinel · `.done` 0 |

### 3.1 .done 정책 (★ R5 verbatim)

★ R5 verbatim "SUCCESS는 .done + success callback 가능 · FAILURE/BLOCKED/INFRA_DEFECT/CRITICAL_ESCALATION 등은 .done 없이 failure envelope 또는 handoff marker만 허용":

- `.done` = **SUCCESS 만** (★ 1/10 terminal state)
- 다른 9 terminal state = `.done` 0 강제
- SUCCESS 외 `.done` 강제 생성 시도 = `CRITICAL_ESCALATION`

### 3.2 Exactly one terminal marker rule (★ R5 신규 verbatim)

★ R5 verbatim "exactly one terminal marker rule을 명시한다":

- **모든 봇 session 종료 시 정확히 1개 terminal marker 발생 강제**
- 0-fire 금지 (★ 9 failure state 중 어디에도 매칭 안 되면 `UNCLASSIFIED_TERMINAL_STATE` 분류 → CRASH_NO_EXIT_CODE 또는 supervisor handoff marker 강제 생성)
- 2-fire 금지 (★ `.done` + failure envelope 동시 생성 시도 → `CRITICAL_ESCALATION`)
- detection: post-session ANU disk scan 으로 task_id 당 marker count 검증

---

## 4. Failure Callback Envelope Schema — **terminal_state + chair_authorization_id mandatory** (★ R7)

### 4.1 envelope mandatory field 11 (★ v1 9 → v2 11 확장)

| field | type | mandatory | 누락 시 |
|---|---|---|---|
| `task_id` | string | ★ YES | INVALID |
| `team` / `bot` | string | ★ YES | INVALID |
| `session` | string | ★ YES | INVALID |
| `phase` | string | ★ YES | INVALID |
| `exit_code` | int | ★ YES (★ crash 시 sentinel -1) | INVALID |
| `failure_kind` | string | ★ YES | INVALID |
| `artifact_paths` | array | ★ YES (★ 빈 리스트 허용) | INVALID |
| `critical7_match` | boolean | ★ YES | INVALID |
| **`terminal_state`** (★ R7 신규 mandatory) | enum (★ §3 10 enum) | ★ YES | INVALID |
| **`chair_authorization_id`** (★ R7 신규 mandatory) | string | ★ YES | INVALID |
| `collector_role` / `collector_key` / `self_key_used` | string + bool | ★ YES (★ ANU + ANU key + false) | SELF_COLLECTOR_FORBIDDEN |

### 4.2 byte limit (★ v1 §4.2 verbatim)

UTF-8 ≤ 3900 bytes hard (wc -c). 초과 시 artifact_paths 만 유지 + summary 축소.

### 4.3 envelope-write fail / handoff-write fail / both-fail fallback rule (★ R3 verbatim)

★ R3 verbatim "envelope-write fail / handoff-write fail / both fail 상황의 fallback rule 명시":

| 시나리오 | rule |
|---|---|
| **envelope-write OK + cron OK** | normal path · ANU callback 정상 수신 |
| **envelope-write OK + cron FAIL** | §6 4-step fallback → disk handoff marker |
| **envelope-write FAIL (★ disk full / IO error)** | (a) **stderr 에 escape-safe JSON 1-line emit** (★ disk 무의존 fallback) + (b) supervisor/parent process 가 stderr capture 시 회수 + (c) cron 시도 skip (★ envelope 부재 시 cron 무의미) |
| **envelope-write FAIL + stderr emit FAIL** | parent process 의 exit_code 만으로 `UNCLASSIFIED_TERMINAL_STATE` 분류 + ANU post-session disk scan 시 marker 부재 detect → `MARKER_FIRE_ZERO` 박제 |
| **envelope-write OK + handoff-write FAIL** | cron 실패 + handoff 실패 → stderr 에 envelope 경로 + handoff 실패 사유 1-line emit |
| **both fail (envelope + handoff)** | stderr 1-line emit 의무 (★ JSON minimal: task_id / terminal_state / exit_code) + parent process 가 supervisor handoff marker 박제 강제 |
| **stderr capture 가능한 supervisor 부재** | last resort: syslog journal 박제 (★ `logger -t failure_callback_2712`) |

---

## 5. Terminal Failure Path Matrix

### 5.1 finish-task.sh inner-script failure callback hook 6 path (★ R1 verbatim)

★ R1 verbatim "finish-task.sh는 wrapper가 아니라 inner-script failure callback hook으로 설계한다":

| exit point | hook 호출 | terminal_state | failure_kind 추출 |
|---|---|---|---|
| **L451 scope-guard FAIL** (★ task-2711 사고) | `_emit_failure_envelope SCOPE_GUARD_FAIL "$task_id" $exit_code "$scope_violation_count"` | SCOPE_GUARD_FAIL | scope_violation_count_NN |
| **qc HIGH/CRITICAL FAIL** | `_emit_failure_envelope QC_FAIL ...` | QC_FAIL | qc_severity_HIGH_or_CRITICAL |
| **capability snapshot null** | `_emit_failure_envelope INFRA_DEFECT ...` | INFRA_DEFECT | capability_paths_null |
| **chair_auth/forbidden/allowed_resources 위반** | `_emit_failure_envelope PERMISSION_FAIL ...` | PERMISSION_FAIL | permission_violation_kind |
| **forbidden_files write 시도 detect** | `_emit_failure_envelope CRITICAL_ESCALATION ...` | CRITICAL_ESCALATION | forbidden_target_violation |
| **API 500 timeout exit** | `_emit_failure_envelope API_FAIL ...` | API_FAIL (recoverable) | api_error_code |

### 5.2 dispatch.py inner instrumentation 5 path (★ R2 verbatim)

★ R2 verbatim "dispatch.py는 wrapper parse가 아니라 inner instrumentation으로 설계한다":

| 지점 | inner hook | terminal_state |
|---|---|---|
| **bot collision detect** (★ task-2711 사고) | `_dispatch_emit_handoff BLOCKED bot_collision` | BLOCKED |
| **DISPATCH_FALSE_OK detect** (★ "위임 완료" but bot 미spawn) | `_dispatch_emit_handoff INFRA_DEFECT dispatch_false_ok` + bot spawn verification (★ process check after N sec) | INFRA_DEFECT |
| **capability snapshot null** | `_dispatch_emit_handoff INFRA_DEFECT capability_null` | INFRA_DEFECT |
| **task md missing** | `_dispatch_emit_handoff PERMISSION_FAIL task_md_missing` | PERMISSION_FAIL |
| **cron/schedule registration failure** | `_dispatch_emit_handoff INFRA_DEFECT cron_registration_failure` | INFRA_DEFECT |

### 5.3 봇 runtime path (★ v1 §5.3 + R7 crash)

| 지점 | hook |
|---|---|
| Critical 7 doctrine 매칭 | CRITICAL_ESCALATION + 즉시 ANU cron |
| forbidden target write 시도 | CRITICAL_ESCALATION |
| infra defect detect | INFRA_DEFECT handoff |
| **runtime crash (★ SIGKILL/OOM/kernel panic)** (★ R7 신규) | supervisor post-mortem handoff marker (★ §6 supervisor handoff) |

---

## 6. Cron 등록 실패 fallback chain 4-step + supervisor fallback (★ v1 §6 + R3 보강)

### 6.1 4-step fallback chain (★ v1 §6.1 verbatim)

1. failure envelope JSON disk 박제
2. ANU cron 발사 시도
3. cron 실패 시 disk handoff marker 박제
4. exit (★ exit_code 유지)

### 6.2 ANU 회수 path (★ v1 §6.2 verbatim)

disk scan · session-bound polling 0 · 우선순위: cron callback > disk envelope > disk handoff marker > **stderr capture log** > **syslog journal** > supervisor handoff marker

### 6.3 SELF_COLLECTOR_FORBIDDEN — **explicit enforcement checkpoint** (★ R4 verbatim)

★ R4 verbatim "SELF_COLLECTOR_FORBIDDEN enforcement checkpoint를 명시한다":

```python
def _validate_collector_strict(envelope: dict) -> None:
    """
    R4 verbatim enforcement checkpoint.
    검증 실패 시 즉시 차단 + CRITICAL_ESCALATION 박제.
    """
    ANU_KEY = "c119085addb0f8b7"

    # Checkpoint 1: collector_role
    if envelope.get("collector_role") != "ANU":
        raise CollectorViolation("SELF_COLLECTOR_FORBIDDEN: collector_role != ANU")

    # Checkpoint 2: collector_key
    if envelope.get("collector_key") != ANU_KEY:
        raise CollectorViolation(f"SELF_COLLECTOR_FORBIDDEN: collector_key != {ANU_KEY}")

    # Checkpoint 3: owner_key
    if envelope.get("owner_key") != ANU_KEY:
        raise CollectorViolation(f"SELF_COLLECTOR_FORBIDDEN: owner_key != {ANU_KEY}")

    # Checkpoint 4: self_key_used 명시적 false
    if envelope.get("self_key_used") is not False:
        raise CollectorViolation("SELF_COLLECTOR_FORBIDDEN: self_key_used must be explicit false")

    # Checkpoint 5: callback cron 발사 직전 호출 (★ 차단 지점)
    # → CollectorViolation 발생 시 cron 발사 skip + CRITICAL_ESCALATION 박제

def _fire_callback_with_enforcement(envelope: dict, cron_fn) -> None:
    """callback 발사 전 enforcement checkpoint 강제."""
    _validate_collector_strict(envelope)  # ★ enforcement
    cron_fn(envelope)
```

★ **차단 지점**: callback cron 발사 직전 `_validate_collector_strict()` 강제 호출 · 검증 실패 시 cron skip + CRITICAL_ESCALATION 박제.

---

## 7. Required Test Fixtures — **5 required + crash/abort** (★ R6 verbatim)

★ R6 verbatim "다음 fixture를 required test로 승격한다":

| # | fixture | terminal_state | precedent |
|---|---|---|---|
| **F-1** | task-2711 scope-guard FAIL | SCOPE_GUARD_FAIL | ★ task-2711 사고 |
| **F-2** | paths_null (capability snapshot null) | INFRA_DEFECT | ★ task-2709 사고 |
| **F-3** | API 500 mid-postprocessing | API_FAIL (recoverable) | ★ task-2709+1 API 500 사고 |
| **F-4** | bot collision / DISPATCH_FALSE_OK | BLOCKED + INFRA_DEFECT | ★ task-2711 bot-b busy 사고 |
| **F-5** | cron registration failure → handoff fallback | (any failure terminal_state) + handoff fallback | ★ envelope-write OK + cron FAIL |
| **F-6** | crash (no exit_code) (★ R7) | CRASH_NO_EXIT_CODE | ★ session crash · supervisor 회수 |
| **F-7** | envelope-write FAIL + stderr emit | UNCLASSIFIED_TERMINAL_STATE | ★ R3 disk full / IO error |
| **F-8** | SELF_COLLECTOR_FORBIDDEN violation (★ self-key cron 시도) | CRITICAL_ESCALATION | ★ task-2625 dev6 self-collector 사고 정합 |

**총 8 required fixture** (★ 5 회장 verbatim + 3 보강)

---

## 8. Architecture — **inner-script + inner-instrumentation 확정** (★ R1/R2 verbatim)

### 8.1 신규 module 4 (★ v1 §8.1)

| module | path | 역할 |
|---|---|---|
| `failure_envelope_writer.py` | `scripts/harness/v36/failure_envelope_writer.py` | envelope JSON 박제 + byte limit + 11 mandatory field + §6.3 enforcement checkpoint |
| `failure_callback_dispatcher.py` | `scripts/harness/v36/failure_callback_dispatcher.py` | ANU cron + 4-step fallback + stderr/syslog fallback |
| `terminal_state_classifier.py` | `scripts/harness/v36/terminal_state_classifier.py` | 10 enum + Critical 7 분류 + exactly-one rule |
| `before_exit_guard_hook.sh` | `scripts/harness/v36/before_exit_guard_hook.sh` | bash hook · finish-task.sh inner 호출용 |

### 8.2 finish-task.sh inner-script hook **확정** (★ R1)

★ R1 verbatim "inner-script failure callback hook" — wrapper option B reject.

- finish-task.sh 자체 변경 (★ 회장 별도 인가 필요 시점)
- §5.1 6 exit point 마다 1 line hook 호출 추가
- 추정 변경 라인: ~6 lines (★ 최소 변경 강제)

### 8.3 dispatch.py inner instrumentation **확정** (★ R2)

★ R2 verbatim "inner instrumentation" — wrapper parse option B reject.

- dispatch.py 자체 변경 (★ 회장 별도 인가 필요 시점)
- §5.2 5 entry point 마다 inner hook 추가
- 추정 변경 라인: ~10~15 lines (★ 최소 변경 강제)
- bot spawn verification 추가 (★ DISPATCH_FALSE_OK 차단 위해 N sec 후 process check)

---

## 9. Affected Files (★ v1 §9 + R6 fixture 8개)

### 9.1 신규 산출물 (★ 향후 dispatch 단계)

1. `scripts/harness/v36/failure_envelope_writer.py`
2. `scripts/harness/v36/failure_callback_dispatcher.py`
3. `scripts/harness/v36/terminal_state_classifier.py`
4. `scripts/harness/v36/before_exit_guard_hook.sh`
5. `tests/test_failure_callback_before_exit_guard_2712.py`
6. `tests/fixtures/failure_callback_2712/F-1_task_2711_scope_guard_fail.json` (★ §7.F-1)
7. `tests/fixtures/failure_callback_2712/F-2_paths_null.json` (★ §7.F-2)
8. `tests/fixtures/failure_callback_2712/F-3_api_500_recoverable.json` (★ §7.F-3)
9. `tests/fixtures/failure_callback_2712/F-4_bot_collision_dispatch_false_ok.json` (★ §7.F-4)
10. `tests/fixtures/failure_callback_2712/F-5_cron_registration_failure_handoff.json` (★ §7.F-5)
11. `tests/fixtures/failure_callback_2712/F-6_crash_no_exit_code.json` (★ §7.F-6)
12. `tests/fixtures/failure_callback_2712/F-7_envelope_write_fail_stderr_emit.json` (★ §7.F-7)
13. `tests/fixtures/failure_callback_2712/F-8_self_collector_forbidden_violation.json` (★ §7.F-8)
14. `schemas/failure_envelope_schema.json` (★ 11 mandatory field)
15. `memory/reports/task-2712.md`
16. `memory/events/task-2712.formalization-commit-260530.json`
17. `memory/events/task-2712.callback-envelope.json`

**총 17 expected_files** (★ v1 → v2 fixture 5→8 확장 + schema 11 field)

### 9.2 변경 대상 (★ 회장 별도 인가)

- `scripts/finish-task.sh` (★ R1 inner-script hook · 회장 별도 인가)
- `dispatch.py` (★ R2 inner instrumentation · 회장 별도 인가)

★ **본 v2 spec 단계는 변경 0 strict**

---

## 10. ANU-Codex 자동 루프 원칙 (★ 회장 verbatim 강화)

### 10.1 자동 진행 조건 6 (★ v1 §10.1 verbatim)

| # | 조건 |
|---|---|
| 1 | Critical 7 = 0 |
| 2 | 권한 확대 = 0 |
| 3 | forbidden target 실제 수정 필요 결정 전 |
| 4 | PR/push/merge/GitHub write = 0 |
| 5 | 기존 evidence 변경 위험 = 0 |
| 6 | Codex 지적이 spec/doc/schema/test 설계 보강에 한정 |

### 10.2 회장 보고 시점 — **v2 강화** (★ 회장 verbatim 본 round)

★ 회장 verbatim "v2 이후 Codex 지적이 spec/doc/schema/test 보강에 한정되고, 실제 파일 수정 인가가 추가로 필요하지 않으면 ANU가 자동 revision loop를 진행한다 · 다만 finish-task.sh 또는 dispatch.py 실제 구현 인가, 구현 dispatch, PR/push/merge가 필요해지는 순간에는 반드시 회장에게 보고한다":

| # | trigger |
|---|---|
| 1 | finish-task.sh 또는 dispatch.py **실제 구현 인가 시점** |
| 2 | Critical 7 |
| 3 | 권한 확대 |
| 4 | 기존 evidence 변경 위험 |
| 5 | **구현 dispatch 필요 시점** |
| 6 | **PR/push/merge 필요 시점** |
| 7 | Codex와 ANU 판단 충돌 |
| 8 | PASS/PWR 도달 후 구현 dispatch 인가 시점 |

### 10.3 v2 본 round 자동 진행 자격 분석

- ★ AXIS_4/AXIS_5 **방향만 승인** (★ 회장 verbatim "spec v2에서 변경 방향과 최소 변경 범위를 명확히 하는 것까지") · **실제 구현 인가 미발** → §10.2 #1 미매칭
- ★ Codex round 2 spec/doc/schema/test 보강 한정 확인 후 자동 진행 가능 (★ §10.1 #6 만족 시)
- ★ Codex round 2 결과로 §10.1 6 조건 + §10.2 8 trigger 재평가

---

## 11. Allowed / Forbidden Files (★ v1 §11 + v2 강화)

### 11.1 expected_files (★ 본 v2 round)

1. `memory/tasks/task-2712_v2.md` (★ 본 file)
2. `memory/events/task-2712.codex-spec-review-round-2-result-260530.json` (★ Codex round 2 결과)
3. `memory/tasks/task-2712_v<N>.md` (★ AUTO_REVISION_CONTINUE 시 vN+1 박제)

### 11.2 allowed_existing_file_edits

- NONE (★ READ_ONLY_SPEC_REVIEW_PHASE)

### 11.3 forbidden_files (★ v1 §11.3 + v2 추가)

- v1 §11.3 verbatim 유지
- `memory/tasks/task-2712.md` (★ v1)

### 11.4 forbidden_actions (★ 회장 verbatim 6 강제)

1. 아직 finish-task.sh 실제 수정 0
2. 아직 dispatch.py 실제 수정 0
3. bot_settings/settings 변경 0
4. PR/push/merge/GitHub write 0
5. task-2710/task-2711/task-2706~2709+1 evidence 변경 0
6. task-2712 구현 dispatch 0

---

## 12. v1 → v2 diff summary

| v1 영역 | v2 변경 | 출처 |
|---|---|---|
| §3 9 terminal state | **10 terminal state** (★ CRASH_NO_EXIT_CODE 신규) | R7 |
| §3.2 (신규) exactly one terminal marker rule | 0-fire / 2-fire 금지 + post-session ANU disk scan 검증 | R5 |
| §4.1 9 mandatory field | **11 mandatory field** (★ terminal_state + chair_authorization_id mandatory 추가) | R7 |
| §4.3 (신규) envelope/handoff fail fallback rule | disk full / IO error / stderr / syslog cascade | R3 |
| §5.1 finish-task.sh 6 exit point | **inner-script hook 확정** (★ wrapper option reject) + hook 호출 syntax | R1 |
| §5.2 dispatch.py 5 entry point | **inner instrumentation 확정** + bot spawn verification | R2 |
| §5.3 runtime path | **runtime crash (CRASH_NO_EXIT_CODE) supervisor post-mortem 추가** | R7 |
| §6.2 ANU 회수 path | stderr capture log + syslog journal + supervisor handoff fallback 추가 | R3 |
| §6.3 SELF_COLLECTOR_FORBIDDEN | **explicit enforcement checkpoint 5단** (★ collector_role / collector_key / owner_key / self_key_used / cron 발사 직전 호출) + Python pseudo-code | R4 |
| §7 fixture 5 → **8 required** | CRASH + envelope-write fail + SELF_COLLECTOR_FORBIDDEN violation 추가 | R6 + 보강 |
| §8.2 / §8.3 옵션 A/B | **option A 확정** (★ inner-script hook + inner instrumentation) · option B reject | R1/R2 |
| §9 expected files 17 | fixture 5→8 확장 | R6 |
| §10.2 회장 보고 시점 7 | **8 trigger** (★ "실제 구현 인가 시점" / "구현 dispatch 필요 시점" / "PR/push/merge 필요 시점" 명시) | 회장 verbatim |

---

## 13. R1~R7 self-check

| ID | 회장 verbatim recommendation | v2 반영 | status |
|---|---|---|---|
| **R1** | finish-task.sh inner-script hook 6 path | §5.1 / §8.2 / §12 | ✓ ACCEPTED |
| **R2** | dispatch.py inner instrumentation 5 path | §5.2 / §8.3 / §12 | ✓ ACCEPTED |
| **R3** | envelope-write / handoff-write / both-fail fallback rule | §4.3 / §6.2 stderr/syslog cascade | ✓ ACCEPTED |
| **R4** | SELF_COLLECTOR_FORBIDDEN enforcement checkpoint | §6.3 5단 checkpoint + cron 발사 직전 차단 지점 | ✓ ACCEPTED |
| **R5** | exactly one terminal marker rule | §3.1 .done SUCCESS only + §3.2 0-fire/2-fire 금지 | ✓ ACCEPTED |
| **R6** | 5 required fixture 승격 | §7 F-1~F-5 (★ + F-6~F-8 보강) | ✓ ACCEPTED |
| **R7** | terminal_state + chair_authorization_id mandatory + crash/abort | §3 #10 CRASH_NO_EXIT_CODE + §4.1 11 mandatory field + §5.3 runtime crash | ✓ ACCEPTED |

**총 7/7 ACCEPTED**

---

## 14. ANU Doctrine Compliance (★ v2 round)

- ★ ANU 자체 코드 구현 0
- ★ ANU 자체 finish-task.sh 변경 0
- ★ ANU 자체 dispatch.py 변경 0
- ★ ANU 자체 bot_settings/settings 변경 0
- ★ ANU 자체 PR/push/merge/GitHub write 0
- ★ ANU 자체 task-2710/task-2711/task-2706~2709+1 evidence 변경 0
- ★ ANU 자체 chair_authorization_id 발급 0
- ★ ANU 자체 새 forbidden target 추가 0
- ★ ANU 자체 새 chair_authorization scope 확장 0
- ★ ANU 자체 분류 결정 0 (★ R1~R7 모두 회장 verbatim 1:1)
- ★ ANU 자체 OVERALL PASS 선언 0
- ★ ANU-Codex 자동 루프 적용 시에도 §10.1 + §10.2 strict

---

## 15. Sentinel

★ task-2712 v2 = READ_ONLY_SPEC_REVIEW_PHASE v2 · Codex round 1 remaining 5 + 회장 verbatim R1~R7 1:1 · §3 10 terminal state (CRASH_NO_EXIT_CODE 신규) + §3.1 .done SUCCESS only + §3.2 exactly one terminal marker rule · §4.1 11 mandatory field (terminal_state + chair_authorization_id 추가) + §4.3 envelope/handoff fail fallback (stderr/syslog cascade) · §5.1 finish-task.sh inner-script hook 6 path 확정 · §5.2 dispatch.py inner instrumentation 5 path 확정 + bot spawn verification · §6.3 SELF_COLLECTOR_FORBIDDEN 5단 checkpoint + Python pseudo-code · §7 8 required fixture · 17 expected_files · finish-task.sh 변경 0 · dispatch.py 변경 0 · bot_settings/settings 변경 0 · PR/push/merge/GitHub write 0 · 구현 dispatch 0 · task-2710/task-2711/task-2706~2709+1 evidence 변경 0 · ANU-Codex 자동 루프 §10.1 6조건 + §10.2 8 trigger strict · Codex round 2 결과로 자동 진행 자격 재평가. 끝
