# task-2711 — ANU_CODEX_REVIEW_LOOP_DECIDER (DRAFT)

★ **DRAFT ONLY** — 회장 verbatim "이번 단계는 아직 draft만 준비한다 · dispatch / PR / push / merge / GitHub write는 하지 않는다" 정합. dispatch 0 · 코드 구현 0 · 회장 별도 인가 대기.

---

## 0. Header / Authorization Anchor

- **task_id**: `task-2711`
- **task_type**: `system_hook` (★ 향후 코드 구현 영역 · 본 draft 단계는 read-only design only)
- **chair_authorization_id**: `<CHAIR_TO_ASSIGN>` (★ 회장 별도 결정 영역 · task-2710 chair_authorization_id 재사용 0 strict)
- **dispatch_status**: **NOT_DISPATCHED · DRAFT_ONLY**
- **executor_team_candidate**: `<CHAIR_TO_DECIDE>` (★ dev1 헤르메스 또는 다른 dev 봇 · 회장 결정 영역)
- **verifier_team_candidate**: `<CHAIR_TO_DECIDE>` (★ task-2711+1 별도 · 회장 결정 영역)
- **anu_collector_key**: `c119085addb0f8b7`

---

## 1. Problem Statement (★ task-2710 7 round 사고 박제)

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

- round 1 → 5 axis NEEDS_REFINEMENT → 회장 R1~R5 ACCEPT + v2 인가
- round 2 → 4 NR + 1 FAIL → 회장 R1~R4 ACCEPT + v3 인가
- round 3 → 1 PASS + 1 PWR + 2 NR + 1 FAIL → 회장 R1~R3 ACCEPT + v4 인가
- round 4 → 동일 → 회장 R1~R3 ACCEPT + v5 인가 + E3 분리 추가
- round 5 → 1 PASS + 2 PWR + 2 NR + 0 FAIL → 회장 R1~R4 ACCEPT + v6 인가
- round 6 → 2 PASS + 2 PWR + 1 NR + 0 FAIL → 회장 R1~R4 ACCEPT + v7 인가
- round 7 → 3 PASS + 2 PWR + 0 NR + 0 FAIL · PILOT_READINESS READY_WITH_RECOMMENDATIONS → 회장 R-doc-1/R-doc-2 ACCEPT + v8 인가 + LOCK

**문제**: 회장이 매 round 마다 verbatim instruction 직접 복붙 → 회장 인지 부하 + ANU bounded loop 자동화 미흡 + minor refinement 사이클이 회장 결정 영역으로 잘못 escalate.

**해결**: Codex review 결과가 **NEEDS_REVISION / HOLD_FOR_CHAIR / PASS_WITH_RECOMMENDATIONS** 이고 **Critical 7 / 권한확대 / forbidden target / 실제 dispatch / GitHub write / 기존 evidence 변경 위험 0** 이면 — ANU 가 회장 복붙 없이 자동으로 revision loop 를 계속 돌리는 **decision runner** 설계 + 구현.

---

## 2. Goal

> Codex review verdict + remaining_recommendations + risk surface 를 입력 받아 5 enum 중 하나로 분류하고, AUTO_REVISION_CONTINUE 영역만 ANU 가 자동 처리하며, 나머지 4 영역은 회장에 escalate 하는 **decision runner** 설계 + 구현.

---

## 3. Decision Enum 5 (★ 회장 verbatim 1:1)

