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

★ **READ-ONLY DESIGN DRAFT v8 — MINOR DOCUMENTATION REVISION** — 회장 verbatim "Codex OVERALL PASS_WITH_RECOMMENDATIONS 인정 · PILOT_READINESS READY_WITH_RECOMMENDATIONS 인정 · remaining 2 minor doc 전부 ACCEPT · v8 minor doc revision 인가 · pilot 불허 · locked 선언 v8 minor 반영 후 인가" 정합.

- v1: sha `cb99419b...` (★ 보존) · v2: `4138b66d...` · v3: `641b852f...` · v4: `1964fb93...` · v5: `8fe519eb...` · v6: `63667ccd...` · v7: `53ba9173...`
- **v8 origin**: Codex round 7 remaining 2 minor doc recommendations 1:1
- **v8 scope**: ★ MINOR DOC ONLY — secondary_labels order-insensitive serialization 명시 + §5/§6 self-contained restatement
- **v8 forbidden scope**: ★ 새 설계 확장 0 · classifier rule 변경 0 · pilot gate 변경 0 · threshold 변경 0 · fresh task ID rule 변경 0

---

## 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**: `v8 (minor doc)`
- **draft_v1_through_v7_preserved**: ✓
- **dispatch_status**: **NOT_DISPATCHED · READ-ONLY DESIGN v8 ONLY**
- **locked_status**: **NOT_LOCKED at write time · 회장 verbatim "v8 minor 반영 후 인가" — v8 self-check 통과 시 LOCKED_READY_FOR_PILOT_DECISION 박제 별도 marker**
- **post_v8_status_target**: ★ `LOCKED_READY_FOR_PILOT_DECISION` (★ 회장 verbatim 명시 · pilot 진입 시 신규 fresh task ID + 별도 chair_authorization_id 발급 필수)

---

## 1. Goal (★ v7 verbatim 유지)

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

---

## 2. Background (★ v7 verbatim 유지)

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 (★ v7 verbatim 유지)

★ Codex round 6/7 AXIS_2 PASS 영역. §3.1 enum / §3.2 nested-path predicates / §3.3 `has_risky_overlap()` single-predicate (`task_type == 'read_only' AND non-empty allowed_resources.allowed_existing_file_edits`) / §3.4 detect_category() 6-step precedence (EXCLUDED → RISKY_OVERLAP → HEAVY_JUDGMENT → VERIFIER → EXECUTOR → UNCLASSIFIED) / §3.5 table↔code 1:1 / §3.6 self-check — 모두 **v7 verbatim 유지**. classifier rule 변경 0.

---

## 4. Excluded category — discriminator + 추가 subcase + secondary_labels + G enum 정정 (★ v7 verbatim 유지 + **secondary_labels order-insensitive 명시**)

### 4.1 Confirmed exclusions 3 (★ v7 verbatim 유지)

`simple_routing` / `diagnostic / scope_guard` / `callback_helper` — EXCLUDED.

### 4.2 qc_verifier subcase matrix — 18 subcase (★ v7 verbatim 유지)

★ v7 §4.2 verbatim 유지 (★ G8 reference 정정 완료 · finish_task_gate_verdict keyword = finish-task/scope-guard/tdd-check/qc/capability-snapshot/gate verdict).

### 4.3 Discriminator overlap precedence + secondary_labels 정책 — **order-insensitive serialization 명시** (★ v8 doc R-doc-1)

★ Codex round 7 remaining recommendation R-doc-1 verbatim "Clarify in prose that secondary_labels is order-insensitive even if serialized as a list":

**Primary label routing rule** (★ v7 §4.3 verbatim 유지):

| overlap case | primary label | secondary_labels (★ unordered set) |
|---|---|---|
| policy_judgment + chain_resolve_verdict | **policy_judgment** | `{"chain_resolve_verdict"}` |
| policy_judgment + attempt_n_escalation | **policy_judgment** | `{"attempt_n_escalation"}` |
| chain_resolve_verdict + attempt_n_escalation | **chain_resolve_verdict** | `{"attempt_n_escalation"}` |
| policy + chain + attempt 3 동시 | **policy_judgment** | `{"chain_resolve_verdict", "attempt_n_escalation"}` |

