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

★ **READ-ONLY DESIGN DRAFT v3** — 회장 verbatim "Codex 4 remaining recommendations 전부 ACCEPT · v3 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**: `memory/tasks/task-2710.md` sha256 `cb99419bbe8cce36e6dedeb415723c5fcb36a4625ba5368feb283fa84a891b7b` (★ 보존)
- **v2 lineage**: `memory/tasks/task-2710_v2.md` sha256 `4138b66dc32f901aeb5b4f89883e1ddee9868c5be21f9696c7b11a84333ac374` (★ 보존)
- **v3 origin**: Codex 4 remaining recommendations 1:1 반영 + 회장 G3/G4 numeric verbatim

---

## 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**: `v3`
- **draft_v1_lineage_preserved**: sha256 `cb99419b...`
- **draft_v2_lineage_preserved**: sha256 `4138b66d...`
- **dispatch_status**: **NOT_DISPATCHED · READ-ONLY DESIGN v3 ONLY**
- **locked_status**: **NOT_LOCKED**
- **anu_collector_key**: `c119085addb0f8b7`

---

## 1. Goal (★ v2 유지)

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

---

## 2. Background (★ v2 §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 ID: `claude-opus-4-8`

---

## 3. Category gate — executable rule set (★ R2 verbatim 보강)

### 3.1 Category enum + formal predicates

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