| enum | 의미 | next action | 회장 보고 필요? |
|---|---|---|---|
| **AUTO_REVISION_CONTINUE** | minor doc/spec/classifier/gate refinement only · risk 0 | ANU 자동 v+1 revision drafting + Codex round+1 재요청 | ★ NO (★ silent loop) |
| **CHAIR_DECISION_REQUIRED** | 기준값 신규 결정 / forbidden target 추가 / classifier rule 신규 추가 / pilot gate 신규 | ANU 회장 보고 + 회장 verbatim 대기 | ★ YES |
| **LOCK_READY** | Codex OVERALL PASS / PASS_WITH_RECOMMENDATIONS + remaining 0 또는 minor doc only | ANU 회장 보고 + lock 인가 대기 | ★ YES (★ lock 인가 only) |
| **PILOT_READY_BUT_NEEDS_CHAIR** | Codex PILOT_READINESS READY 또는 READY_WITH_RECOMMENDATIONS + lock 완료 | ANU 회장 보고 + pilot 별도 결정 대기 (★ 신규 fresh task ID + 별도 chair_authorization_id) | ★ YES (★ pilot 인가 only) |
| **CRITICAL_ESCALATION** | Critical 7 / 권한확대 / forbidden target 침해 / 실제 dispatch / GitHub write / 기존 evidence 변경 위험 발견 | ANU 즉시 회장 보고 + auto loop 중단 + lock/pilot 시도 0 | ★ YES (★ 즉시) |

---

## 4. Risk Surface — auto vs chair gating 기준 (★ 회장 verbatim 1:1)

### 4.1 AUTO 허용 영역 (★ 회장 verbatim "minor doc/spec/classifier/gate refinement는 ANU-Codex loop가 자동 처리")

| 영역 | 예시 | 자동 처리 가능? |
|---|---|---|
| minor documentation | secondary_labels order-insensitive serialization 명시 | YES |
| spec restatement | "v6 verbatim 유지" → self-contained 본문 박제 | YES |
| classifier rule clarification | data-path mismatch fix (`allowed_resources.allowed_existing_file_edits` nested) | YES |
| classifier discriminator tightening | policy/chain/attempt overlap precedence 명시 | YES |
| pilot gate refinement | "가장 최근" authoritative source cascade 명시 | YES |
| enum expansion (★ existing 분류 내) | qc subcase enum +3 추가 (regression_replay_verdict 등) | YES |
| numeric threshold formalization | G3 +50% / $15 verbatim 박제 | YES (★ 회장이 한 번 결정한 threshold 정합) |

### 4.2 CHAIR-ONLY 영역 (★ 회장 verbatim 강제 — 5 영역)

| 영역 | 정의 | 자동 처리 차단 |
|---|---|---|
| **Critical 7** | feedback_critical_escalation_only_260508.md 7 분류 매칭 | ★ CRITICAL_ESCALATION |
| **기준값 신규 결정** | G3/G4/G5/G6 threshold 신규 또는 변경 (★ 회장이 한 번도 결정 안한 값) | ★ CHAIR_DECISION_REQUIRED |
| **forbidden target 필요** | 새 forbidden path 추가 / immutable scope 확장 / 권한 확대 | ★ CHAIR_DECISION_REQUIRED |
| **실제 dispatch/pilot/PR/push/merge** | dispatch.py 실행 / pilot session spawn / git push / PR open | ★ PILOT_READY_BUT_NEEDS_CHAIR 또는 CRITICAL_ESCALATION |
| **lock/pilot 인가** | locked_status 변경 / pilot_authorization_status 변경 | ★ LOCK_READY 또는 PILOT_READY_BUT_NEEDS_CHAIR |

### 4.3 Risk detection — 자동화 차단 trigger 6 (★ 회장 verbatim "Critical 7·권한확대·forbidden target·실제 dispatch·GitHub write·기존 evidence 변경 위험")

| # | trigger 조건 | 분류 |
|---|---|---|
| 1 | Codex remaining_recommendations 가 Critical 7 doctrine 키워드 매칭 | CRITICAL_ESCALATION |
| 2 | Codex remaining_recommendations 가 권한 확대 (★ new allowed_path / new chair_auth scope) 요구 | CHAIR_DECISION_REQUIRED |
| 3 | Codex remaining_recommendations 가 forbidden target 변경 (★ §11.3 list 변경) 요구 | CHAIR_DECISION_REQUIRED |
| 4 | revision drafting 산출물 expected_files 가 실제 dispatch / PR / push / merge / GitHub write 포함 | CRITICAL_ESCALATION |
| 5 | revision drafting 산출물 allowed_existing_file_edits 가 immutable scope (§6.2 8 axis) 매칭 | CRITICAL_ESCALATION |
| 6 | revision drafting 이 기존 evidence (★ v1~vN immutable) overwrite 시도 | CRITICAL_ESCALATION |

