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

★ **READ-ONLY DESIGN DRAFT v5** — 회장 verbatim "Codex round 4 remaining recommendations 3건 전부 ACCEPT · v5 revision 인가 · pilot 불허 · locked 불허 · E3 write-time guard ↔ post-pilot integrity check 분리" 정합. **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 lineage**: sha `1964fb93...` (★ 보존)
- **v5 origin**: Codex round 4 remaining 3 recommendations 1:1 + 회장 verbatim E3 분리

---

## 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**: `v5`
- **draft_v1_v2_v3_v4_preserved**: ✓
- **dispatch_status**: **NOT_DISPATCHED · READ-ONLY DESIGN v5 ONLY**
- **locked_status**: **NOT_LOCKED**

---

## 1. Goal (★ v4 유지)

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

---

## 2. Background (★ v4 유지)

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 — overlap-first precedence (★ R1 verbatim 강제)

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

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

### 3.2 Formal predicates — nested data path 통일 (★ v4 §3.2 유지)

```python
def _get_allowed_existing_edits(task_md):
    """allowed_resources.allowed_existing_file_edits nested path 통일."""
    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):
    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):
    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):
        return False
    return has_explicit_executor_verifier_team_separation(task_md)

def is_executor(task_md):
    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))

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

### 3.3 Risky overlap detection — first-class predicate (★ R1 verbatim 신규)

```python
def has_risky_overlap(task_md):
    """
    R1 verbatim: '우선 위험 overlap으로 본다.'
    HEAVY_JUDGMENT 매칭 여부와 무관하게 UNCLASSIFIED 강제 대상.

    4 risky overlap cases:
    (a) verifier + executor       (read_only + non-empty edits + verifier shape)
    (b) verifier + non-empty edits (★ task_type=read_only + allowed_resources.allowed_existing_file_edits != [])
    (c) read_only + non-empty edits (★ regardless of id pattern / team separation)
    (d) triple-overlap            (★ heavy_judgment + verifier shape + non-empty edits 동시 매칭)
    """
    task_type = _get_task_type(task_md)
    has_edits = bool(_get_allowed_existing_edits(task_md))

    # (a)(b)(c): read_only + non-empty edits 자체가 위험 overlap
    if task_type == 'read_only' and has_edits:
        return True

    # (d) triple-overlap: heavy + verifier-shape + non-empty edits
    # heavy_judgment 매칭 + verifier id pattern + team separation + non-empty edits
    if is_heavy_judgment(task_md) and re.match(r'^task-\d+\+\d+$', _get_task_id(task_md)) \
        and has_explicit_executor_verifier_team_separation(task_md) \
        and has_edits:
        return True

    return False
```

### 3.4 detect_category() — **overlap detection FIRST** (★ R1 verbatim 강제)

★ R1 verbatim "overlap detection을 HEAVY_JUDGMENT 판정보다 먼저 둔다":

```python
def detect_category(task_md):
    """
    Precedence:
      Step 1 EXCLUDED
      Step 2 RISKY OVERLAP → UNCLASSIFIED 강제 (★ R1 verbatim HEAVY_JUDGMENT 보다 먼저)
      Step 3 HEAVY_JUDGMENT
      Step 4 VERIFIER
      Step 5 EXECUTOR
      Step 6 UNCLASSIFIED
    """
    # Step 1: EXCLUDED 최우선
    if is_excluded(task_md):
        return CATEGORY.EXCLUDED

    # Step 2: ★ R1 verbatim — risky overlap FIRST (HEAVY_JUDGMENT 보다 먼저)
    if has_risky_overlap(task_md):
        return CATEGORY.UNCLASSIFIED

    # Step 3: HEAVY_JUDGMENT
    if is_heavy_judgment(task_md):
        return CATEGORY.HEAVY_JUDGMENT

    # Step 4: VERIFIER
    if is_verifier(task_md):
        return CATEGORY.VERIFIER

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

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

### 3.5 Precedence rule table — **triple-overlap row 포함** (★ R1 verbatim 강제)