#### 4.3.1 secondary_labels — **order-insensitive set semantics** (★ v8 doc R-doc-1 verbatim)

★ **semantic invariant**:

- `secondary_labels` 는 **순서 없는 라벨 집합 (set semantics)** 이다. 직렬화 시 JSON 배열로 표현되더라도 — `["chain_resolve_verdict", "attempt_n_escalation"]` 와 `["attempt_n_escalation", "chain_resolve_verdict"]` 는 **의미상 동치**다.
- 모든 consumer 는 `secondary_labels` 를 **multi-set/set** 으로 취급한다 — 인덱스/순서/위치 의존 비교 금지.
- 두 record 의 `secondary_labels` 비교는 **set equality** (`set(a) == set(b)`) 로만 수행한다.
- 두 operator 가 동일 qc call 을 독립 분류했을 때 결과 `secondary_labels` 는 **순서와 무관하게 set 으로 동치** 여야 한다 (★ Codex round 7 verbatim "primary deterministic and secondary_labels convergent as a set" 인정 영역 정합).

#### 4.3.2 Serialization 권고

| layer | 표현 |
|---|---|
| in-memory | Python `set` 또는 `frozenset` |
| JSON serialization | sorted list (★ canonicalization · 같은 set → 같은 직렬 결과) 권고 — 단 deserialize 후 즉시 `set(...)` 으로 복원 |
| audit/log | sorted list 표기 (★ 시각적 일관성) |

★ **Hard rule (★ v7 §4.3 verbatim)**: `secondary_labels` 는 model selection 결정 입력 0. routing decision = `primary_label` 단독.

### 4.4 Subcase classifier decision rule — (CATEGORY, primary, secondary) tuple (★ v7 verbatim 유지)

★ v7 §4.4 verbatim 유지 — `(CATEGORY, primary_label, secondary_labels)` tuple 반환. docstring "15 subcase" 정정 유지. `LLM_JUDGMENT_SUBCASES` set 15 항목 verbatim. classifier rule 변경 0.

★ tuple consumer 처리 가이드:
- `result[0]` (CATEGORY) → routing decision
- `result[1]` (primary_label) → model_selection_input single source
- `result[2]` (secondary_labels) → §4.3.1 order-insensitive set semantics 적용

### 4.5 Judgment type taxonomy (★ v7 verbatim 유지)

deterministic / LLM judgment / policy judgment / evidence trust judgment / 복합 — 5 분류 변경 0.

### 4.6 R2/R3/R-doc-1 self-check

| 출처 | v8 반영 |
|---|---|
| v7 §4.6 (Codex round 5/6 R2/R3) | 변경 0 (★ v7 verbatim 유지) |
| Codex round 7 R-doc-1 "secondary_labels order-insensitive serialization 명시" | §4.3.1 set semantics 명시 + §4.3.2 serialization 권고 + §4.4 tuple consumer 가이드 |

---

## 5. Method A (overlay) — 사전 조건 A/B · self-contained restatement (★ v8 doc R-doc-2)

★ Codex round 7 remaining recommendation R-doc-2 verbatim "If this draft is meant to stand alone, restate the operative §5/§6 text instead of only 'v6 verbatim 유지'" — 본 §5 는 v7 (★ v6 verbatim 인계) 정합 영역을 **self-contained 본문 직접 박제** 로 전환.

### 5.1 Method A definition

★ **Method A = overlay (NOT bypass)**:

- per-dispatch override = **in-memory overlay** (★ NOT disk write)
- `bot_settings.json` 디스크 변경 0 강제
- dispatch.py 진입 시 `--model claude-opus-4-8` argument 가 `_read_bot_models()` 결과를 in-memory overlay 로 일시 교체
- session 종료와 함께 overlay 도 종료 · 디스크 영구 변경 0

### 5.2 4.8 적용 가능 사전 조건 A / B 만