---

## 5. Architecture (★ draft only)

### 5.1 Runner module

**Path**: `scripts/anu/codex_review_loop_decider.py`

**Public API**:

```python
from typing import Literal, NamedTuple

DecisionEnum = Literal[
    'AUTO_REVISION_CONTINUE',
    'CHAIR_DECISION_REQUIRED',
    'LOCK_READY',
    'PILOT_READY_BUT_NEEDS_CHAIR',
    'CRITICAL_ESCALATION',
]

class CodexReviewInput(NamedTuple):
    task_id: str                       # ★ e.g. "task-2710"
    version: int                       # ★ e.g. 7
    round_number: int                  # ★ e.g. 7
    overall_verdict: str               # ★ Codex OVERALL (PASS / PASS_WITH_RECOMMENDATIONS / NEEDS_REVISION / HOLD_FOR_CHAIR)
    pilot_readiness: str               # ★ Codex PILOT_READINESS (READY / READY_WITH_RECOMMENDATIONS / NOT_READY_WITHOUT_FOLLOWUP / NOT_READY)
    axis_counts: dict                  # ★ {'pass': N, 'pwr': N, 'nr': N, 'fail': N}
    remaining_recommendations: list    # ★ Codex remaining recommendations verbatim
    locked_status: bool                # ★ task md locked_status
    chair_authorization_id: str        # ★ task md chair_authorization_id

class DecisionResult(NamedTuple):
    decision: DecisionEnum
    rationale: str                     # ★ verbatim · audit recording
    next_action: str                   # ★ ANU 가 다음 수행할 액션 (★ auto draft path / chair report path)
    risk_triggers_matched: list        # ★ §4.3 6 trigger 중 매칭 항목
    chair_facing_summary: str          # ★ chair escalation 시 본문 (★ AUTO 시 빈 문자열)
    audit_marker_path: str             # ★ marker JSON 박제 path

def decide(input: CodexReviewInput) -> DecisionResult:
    """
    회장 verbatim 5 enum 분류 + risk gating.
    AUTO_REVISION_CONTINUE 만 ANU 자동 처리.
    """
```

### 5.2 Risk gating 순서 (★ precedence)

```
Step 1: CRITICAL_ESCALATION check (★ §4.3 trigger 1, 4, 5, 6)
    ↓ no match
Step 2: CHAIR_DECISION_REQUIRED check (★ §4.3 trigger 2, 3)
    ↓ no match
Step 3: LOCK_READY check (★ Codex OVERALL PASS or PWR + remaining 0 또는 minor doc only)
    ↓ no match
Step 4: PILOT_READY_BUT_NEEDS_CHAIR check (★ Codex PILOT_READINESS READY/READY_WITH_RECOMMENDATIONS + locked_status True)
    ↓ no match
Step 5: AUTO_REVISION_CONTINUE (★ default · minor refinement only)
```

### 5.3 Auto revision drafting — bounded actions

`AUTO_REVISION_CONTINUE` 시 ANU 가 자동 수행하는 action set:

| action | bounded? | 자동 허용 |
|---|---|---|
| 신규 vN+1 task md draft 작성 | ★ vN 보존 + vN+1 별도 파일 | YES |
| Codex review 결과 marker 박제 | ★ marker JSON 박제 | YES |
| ANU self-check 작성 | ★ self-check section 박제 | YES |
| Codex round+1 재요청 | ★ codex:codex-rescue subagent 호출 | YES |
| 기존 evidence 변경 | ★ §6.2 immutable scope | **NO (★ CRITICAL_ESCALATION)** |
| 실제 dispatch / PR / push | ★ §11.4 forbidden | **NO (★ CRITICAL_ESCALATION)** |
| chair_authorization_id 재사용 | ★ 동일 task lineage 한정 | YES (★ task-2710 v1~v8 사례 정합) |
| 새 chair_authorization_id 발급 | ★ 신규 lineage 진입 | **NO (★ CHAIR_DECISION_REQUIRED)** |

### 5.4 Loop boundary — bounded iteration

| boundary | rule |
|---|---|
| max round per task lineage | **7** (★ task-2710 사례 정합 · 회장 결정 영역) |
| stagnation detection | round N axis 분포 ↔ round N-1 axis 분포 동일 + remaining ≥ N-1 시 → CHAIR_DECISION_REQUIRED |
| LOCK_READY 도달 시 | auto loop 중단 + chair 보고 |
| CRITICAL_ESCALATION 도달 시 | auto loop 즉시 중단 + chair 보고 + lock 유지 |

---

## 6. Decision Schema (★ JSON fixture 후보)

### 6.1 Input schema (★ `schemas/codex_review_input_schema.json`)

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": ["task_id", "version", "round_number", "overall_verdict", "pilot_readiness", "axis_counts", "remaining_recommendations", "locked_status", "chair_authorization_id"],
  "properties": {
    "task_id": {"type": "string", "pattern": "^task-\\d+(\\+\\d+)?$"},
    "version": {"type": "integer", "minimum": 1},
    "round_number": {"type": "integer", "minimum": 1},
    "overall_verdict": {"enum": ["PASS", "PASS_WITH_RECOMMENDATIONS", "NEEDS_REVISION", "HOLD_FOR_CHAIR"]},
    "pilot_readiness": {"enum": ["READY", "READY_WITH_RECOMMENDATIONS", "NOT_READY_WITHOUT_FOLLOWUP", "NOT_READY"]},
    "axis_counts": {"type": "object", "properties": {"pass": {"type": "integer"}, "pwr": {"type": "integer"}, "nr": {"type": "integer"}, "fail": {"type": "integer"}}},
    "remaining_recommendations": {"type": "array", "items": {"type": "string"}},
    "locked_status": {"type": "boolean"},
    "chair_authorization_id": {"type": "string"}
  }
}
```

### 6.2 Output schema (★ `schemas/codex_review_decision_output_schema.json`)

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": ["decision", "rationale", "next_action", "risk_triggers_matched", "chair_facing_summary", "audit_marker_path"],
  "properties": {
    "decision": {"enum": ["AUTO_REVISION_CONTINUE", "CHAIR_DECISION_REQUIRED", "LOCK_READY", "PILOT_READY_BUT_NEEDS_CHAIR", "CRITICAL_ESCALATION"]},
    "rationale": {"type": "string"},
    "next_action": {"type": "string"},
    "risk_triggers_matched": {"type": "array", "items": {"type": "integer", "minimum": 1, "maximum": 6}},
    "chair_facing_summary": {"type": "string"},
    "audit_marker_path": {"type": "string"}
  }
}
```

---

## 7. task-2710 사례 fixture (★ 회장 verbatim "task-2710 사례 fixture 포함")

### 7.1 round 1 fixture (★ NEEDS_REVISION + 5/5 NR)

```json
{
  "task_id": "task-2710",
  "version": 1,
  "round_number": 1,
  "overall_verdict": "NEEDS_REVISION",
  "pilot_readiness": "NOT_READY_WITHOUT_FOLLOWUP",
  "axis_counts": {"pass": 0, "pwr": 0, "nr": 5, "fail": 0},
  "remaining_recommendations": [
    "R1: §5 사전 조건 C 제거",
    "R2: §3 classifier executable화",
    "R3: §4 qc subcase 분류",
    "R4: §6 structural guard enforcement",
    "R5: §7 pilot gates 수치"
  ],
  "locked_status": false,
  "chair_authorization_id": "CHAIR-AUTH-TASK-2710-..."
}
```