| case | task_type | id pattern | team separation | allowed_resources.allowed_existing_file_edits | heavy_judgment 매칭 | detect_category() result | Step |
|---|---|---|---|---|---|---|---|
| **(a) verifier + executor** | `read_only` | `task-NNNN+M` | declared | **non-empty** | n/a | **UNCLASSIFIED** | Step 2 |
| **(b) verifier + non-empty edits** | `read_only` | `task-NNNN+M` | declared | **non-empty** | n/a | **UNCLASSIFIED** | Step 2 |
| **(c) read_only + non-empty edits** | `read_only` | any | any | **non-empty** | n/a | **UNCLASSIFIED** | Step 2 |
| **(d) triple-overlap** | `read_only` | `task-NNNN+M` | declared | **non-empty** | **YES** | **UNCLASSIFIED** (★ HEAVY_JUDGMENT 매칭 무시) | Step 2 |
| heavy_judgment only (read_only + empty edits + heavy match) | `read_only` | any | any | empty | YES | HEAVY_JUDGMENT | Step 3 |
| heavy_judgment + verifier (★ overlap 없음 = empty edits) | `read_only` | `task-NNNN+M` | declared | empty | YES | HEAVY_JUDGMENT (★ Step 3) | Step 3 |
| verifier only | `read_only` | `task-NNNN+M` | declared | empty | NO | VERIFIER | Step 4 |
| executor only | EXECUTOR_TYPES | any | any | n/a | NO | EXECUTOR | Step 5 |
| excluded | n/a (★ qc/routing/diagnostic) | any | any | any | any | EXCLUDED | Step 1 |
| 매칭 0 | any | any | any | any | NO | UNCLASSIFIED → HOLD_FOR_CHAIR | Step 6 |

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

| Codex round 4 지적 | v5 반영 |
|---|---|
| §3.4 Step 2 HEAVY_JUDGMENT precedence 가 Step 3 overlap detection 보다 먼저 → triple-overlap 시 HEAVY_JUDGMENT 반환 가능 | §3.4 Step 2 risky overlap detection FIRST (★ HEAVY_JUDGMENT 보다 먼저) + §3.3 `has_risky_overlap()` first-class predicate |
| §3.5 triple-overlap row 부재 → table ↔ code 불일치 | §3.5 (a)(b)(c)(d) 4 risky overlap row 명시 + (d) triple-overlap row 추가 (★ HEAVY_JUDGMENT 매칭 무시 강제) |

---

## 4. Excluded category — runtime-identifiable qc subcase matrix (★ R2 verbatim 강제)

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

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

### 4.2 qc_verifier subcase matrix — **runtime-identifiable + 3 추가 subcase** (★ R2 verbatim 강제)

★ R2 verbatim "runtime input, marker, keyword, evidence source 명시" + "chain-resolve / attempt-N / GEMINI_EXTERNAL_TRIGGER_GAP subcase 추가 열거" + "deterministic vs LLM judgment vs policy judgment vs evidence trust judgment 구분":