★ Method A 사전 조건은 **A / B 둘 중 하나** 충족 시:

| 사전 조건 | 정의 | enforcement check |
|---|---|---|
| **A** | 기존 `bot_settings.json` 에서 4.8-capable bot 또는 model_router rule 이 **명시적으로 존재** | bot_settings.json 의 model field 에 `claude-opus-4-8` 매핑 존재 또는 model_router rule 에 4.8 mapping 존재 시 PASS |
| **B** | **chair-authorized per-dispatch overlay** 가 기존 bot route 위에서 허용된 model field 만 일시 지정 | dispatch.py CLI `--model claude-opus-4-8` + 유효 `chair_authorization_id` 제시 시 in-memory overlay 적용 |

★ A 또는 B 단독 충족 시 §7 pilot gates G1~G6 진입 자격 발생 (★ 자격 발생 ≠ 실제 진입 · 별도 회장 결정 필요).

### 5.3 사전 조건 C 부재 강제

★ **"Anthropic API 자체가 `claude-opus-4-8` model ID 응답 가능"은 독립 사전 조건이 아니다.**

- API 응답 가능성 = **pilot runtime check 만** 사용 (★ pre-condition 0)
- `bot_settings.json` 우회 근거로 사용 0 강제
- API capability + bot_settings 미존재 + chair authorization 미존재 시 — **사전 조건 미충족 · pilot 진입 0**

---

## 6. Structural enforcement rules — E1~E5 · self-contained restatement (★ v8 doc R-doc-2)

★ Codex round 7 R-doc-2 정합 — 본 §6 도 self-contained 본문 직접 박제.

### 6.1 Enforcement rules E1~E5

| rule | 강제 mechanism | enforcement layer |
|---|---|---|
| **E1: old task id targeting 차단** | dispatch.py 진입 시 `task-id` argument 가 **task-2710 이하** 또는 기존 `+N` lineage 매칭 시 reject (★ 4.8 pilot 시 강제) | dispatch.py pilot mode entry guard |
| **E2: --resume 기반 4.8 pilot 차단** | `--model claude-opus-4-8` + `--resume <session>` 조합 detect 시 reject | dispatch.py CLI argument check |
| **E3-a: 기존 evidence overwrite 차단 — write-time guard** | §6.2 immutable path-scope 의 파일에 **write attempt (open/write/rename/unlink) 발생 직전 path prefix check + reject**. 이 guard 는 overwrite 시도 자체를 in-flight 차단한다. | file write guard (★ syscall/path prefix 검사 지점 · pilot session runtime in-flight) |
| **E3-b: 기존 evidence overwrite 차단 — post-pilot integrity check** | §6.2 immutable path-scope 의 모든 파일에 대해 **pilot 시작 시점 pre-hash + 종료 시점 post-hash 를 비교** · mutation count 0 증명. 이 check 는 사후 hash 검증 지점이며 E3-a 가 누락한 누설 (★ symlink/hardlink/race) 을 사후 탐지한다. | post-pilot integrity verification (★ pilot 완료 후 G6 sweep 과 동일 layer) |
| **E4: immutable historical evidence path-scope 명시** | §6.2 path-scope 의 모든 파일은 pilot session 동안 sha256 fixed 강제 | post-pilot G6 verification |
| **E5: fresh task ID 없이 4.8 pilot 불가** | 4.8 pilot 시 task-id 가 **task-2710 이후 신규 ID 발급 후만** 허용 (★ 회장 별도 인가) + 신규 `chair_authorization_id` 발급 강제 | dispatch.py task-id whitelist check + chair authorization presence check |

### 6.2 Immutable path-scope 8 axis

다음 path-scope 의 task-2706~2709+1 관련 파일은 **immutable historical evidence** (★ pilot session 동안 sha256 fixed):