**expected decision**: `AUTO_REVISION_CONTINUE` (★ minor refinement only · risk trigger 0)

### 7.2 round 6 fixture (★ PASS_WITH_RECOMMENDATIONS + PILOT_READINESS NOT_READY)

```json
{
  "task_id": "task-2710",
  "version": 6,
  "round_number": 6,
  "overall_verdict": "PASS_WITH_RECOMMENDATIONS",
  "pilot_readiness": "NOT_READY_WITHOUT_FOLLOWUP",
  "axis_counts": {"pass": 2, "pwr": 2, "nr": 1, "fail": 0},
  "remaining_recommendations": [
    "case 6 ACCEPT_WITH_KNOWN_CAVEATS enum 보강",
    "§4.3 overlap signal recording 정책",
    "§4.2 G8 reference 정정",
    "§7.5.2 case 8 tie-resolution rule"
  ],
  "locked_status": false,
  "chair_authorization_id": "CHAIR-AUTH-TASK-2710-..."
}
```

**expected decision**: `AUTO_REVISION_CONTINUE` (★ minor refinement only · risk trigger 0 · OVERALL threshold 충족이나 PILOT_READINESS 미충족)

### 7.3 round 7 fixture (★ PASS_WITH_RECOMMENDATIONS + PILOT_READINESS READY_WITH_RECOMMENDATIONS)

```json
{
  "task_id": "task-2710",
  "version": 7,
  "round_number": 7,
  "overall_verdict": "PASS_WITH_RECOMMENDATIONS",
  "pilot_readiness": "READY_WITH_RECOMMENDATIONS",
  "axis_counts": {"pass": 3, "pwr": 2, "nr": 0, "fail": 0},
  "remaining_recommendations": [
    "secondary_labels order-insensitive serialization 명시",
    "§5/§6 self-contained restatement"
  ],
  "locked_status": false,
  "chair_authorization_id": "CHAIR-AUTH-TASK-2710-..."
}
```

**expected decision**: `AUTO_REVISION_CONTINUE` (★ minor doc only · risk trigger 0 · v8 minor doc 자동 revision 가능)
※ 단 v8 후 LOCK_READY 도달 시 회장 보고 필요

### 7.4 v8 post-self-check fixture (★ LOCK_READY)

```json
{
  "task_id": "task-2710",
  "version": 8,
  "round_number": 7,
  "overall_verdict": "PASS_WITH_RECOMMENDATIONS",
  "pilot_readiness": "READY_WITH_RECOMMENDATIONS",
  "axis_counts": {"pass": 3, "pwr": 2, "nr": 0, "fail": 0},
  "remaining_recommendations": [],
  "locked_status": false,
  "chair_authorization_id": "CHAIR-AUTH-TASK-2710-..."
}
```

**expected decision**: `LOCK_READY` (★ Codex OVERALL PWR + remaining 0 · chair lock 인가 보고)

### 7.5 가상 CRITICAL_ESCALATION fixture

```json
{
  "task_id": "task-2710",
  "version": 9,
  "round_number": 8,
  "overall_verdict": "NEEDS_REVISION",
  "pilot_readiness": "NOT_READY_WITHOUT_FOLLOWUP",
  "axis_counts": {"pass": 2, "pwr": 1, "nr": 1, "fail": 1},
  "remaining_recommendations": [
    "task-2706+1 verifier marker recorded_at 를 'accepted_no_caveat' 으로 reclassify"
  ],
  "locked_status": true,
  "chair_authorization_id": "CHAIR-AUTH-TASK-2710-..."
}
```

**expected decision**: `CRITICAL_ESCALATION` (★ trigger 6 — 기존 evidence overwrite 시도)

---