| qc_verifier subcase | runtime input | marker / keyword | evidence source | judgment type | 분류 |
|---|---|---|---|---|---|
| `severity_badge` | qc_verify.py severity field | regex `^(LOW|MEDIUM|HIGH|CRITICAL)$` | qc_verify.py stdout | **deterministic** | EXCLUDED |
| `file_count` | file glob count | numeric int | filesystem stat | **deterministic** | EXCLUDED |
| `tdd_check` | RED→GREEN test count + audit-trail file count | boolean + numeric | audit-trail markers | **deterministic** | EXCLUDED |
| `gemini_review_check` | PR comments body | keyword `gemini-code-assist` author + `/gemini review` trigger | GitHub PR comments API | **LLM judgment** | **4.8 candidate** |
| `browser_verify` | Playwright artifact / screenshot | artifact file path + URL match | `tests/artifacts/*.png` + Playwright log | **LLM judgment** | **4.8 candidate** |
| `security_audit` | Loki adversarial report | keyword `OWASP` / `CVE` / `CWE` + severity | `memory/reports/loki-*.md` | **LLM judgment** | **4.8 candidate** |
| `policy_judgment` | doctrine compliance markers | keyword `feedback_*` / `doctrine` / `verbatim` | `memory/feedback_*.md` + CLAUDE.md | **policy judgment** | **4.8 candidate** |
| `evidence_trust_judgment` | source attribution chain | keyword `RECEIVED_INBOUND_THIS_SESSION` / `LOG_LOOKUP` / `schedule_history` | `memory/events/*.json` source_attribution field | **evidence trust judgment** | **4.8 candidate** |
| `critical_7_interpretation` | Critical 7 분류 결정 | keyword `Critical 7` / `CHAIR_REQUIRED` | `feedback_critical_escalation_only_260508.md` | **LLM judgment** | **4.8 candidate** |
| `merge_readiness_judgment` | PR head sha + CI status + Gemini freshness | keyword `MERGE_READY` / `merge-ready` + CI status checks | GitHub PR API + CI run logs + `gh pr view --json` | **policy + Critical 7 + evidence trust** | **4.8 candidate** |
| `lineage_rewrite_detection` | task md sha256 history | keyword `lineage` / `parent_task` + sha diff | `memory/tasks/task-NNNN.md` git log | **evidence trust + policy** | **4.8 candidate** |
| `owner_nudge_interpretation` | OWNER token action audit | keyword `OWNER_TRIGGER_ONLY_CAPABILITY` / `OWNER_GEMINI_TRIGGER_ROUTER` | `OWNER_TRIGGER_ONLY_CAPABILITY` audit jsonl | **policy + evidence trust** | **4.8 candidate** |
| **`chain_resolve_verdict`** (★ R2 신규 verbatim) | attempt-N chain resolve outcome | keyword `attempt-` / `chain` / `resolver` + verdict enum | `memory/events/task-NNNN.attempt-N.json` | **LLM judgment + policy** | **4.8 candidate** |
| **`attempt_n_escalation`** (★ R2 신규 verbatim) | attempt-N hard limit hit | keyword `attempt-2` / `attempt-3` / `hard limit` | task md `attempt_n_history` + `feedback_attempt_n_hard_limit_doctrine_260513.md` | **policy judgment** | **4.8 candidate** |
| **`gemini_external_trigger_gap_interpretation`** (★ R2 신규 verbatim) | Gemini fresh evidence 부재 + OWNER nudge router state | keyword `GEMINI_EXTERNAL_TRIGGER_GAP` / `GEMINI_EXTERNAL_TRIGGER_STALE` / `OWNER_GEMINI_TRIGGER_ROUTER` | `feedback_gemini_external_trigger_gap_260509.md` + watcher OWNER nudge audit | **evidence trust + policy judgment** | **4.8 candidate** |

### 4.3 Subcase classifier decision rule — 15 subcase 처리 (★ R2 verbatim · "deterministic vs judgment-bearing 구분")

