# task-2710 v4 — Model upgrade policy · 4.8 future dispatch priority (READ-ONLY DESIGN DRAFT v4)

★ **READ-ONLY DESIGN DRAFT v4** — 회장 verbatim "Codex round 3 remaining recommendations 3건 전부 ACCEPT · v4 revision 인가 · pilot 불허 · locked 불허" 정합. **bot_settings.json 변경 0 · dispatch.py 변경 0 · settings.json 변경 0 · finish-task.sh 변경 0 · PR/push/merge/GitHub write/실제 dispatch 0**.

- **v1 lineage**: sha `cb99419b...` (★ 보존)
- **v2 lineage**: sha `4138b66d...` (★ 보존)
- **v3 lineage**: sha `641b852f...` (★ 보존)
- **v4 origin**: Codex round 3 remaining 3 recommendations 1:1 반영

---

## 0. Header / Authorization Anchor

- **task_id**: `task-2710`
- **task_type**: `policy_design_only`
- **chair_authorization_id**: `CHAIR-AUTH-TASK-2710-MODEL-UPGRADE-POLICY-4-8-FUTURE-DISPATCH-READ-ONLY-DESIGN-260530`
- **draft_version**: `v4`
- **draft_v1_v2_v3_preserved**: ✓
- **dispatch_status**: **NOT_DISPATCHED · READ-ONLY DESIGN v4 ONLY**
- **locked_status**: **NOT_LOCKED**

---

## 1. Goal (★ v3 유지)

> 신규 heavy judgment / verifier / executor dispatch 에서 `claude-opus-4-8` 우선 적용 가능성 검토 + `bot_settings.json` 직접 변경 금지 doctrine 과 충돌 0 안전 절차 설계 + 기존 evidence immutable historical 강제

---

## 2. Background (★ v3 유지)

ANU 본 세션 `claude-opus-4-7` · 봇 dispatch `claude-sonnet-4-6` · 4.8 ID `claude-opus-4-8` · CLAUDE.md `bot_settings.json 직접 변경 금지` doctrine.

---

## 3. Category gate — executable rule set (★ R1 verbatim 보강 · data-path/precedence fix)

### 3.1 Category enum (★ v3 유지)

```python
CATEGORY = Enum('Category', {
    'HEAVY_JUDGMENT': 'heavy_judgment',
    'VERIFIER': 'verifier',
    'EXECUTOR': 'executor',
    'EXCLUDED': 'excluded',
    'UNCLASSIFIED': 'unclassified',
})
```

### 3.2 Formal predicates — **nested data path 통일** (★ R1 verbatim 강제)

```python
def _get_allowed_existing_edits(task_md):
    """
    R1 verbatim: '참조 경로를 allowed_resources.allowed_existing_file_edits 로 통일'
    + 'task_md.get(...) 직접 참조 금지' 정합 강제.
    """
    ar = task_md.get('allowed_resources', {}) or {}
    return ar.get('allowed_existing_file_edits') or []

def _get_task_type(task_md):
    return task_md.get('task_type')

def _get_task_id(task_md):
    return task_md.get('task_id', '')

def is_heavy_judgment(task_md):
    """Predicate H: task_type ∈ HEAVY_TYPES OR (wordcount ≥ 5000 AND enum_matrix_sections ≥ 5)"""
    HEAVY_TYPES = {'policy_design_only', 'spec_design', 'classification_refinement', 'cross_domain_audit'}
    if _get_task_type(task_md) in HEAVY_TYPES:
        return True
    wc = count_words(task_md['body'])
    sections = count_enum_or_matrix_sections(task_md['body'])
    return wc >= 5000 and sections >= 5

def is_verifier(task_md):
    """
    Predicate V: task_type == 'read_only' AND id_match(task-NNNN+M) AND
    allowed_resources.allowed_existing_file_edits == [] AND team_separation_declared
    """
    if _get_task_type(task_md) != 'read_only':
        return False
    if not re.match(r'^task-\d+\+\d+$', _get_task_id(task_md)):
        return False
    if _get_allowed_existing_edits(task_md):  # ★ nested path
        return False
    return has_explicit_executor_verifier_team_separation(task_md)

def is_executor(task_md):
    """
    Predicate E: task_type ∈ EXECUTOR_TYPES OR
    allowed_resources.allowed_existing_file_edits != []
    """
    EXECUTOR_TYPES = {'code', 'system_hook', 'local_runtime', 'formalization_commit_only', 'closeout_marker_only'}
    if _get_task_type(task_md) in EXECUTOR_TYPES:
        return True
    return bool(_get_allowed_existing_edits(task_md))  # ★ nested path

def is_excluded(task_md):
    return matches_excluded_category(task_md)
```