## 8. Test scenarios (★ `tests/test_codex_review_loop_decider_2711.py`)

| test ID | scenario | input fixture | expected decision |
|---|---|---|---|
| T-1 | task-2710 round 1 NEEDS_REVISION 5/5 NR | §7.1 | AUTO_REVISION_CONTINUE |
| T-2 | task-2710 round 6 PASS_WITH_RECOMMENDATIONS + PILOT_READINESS NOT_READY | §7.2 | AUTO_REVISION_CONTINUE |
| T-3 | task-2710 round 7 PASS_WITH_RECOMMENDATIONS + PILOT_READINESS READY_WITH_RECOMMENDATIONS | §7.3 | AUTO_REVISION_CONTINUE |
| T-4 | task-2710 v8 post-self-check (★ remaining 0) | §7.4 | LOCK_READY |
| T-5 | task-2710 가상 CRITICAL_ESCALATION (★ evidence reclassify 요구) | §7.5 | CRITICAL_ESCALATION |
| T-6 | LOCK_READY 후 PILOT_READINESS READY + locked_status True | (★ §7.4 후속) | PILOT_READY_BUT_NEEDS_CHAIR |
| T-7 | round 8 stagnation (★ §5.4 boundary) | round 7 ↔ round 8 axis 동일 + remaining 동일 | CHAIR_DECISION_REQUIRED |
| T-8 | Critical 7 키워드 매칭 | remaining 에 `CHAIR_REQUIRED` / `Critical 7` 포함 | CRITICAL_ESCALATION |
| T-9 | forbidden path 변경 요구 | remaining 에 `add forbidden_path` 키워드 매칭 | CHAIR_DECISION_REQUIRED |
| T-10 | 실제 dispatch 요구 | remaining 에 `dispatch.py 변경` / `bot_settings.json 변경` | CRITICAL_ESCALATION |

---

## 9. Affected Files (★ 회장 인가 후 신규 작성)

| file | 작성 방향 |
|---|---|
| `scripts/anu/codex_review_loop_decider.py` (★ 신규) | §5 architecture + §6 schema validation + §3 5 enum classification |
| `tests/test_codex_review_loop_decider_2711.py` (★ 신규) | §8 10 test scenarios + §7 5 fixture |
| `schemas/codex_review_input_schema.json` (★ 신규) | §6.1 input schema |
| `schemas/codex_review_decision_output_schema.json` (★ 신규) | §6.2 output schema |
| `tests/fixtures/codex_review_2711/task-2710_round1.json` 등 (★ 신규) | §7.1~7.5 5 fixture 박제 |
| `memory/reports/task-2711.md` (★ 신규) | 보고서 |
| `memory/events/task-2711.formalization-commit-260530.json` (★ 신규) | formalization marker |
| `memory/events/task-2711.callback-envelope.json` (★ 신규) | ANU envelope |

**총 expected_files 8 개** (★ task md 본 draft 포함 시 9 개)

---

## 10. Allowed / Forbidden Files

### 10.1 expected_files (★ 본 draft 단계)

1. `memory/tasks/task-2711_draft.md` (★ 본 file)

★ 위 §9 affected files 는 **회장 인가 후 dispatch 단계**에서 작성. 본 draft 단계는 task md only.

### 10.2 allowed_existing_file_edits (★ 본 draft 단계)

- **NONE** (★ draft only · 코드 변경 0)

### 10.3 forbidden_files (★ 강제)

- `scripts/finish-task.sh`
- `scripts/session-watchdog.sh`
- `.claude/settings.json` / `/home/jay/.claude/settings.json`
- `dispatch.py` / `dispatch/__init__.py` / `dispatch/normal_fallback_callback_helper.py`
- `bot_settings.json` / `memory/bot_settings.json`
- `qc_verify.py`
- `utils/merge_queue_executor.py` / `utils/real_merge_hooks.py`
- `anu_v3/`
- `memory/capabilities/**`
- task-2706~2709+1 모든 산출물 (★ immutable historical evidence)
- `memory/tasks/task-2710.md` / `task-2710_v2~v8.md` (★ task-2710 final-locked)
- task-2710 모든 marker (★ events/task-2710.*.json)