| axis | scope |
|---|---|
| closeout markers | `memory/events/p1a_*.json` / `p1b_*.json` / `c1_*.json` / `p2a_*.json` / `task-2709plus1_*.json` |
| verifier markers | `memory/events/task-2706+1.*.json` / `task-2707+1.*.json` / `task-2708+1.*.json` / `task-2709+1.*.json` |
| dispatched markers | `memory/events/task-2706.dispatched-*.json` / `task-2707.dispatched-*.json` / `task-2708.dispatched-*.json` / `task-2709.dispatched-*.json` |
| verifier reports | `memory/reports/task-2706+1.md` / `task-2707+1.md` / `task-2708+1.md` / `task-2709+1.md` |
| task md | `memory/tasks/task-2706.md` / `task-2707.md` / `task-2708_v2.md` / `task-2709.md` / `task-2709+1.md` |
| capability snapshots | `memory/capabilities/task-2706.json` / `task-2707.json` / `task-2708.json` / `task-2709.json` / `task-2709+1.json` |
| callback envelopes | `memory/events/task-2706+1.callback-envelope.json` / `task-2707+1.callback-envelope.json` / `task-2708+1.callback-envelope.json` / `task-2709+1.callback-envelope.json` |
| decision files | `memory/events/task-2706+1.decision.json` / `task-2707+1.decision.json` / `task-2708+1.decision.json` / `task-2709+1.decision.json` |

### 6.3 E3-a ↔ E3-b 분리 의도 (★ defense in depth)

- **E3-a (write-time guard)**: in-flight syscall 차단 (★ overwrite 시도 자체를 runtime 시점에 0)
- **E3-b (post-pilot integrity check)**: 사후 hash sweep (★ E3-a 가 놓친 in-flight 누설 — symlink/hardlink/race — 사후 증명)
- **defense in depth**: E3-a + E3-b 두 layer 둘 다 통과해야 immutable lineage 보장 (★ 한 layer fail-only 로는 pilot acceptance 0)

---

## 7. Pilot pre-acceptance gates (★ v7 verbatim 유지)

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

4.8 API 500 → 4.6 retry 1회 + audit marker.

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

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

### 7.3 G3 — cost ceiling (★ v7 verbatim 유지)

상대 +50% / 절대 $15.

### 7.4 G4 — latency ceiling (★ v7 verbatim 유지)

상대 +50% / 절대 20분.

### 7.5 G5 — baseline 결정성 (★ v7 verbatim 유지)

§7.5.1 slot 1/2/3 marker pattern · §7.5.2 priority 3-tier + 결격 8 case (★ ACCEPT_WITH_KNOWN_CAVEATS 명시) · §7.5.2.A case 8 4-step tie-resolution · §7.5.3-7.5.6 동일급 강제 + mixed-slot 평균 금지 + 보수적 기준 + 4번째 후보 secondary. **모두 v7 verbatim 유지** — pilot gate 변경 0 / threshold 변경 0.

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

7 path scope pre/post hash sweep.

---

## 8. Acceptance Criteria (★ v8 minor doc)

1. ★ R-doc-1 secondary_labels order-insensitive set semantics 명시 1:1 반영
2. ★ R-doc-2 §5/§6 self-contained restatement 1:1 반영
3. ★ v7 설계 의미 변경 0 (★ §3 classifier / §4.2 18 subcase / §4.4 tuple / §4.5 taxonomy / §7.5.1-7.5.6/7.6 모두 verbatim 유지)
4. ★ 회장 verbatim 금지 7 ("새 설계 확장 · classifier rule 변경 · pilot gate 변경 · threshold 변경 · fresh task ID rule 변경 · 모든 production code 변경 · pilot dispatch") 모두 0
5. ★ Codex round 6/7 PASS/PWR axis (1/2/3/4/5) 손상 0
6. ★ PILOT_READINESS READY_WITH_RECOMMENDATIONS 유지 가능 (★ self-check §10 영역)
7. ★ pilot dispatch 별도 회장 결정 필요 강제 유지
8. ★ pilot 진입 시 신규 fresh task ID + 별도 chair_authorization_id 강제 유지
9. ★ v1~v7 모두 보존 · revert 0
10. ★ v8 self-check (★ §10) 통과 시 `LOCKED_READY_FOR_PILOT_DECISION` marker 박제 (★ 회장 verbatim "locked 선언은 v8 minor 반영 후 인가")