### 3.3 Formal definitions (★ v3 §3.2 유지 · 명시화)

- **`enum_or_matrix_section`**: markdown section (## or ###) containing `enum` OR `matrix` OR `cell` OR `R[0-9]+` OR `axis` OR table with ≥ 2 comparison rows.
- **`team_separation_declared`**: task md 본문에 `executor_team` 키와 `verifier_team` 키가 모두 명시되고 두 값이 다른 team 일 때 `True`.
- **`task_id pattern`**: `^task-\d+(\+\d+)?$` · verifier 는 `+N` suffix 강제.
- **`allowed_existing_file_edits`**: **`allowed_resources.allowed_existing_file_edits`** (★ nested · None → [] normalize)

### 3.4 detect_category() — **precedence rule code 정합 강제** (★ R1 verbatim 강제)

★ R1 verbatim "§3.4와 detect_category() 결과가 불일치하지 않도록 pseudo-code를 수정한다" 정합:

```python
def detect_category(task_md):
    """
    Precedence: EXCLUDED > HEAVY_JUDGMENT > VERIFIER_EXECUTOR_OVERLAP_CHECK > VERIFIER > EXECUTOR > UNCLASSIFIED
    R1 verbatim: verifier + executor overlap → UNCLASSIFIED 강제.
    """
    # Step 1: EXCLUDED 최우선 (0th)
    if is_excluded(task_md):
        return CATEGORY.EXCLUDED

    # Step 2: HEAVY_JUDGMENT (1st)
    if is_heavy_judgment(task_md):
        return CATEGORY.HEAVY_JUDGMENT

    # Step 3: ★ R1 verbatim — verifier + executor overlap detection FIRST
    # task_type == 'read_only' but allowed_existing_file_edits non-empty → UNCLASSIFIED
    # (verifier shape with executor write behavior = structural inconsistency)
    if _get_task_type(task_md) == 'read_only' and _get_allowed_existing_edits(task_md):
        return CATEGORY.UNCLASSIFIED  # ★ R1 verbatim "verifier+executor overlap은 UNCLASSIFIED로 강제"

    # Step 4: VERIFIER (2nd) — overlap 이미 제거된 후
    if is_verifier(task_md):
        return CATEGORY.VERIFIER

    # Step 5: EXECUTOR (3rd)
    if is_executor(task_md):
        return CATEGORY.EXECUTOR

    # Step 6: UNCLASSIFIED → HOLD_FOR_CHAIR
    return CATEGORY.UNCLASSIFIED
```

### 3.5 Precedence rule table (★ §3.4 ↔ detect_category() 정합 강제)

| overlap case | rule | detect_category() result |
|---|---|---|
| heavy_judgment + verifier | heavy_judgment 우선 | HEAVY_JUDGMENT (★ Step 2) |
| heavy_judgment + executor | heavy_judgment 우선 | HEAVY_JUDGMENT (★ Step 2) |
| **verifier shape + executor write** (★ task_type=read_only + non-empty allowed_edits) | UNCLASSIFIED 강제 | UNCLASSIFIED (★ Step 3 · R1 verbatim) |
| excluded + 다른 모든 case | excluded 0th | EXCLUDED (★ Step 1) |
| executor only | executor | EXECUTOR (★ Step 5) |
| verifier only (★ overlap 없음) | verifier | VERIFIER (★ Step 4) |
| 모두 매칭 안됨 | UNCLASSIFIED → HOLD_FOR_CHAIR | UNCLASSIFIED (★ Step 6) |

### 3.6 R1 self-check (★ Codex round 3 AXIS_2 FAIL 영역 정합)

| Codex round 3 지적 | v4 반영 |
|---|---|
| `task_md.get('allowed_existing_file_edits')` data path mismatch | §3.2 `_get_allowed_existing_edits()` helper + nested `allowed_resources.allowed_existing_file_edits` 통일 |
| §3.4 ↔ `detect_category()` 불일치 (verifier+executor → UNCLASSIFIED 미강제) | §3.4 Step 3 verifier+executor overlap detection FIRST 추가 · UNCLASSIFIED 반환 강제 |

---

## 4. Excluded category — qc_verifier subcase matrix 확장 (★ R2 verbatim 보강)

### 4.1 Confirmed exclusions 3 (★ v3 유지)

| category | LLM judgment | 분류 |
|---|---|---|
| `simple_routing` | 0 | EXCLUDED |
| `diagnostic / scope_guard` | 0 | EXCLUDED |
| `callback_helper` | 0 | EXCLUDED |

### 4.2 qc_verifier subcase decision matrix — **9 subcase 확장** (★ R2 verbatim 강제)

| qc_verifier subcase | LLM judgment | 분류 | rationale |
|---|---|---|---|
| `qc_verify.py severity_badge` | 0 | EXCLUDED | numeric/boolean check |
| `qc_verify.py file_count` | 0 | EXCLUDED | numeric check |
| `qc_verify.py tdd_check` | 0 | EXCLUDED | file count + presence boolean |
| `gemini_review_check` | YES | **4.8 candidate (heavy_judgment subcategory)** | external review interpretation |
| `browser_verify` | YES | **4.8 candidate** | screenshot/Playwright artifact interpretation |
| `security_audit` (Loki adversarial) | YES | **4.8 candidate** | adversarial judgment |
| `policy_judgment` (doctrine compliance interpretation) | YES | **4.8 candidate** | LLM judgment 본질 |
| `evidence_trust_judgment` (source attribution interpretation) | YES | **4.8 candidate** | external evidence trust |
| `critical_7_interpretation` (Critical 7 분류 결정) | YES | **4.8 candidate** | LLM-mediated classification |
| **`merge_readiness_judgment`** (★ R2 신규 verbatim) | YES (★ policy + Critical 7 + evidence trust 복합) | **4.8 candidate** | LLM judgment + policy + Critical 7 interpretation 포함 |
| **`lineage_rewrite_detection`** (★ R2 신규 verbatim) | YES (★ evidence trust + policy 복합) | **4.8 candidate** | evidence trust + lineage rewrite policy judgment 포함 |
| **`owner_nudge_interpretation`** (★ R2 신규 verbatim) | YES (★ policy + evidence trust 복합) | **4.8 candidate** | OWNER nudge action policy + evidence trust interpretation 포함 |

### 4.3 Subcase classifier decision rule — 12 subcase 처리 (★ R2 verbatim · "decision matrix 추가")

```python
def classify_qc_subcase(qc_call):
    """
    9 LLM-judgment subcases → 4.8 candidate
    3 deterministic subcases → EXCLUDED
    Unknown subcases → UNCLASSIFIED (★ HOLD_FOR_CHAIR)
    R2 verbatim: merge_readiness/lineage_rewrite/owner_nudge subcase 명시.
    """
    LLM_JUDGMENT_SUBCASES = {
        'gemini_review_check',
        'browser_verify',
        'security_audit',
        'policy_judgment',
        'evidence_trust_judgment',
        'critical_7_interpretation',
        'merge_readiness_judgment',      # ★ R2 verbatim 신규
        'lineage_rewrite_detection',     # ★ R2 verbatim 신규
        'owner_nudge_interpretation',    # ★ R2 verbatim 신규
    }
    DETERMINISTIC_SUBCASES = {
        'severity_badge',
        'file_count',
        'tdd_check',
    }
    if qc_call.subcase in LLM_JUDGMENT_SUBCASES:
        return CATEGORY.HEAVY_JUDGMENT  # ★ 4.8 candidate
    if qc_call.subcase in DETERMINISTIC_SUBCASES:
        return CATEGORY.EXCLUDED
    return CATEGORY.UNCLASSIFIED  # ★ HOLD_FOR_CHAIR
```

### 4.4 Category 이동 규칙 (★ R2 verbatim "별도 category 이동 규칙")

- LLM_JUDGMENT_SUBCASES 매칭 → `qc_verifier` 진입이지만 분류는 `HEAVY_JUDGMENT` cascade
- DETERMINISTIC_SUBCASES 매칭 → `EXCLUDED` 유지 (★ 4.8 적용 0)
- 매칭 0 → `UNCLASSIFIED` → 회장 결정 영역 (★ pilot 진입 0)

### 4.5 R2 self-check (★ Codex round 3 AXIS_3 NEEDS_REFINEMENT 영역)

| Codex round 3 지적 | v4 반영 |
|---|---|
| merge-readiness judgment 부재 | §4.2 `merge_readiness_judgment` 신규 추가 · §4.3 LLM_JUDGMENT_SUBCASES 포함 |
| lineage-rewrite detection 부재 | §4.2 `lineage_rewrite_detection` 신규 · §4.3 포함 |
| OWNER-nudge interpretation 부재 | §4.2 `owner_nudge_interpretation` 신규 · §4.3 포함 |
| out-of-qc-scope 처리 규칙 부재 | §4.4 category 이동 규칙 명시 |

---

## 5. Method A (overlay) — 사전 조건 A/B (★ v3 유지)

(★ v3 §5 verbatim · R1 round 2 ACCEPTED 영역 변경 없음)

### 5.1 Method A = overlay (NOT bypass)

bot_settings.json 디스크 변경 0 · in-memory overlay 1회.

### 5.2 사전 조건 A/B 만

- **A**: 기존 bot_settings.json 에서 4.8-capable bot 또는 route 명시적 존재
- **B**: chair-authorized per-dispatch overlay

### 5.3 사전 조건 C 제거 (★ v3 유지)

API 응답 가능성 = pilot runtime check 만 · bot_settings 우회 근거로 사용 0.

---

## 6. Structural enforcement rules (★ v3 유지)

(★ v3 §6 verbatim · R4 round 2 PASS_WITH_RECOMMENDATIONS 영역)

### 6.1 Enforcement rules E1~E5 (★ v3 유지)

E1: old task id targeting 차단 · E2: --resume + 4.8 차단 · E3: evidence overwrite 차단 · E4: immutable path-scope 명시 · E5: fresh task ID 강제

### 6.2 Immutable path-scope 8 axis (★ v3 유지)

closeout markers / verifier markers / dispatched markers / verifier reports / task md / capability snapshots / callback envelopes / decision files

---

## 7. Pilot pre-acceptance gates (★ R3 verbatim 보강 · G5 baseline 결정성 확정)

### 7.1 G1 — fallback-on-API-500 (★ v3 유지)

4.8 API 500 → 4.6 retry 1회 + audit marker

### 7.2 G2 — fallback-on-no-4.8-capable-route (★ v3 유지)

§5.2 A/B 미충족 → 4.6 default + audit marker

### 7.3 G3 — cost ceiling (★ v3 유지 · 회장 verbatim 확정)

- 상대: 동일급 baseline +50% 초과 금지
- 절대: 1회 pilot $15 초과 금지

### 7.4 G4 — latency ceiling (★ v3 유지 · 회장 verbatim 확정)

- 상대: 동일급 baseline +50% 초과 금지
- 절대: 1회 pilot wall time 20분 초과 금지

### 7.5 G5 — baseline 결정성 확정 (★ R3 verbatim 강제)

#### 7.5.1 필수 baseline 3건 (★ R3 verbatim 1:1)

| slot | 분류 | 선정 규칙 |
|---|---|---|
| **slot 1** | 최근 verifier task 1건 | task-2706+1 / 2707+1 / 2708+1 / 2709+1 중 **가장 최근 완료 + ACCEPT_WITH_KNOWN_CAVEATS 이상 verdict 박힌 1건** |
| **slot 2** | 최근 executor task 1건 | task-2706 / 2707 / 2708 / 2709 중 **가장 최근 commit + accepted closeout 박힌 1건** |
| **slot 3** | 최근 heavy_judgment 또는 Codex-review task 1건 | task-2710 v1/v2/v3 Codex review markers 중 **가장 최근 round 1건** |

#### 7.5.2 4번째 후보 (★ R3 verbatim "보조 비교값으로만 사용")

- 4번째 후보 = §7.5.1 slot 1/2/3 외 가장 최근 1건
- 사용 방식: **secondary comparison only** (★ primary baseline 3건에는 미포함)
- secondary 값이 primary 와 충돌 시 → §7.5.4 보수적 기준 적용

#### 7.5.3 baseline 3건 확보 실패 (★ R3 verbatim "확보 못하면 pilot dispatch 금지")

- slot 1/2/3 중 1건이라도 결격 시 → **pilot dispatch 0 강제** (★ HOLD_FOR_CHAIR)
- 결격 사유: 산출물 부재 / sha256 변동 감지 / final verdict REJECT / HOLD_FOR_CHAIR

#### 7.5.4 tie / conflicting baseline 처리 — 보수적 기준 (★ R3 verbatim "더 보수적인 기준")

★ R3 verbatim "보수적 기준이란 cost/wall time/output tokens/API error/retry count/evidence mutation count에서 pilot 허용 폭이 더 좁은 값을 뜻한다"

| 비교 항목 | 보수적 기준 (★ pilot 허용 폭이 더 좁은 값) |
|---|---|
| `cost` | baseline 중 **최저 cost** 기준으로 +50% / $15 limit 적용 (★ 더 낮은 base → 더 좁은 허용) |
| `wall_time` | baseline 중 **최단 wall_time** 기준으로 +50% / 20분 limit 적용 |
| `output_tokens` | baseline 중 **최소 output_tokens** 기준으로 비교 |
| `api_error` | baseline 중 **최저 api_error count** 기준으로 비교 (★ 더 적은 base → 더 엄격) |
| `retry_count` | baseline 중 **최저 retry_count** 기준으로 비교 |
| `evidence_mutation_count` | baseline 중 **최저 evidence_mutation count** 기준 (★ 0 이 baseline 정합) |

### 7.6 G6 — evidence integrity hash scope (★ v3 유지)

pre/post hash sweep 7 path scope (events / reports / tasks / capabilities / decision / envelope / dispatched).

### 7.7 R3 self-check (★ Codex round 3 AXIS_5 NEEDS_REFINEMENT 영역)

| Codex round 3 지적 | v4 반영 |
|---|---|
| "verifier 4건 중 최소 3건 선택" 결정성 부족 | §7.5.1 slot 1/2/3 명시 (verifier / executor / heavy_judgment_or_Codex_review) |
| which 3 + selection rule 미명시 | §7.5.1 선정 규칙 verbatim (★ 최근 완료 + verdict 박힘 기준) |
| fewer-than-3 fallback 미명시 | §7.5.3 pilot dispatch 0 강제 |
| tie/selection handling 미명시 | §7.5.4 보수적 기준 6 metric 매핑 |

---

## 8. Acceptance Criteria (★ v3 §8 + v4 추가)

1. ★ R1~R3 (★ Codex round 3 remaining 3 recommendations) 1:1 반영
2. ★ §3 data-path 통일 + precedence rule code ↔ table 정합
3. ★ §4 qc_verifier 12 subcase decision matrix (9 LLM + 3 deterministic)
4. ★ §7.5 G5 baseline 결정성 확정 (slot 1/2/3 + 4번째 후보 secondary + 결격 시 pilot 0 + 보수적 기준)
5. ★ §3 / §4 / §7 외 v3 영역 (Method A / 사전 조건 A/B / E1~E5 / immutable path-scope / G1/G2/G3/G4/G6) 변경 0
6. ★ bot_settings.json / dispatch.py / settings.json / finish-task.sh 변경 0
7. ★ PR / push / merge / GitHub write / 실제 dispatch 0
8. ★ task-2706~2709+1 evidence overwrite 0
9. ★ v1 / v2 / v3 모두 보존 · revert 0
10. ★ Codex round 4 OVERALL PASS / PASS_WITH_RECOMMENDATIONS 까지 locked 0 / pilot 0

---

## 9. v3 → v4 diff summary

| v3 영역 | v4 변경 | rationale |
|---|---|---|
| §3.2 `task_md.get('allowed_existing_file_edits')` | `_get_allowed_existing_edits()` helper · `allowed_resources.allowed_existing_file_edits` 통일 | Codex round 3 AXIS_2 data path mismatch · R1 verbatim |
| §3.4 `detect_category()` precedence rule | Step 3 verifier+executor overlap detection FIRST 추가 · UNCLASSIFIED 강제 | Codex round 3 AXIS_2 precedence rule code 불일치 · R1 verbatim |
| §3.5 (신규) precedence rule table | §3.4 ↔ table 정합 강제 | R1 verbatim |
| §4.2 qc_verifier 9 subcase | **12 subcase** 확장 (merge_readiness / lineage_rewrite / owner_nudge 신규) | Codex round 3 AXIS_3 · R2 verbatim |
| §4.3 `classify_qc_subcase()` | 9 LLM_JUDGMENT_SUBCASES 확장 | R2 verbatim |
| §4.4 (신규) category 이동 규칙 | LLM_JUDGMENT → HEAVY_JUDGMENT cascade · DETERMINISTIC → EXCLUDED · 미매칭 → UNCLASSIFIED | R2 verbatim "별도 category 이동 규칙" |
| §7.5 "verifier 4건 중 최소 3건" | slot 1 verifier / slot 2 executor / slot 3 heavy_judgment_or_Codex_review 명시 | Codex round 3 AXIS_5 G5 결정성 · R3 verbatim |
| §7.5 4번째 후보 처리 | "secondary comparison only" 명시 | R3 verbatim |
| §7.5 결격 시 처리 | pilot dispatch 0 강제 (HOLD_FOR_CHAIR) | R3 verbatim |
| §7.5 tie/conflicting | 보수적 기준 6 metric 매핑 | R3 verbatim |
| §5/§6/§7.1-7.4/§7.6 | **변경 0** (★ v3 PASS / PASS_WITH_RECOMMENDATIONS 영역 보존) | R1 round 2 PASS / R4 round 2 PWR / G3/G4 round 3 PASS 영역 |

---

## 10. R1~R3 (Codex round 3 remaining) self-check

| ID | Codex round 3 remaining recommendation | v4 반영 위치 | status |
|---|---|---|---|
| **R1** | §3 data-path 통일 + verifier+executor → UNCLASSIFIED + precedence code 정합 | §3.2 `_get_allowed_existing_edits()` / §3.4 Step 3 / §3.5 table / §3.6 self-check | ✓ ACCEPTED |
| **R2** | qc coverage 확장 (merge-readiness / lineage-rewrite / OWNER-nudge) + category 이동 규칙 | §4.2 신규 3 subcase / §4.3 9 LLM SUBCASES / §4.4 이동 규칙 / §4.5 self-check | ✓ ACCEPTED |
| **R3** | G5 baseline 결정성 (slot 1/2/3 + 4번째 secondary + 결격 시 pilot 0 + 보수적 기준) | §7.5.1 / §7.5.2 / §7.5.3 / §7.5.4 / §7.7 self-check | ✓ ACCEPTED |

**총 3/3 ACCEPTED**

---

## 11. Allowed / Forbidden Files

### 11.1 expected_files (★ 본 v4 round)

1. `memory/tasks/task-2710_v4.md`
2. `memory/events/task-2710.v4-revision-created-260530.json` (★ 본 marker)
3. `memory/events/task-2710.v4-codex-round-4-rereview-result-260530.json` (★ Codex round 4)

### 11.2 allowed_existing_file_edits

- **NONE** (★ v1/v2/v3 보존 · 코드 변경 0)

### 11.3 forbidden_files (★ v3 §11.3 verbatim + v4 추가)

- `bot_settings.json` / `memory/bot_settings.json`
- `dispatch.py` / `dispatch/__init__.py` / `dispatch/normal_fallback_callback_helper.py`
- `scripts/finish-task.sh` / `scripts/task-scope-guard.sh` / `scripts/session-watchdog.sh`
- `.claude/settings.json` / `/home/jay/.claude/settings.json`
- `scripts/harness/v36/dispatch_marker_writer.py` / `scripts/harness/v36/callback_preregistration.py`
- `tests/test_allowed_resources_paths_normalization.py`
- `qc_verify.py` / `teams/shared/qc_verify.py`
- `utils/merge_queue_executor.py` / `utils/real_merge_hooks.py`
- `anu_v3/`
- `memory/capabilities/**`
- task-2706~2709+1 모든 산출물 (★ immutable historical)
- `memory/tasks/task-2710.md` (★ v1)
- `memory/tasks/task-2710_v2.md` (★ v2)
- `memory/tasks/task-2710_v3.md` (★ v3)
- 모든 production code

### 11.4 forbidden_actions (★ 회장 verbatim 6 강제 · v3 유지)

1. bot_settings.json / dispatch.py / settings.json / finish-task.sh 변경 0
2. PR / push / merge / GitHub write / 실제 dispatch 0
3. pilot dispatch 0
4. task-2710 locked 선언 0
5. 4.8 소급 적용 0
6. task-2709+1 추가 작업 0

---

## 12. ANU Doctrine Compliance

- ★ ANU 자체 v1/v2/v3 modification 0
- ★ ANU 자체 코드 구현 0
- ★ ANU 자체 모델 설정 변경 0
- ★ ANU 자체 pilot dispatch 0
- ★ ANU 자체 locked 선언 0
- ★ ANU 자체 분류 결정 0 (★ R1~R3 모두 회장 verbatim 매핑)
- ★ task-2706~2709+1 evidence overwrite 0
- ★ ANU 자체 OVERALL PASS 선언 0 (★ Codex round 4 결과 박제만)

---

## 13. Sentinel

★ task-2710 v4 = read-only design draft v4 · Codex round 3 remaining 3 recommendations 1:1 반영 (★ R1 data-path/precedence · R2 qc coverage 12 subcase · R3 G5 baseline 결정성) · bot_settings.json 변경 0 · dispatch.py 변경 0 · settings.json 변경 0 · finish-task.sh 변경 0 · 코드 구현 0 · pilot dispatch 0 · locked 선언 0 · v1/v2/v3 보존 · task-2706~2709+1 evidence overwrite 0. Codex round 4 PASS / PASS_WITH_RECOMMENDATIONS 전까지 pilot 0. 끝