### 10.4 forbidden_actions (★ 회장 verbatim 강제 · draft 단계)

1. 실제 코드 구현 0
2. dispatch / PR / push / merge / GitHub write 0
3. task-2709+1 추가 작업 0
4. 기존 evidence 재분류 0
5. task-2706~2709+1 evidence 변경 0
6. task-2710 추가 revision / Codex round 0
7. task-2710 chair_authorization_id 재사용 0
8. ANU 자체 dispatch 0 (★ 회장 별도 인가 대기)

### 10.5 chair_authorization_id 분리 강제 (★ 회장 verbatim)

- ★ task-2711 chair_authorization_id 는 **본 task md 작성 시 미지정** (★ `<CHAIR_TO_ASSIGN>` placeholder)
- ★ 회장 별도 결정 시 신규 발급 (★ task-2710 chair_authorization_id 재사용 0 strict)
- ★ 권장 형식: `CHAIR-AUTH-TASK-2711-ANU-CODEX-REVIEW-LOOP-DECIDER-260XXX`

---

## 11. Acceptance Criteria (★ 본 draft 단계 + 향후 dispatch 단계 분리)

### 11.1 본 draft 단계 (★ 본 round)

1. ★ task-2711 draft md 1 file 작성 (★ §10.1)
2. ★ dispatch 0 / 코드 구현 0 / PR/push/merge/GitHub write 0
3. ★ task-2710 evidence 변경 0
4. ★ task-2706~2709+1 evidence 변경 0
5. ★ task-2710 chair_authorization_id 재사용 0
6. ★ chair_authorization_id placeholder 명시 (★ 회장 결정 영역)

### 11.2 향후 dispatch 단계 (★ 회장 별도 인가 후)

1. §9 affected files 8 개 작성
2. §8 10 test scenarios PASS
3. §3 5 enum classification 정합
4. §4 risk gating precedence 정합
5. §5.4 loop boundary 정합 (★ max 7 round + stagnation detection)
6. §6 input/output schema validation
7. §7 5 fixture (★ task-2710 사례) 박제
8. forbidden_files / forbidden_actions 0 위반

---

## 12. ANU Doctrine Compliance (★ 본 draft 단계)

- ★ ANU 자체 dispatch 0 (★ 회장 verbatim 'dispatch / PR / push / merge / GitHub write는 하지 않는다')
- ★ ANU 자체 코드 구현 0
- ★ ANU 자체 chair_authorization_id 발급 0 (★ 회장 결정 영역)
- ★ task-2710 evidence 변경 0
- ★ task-2706~2709+1 evidence 변경 0
- ★ ANU 자체 새 forbidden target 추가 0 (★ §10.3 은 기존 doctrine 정합 · 신규 추가 0)
- ★ ANU 자체 새 chair_authorization scope 확장 0
- ★ ANU 자체 lock/pilot 인가 0

---

## 13. Sentinel

★ task-2711 = DRAFT_ONLY · ANU_CODEX_REVIEW_LOOP_DECIDER · 5 enum decision (AUTO_REVISION_CONTINUE / CHAIR_DECISION_REQUIRED / LOCK_READY / PILOT_READY_BUT_NEEDS_CHAIR / CRITICAL_ESCALATION) · risk gating 6 trigger · loop boundary (max 7 round + stagnation) · task-2710 7-round 사고 fixture 박제 · dispatch 0 · 코드 구현 0 · PR/push/merge/GitHub write 0 · task-2710 evidence 변경 0 · task-2706~2709+1 evidence 변경 0 · task-2710 chair_authorization_id 재사용 0 · chair_authorization_id placeholder (★ 회장 결정 영역). 끝