---

## 9. v7 → v8 minor doc diff summary

| v7 영역 | v8 변경 | rationale |
|---|---|---|
| §4.3 secondary_labels 정책 | §4.3.1 (신규) order-insensitive set semantics 명시 + §4.3.2 (신규) serialization 권고 + §4.4 tuple consumer 가이드 prose | Codex round 7 R-doc-1 verbatim |
| §5 "(★ v6 verbatim 유지)" 참조형 | self-contained 본문 직접 박제 — §5.1 Method A 정의 / §5.2 사전 조건 A/B / §5.3 사전 조건 C 부재 강제 | Codex round 7 R-doc-2 verbatim |
| §6 "(★ v5 §6 verbatim)" 참조형 | self-contained 본문 직접 박제 — §6.1 E1~E5 table / §6.2 immutable 8 axis table / §6.3 defense in depth | Codex round 7 R-doc-2 verbatim |
| §3 / §4.1 / §4.2 / §4.4 / §4.5 / §7.1-7.6 | **변경 0** (★ v7 verbatim) | round 6/7 PASS/PWR 영역 보존 + 회장 verbatim 금지 7 정합 |

---

## 10. v8 ANU self-check 5 항목 (★ 회장 verbatim 강제)

★ 회장 verbatim "v8 이후 추가 Codex 재검토는 필수 아님 · 단, ANU self-check 로 다음 5가지를 확인한다":

| # | self-check 항목 | v8 verification | 결과 |
|---|---|---|---|
| **1** | round 7 minor doc recommendation 2건 반영 | R-doc-1 §4.3.1/§4.3.2/§4.4 prose · R-doc-2 §5/§6 self-contained 본문 박제 | ✓ PASS |
| **2** | v7 설계 의미 변경 0 | §3 classifier 0 · §4.2 18 subcase set 0 · §4.4 tuple 0 · §4.5 taxonomy 0 · §7 pilot gate G1~G6 enum 0 · threshold (+50% / $15 / 20분) 0 · fresh task ID rule E5 0 · 모두 v7 verbatim 유지 확인 | ✓ PASS |
| **3** | 기존 PASS/PWR axis 손상 0 | AXIS_1 (§5 overlay framing) self-contained 박제 · framing 변경 0 → PASS 유지 / AXIS_2 (§3 classifier) verbatim → PASS 유지 / AXIS_3 (§4 matrix) secondary_labels set semantics 명시 = strengthening · weakening 0 → PWR 유지 또는 강화 / AXIS_4 (§6 structural) self-contained 박제 · E1~E5 표현 변경 0 → PASS 유지 / AXIS_5 (§7 pilot gates) verbatim → PWR 유지 | ✓ PASS |
| **4** | PILOT_READINESS READY_WITH_RECOMMENDATIONS 유지 가능 | Codex round 7 remaining 2 minor doc 모두 v8 에서 처리 · 신규 blocker 도입 0 · §3/§4/§5/§6/§7 의미 변경 0 → Codex round 7 READY_WITH_RECOMMENDATIONS 판정 근거 모두 유지 | ✓ PASS (★ 별도 Codex 재검토 없이도 substantive blocker 신규 도입 0 명백) |
| **5** | pilot dispatch 별도 회장 결정 필요 | §0 header `dispatch_status: NOT_DISPATCHED` · `locked_status: NOT_LOCKED` · §11.4 forbidden_actions pilot dispatch 0 명시 · §6.1 E5 fresh task ID + 별도 chair_authorization_id 강제 · 회장 verbatim "pilot dispatch는 task-2710에서 직접 진행하지 않는다 · pilot 진입 시 반드시 신규 fresh task ID를 발급하고, 별도 chair_authorization_id를 받아야 한다" 본 §10/§11.4 1:1 반영 | ✓ PASS |

