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

★ **READ-ONLY DESIGN DRAFT v2** — 회장 verbatim "Codex required revision 5 건 전부 ACCEPT · v2 revision 진행 인가 · pilot dispatch 계속 불허 · locked 선언 아직 불허" 정합. **bot_settings.json 변경 0 · dispatch.py 변경 0 · settings.json 변경 0 · finish-task.sh 변경 0 · PR / push / merge / GitHub write / 실제 dispatch 0**.

- **v1 lineage**: `memory/tasks/task-2710.md` sha256 `cb99419bbe8cce36e6dedeb415723c5fcb36a4625ba5368feb283fa84a891b7b` (★ 보존 · revert 0)
- **v2 origin**: R1~R5 verbatim Codex required revisions 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` (★ 회장 verbatim 확정)
- **draft_version**: `v2`
- **draft_v1_lineage_preserved**: `memory/tasks/task-2710.md` sha256 `cb99419bbe8cce36e6dedeb415723c5fcb36a4625ba5368feb283fa84a891b7b`
- **dispatch_status**: **NOT_DISPATCHED · READ-ONLY DESIGN v2 ONLY**
- **locked_status**: **NOT_LOCKED** (★ 회장 verbatim 'locked 선언 아직 불허')
- **anu_collector_key**: `c119085addb0f8b7`

---

## 1. Goal (★ v1 §1 유지 + R4 보강 영역 안내)

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

---

## 2. Background — 현재 모델 상태 (★ v1 §2 verbatim 유지)

| dispatch | model_router 권장 | bot 실제 model |
|---|---|---|
| task-2706 / 2707 / 2708 / 2709 (executor) | claude-opus-4-6 | claude-sonnet-4-6 |
| task-2706+1 / 2707+1 / 2708+1 / 2709+1 (verifier) | — | claude-sonnet-4-6 |

- ANU 본 세션: `claude-opus-4-7`
- Opus 4.8 model ID: `claude-opus-4-8`
- CLAUDE.md doctrine: `bot_settings.json 모델 설정을 직접 변경하지 마세요`

---

## 3. Category gate — machine-decidable rule set (★ R2 verbatim 보강)

### 3.1 4.8 우선 적용 3 category (★ machine-decidable rule)

| category | machine-decidable detection rule | precedence |
|---|---|---|
| **heavy_judgment** | task md `task_type IN {policy_design_only, spec_design, classification_refinement, cross_domain_audit}` **OR** task md 본문 wordcount ≥ 5000 + ≥ 5 enum/matrix sections | 1st (highest) |
| **verifier** | task md `task_type == read_only` **AND** task id pattern `task-NNNN+M` **AND** §5.2 `allowed_existing_file_edits == []` **AND** `executor` 와 `verifier` team 분리 명시 | 2nd |
| **executor** | task md `task_type IN {code, system_hook, local_runtime, formalization_commit_only, closeout_marker_only}` **AND** §5.2 `allowed_existing_file_edits != []` (★ structural write behavior 시그널) | 3rd |

### 3.2 precedence rule (★ R2 verbatim · overlap 해소)

1. **Precedence A**: heavy_judgment vs verifier — task가 둘 다 만족 시 (예: task-2710 자체) → **heavy_judgment 우선** (★ design/policy 본질 우선)
2. **Precedence B**: verifier vs executor — verifier가 더 강한 시그널 (★ `allowed_existing_file_edits == []` structural test 우선)
3. **Precedence C**: executor + helper coexist in single dispatch → **executor 분류** (★ write behavior 시그널 우선 · helper subsection은 별도 dispatch 권장)

### 3.3 structural verifier ↔ executor test (★ R2 verbatim 추가 acceptance · §7 정합)

```python
def detect_category(task_md_dict):
    task_type = task_md_dict.get('task_type')
    allowed_edits = task_md_dict.get('allowed_existing_file_edits', [])
    # precedence A
    if task_type in {'policy_design_only', 'spec_design', 'classification_refinement', 'cross_domain_audit'}:
        return 'heavy_judgment'
    # precedence B (verifier vs executor)
    if task_type == 'read_only' and not allowed_edits:
        return 'verifier'
    # precedence C
    if task_type in {'code', 'system_hook', 'local_runtime', 'formalization_commit_only', 'closeout_marker_only'} or allowed_edits:
        return 'executor'
    return 'unclassified'  # ★ 회장 결정 영역