# Formal predicates (machine-decidable)
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 task_md.get('task_type') 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_edits == [] AND team_separation_declared"""
    if task_md.get('task_type') != 'read_only':
        return False
    if not re.match(r'^task-\d+\+\d+$', task_md.get('task_id', '')):
        return False
    if task_md.get('allowed_existing_file_edits', []):
        return False
    return has_explicit_executor_verifier_team_separation(task_md)

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

def is_excluded(task_md):
    """Predicate X: §4 excluded category"""
    return matches_excluded_category(task_md)
```

### 3.2 Formal definitions (★ Codex R2 ambiguity 해소)

- **`enum_or_matrix_section`** = markdown section (## or ###) that contains at least one of: `enum`, `matrix`, `cell`, `R[0-9]+`, `axis`, table with ≥ 2 rows of comparison data. Counter is `len(re.findall(<pattern>, body))`.
- **`team_separation_declared`** = task md 본문에 `executor_team` 키와 `verifier_team` 키가 모두 명시되고 두 값이 다른 team 일 때 `True`.
- **`task_id pattern`** = `^task-\d+(\+\d+)?$` · verifier 는 `+N` suffix 강제 (★ N ≥ 1).
- **`allowed_existing_file_edits`** = task md `allowed_resources.allowed_existing_file_edits` 리스트 (★ None 은 빈 리스트로 normalize).

### 3.3 detect_category() — §3.1 predicate 빠짐없이 반영 (★ Codex R2 alignment)

```python
def detect_category(task_md):
    """Precedence: EXCLUDED > HEAVY_JUDGMENT > VERIFIER > EXECUTOR > UNCLASSIFIED"""
    if is_excluded(task_md):
        return CATEGORY.EXCLUDED
    if is_heavy_judgment(task_md):
        return CATEGORY.HEAVY_JUDGMENT
    if is_verifier(task_md):  # ★ task-NNNN+M id_match + team_separation + allowed_edits == []
        return CATEGORY.VERIFIER
    if is_executor(task_md):
        return CATEGORY.EXECUTOR
    return CATEGORY.UNCLASSIFIED  # ★ HOLD_FOR_CHAIR
```

### 3.4 Precedence rule (★ overlap 해소)

| overlap case | rule | precedence |
|---|---|---|
| heavy_judgment + verifier | heavy_judgment | 1st |
| heavy_judgment + executor (★ writes files) | heavy_judgment | 1st (★ design/policy 본질 우선) |
| verifier + executor (★ verifier task with non-empty allowed_edits — 비정상) | UNCLASSIFIED → HOLD_FOR_CHAIR | structural test FAIL |
| excluded + 다른 모든 case | excluded | 0th (★ pre-emptive) |

### 3.5 Self-classification

- task-2710 자체 → `is_heavy_judgment` (★ task_type=policy_design_only + body wordcount ≥ 5000 + ≥ 5 enum/matrix sections)

---

## 4. Excluded category — qc_verifier subcase decision matrix (★ R3 verbatim 보강)

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

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

### 4.2 qc_verifier subcase decision matrix (★ R3 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` (audit-trail file count) | 0 | EXCLUDED | file count + presence boolean |
| `gemini_review_check` | YES | **4.8 candidate (heavy_judgment subcategory)** | external review interpretation |
| `browser_verify` (screenshot/Playwright) | YES | **4.8 candidate** | 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 |

### 4.3 Subcase classifier decision rule (★ R3 verbatim "decision matrix 추가")

```python
def classify_qc_subcase(qc_call):
    """6 LLM-judgment subcases → 4.8 candidate, otherwise EXCLUDED."""
    LLM_JUDGMENT_SUBCASES = {
        'gemini_review_check',
        'browser_verify',
        'security_audit',
        'policy_judgment',
        'evidence_trust_judgment',
        'critical_7_interpretation',
    }
    DETERMINISTIC_SUBCASES = {
        'severity_badge',
        'file_count',
        'tdd_check',
    }
    if qc_call.subcase in LLM_JUDGMENT_SUBCASES:
        return CATEGORY.HEAVY_JUDGMENT
    if qc_call.subcase in DETERMINISTIC_SUBCASES:
        return CATEGORY.EXCLUDED
    return CATEGORY.UNCLASSIFIED  # ★ HOLD_FOR_CHAIR
```

---

## 5. Method A (overlay) — 사전 조건 A/B만 (★ R1 verbatim "사전 조건 C 제거")

### 5.1 Method A 정의 (★ v2 §5.1 유지)

- per-dispatch override = **overlay** (★ NOT bypass)
- bot_settings.json 디스크 변경 0 · in-memory overlay 1회

### 5.2 4.8 적용 가능 조건 (★ R1 verbatim "A/B만 유지")

| 사전 조건 | 정의 | enforcement |
|---|---|---|
| **A** | 기존 `bot_settings.json` 에서 4.8-capable bot 또는 route 가 **명시적으로 존재** | bot_settings.json 의 model 필드에 `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 적용 |

### 5.3 사전 조건 C 제거 (★ R1 verbatim 강제)

- ★ **"Anthropic API 자체가 `claude-opus-4-8` model ID 응답 가능"은 독립 사전 조건으로 두지 않는다**
- API 응답 가능성 = **pilot runtime check 만** 사용 (★ pre-condition 아님)
- bot_settings 우회 근거로 사용 0 강제

### 5.4 회장 verbatim R1 정합

★ R1 verbatim 1:1 반영:
- ✓ "사전 조건 C 제거"
- ✓ "4.8 적용 가능 조건은 A/B만 유지"
- ✓ "A: 기존 bot_settings.json에서 4.8-capable bot 또는 route가 명시적으로 존재"
- ✓ "B: chair-authorized per-dispatch overlay"
- ✓ "API 응답 가능성은 pilot runtime check로만 다루고, bot_settings 우회 근거로 쓰지 않는다"

---

## 6. Structural enforcement rules (★ R4 verbatim "후보가 아니라 enforcement rule")

### 6.1 Enforcement rules 5 (★ R4 verbatim 강제 · "별도 task에서 구현 후보" 표현 **제거**)

| rule | 강제 mechanism | enforcement layer |
|---|---|---|
| **E1: old task id targeting 차단** | dispatch.py 진입 시 `task-id` argument 가 **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: 기존 evidence overwrite 차단** | §6.2 immutable path-scope 의 파일에 write attempt 시 reject (★ 4.8 pilot session 내 강제) | file write guard (post-pilot integrity check + path prefix check) |
| **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 발급 후만** 허용 (★ 회장 별도 인가) | dispatch.py task-id whitelist check |

### 6.2 Immutable path-scope (★ R4 verbatim · "memory/events/ / memory/reports/ / memory/tasks/ / capabilities/ / decision files / callback envelopes / dispatched markers")

다음 path-scope 의 task-2706 ~ task-2709+1 관련 파일은 **immutable historical evidence**:

| path | scope | enforcement |
|---|---|---|
| `memory/events/p1a_*.json` / `p1b_*.json` / `c1_*.json` / `p2a_*.json` / `task-2709plus1_*.json` | closeout markers | 100% sha256 fixed |
| `memory/events/task-2706+1.*.json` / `task-2707+1.*.json` / `task-2708+1.*.json` / `task-2709+1.*.json` | verifier markers | 100% sha256 fixed |
| `memory/events/task-2706.dispatched-*.json` / `task-2707.dispatched-*.json` / `task-2708.dispatched-*.json` / `task-2709.dispatched-*.json` | dispatched markers | 100% sha256 fixed |
| `memory/reports/task-2706+1.md` / `task-2707+1.md` / `task-2708+1.md` / `task-2709+1.md` | verifier reports | 100% sha256 fixed |
| `memory/tasks/task-2706.md` / `task-2707.md` / `task-2708_v2.md` / `task-2709.md` / `task-2709+1.md` | task md (★ accepted/verified lineage) | 100% sha256 fixed |
| `memory/capabilities/task-2706.json` / `task-2707.json` / `task-2708.json` / `task-2709.json` / `task-2709+1.json` | capability snapshots | 100% sha256 fixed |
| `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` | callback envelopes | 100% sha256 fixed |
| `memory/events/task-2706+1.decision.json` / `task-2707+1.decision.json` / `task-2708+1.decision.json` / `task-2709+1.decision.json` | decision files | 100% sha256 fixed |

### 6.3 회장 verbatim R4 정합

★ R4 verbatim 1:1 반영:
- ✓ "별도 task에서 구현 후보 표현 제거"
- ✓ "v3에서는 최소 enforcement rule 명시" (★ E1~E5)
- ✓ "1. old task id targeting 차단 / 2. --resume 기반 4.8 pilot 차단 / 3. 기존 evidence overwrite 차단 / 4. task-2706~2709+1 immutable historical evidence path-scope 명시 / 5. fresh task ID 없이는 4.8 pilot 불가"
- ✓ "immutable path scope에는 최소 다음을 포함한다: memory/events/, memory/reports/, memory/tasks/, capabilities/, decision files, callback envelopes, dispatched markers"

---

## 7. Pilot pre-acceptance gates — numeric thresholds 확정 (★ R5 verbatim 강제)

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

- 4.8 봇 API 500 응답 시 → model overlay 해제 + 4.6 retry **1회**
- pilot session 자체 abort 0 · audit marker 박제

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

- §5.2 사전 조건 A/B 미충족 시 → 4.8 우선 적용 skip + 4.6 default 진행
- silent fallback + audit marker 박제

### 7.3 G3 — cost ceiling (★ 회장 verbatim 수치 확정)

- **상대 ceiling**: 동일급 baseline 대비 **+50% 초과 금지**
- **절대 ceiling**: 1회 pilot 절대 상한 **$15 초과 금지**
- enforcement: per-dispatch token cost counter + threshold check (★ pre-pilot wrapper)
- 위반 시 → abort + audit marker

### 7.4 G4 — latency ceiling (★ 회장 verbatim 수치 확정)

- **상대 ceiling**: 동일급 baseline 대비 **+50% 초과 금지**
- **절대 ceiling**: 1회 pilot wall time 절대 상한 **20분 초과 금지**
- enforcement: dispatch.py timeout (★ 1200 seconds hard)
- 위반 시 → abort + 4.6 fallback + audit marker

### 7.5 G5 — regression comparison baseline (★ R5 verbatim "최소 baseline 3건")

- **baseline 3건 최소** 비교 (★ 회장 verbatim)
- 비교 항목 6 (★ 회장 verbatim 정합):
  1. `cost` (★ USD per dispatch)
  2. `wall_time` (★ seconds)
  3. `output_tokens` (★ token count)
  4. `api_error` (★ 500/429/etc count)
  5. `retry_count` (★ fallback retry count)
  6. `evidence_mutation_count` (★ §6.2 path-scope 외 mutation count)
- baseline 후보 (★ task-2706+1 / 2707+1 / 2708+1 / 2709+1 verifier 4건 중 최소 3건 선택)

### 7.6 G6 — evidence integrity hash scope (★ R5 verbatim 정합)

- **pre/post hash sweep 범위 7 path** (★ 회장 verbatim 1:1):
  1. `memory/events/`
  2. `memory/reports/`
  3. `memory/tasks/`
  4. `capabilities/` (= `memory/capabilities/`)
  5. `decision files` (= `memory/events/task-NNNN+M.decision.json`)
  6. `callback envelopes` (= `memory/events/task-NNNN+M.callback-envelope.json`)
  7. `dispatched markers` (= `memory/events/task-NNNN.dispatched-*.json`)
- pre/post 비교: §6.2 immutable path-scope 의 모든 파일 sha256 **0 mutation** 증명
- 위반 시 → pilot FAIL + chair escalation

### 7.7 회장 verbatim R5 정합

★ R5 verbatim 1:1 반영:
- ✓ G3 "+50% / $15 절대 상한"
- ✓ G4 "+50% / 20분 절대 상한"
- ✓ G5 "baseline 3건 최소 + 6 비교 항목"
- ✓ G6 "7 path pre/post hash scope"

---

## 8. Acceptance Criteria (★ v3 본 round)

1. ★ R1~R5 (★ Codex round 2 remaining 4 recommendations) 1:1 반영 (★ §5/§3/§4/§6/§7 자체 박제)
2. ★ §3 executable rule set + formal predicates + precedence
3. ★ §4.2 qc_verifier 6 LLM judgment subcase carve-out + §4.3 decision matrix
4. ★ §5 Method A overlay + 사전 조건 A/B만 + 사전 조건 C 제거
5. ★ §6 enforcement rules E1~E5 + immutable path-scope 7 axis
6. ★ §7 G1~G6 numeric thresholds 확정 (G3/G4) + G5 baseline 3건 + G6 7 path
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. ★ v1 / v2 모두 보존 · revert 0
11. ★ Codex 재검토 (round 3) OVERALL PASS 또는 PASS_WITH_RECOMMENDATIONS 까지 locked 0 / pilot 0

---

## 9. v2 → v3 diff summary

| v2 영역 | v3 변경 | rationale |
|---|---|---|
| §5.2 사전 조건 C | **제거** | Codex AXIS_1 NEEDS_REFINEMENT · R1 verbatim |
| §3.1 wordcount/team 정의 | **formal definitions 추가** (§3.2) | Codex AXIS_2 NEEDS_REFINEMENT · R2 verbatim |
| §3.3 detect_category() | **§3.1 verifier predicates 빠짐없이 반영** | Codex AXIS_2 · R2 verbatim |
| §4.3 internal subcase classifier 모호 | **§4.3 classify_qc_subcase() decision rule** | Codex AXIS_3 NEEDS_REFINEMENT · R3 verbatim |
| §6.1 "별도 task 구현 후보" | **enforcement rules E1~E5 직접 명시** | Codex AXIS_4 FAIL · R4 verbatim |
| §6.2 immutable list 8 file 패턴만 | **§6.2 path-scope 8 axis 매트릭스** | Codex AXIS_4 · R4 verbatim |
| §7.2 G3/G4 "회장 결정 영역" | **§7.3/7.4 +50% / $15 / 20분 확정** | Codex AXIS_5 NEEDS_REFINEMENT · R5 verbatim |
| §7.2 G5 thin baseline | **§7.5 baseline 3건 + 6 비교 항목** | Codex AXIS_5 · R5 verbatim |
| §7.2 G6 hash 범위 미명시 | **§7.6 7 path 명시** | Codex AXIS_5 · R5 verbatim |

---

## 10. R1~R5 (Codex round 2 remaining 4) self-check (★ Codex round 2 verbatim ↔ v3 반영)

| ID | Codex round 2 remaining recommendation | v3 반영 위치 | status |
|---|---|---|---|
| **R1** | §5.2 사전 조건 C 제거 / A/B 만 유지 | §5.2 / §5.3 / §5.4 | ✓ ACCEPTED |
| **R2** | §3/§4 classifier executable 화 · formal predicate · §3.3↔§3.1 정합 | §3.1 / §3.2 / §3.3 / §3.4 | ✓ ACCEPTED |
| **R3** | qc_verifier subcase decision rule 명시 · 6 LLM judgment subcase 4.8 candidate | §4.2 / §4.3 | ✓ ACCEPTED |
| **R4** | structural guard 후보 → enforcement rule · 5 rule + path-scope 7 axis | §6.1 E1~E5 / §6.2 / §6.3 | ✓ ACCEPTED |
| **R5** | G3 cost (+50% / $15) / G4 latency (+50% / 20분) / G5 baseline 3건 / G6 7 path | §7.3 / §7.4 / §7.5 / §7.6 / §7.7 | ✓ ACCEPTED |

**총 5/5 ACCEPTED**

---

## 11. Allowed / Forbidden Files

### 11.1 expected_files (★ 본 v3 round)

1. `memory/tasks/task-2710_v3.md` (★ 본 file)
2. `memory/events/task-2710.v3-revision-created-260530.json`
3. `memory/events/task-2710.v3-codex-round-3-rereview-result-260530.json`

### 11.2 allowed_existing_file_edits

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

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

- `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 모든 산출물 (★ §6.2 immutable historical evidence)
- `memory/tasks/task-2710.md` (★ v1)
- `memory/tasks/task-2710_v2.md` (★ v2)
- 모든 production code

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

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 modification 0
- ★ ANU 자체 코드 구현 0
- ★ ANU 자체 모델 설정 변경 0
- ★ ANU 자체 pilot dispatch 0
- ★ ANU 자체 locked 선언 0
- ★ ANU 자체 분류 결정 0 (★ R1~R5 모두 회장 verbatim 매핑 · Codex round 2 수치 정합 + 회장 G3/G4 수치 1:1)
- ★ task-2706~2709+1 evidence overwrite 0
- ★ ANU 자체 OVERALL PASS 선언 0 (★ Codex round 3 결과 박제만)

---

## 13. Sentinel

★ task-2710 v3 = read-only design draft v3 · Codex round 2 remaining 4 recommendations 1:1 반영 + 회장 G3/G4 수치 확정 · bot_settings.json 변경 0 · dispatch.py 변경 0 · settings.json 변경 0 · finish-task.sh 변경 0 · 코드 구현 0 · pilot dispatch 0 · locked 선언 0 · v1/v2 보존 · task-2706~2709+1 evidence overwrite 0. Codex round 3 PASS / PASS_WITH_RECOMMENDATIONS 전까지 pilot 0. 끝