**총 5/5 PASS** — v8 self-check 통과 → §13 sentinel 후 LOCKED_READY_FOR_PILOT_DECISION marker 별도 박제 자격 충족 (★ marker 박제 자체는 회장 verbatim "v8 minor 반영 후 인가" 명시 영역 — 본 v8 self-check 통과가 그 사전 조건).

---

## 11. Allowed / Forbidden Files

### 11.1 expected_files (★ 본 v8 round)

1. `memory/tasks/task-2710_v8.md`
2. `memory/events/task-2710.v8-revision-and-locked-ready-for-pilot-decision-260530.json`

### 11.2 allowed_existing_file_edits

- NONE (★ v1~v7 보존 · 코드 변경 0)

### 11.3 forbidden_files

v7 §11.3 verbatim + `memory/tasks/task-2710_v7.md` (★ v7) 추가.

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

1. 실제 코드 구현 0
2. bot_settings.json 변경 0
3. dispatch.py 변경 0
4. settings.json 변경 0
5. finish-task.sh 변경 0
6. 모델 설정 변경 0
7. PR / push / merge / GitHub write 0
8. 실제 dispatch 0
9. pilot dispatch 0
10. task-2709+1 추가 작업 0
11. 기존 evidence 재분류 0
12. ANU 자체 새 설계 확장 0 · classifier rule 변경 0 · pilot gate 변경 0 · threshold 변경 0 · fresh task ID rule 변경 0

### 11.5 pilot dispatch 진입 요건 (★ 회장 verbatim 강제 · 본 task-2710 외 분리)

- ★ pilot dispatch 는 **task-2710 에서 직접 진행 0**
- ★ pilot 진입 시 **신규 fresh task ID 발급** (★ task-2710 이후 신규 ID · §6.1 E5 강제)
- ★ pilot 진입 시 **별도 chair_authorization_id 발급** (★ 본 task-2710 의 `CHAIR-AUTH-TASK-2710-...` 재사용 0)

---

## 12. ANU Doctrine Compliance

- ★ v1~v7 modification 0 · v1~v7 overwrite 0
- ★ ANU 자체 코드 구현 0 · 모델 설정 변경 0 · pilot dispatch 0
- ★ ANU 자체 분류 결정 0 (★ R-doc-1/R-doc-2 모두 회장 verbatim 1:1)
- ★ task-2706~2709+1 evidence overwrite 0
- ★ ANU 자체 OVERALL PASS 선언 0 (★ Codex round 7 verdict 박제만)
- ★ ANU 자체 PILOT_READINESS 해석 0 (★ Codex round 7 판정 박제만)
- ★ ANU 자체 pilot 진입 인가 0 (★ 회장 별도 결정 영역)
- ★ ANU 자체 lock 선언 0 (★ v8 self-check 통과 후에만 별도 marker 박제 · 회장 verbatim "v8 minor 반영 후 인가" 정합)
- ★ ANU 자체 새 설계 확장 0 (★ 회장 verbatim 금지 영역 strict)

---

## 13. Sentinel

★ task-2710 v8 = read-only design draft v8 MINOR DOCUMENTATION revision · Codex round 7 remaining 2 minor doc recommendations (R-doc-1 secondary_labels order-insensitive set semantics · R-doc-2 §5/§6 self-contained restatement) 1:1 반영 · 새 설계 확장 0 · classifier rule 변경 0 · pilot gate 변경 0 · threshold 변경 0 · fresh task ID rule 변경 0 · v7 §3/§4.1/§4.2 18 subcase/§4.4 tuple/§4.5 taxonomy/§7.1-7.6 모두 verbatim 유지 · ANU self-check 5/5 PASS · v1~v7 보존 · task-2706~2709+1 evidence overwrite 0 · bot_settings.json 변경 0 · dispatch.py 변경 0 · settings.json 변경 0 · finish-task.sh 변경 0 · 코드 구현 0 · pilot dispatch 0. **post-v8 status target = LOCKED_READY_FOR_PILOT_DECISION** — 회장 verbatim "v8 minor 반영 후 인가" 영역 별도 marker 박제 (★ pilot 진입은 신규 fresh task ID + 별도 chair_authorization_id 강제). 끝