```

★ 실 구현은 별도 task (★ 본 v2 = design only).

### 3.4 self-classification dogfooding

- task-2710 자체 = `heavy_judgment` (★ §3.1 precedence A · `policy_design_only` 매핑)

---

## 4. Excluded category — narrow화 (★ R3 verbatim 보강)

### 4.1 confirmed exclusions 3 (★ 유지)

| category | 제외 사유 | confidence |
|---|---|---|
| `simple_routing` | dispatch.py routing classifier · lightweight string matching | HIGH (★ LLM judgment 0) |
| `diagnostic` / `scope_guard` | scripts/task-scope-guard.sh · bash 로직 · deterministic file path matching | HIGH (★ LLM judgment 0) |
| `callback_helper` | dispatch/normal_fallback_callback_helper.py · helper subprocess · deterministic argv 생성 | HIGH (★ LLM judgment 0) |

### 4.2 narrow qc_verifier (★ R3 verbatim 박제)

| qc_verifier subcase | 분류 | rationale |
|---|---|---|
| `qc_verify.py` deterministic rule check (★ severity badge, count, file count) | **EXCLUDED** | LLM judgment 0 · numeric/boolean check |
| `qc_verify.py` audit-trail change detection (★ tdd_check) | **EXCLUDED** | file count + presence check · deterministic |
| `gemini_review_check` | **★ 4.8 candidate (heavy_judgment subcategory)** | LLM judgment 포함 · external evidence interpretation |
| `browser_verify` | **★ 4.8 candidate (heavy_judgment subcategory)** | screenshot/Playwright artifact interpretation · LLM judgment 가능 |
| `security_audit` (★ Loki 레드팀) | **★ 4.8 candidate (heavy_judgment subcategory)** | adversarial judgment · LLM 능력 의존 |
| `policy_judgment` (★ doctrine compliance interpretation) | **★ 4.8 candidate (heavy_judgment subcategory)** | LLM judgment 본질적 |

### 4.3 routing 정합

- qc_verifier 진입 시 internal subcase classifier 가 LLM judgment 포함 path 분리 → 해당 subcase는 §3 heavy_judgment 분류로 cascade
- 실 구현은 별도 task (★ 본 v2 = design only)

---

## 5. Method A (overlay) — 정확한 정의 (★ R1 verbatim 보강)

### 5.1 Method A 정의 (★ R1 verbatim 강제)

- ★ **per-dispatch override는 `bot_settings.json` bypass 가 아니라 overlay 다**
- 동작 흐름:
  1. dispatch.py 가 `_read_bot_models()` 로 `bot_settings.json` 기존 model 읽음
  2. CLI flag `--model claude-opus-4-8` 가 주어진 경우 + task category 가 §3.1 3 category 매핑
  3. **허용된 task/category 범위에서 model field 만 일시 overlay** (★ in-memory · 디스크 변경 0)
  4. overlay 결과로 봇 dispatch · bot_settings.json 파일은 **변경 0**
- bot_settings.json **직접 변경은 계속 금지** (★ CLAUDE.md doctrine 유지)

### 5.2 사전 조건 (★ R1 verbatim 강제)

- ★ **4.8-configured bot 또는 4.8-capable route 가 사전에 존재해야 한다**
- 사전 조건 충족 방식 후보:
  - **사전 조건 A**: bot_settings.json 에 4.8-capable bot 1+ 명시 (★ 회장 별도 인가 후 별도 task 로 추가 · 본 v2 영역 외)
  - **사전 조건 B**: dispatch.py model_router 가 4.8 route 인식 (★ 별도 task)
  - **사전 조건 C**: Anthropic API 자체가 `claude-opus-4-8` model ID 응답 가능 (★ system prompt verbatim 정합 확인)
- 사전 조건 미충족 시 → §7 fallback-on-no-4.8-capable-route 발동 (★ §7 정합)

### 5.3 충돌 0 5 axis (★ R1 verbatim 강제)

| axis | 본 Method A 처리 | doctrine 정합 |
|---|---|---|
| bot_settings.json 디스크 변경 | 0 | ★ CLAUDE.md doctrine 유지 |
| in-memory overlay | 1회 per-dispatch | ★ doctrine 충돌 0 (★ 디스크 변경 없음) |
| 다른 봇 / 다른 task model 영향 | 0 | ★ scope isolated |
| ANU 자체 변경 | 0 | ★ ANU strict 정합 |
| 회장 인가 의무 | per-pilot dispatch 별도 | ★ 회장 별도 인가 영역 |

### 5.4 회장 verbatim 강제 정합

★ 본 §5 = R1 verbatim 1:1 반영:
- ✓ "per-dispatch override는 bot_settings.json bypass가 아니라 overlay로 명시"
- ✓ "기존 bot_settings.json을 읽은 뒤, 허용된 task/category 범위에서 model field만 일시 overlay"
- ✓ "4.8-configured bot 또는 4.8-capable route가 사전에 존재해야 한다는 조건"
- ✓ "bot_settings.json 직접 변경은 계속 금지"

---

## 6. No-retroactive structural guard (★ R4 verbatim 보강)

### 6.1 textual promise → structural guard 전환 (★ R4 verbatim 강제)

| structural guard 항목 | 차단 대상 | 차단 방식 후보 (★ 별도 task 구현) |
|---|---|---|
| `--resume` 차단 | 4.8 pilot 시 `--resume <old session id>` 사용 | dispatch.py wrapper layer 가 4.8 + --resume 조합 검출 시 reject |
| manual session targeting 차단 | 4.8 pilot 시 task-2706~2709+1 session ID 직접 target | session ID prefix check · old lineage IDs 거부 |
| old task ID targeting 차단 | task-2706 ~ task-2709+1 ID 를 task-id argument 로 4.8 dispatch | dispatch.py 가 task-id whitelist check · pilot 은 fresh task ID 만 |
| old evidence overwrite 차단 | task-2706~2709+1 산출물 (decision/report/envelope/marker) overwrite | file-level immutable bit 또는 git baseline sha 강제 |
| immutable historical evidence 선언 | task-2706~2709+1 모든 lineage | 본 §6.2 verbatim 박제 |

### 6.2 task-2706 ~ task-2709+1 evidence = **immutable historical evidence** (★ R4 verbatim 강제)

다음 evidence 는 4.8 pilot / future dispatch / 모든 후속 작업에서 **immutable historical** 로 고정한다:

- `memory/events/p1a_task_md_sha_contract_accepted_with_known_caveats_260529.json` (P1-A)
- `memory/events/p1b_finish_task_profile_contract_accepted_with_known_caveats_260529.json` (P1-B)
- `memory/events/c1_dispatch_marker_writer_formalization_accepted_with_known_caveats_chair_closeout_260529.json` (C1)
- `memory/events/p2a_callback_before_failfast_pre_registration_layer_accepted_with_known_caveats_chair_closeout_260529.json` (P2-A)
- `memory/events/task-2709plus1_accept_with_known_caveats_direct_recovery_closed_chair_closeout_260530.json` (task-2709+1)
- `memory/events/task-2709+1.api500-postprocessing-interrupted-infra-caveat-260530.json` (infra caveat)
- `memory/events/task-2706+1.decision.json` / `task-2707+1.decision.json` / `task-2708+1.decision.json` / `task-2709+1.decision.json` (verifier decisions)
- `memory/reports/task-2706+1.md` / `task-2707+1.md` / `task-2708+1.md` / `task-2709+1.md` (verifier reports)
- `memory/events/task-2706.dispatched-spawn-verified-260529.json` ~ `task-2709.dispatched-spawn-verified-260529.json` (★ 5 SPAWN_VERIFIED markers)
- 봇 git commits: `b5f65244` (task-2707) / `b8f9276d` 외 4건 (task-2708) / `50bdce87` 외 2건 (task-2709)

### 6.3 fresh task ID 강제 (★ R4 verbatim)

- 4.8 pilot 은 **fresh task ID 만 허용** (★ task-2710 이후 신규 ID · 회장 별도 인가 task)
- pilot 산출물 = 신규 marker · 기존 lineage marker 변경 0

### 6.4 회장 verbatim 정합

★ 본 §6 = R4 verbatim 1:1 반영:
- ✓ "textual promise만 부족"
- ✓ "--resume, manual session targeting, old task id targeting, old evidence overwrite 차단 structural guard 설계"
- ✓ "4.8 pilot은 fresh task ID에서만 가능"
- ✓ "task-2706~2709+1 evidence는 immutable historical evidence로 고정"

---

## 7. Acceptance Criteria + pilot pre-acceptance gates (★ R2/R5 verbatim 보강)

### 7.1 v2 design draft acceptance criteria (★ 본 round)

1. ★ R1~R5 verbatim 1:1 반영 (★ §5/§3/§4/§6/§7.2)
2. ★ §3.1 machine-decidable rule set + §3.2 precedence + §3.3 structural test 박제
3. ★ §4.2 qc_verifier narrow화 (★ 4 subcase 4.8 candidate 분리)
4. ★ §5 Method A overlay 정의 + 사전 조건
5. ★ §6 structural no-retroactive guard 5 항목
6. ★ §7.2 6 pilot gates 박제
7. ★ bot_settings.json / dispatch.py / settings.json / finish-task.sh 변경 0
8. ★ PR / push / merge / GitHub write / 실제 dispatch 0
9. ★ task-2706~2709+1 evidence overwrite 0
10. ★ Codex 재검토 OVERALL PASS 또는 PASS_WITH_RECOMMENDATIONS 까지 locked 0 / pilot 0

### 7.2 pilot pre-acceptance 6 gates (★ R5 verbatim 강제)

pilot dispatch **전** 반드시 충족:

| gate | 정의 | 측정 / 강제 방식 |
|---|---|---|
| **G1: fallback-on-API-500** | pilot 봇이 4.8 API 500 응답 시 4.6 으로 자동 fallback · pilot session 자체는 계속 | dispatch.py wrapper 가 status 500 detect → model overlay 해제 + 4.6 retry 1회 |
| **G2: fallback-on-no-4.8-capable-route** | §5.2 사전 조건 미충족 시 4.8 우선 적용 skip + 4.6 default 진행 | dispatch.py 가 사전 조건 check 후 silent fallback + audit marker |
| **G3: cost ceiling** | 4.8 token cost 한계 정의 (★ token cost X% 초과 시 abort) | per-dispatch token counter + threshold (회장 결정 영역) |
| **G4: latency ceiling** | 4.8 응답 시간 한계 정의 (★ N seconds 초과 시 abort + 4.6 fallback) | dispatch.py timeout (회장 결정 영역) |
| **G5: regression comparison baseline** | pilot 결과 vs task-2706~2709+1 baseline 비교 | verifier decision verdict + acceptance count 비교 박제 |
| **G6: post-pilot evidence integrity verification** | pilot 후 task-2706~2709+1 산출물 sha256 동일 강제 (★ overwrite 0 증명) | sha256sum 사전/사후 비교 박제 |

### 7.3 회장 verbatim 정합

★ 본 §7 = R2 verbatim acceptance + R5 verbatim 6 gates 1:1 반영:
- ✓ "verifier와 executor 구조 테스트 항목을 acceptance criteria에 추가" (★ §7.1 #2)
- ✓ "fallback-on-API-500 / fallback-on-no-4.8-capable-route / cost ceiling / latency ceiling / regression comparison baseline / post-pilot evidence integrity verification" (★ §7.2 G1~G6)

---

## 8. Allowed / Forbidden Files (★ v1 §6 + v2 추가)

### 8.1 expected_files (★ 본 v2 round)

1. `memory/tasks/task-2710_v2.md` (★ 본 file · v2 design draft)
2. `memory/events/task-2710.v2-revision-created-260530.json` (★ v2 revision marker)
3. `memory/events/task-2710.v2-codex-rereview-result-260530.json` (★ Codex 재검토 결과)

### 8.2 allowed_existing_file_edits

- **NONE** (★ 본 round = read-only · 기존 파일 edit 0 · v1 보존)

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

- `bot_settings.json` / `memory/bot_settings.json` (★ 회장 verbatim 직접 변경 금지)
- `dispatch.py` / `dispatch/__init__.py` / `dispatch/normal_fallback_callback_helper.py` (★ 회장 verbatim "dispatch.py 변경 금지")
- `scripts/finish-task.sh` (★ 회장 verbatim "finish-task.sh 변경 금지")
- `scripts/task-scope-guard.sh` / `scripts/session-watchdog.sh`
- `.claude/settings.json` / `/home/jay/.claude/settings.json` (★ 회장 verbatim "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 모든 산출물 (★ §6.2 immutable historical evidence)
- `memory/tasks/task-2710.md` (★ v1 보존 · revert 0)
- 모든 production code

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

1. 실제 코드 구현 금지
2. bot_settings.json 변경 금지
3. dispatch.py 변경 금지
4. 모델 설정 변경 금지
5. pilot dispatch 금지
6. task-2709+1 추가 작업 금지
7. 기존 evidence 재분류 금지
8. locked 선언 금지

### 8.5 Capability Scope YAML (★ paths key explicit dogfooding)

```yaml
allowed_resources:
  paths:
    - memory/tasks/task-2710_v2.md
    - memory/events/task-2710.v2-revision-created-260530.json
    - memory/events/task-2710.v2-codex-rereview-result-260530.json
  expected_files:
    - memory/tasks/task-2710_v2.md
    - memory/events/task-2710.v2-revision-created-260530.json
    - memory/events/task-2710.v2-codex-rereview-result-260530.json
  allowed_existing_file_edits: []
  forbidden_paths:
    - 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
    - utils/merge_queue_executor.py
    - utils/real_merge_hooks.py
    - anu_v3/
    - memory/capabilities/**
    - memory/tasks/task-2710.md
```

---

## 9. Out-of-Scope (★ 명시 강제)

- ★ 본 v2 round 실제 dispatch 0
- ★ pilot dispatch 0 (★ 회장 verbatim "pilot dispatch는 계속 불허")
- ★ task-2710 locked 선언 0 (★ 회장 verbatim "locked 선언도 아직 불허")
- ★ task-2706~2709+1 4.8 소급 적용 0 / overwrite 0 / 재분류 0
- ★ task-2709+1 추가 작업 0
- ★ bot_settings.json 변경 0 / dispatch.py 변경 0 / settings.json 변경 0 / finish-task.sh 변경 0
- ★ PR / branch push / merge / GitHub write 0
- ★ 4.8 capable bot 사전 추가 (★ 회장 별도 인가 후 별도 task)
- ★ dispatch.py wrapper 실 구현 (★ 별도 task)
- ★ structural guard 실 구현 (★ 별도 task)

---

## 10. R1~R5 self-check (★ Codex 5 revisions 1:1 반영 박제)

| ID | Codex required revision | v2 반영 위치 | 반영 status |
|---|---|---|---|
| **R1** | Method A 는 overlay (not bypass) 명시 + 4.8-configured bot 사전 존재 조건 + bot_settings 직접 변경 금지 | §5.1 / §5.2 / §5.3 / §5.4 | ✓ ACCEPTED |
| **R2** | machine-decidable category rule + precedence + structural verifier↔executor test → acceptance criteria | §3.1 / §3.2 / §3.3 / §7.1 #2 | ✓ ACCEPTED |
| **R3** | qc_verifier narrow화 (gemini_review_check / browser_verify / security / policy subcase 분리) | §4.2 / §4.3 | ✓ ACCEPTED |
| **R4** | structural no-retroactive guard (--resume/manual/old task ID/overwrite 차단) + fresh task ID + immutable historical | §6.1 / §6.2 / §6.3 / §6.4 | ✓ ACCEPTED |
| **R5** | pilot gates (fallback-on-API-500 / no-4.8-route / cost / latency / regression baseline / evidence integrity) | §7.2 G1~G6 | ✓ ACCEPTED |

**총 5/5 ACCEPTED · v2 반영 완료**

---

## 11. ANU Doctrine Compliance

- ★ ANU 자체 bot_settings.json 변경 0
- ★ ANU 자체 dispatch.py 변경 0
- ★ ANU 자체 settings.json 변경 0
- ★ ANU 자체 finish-task.sh 변경 0
- ★ ANU 자체 코드 구현 0
- ★ ANU 자체 모델 설정 변경 0
- ★ ANU 자체 pilot dispatch 0
- ★ ANU 자체 task-2709+1 추가 작업 0
- ★ ANU 자체 기존 evidence 재분류 0
- ★ ANU 자체 locked 선언 0
- ★ ANU 자체 분류 결정 0 (★ §3 rule + §4 narrow + §5 overlay + §6 guard + §7 gates 모두 회장 verbatim R1~R5 매핑만)
- ★ ANU 자체 v1 변경 0 (★ v1 보존 · revert 0)

---

## 12. Linked Markers (★ R4 §6.2 immutable historical evidence 정합)

- `memory/tasks/task-2710.md` (★ v1 · sha cb99419b... · 보존 · revert 0)
- `memory/events/task-2710.draft-created-260530.json` (★ v1 creation marker)
- `memory/events/task-2710.codex-review-needs-revision-260530.json` (★ Codex v1 review NEEDS_REVISION)
- `memory/events/task-2709plus1_accept_with_known_caveats_direct_recovery_closed_chair_closeout_260530.json` (★ task-2709+1 종료 · immutable)
- `memory/events/task-2709+1.api500-postprocessing-interrupted-infra-caveat-260530.json` (★ infra caveat · immutable)
- `memory/events/p2a_callback_before_failfast_pre_registration_layer_accepted_with_known_caveats_chair_closeout_260529.json` (★ P2-A · immutable)
- `memory/events/c1_dispatch_marker_writer_formalization_accepted_with_known_caveats_chair_closeout_260529.json` (★ C1 · immutable)
- `memory/events/p1b_finish_task_profile_contract_accepted_with_known_caveats_260529.json` (★ P1-B · immutable)
- `memory/events/p1a_task_md_sha_contract_accepted_with_known_caveats_260529.json` (★ P1-A · immutable)
- `memory/events/task-2706+1.decision.json` / `task-2707+1.decision.json` / `task-2708+1.decision.json` / `task-2709+1.decision.json` (★ verifier decisions · immutable)
- CLAUDE.md (★ bot_settings.json 직접 변경 금지 doctrine 출처)

---

## 13. Sentinel

★ 본 task-2710 v2 = read-only design draft v2 · R1~R5 Codex required revisions 1:1 반영 · bot_settings.json 변경 0 · dispatch.py 변경 0 · settings.json 변경 0 · finish-task.sh 변경 0 · 코드 구현 0 · pilot dispatch 0 · locked 선언 0 · 기존 evidence overwrite 0 · task-2709+1 추가 작업 0 · v1 보존. Codex 재검토 OVERALL PASS / PASS_WITH_RECOMMENDATIONS 전까지 pilot 으로 넘어가지 않음. 끝