```python
def classify_qc_subcase(qc_call):
    """
    R2 verbatim:
      - judgment-bearing qc → 4.8 candidate (LLM / policy / evidence trust)
      - deterministic qc → excluded only
      - unknown → UNCLASSIFIED (HOLD_FOR_CHAIR)
    """
    LLM_JUDGMENT_SUBCASES = {
        'gemini_review_check',
        'browser_verify',
        'security_audit',
        'policy_judgment',
        'evidence_trust_judgment',
        'critical_7_interpretation',
        'merge_readiness_judgment',
        'lineage_rewrite_detection',
        'owner_nudge_interpretation',
        'chain_resolve_verdict',                       # ★ R2 verbatim 신규
        'attempt_n_escalation',                        # ★ R2 verbatim 신규
        'gemini_external_trigger_gap_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 Judgment type taxonomy (★ R2 verbatim "구분")

| judgment type | 정의 | 예시 subcase | 4.8 적용 |
|---|---|---|---|
| **deterministic** | numeric/boolean/regex check · LLM 없이 결정 가능 | severity_badge / file_count / tdd_check | NO (EXCLUDED) |
| **LLM judgment** | text interpretation / image interpretation / multi-source synthesis | gemini_review_check / browser_verify / security_audit / critical_7_interpretation / chain_resolve_verdict | YES (4.8 candidate) |
| **policy judgment** | doctrine/feedback memory 정합 판정 | policy_judgment / attempt_n_escalation | YES (4.8 candidate) |
| **evidence trust judgment** | source attribution / lineage / RECEIVED_INBOUND vs LOG_LOOKUP 구분 | evidence_trust_judgment / lineage_rewrite_detection | YES (4.8 candidate) |
| **복합** | 2 이상 judgment type 동시 적용 | merge_readiness_judgment (policy + Critical 7 + evidence trust) / owner_nudge_interpretation (policy + evidence trust) / gemini_external_trigger_gap_interpretation (evidence trust + policy) | YES (4.8 candidate) |

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

| Codex round 4 지적 | v5 반영 |
|---|---|
| 3 신규 subcase 의 runtime-identifiable criteria 부재 | §4.2 runtime input / marker / keyword / evidence source 4 column 명시 |
| chain-resolve / attempt-N / GEMINI_EXTERNAL_TRIGGER_GAP 미열거 | §4.2 3 신규 row · §4.3 LLM_JUDGMENT_SUBCASES 확장 (총 12 → 15) |
| deterministic vs judgment-bearing 구분 부재 | §4.4 judgment type taxonomy 5 분류 (deterministic / LLM / policy / evidence trust / 복합) |

---

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

(★ v4 §5 verbatim · R1 round 2 ACCEPTED 영역)

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

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

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

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

API 응답 가능성 = pilot runtime check 만.

---

## 6. Structural enforcement rules (★ E3 분리 verbatim)

### 6.1 Enforcement rules E1~E5 (★ E3 write-time guard ↔ post-pilot integrity check 분리)

| rule | 강제 mechanism | enforcement layer |
|---|---|---|
| **E1: old task id targeting 차단** | dispatch.py 진입 시 `task-id` argument 가 2710 이하 또는 기존 `+N` lineage 매칭 시 reject | 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** (★ 회장 verbatim 분리) | §6.2 immutable path-scope 의 파일에 **write attempt (open/write/rename/unlink) 발생 직전 path prefix check + reject**. 이 guard 는 overwrite 시도 자체를 차단한다. | file write guard (★ syscall/path prefix 검사 지점 · pilot session runtime in-flight) |
| **E3-b: 기존 evidence overwrite 차단 — post-pilot integrity check** (★ 회장 verbatim 분리) | §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 발급 후만 허용 | dispatch.py task-id whitelist check |

### 6.2 Immutable path-scope 8 axis (★ v4 §6.2 verbatim 유지)

closeout markers / verifier markers / dispatched markers / verifier reports / task md / capability snapshots / callback envelopes / decision files (★ task-2706~2709+1 lineage)

### 6.3 E3-a ↔ E3-b 분리 의도 (★ 회장 verbatim "추가 정리")

★ 회장 verbatim "write-time guard는 overwrite 시도 차단 지점이고, post-pilot integrity check는 사후 hash 검증 지점이라고 명확히 쓴다":

- **E3-a (write-time guard)**: in-flight syscall 차단 (★ runtime 시도 0)
- **E3-b (post-pilot integrity check)**: 사후 hash sweep (★ E3-a 가 놓친 in-flight 누설 사후 증명)
- **defense in depth**: 두 layer 둘 다 통과해야 immutable lineage 보장

---

## 7. Pilot pre-acceptance gates — baseline source + 동일급 (★ R3 verbatim 강제)

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

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

### 7.3 G3 — cost ceiling +50% / $15 (★ v4 유지)

### 7.4 G4 — latency ceiling +50% / 20분 (★ v4 유지)

### 7.5 G5 — baseline 결정성 + **authoritative source** + **동일급 비교 강제** (★ R3 verbatim)

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

| slot | 분류 | 선정 규칙 |
|---|---|---|
| **slot 1** | verifier baseline | task-2706+1 / 2707+1 / 2708+1 / 2709+1 중 §7.5.2 우선순위 timestamp 기준 가장 최근 + ACCEPT_WITH_KNOWN_CAVEATS 이상 verdict 1건 |
| **slot 2** | executor baseline | task-2706 / 2707 / 2708 / 2709 중 §7.5.2 우선순위 timestamp 기준 가장 최근 + accepted closeout 1건 |
| **slot 3** | heavy_judgment / Codex-review baseline | task-2710 v1~v4 Codex review markers (round 1~4) 중 §7.5.2 우선순위 timestamp 기준 가장 최근 1건 |

#### 7.5.2 Authoritative "가장 최근" source — 우선순위 3 단 (★ R3 verbatim 강제)

★ R3 verbatim "우선순위는 completion marker timestamp, report timestamp, dispatch marker timestamp 순서로 한다":

| priority | timestamp source | path pattern |
|---|---|---|
| **1st (최우선)** | completion marker timestamp | `memory/events/<lineage>_accepted_with_known_caveats_*_chair_closeout_*.json` 또는 `*_accepted_with_known_caveats_*_closed_*.json` · `recorded_at` field |
| **2nd** | report timestamp | `memory/reports/task-NNNN(+M).md` · file mtime 또는 markdown frontmatter `recorded_at` |
| **3rd** | dispatch marker timestamp | `memory/events/task-NNNN(+M).dispatched-YYYYMMDD.json` · `dispatched_at` field |

★ 1st 결격 시에만 2nd, 2nd 결격 시에만 3rd 사용 · cascade.

#### 7.5.3 동일급 비교 강제 — **mixed-slot 평균 금지** (★ R3 verbatim 강제)

★ R3 verbatim "slot 1 verifier는 verifier baseline끼리 비교한다 · slot 2 executor는 executor baseline끼리 비교한다 · slot 3 heavy_judgment/Codex-review는 같은 judgment 계열끼리 비교한다 · mixed-slot 평균으로 G3/G4를 완화하지 않는다":

| slot | 동일급 비교 대상 | mixed-slot 평균 |
|---|---|---|
| slot 1 verifier | verifier baseline 끼리만 비교 (★ executor / heavy 계열 평균 포함 0) | **금지** |
| slot 2 executor | executor baseline 끼리만 비교 (★ verifier / heavy 계열 평균 포함 0) | **금지** |
| slot 3 heavy_judgment / Codex-review | 같은 judgment 계열 끼리만 비교 (★ verifier / executor 평균 포함 0) | **금지** |

#### 7.5.4 G3/G4 동일급 baseline governance (★ R3 verbatim)

- **G3 cost ceiling**: 신규 dispatch 의 category 매칭 slot 의 동일급 baseline cost 와만 비교 (★ +50% / $15 limit 적용)
- **G4 latency ceiling**: 신규 dispatch 의 category 매칭 slot 의 동일급 baseline wall_time 과만 비교 (★ +50% / 20분 limit 적용)
- **동일급 baseline 부재 시** → 해당 slot **pilot 불가** (★ R3 verbatim "동일급 baseline이 없으면 해당 slot은 pilot 불가로 처리한다")

#### 7.5.5 baseline 3건 확보 실패 + tie/conflicting (★ R3 verbatim · v4 §7.5.3/7.5.4 유지)

- slot 1/2/3 중 1건이라도 결격 → **pilot dispatch 0 강제** (★ R3 verbatim "baseline 3건을 확보하지 못하면 pilot dispatch 금지한다")
- tie/conflicting → §7.5.6 보수적 기준 (★ v4 §7.5.4 유지)

#### 7.5.6 보수적 기준 (★ v4 §7.5.4 유지)

| 비교 항목 | 보수적 기준 |
|---|---|
| `cost` | baseline 중 최저 cost 기준 |
| `wall_time` | baseline 중 최단 wall_time 기준 |
| `output_tokens` | baseline 중 최소 output_tokens 기준 |
| `api_error` | baseline 중 최저 api_error count 기준 |
| `retry_count` | baseline 중 최저 retry_count 기준 |
| `evidence_mutation_count` | baseline 중 최저 evidence_mutation count 기준 |

#### 7.5.7 4번째 후보 (★ v4 §7.5.2 유지)

secondary comparison only · primary baseline 3건 미포함.

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

pre/post hash sweep 7 path scope · E3-b 와 동일 layer.

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

| Codex round 4 지적 | v5 반영 |
|---|---|
| "가장 최근" authoritative source 미명시 | §7.5.2 우선순위 3 단 (completion marker → report → dispatch marker) verbatim |
| G3/G4 "동일급 baseline" ↔ §7.5 mixed-slot 정합 미명시 | §7.5.3 동일급 비교 강제 + §7.5.4 mixed-slot 평균 금지 + 동일급 부재 시 slot pilot 불가 |

---

## 8. Acceptance Criteria

1. ★ R1 (§3 overlap-first precedence + triple-overlap row + UNCLASSIFIED 강제) 1:1 반영
2. ★ R2 (§4 runtime-identifiable + 3 추가 subcase + judgment taxonomy 5 분류) 1:1 반영
3. ★ R3 (§7.5 authoritative source + 동일급 비교 + mixed-slot 평균 금지 + 동일급 부재 시 slot pilot 불가) 1:1 반영
4. ★ E3 write-time guard (E3-a) ↔ post-pilot integrity check (E3-b) 분리 (★ 회장 verbatim "추가 정리")
5. ★ §5 / §6.2 / §7.1-7.4 / §7.6 v4 영역 변경 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 / v4 모두 보존 · revert 0
10. ★ Codex round 5 OVERALL PASS / PASS_WITH_RECOMMENDATIONS 까지 locked 0 / pilot 0

---

## 9. v4 → v5 diff summary

| v4 영역 | v5 변경 | rationale |
|---|---|---|
| §3.4 Step 2 HEAVY_JUDGMENT precedence | Step 2 ★ risky overlap detection FIRST → UNCLASSIFIED 강제 · HEAVY_JUDGMENT → Step 3 demote | Codex round 4 AXIS_2 FAIL · R1 verbatim |
| §3.3 (신규) `has_risky_overlap()` first-class predicate | 4 risky overlap cases (a)(b)(c)(d) 매트릭스 | R1 verbatim |
| §3.5 precedence table | triple-overlap (d) row 추가 + HEAVY_JUDGMENT 매칭 무시 강제 명시 | R1 verbatim |
| §4.2 9 subcase rationale 만 | runtime input / marker / keyword / evidence source 4 column 추가 | Codex round 4 AXIS_3 · R2 verbatim |
| §4.2 9 subcase | **15 subcase** 확장 (chain_resolve_verdict / attempt_n_escalation / gemini_external_trigger_gap_interpretation 신규) | R2 verbatim |
| §4.3 `classify_qc_subcase()` | LLM_JUDGMENT_SUBCASES 12 → 15 확장 | R2 verbatim |
| §4.4 (신규) judgment type taxonomy | deterministic / LLM / policy / evidence trust / 복합 5 분류 | R2 verbatim |
| §6.1 E3 one-line | E3-a write-time guard + E3-b post-pilot integrity check 분리 + §6.3 의도 설명 | 회장 verbatim "추가 정리" |
| §7.5.1 "가장 최근" 모호 | §7.5.2 authoritative source 우선순위 3 단 (completion marker → report → dispatch marker) | Codex round 4 AXIS_5 · R3 verbatim |
| §7.5 mixed-slot baseline | §7.5.3 동일급 비교 강제 + §7.5.4 mixed-slot 평균 금지 + 동일급 부재 시 slot pilot 불가 | R3 verbatim |
| §5 / §6.2 / §7.1-7.4 / §7.6 | **변경 0** | round 3 / 4 PASS 또는 PWR 영역 보존 |

---

## 10. R1~R3 + E3 (Codex round 4 + 회장 추가 정리) self-check

| ID | 회장 verbatim recommendation | v5 반영 위치 | status |
|---|---|---|---|
| **R1** | overlap detection FIRST + triple-overlap row + UNCLASSIFIED 강제 + detect_category() pseudo-code 1:1 | §3.3 has_risky_overlap() / §3.4 Step 2 / §3.5 (a)(b)(c)(d) table / §3.6 self-check | ✓ ACCEPTED |
| **R2** | runtime-identifiable + 3 추가 subcase + deterministic vs judgment 구분 | §4.2 4 column · 15 subcase / §4.3 / §4.4 taxonomy / §4.5 self-check | ✓ ACCEPTED |
| **R3** | authoritative source + 동일급 비교 + mixed-slot 평균 금지 + 동일급 부재 시 slot pilot 불가 | §7.5.2 / §7.5.3 / §7.5.4 / §7.7 self-check | ✓ ACCEPTED |
| **E3 분리** | write-time guard ↔ post-pilot integrity check 별도 문장 | §6.1 E3-a / E3-b + §6.3 의도 설명 | ✓ ACCEPTED |

**총 4/4 ACCEPTED**

---

## 11. Allowed / Forbidden Files

### 11.1 expected_files (★ 본 v5 round)

1. `memory/tasks/task-2710_v5.md`
2. `memory/events/task-2710.v5-revision-created-260530.json`
3. `memory/events/task-2710.v5-codex-round-5-rereview-result-260530.json`

### 11.2 allowed_existing_file_edits

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

### 11.3 forbidden_files (★ v4 §11.3 + v5 추가)

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

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

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

---

## 13. Sentinel

★ task-2710 v5 = read-only design draft v5 · Codex round 4 remaining 3 recommendations + 회장 추가 정리 (E3 분리) 1:1 반영 · bot_settings.json 변경 0 · dispatch.py 변경 0 · settings.json 변경 0 · finish-task.sh 변경 0 · 코드 구현 0 · pilot dispatch 0 · locked 선언 0 · v1/v2/v3/v4 보존 · task-2706~2709+1 evidence overwrite 0. Codex round 5 PASS / PASS_WITH_RECOMMENDATIONS 전까지 pilot 0. 끝
