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

★ **READ-ONLY DESIGN DRAFT v7 — MINOR REVISION** — 회장 verbatim "Codex OVERALL PASS_WITH_RECOMMENDATIONS 회장 threshold 충족 인정 · PILOT_READINESS NOT_READY_WITHOUT_FOLLOWUP → pilot 불허 · locked 불허 · remaining 4 recommendations 전부 ACCEPT · v7 minor revision 인가 · 새 설계 확장 0 · 4 영역 surgical fix only" 정합.

- v1: sha `cb99419b...` (★ 보존)
- v2: sha `4138b66d...` (★ 보존)
- v3: sha `641b852f...` (★ 보존)
- v4: sha `1964fb93...` (★ 보존)
- v5: sha `8fe519eb...` (★ 보존)
- v6: sha `63667ccd...` (★ 보존)
- **v7 origin**: Codex round 6 remaining 4 recommendations 1:1 minor surgical fix

★ **v7 = MINOR revision · 4 surgical patch only · 새 설계 확장 0**:
- §3 / §4.2 (15 subcase set) / §4.4 / §4.5 / §5 / §6 / §7.1-7.4 / §7.5.1 / §7.5.3-7.5.6 / §7.6 모두 **v6 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**: `v7 (minor)`
- **draft_v1_v2_v3_v4_v5_v6_preserved**: ✓
- **dispatch_status**: **NOT_DISPATCHED · READ-ONLY DESIGN v7 ONLY**
- **locked_status**: **NOT_LOCKED**
- **chair_verbatim_threshold_recognition**: ★ Codex round 6 OVERALL PASS_WITH_RECOMMENDATIONS = 회장 verbatim threshold 충족 인정 (★ 회장 verbatim "회장 threshold를 충족한 것으로 인정한다")

---

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

---

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

---

## 3. Category gate (★ v6 verbatim 유지)

★ R4 (round 5) Codex AXIS_2 PASS 영역 변경 0. §3.1 / §3.2 / §3.3 / §3.4 / §3.5 / §3.6 모두 v6 verbatim.

---

## 4. Excluded category — discriminator + 추가 subcase + **secondary_labels 정책** + **G enum 정정** (★ v6 + R2/R3 verbatim 정정)

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

### 4.2 qc_verifier subcase matrix — **G8 reference 정정** (★ R3 verbatim 강제)

★ R3 verbatim "§7이 G1~G6만 정의한다면 G8 reference를 올바른 G 번호로 정정한다 · 별도 G8을 새로 만들지 말고 오기 수정으로 처리한다":

★ v6 §4.2 `finish_task_gate_verdict` row 의 keyword column 은 `finish-task` / `scope-guard` / `G3` / `G4` / `G5` / **`G8`** / `gate verdict` 로 기록되어 있었으나 — 이 `G3/G4/G5/G8` 은 **finish-task.sh 내부 step gate 명칭** 으로 의도된 것이지 §7 pilot pre-acceptance gate (G1~G6) 와 무관하다. Codex round 6 가 §7 G1~G6 정의와의 혼동 가능성을 지적 (★ AXIS_5 NEEDS_REFINEMENT).

**정정 (R3 verbatim · 별도 G8 신설 금지 · 오기 수정 only)**:

v6 `finish_task_gate_verdict` row keyword column 을 **`finish-task` / `scope-guard` / `tdd-check` / `qc` / `capability-snapshot` / `gate verdict`** 로 정정 (★ §7 pilot gate enum 과 혼동 회피).

| qc_verifier subcase | runtime discriminator | runtime input | marker / keyword | evidence source | judgment type | 분류 |
|---|---|---|---|---|---|---|
| `finish_task_gate_verdict` (★ v7 정정) | finish-task gate composite outcome | finish-task scope-guard + tdd-check + qc + capability snapshot result | `finish-task` / `scope-guard` / `tdd-check` / `qc` / `capability-snapshot` / `gate verdict` (★ §7 G1~G6 pilot gate 참조 표현 제거) | `scripts/finish-task.sh` stderr + scope-violation jsonl + qc verdict | policy + evidence trust + Critical 7 (★ spec gate + evidence integrity 복합) | **4.8 candidate** |

★ v6 §4.2 의 다른 17 subcase row 는 모두 **v6 verbatim 유지**.

### 4.3 Discriminator overlap precedence + **secondary_labels 정책** (★ R2 verbatim 강제)

★ R2 verbatim:
- "primary label은 suppression-only로 하나만 선택한다"
- "단, suppressed signals는 secondary_labels 배열 또는 equivalent evidence field에 기록한다"
- "primary 판단은 precedence에 따르고, secondary는 감사/설명용으로만 둔다"
- "secondary label은 model selection을 변경하지 못한다고 명시한다"

**Primary label routing rule** (★ v6 §4.3 verbatim 유지 + secondary_labels 정책 추가):

| overlap case | primary label (★ routing 결정) | secondary_labels (★ 감사/설명용 only) |
|---|---|---|
| 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"]` |

**Recording requirement**:

```python
qc_classification_record = {
    'primary_label': 'policy_judgment',          # ★ routing decision (★ model selection 결정)
    'secondary_labels': ['chain_resolve_verdict', 'attempt_n_escalation'],  # ★ 감사/설명용 only
    'precedence_applied': 'policy > chain > attempt',
    'model_selection_input': 'primary_label',     # ★ secondary_labels 는 model selection 입력 0
}
```

**★ Hard rule (★ R2 verbatim "secondary label은 model selection을 변경하지 못한다고 명시한다")**:

- `model_selection_input` 은 `primary_label` field 단독 (★ secondary_labels 미참조)
- secondary_labels = audit/explanation only · routing/model decision 0
- secondary_labels presence 가 4.8 candidate 여부를 변경하지 못한다

### 4.4 Subcase classifier decision rule — **secondary_labels 기록 추가** (★ R2 verbatim)

```python
def classify_qc_subcase(qc_call):
    """
    R2 verbatim: primary label suppression-only + secondary_labels audit/explanation only.
    secondary_labels 는 model selection 변경 못함 (★ hard rule).
    """
    DETERMINISTIC_SUBCASES = {
        'severity_badge',
        'file_count',
        'tdd_check',
    }
    LLM_JUDGMENT_SUBCASES = {
        # ... v6 §4.4 verbatim 15 항목 ...
        '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', 'attempt_n_escalation', 'gemini_external_trigger_gap_interpretation',
        'regression_replay_verdict', 'finish_task_gate_verdict', 'taskctl_state_guard_scope_misfire',
    }

    # ★ R2 verbatim — primary label precedence (★ routing decision)
    primary = None
    secondary = []

    if has_policy_judgment_signal(qc_call):
        primary = 'policy_judgment'
    elif has_chain_resolve_signal(qc_call):
        primary = 'chain_resolve_verdict'
    elif has_attempt_n_escalation_signal(qc_call):
        primary = 'attempt_n_escalation'

    # ★ R2 verbatim — secondary_labels (★ audit/explanation only)
    for signal_check, label in [
        (has_policy_judgment_signal, 'policy_judgment'),
        (has_chain_resolve_signal, 'chain_resolve_verdict'),
        (has_attempt_n_escalation_signal, 'attempt_n_escalation'),
    ]:
        if signal_check(qc_call) and label != primary:
            secondary.append(label)

    # routing decision = primary only (secondary_labels 미참조)
    if primary in LLM_JUDGMENT_SUBCASES:
        return (CATEGORY.HEAVY_JUDGMENT, primary, secondary)

    if qc_call.subcase in LLM_JUDGMENT_SUBCASES:
        return (CATEGORY.HEAVY_JUDGMENT, qc_call.subcase, [])
    if qc_call.subcase in DETERMINISTIC_SUBCASES:
        return (CATEGORY.EXCLUDED, qc_call.subcase, [])
    return (CATEGORY.UNCLASSIFIED, qc_call.subcase, [])
```

★ docstring/comment 내 "18 subcase" → **"15 subcase"** 정정 (★ v6 round 6 AXIS_3 Codex 지적 "docstring '18' vs set 15 inconsistency" 정합).

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

### 4.6 R2/R3 self-check (★ v6 §4.6 + 본 round R2/R3)

| Codex round 6 지적 | v7 반영 |
|---|---|
| §4.3 coexistence overlap 이 suppression-only 로 처리되어 multi-label evidence 미기록 | §4.3 primary_label + secondary_labels 분리 · §4.4 classifier (primary, secondary) tuple 반환 · hard rule "secondary 는 model selection 변경 0" 명시 |
| §4.4 docstring "18 LLM-judgment subcases" vs set 15 inconsistency | §4.4 docstring "15 subcase" 정정 |
| §4.2 `G8` reference 오기 (★ §7 = G1~G6 만 정의) | §4.2 finish_task_gate_verdict row keyword column 정정 (★ G3/G4/G5/G8 → tdd-check/qc/capability-snapshot 등 finish-task.sh 내부 gate enum 표현) · 별도 G8 신설 0 |

---

## 5. Method A (overlay) (★ v6 verbatim 유지)

---

## 6. Structural enforcement rules (★ v6 verbatim 유지)

---

## 7. Pilot pre-acceptance gates — **case 6 enum 보강 + case 8 tie-resolution 추가** (★ R1/R4 verbatim 강제)

### 7.1 G1 / 7.2 G2 / 7.3 G3 / 7.4 G4 (★ v6 verbatim 유지)

### 7.5 G5 — baseline 결정성

#### 7.5.1 필수 baseline 3건 (★ v6 verbatim 유지)

#### 7.5.2 Authoritative source + 결격 8 case — **case 6 enum 보강** (★ R1 verbatim 강제)

**Priority cascade rule** (★ v6 §7.5.2 verbatim 유지):

| priority | timestamp source | path pattern |
|---|---|---|
| 1st | completion marker | §7.5.1 slot-specific · `recorded_at` |
| 2nd | report | `memory/reports/task-NNNN(+M).md` · mtime 또는 frontmatter `recorded_at` |
| 3rd | dispatch marker | `memory/events/task-NNNN(+M).dispatched-YYYYMMDD.json` · `dispatched_at` |

**결격 8 case — case 6 enum 보강** (★ R1 verbatim "ACCEPT_WITH_KNOWN_CAVEATS 를 명시적으로 포함 · task-2706~2709+1 실제 closeout pattern 과 정합"):

| # | 결격 사유 | detection rule |
|---|---|---|
| 1 | marker 파일 없음 | `os.path.exists()` False |
| 2 | JSON/YAML parse 실패 | `json.loads()` / `yaml.safe_load()` exception |
| 3 | required field 누락 | `recorded_at` / `task_id` / `status` 등 schema field 부재 |
| 4 | timestamp 없음 또는 비정상 | `recorded_at` 부재 또는 `datetime.fromisoformat()` 실패 또는 미래/원시시간 |
| 5 | task_id 불일치 | marker `task_id` ≠ 예상 lineage |
| **6** | **status 가 accepted/closed/pass/pass_with_recommendations 계열 아님** (★ R1 verbatim 보강) | `status` field 가 다음 enum 외: **`ACCEPT_WITH_KNOWN_CAVEATS` / `ACCEPTED_WITH_KNOWN_CAVEATS` / `accepted_with_known_caveats` / `accepted_with_known_caveats_direct_recovery_closed`** (★ task-2706~2709+1 lineage closeout pattern verbatim) / `accepted` / `closed` / `chair_closeout` / `pass` / `PASS` / `pass_with_recommendations` / `PASS_WITH_RECOMMENDATIONS` 계열. HOLD_FOR_CHAIR / REJECT / FAIL 포함 시 결격. |
| 7 | evidence sha/hash 불일치 | marker `sha256` ≠ 실제 파일 sha256 |
| 8 | completion ↔ report/dispatch marker lineage 불일치 | §7.5.2.A tie-resolution rule 적용 (★ v7 신규) |

#### 7.5.2.A case 8 canonical tie-resolution rule (★ R4 verbatim 강제 · v7 신규)

★ R4 verbatim "3 priority sources가 동시에 존재하고 값이 불일치하면 다음 순서로 판단한다":

**Step 1 — lineage match score 우선** (★ R4 verbatim 1st rule):

```python
def lineage_match_score(source):
    """task_id / head_sha / marker_sha 매칭 수."""
    expected = {
        'task_id': slot_specific_task_id,
        'head_sha': slot_specific_head_sha,
        'marker_sha': slot_specific_marker_sha,
    }
    score = 0
    if source.get('task_id') == expected['task_id']:
        score += 1
    if source.get('head_sha') == expected['head_sha']:
        score += 1
    if source.get('marker_sha') == expected['marker_sha']:
        score += 1
    return score

# Step 1: lineage_match_score 최대 source 선택
```

**Step 2 — Priority source 순서** (★ R4 verbatim 2~4 rule):

| step | rule |
|---|---|
| Step 2-a | completion marker (★ R4 verbatim "2) completion marker") |
| Step 2-b | report marker (★ R4 verbatim "3) report marker") |
| Step 2-c | dispatch marker (★ R4 verbatim "4) dispatch marker") |

**Step 3 — 보수적 값** (★ R4 verbatim "그래도 충돌하면 더 보수적인 값으로 결정 · cost / wall_time / output_tokens / API error / retry_count / evidence_mutation_count 기준에서 pilot 허용 폭이 더 좁은 값"):

| 항목 | 보수적 값 |
|---|---|
| cost | sources 중 **최저** cost (★ pilot 허용 폭 좁음) |
| wall_time | sources 중 **최단** wall_time |
| output_tokens | sources 중 **최소** output_tokens |
| api_error | sources 중 **최저** api_error count |
| retry_count | sources 중 **최저** retry_count |
| evidence_mutation_count | sources 중 **최저** mutation count |

**Step 4 — Evidence recording** (★ R4 verbatim "tie-resolution 결과와 선택 이유를 pilot gate evidence에 기록한다"):

```python
pilot_gate_evidence['tie_resolution'] = {
    'sources_compared': [completion_marker, report_marker, dispatch_marker],
    'lineage_match_scores': {...},      # Step 1
    'priority_order_applied': '...',     # Step 2
    'conservative_selection': {...},     # Step 3
    'selected_source': '...',            # 최종 선택
    'reason': '...',                     # 선택 이유 verbatim
}
```

#### 7.5.3 동일급 비교 강제 (★ v6 verbatim 유지)

#### 7.5.4 G3/G4 동일급 baseline governance (★ v6 verbatim 유지)

#### 7.5.5 보수적 기준 (★ v6 verbatim 유지)

#### 7.5.6 4번째 후보 (★ v6 verbatim 유지)

### 7.6 G6 (★ v6 verbatim 유지)

### 7.7 R1/R4 self-check (★ v6 §7.7 + 본 round R1/R4)

| Codex round 6 지적 | v7 반영 |
|---|---|
| §7.5.2 case 6 enum 이 `ACCEPT_WITH_KNOWN_CAVEATS` 누락 → task-2706~2709+1 closeout pattern 배제 가능성 | §7.5.2 case 6 enum 확장 (★ ACCEPT_WITH_KNOWN_CAVEATS / accepted_with_known_caveats / accepted_with_known_caveats_direct_recovery_closed / chair_closeout / PASS_WITH_RECOMMENDATIONS 모두 명시) |
| §7.5.2 case 8 tie-resolution rule 부재 | §7.5.2.A 4-step rule (★ Step 1 lineage_match_score → Step 2 priority order → Step 3 보수적 값 → Step 4 evidence recording) |

---

## 8. Acceptance Criteria

1. ★ R1 §7.5.2 case 6 enum 보강 (★ ACCEPT_WITH_KNOWN_CAVEATS 명시) 1:1 반영
2. ★ R2 §4.3 primary_label + secondary_labels 정책 + hard rule "secondary 가 model selection 변경 0" 1:1 반영
3. ★ R3 §4.2 G8 reference 정정 + 별도 G8 신설 0 1:1 반영
4. ★ R4 §7.5.2.A case 8 tie-resolution 4-step rule 1:1 반영
5. ★ v6 §3 / §4 (15 subcase set) / §4.5 / §5 / §6 / §7.1-7.4 / §7.5.1 / §7.5.3-7.5.6 / §7.6 verbatim 유지 (★ 새 설계 확장 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 / v5 / v6 모두 보존 · revert 0
10. ★ Codex round 7 = PILOT_READINESS 재판정 (★ 새 설계 확장 평가 아님)

---

## 9. v6 → v7 minor diff summary (★ 4 surgical patch only)

| v6 영역 | v7 변경 | rationale |
|---|---|---|
| §4.2 `finish_task_gate_verdict` row keyword `G3/G4/G5/G8` | **`tdd-check / qc / capability-snapshot`** 등 finish-task.sh 내부 enum 표현 | Codex round 6 AXIS_5 · R3 verbatim |
| §4.3 overlap suppression-only | **primary_label + secondary_labels 분리** + hard rule "secondary 가 model selection 변경 0" | Codex round 6 AXIS_3 · R2 verbatim |
| §4.4 docstring "18" | "15" 정정 | Codex round 6 AXIS_3 · R2 정합 |
| §7.5.2 case 6 enum | **ACCEPT_WITH_KNOWN_CAVEATS / accepted_with_known_caveats / accepted_with_known_caveats_direct_recovery_closed / chair_closeout / PASS_WITH_RECOMMENDATIONS** 명시 | Codex round 6 AXIS_5 · R1 verbatim |
| §7.5.2.A (신규) | case 8 tie-resolution 4-step (lineage_match_score → priority order → 보수적 값 → evidence recording) | Codex round 6 AXIS_5 · R4 verbatim |
| §3 / §4.1 / §4.2 외 17 subcase row / §4.5 / §5 / §6 / §7.1-7.4 / §7.5.1 / §7.5.3-7.5.6 / §7.6 | **변경 0** (★ v6 verbatim) | round 6 PASS / PWR 영역 보존 + 새 설계 확장 0 정합 |

---

## 10. R1~R4 (Codex round 6 remaining) self-check

| ID | 회장 verbatim recommendation | v7 반영 위치 | status |
|---|---|---|---|
| **R1** | §7.5.2 case 6 enum 보강 (★ ACCEPT_WITH_KNOWN_CAVEATS 포함) | §7.5.2 case 6 / §7.7 self-check | ✓ ACCEPTED |
| **R2** | §4.3 primary suppression-only + secondary_labels 기록 + hard rule | §4.3 table / §4.4 (primary, secondary) tuple / §4.6 self-check | ✓ ACCEPTED |
| **R3** | §4.2 G8 reference 정정 + 별도 G8 신설 0 | §4.2 finish_task_gate_verdict row 정정 / §4.6 self-check | ✓ ACCEPTED |
| **R4** | §7.5.2 case 8 4-step tie-resolution (lineage_match_score → priority order → 보수적 값 → evidence recording) | §7.5.2.A 4-step rule / §7.7 self-check | ✓ ACCEPTED |

**총 4/4 ACCEPTED**

---

## 11. Allowed / Forbidden Files

### 11.1 expected_files

1. `memory/tasks/task-2710_v7.md`
2. `memory/events/task-2710.v7-revision-created-260530.json`
3. `memory/events/task-2710.v7-codex-round-7-rereview-result-260530.json`

### 11.2 allowed_existing_file_edits

- NONE

### 11.3 forbidden_files

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

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

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. locked 선언 0

---

## 12. ANU Doctrine Compliance

- ★ v1/v2/v3/v4/v5/v6 modification 0
- ★ ANU 자체 코드 구현 0 · 모델 설정 변경 0 · pilot dispatch 0 · locked 선언 0
- ★ ANU 자체 분류 결정 0 (★ R1~R4 모두 회장 verbatim 1:1)
- ★ task-2706~2709+1 evidence overwrite 0
- ★ ANU 자체 OVERALL PASS 선언 0
- ★ ANU 자체 threshold 해석 0 · pilot 진입 인가 0 · lock 인가 0
- ★ ANU 자체 새 설계 확장 0 (★ 회장 verbatim "Codex round 7의 목표는 새 설계 확장이 아니라 remaining 4 recommendation 반영 확인과 PILOT_READINESS 재판정")

---

## 13. Sentinel

★ task-2710 v7 = read-only design draft v7 MINOR revision · Codex round 6 remaining 4 recommendations (R1 case 6 enum 보강 · R2 secondary_labels 정책 · R3 G8 오기 정정 · R4 case 8 tie-resolution 4-step) 1:1 surgical fix · 새 설계 확장 0 · v6 §3 / §4 (15 subcase) / §4.5 / §5 / §6 / §7.1-7.4 / §7.5.1 / §7.5.3-7.5.6 / §7.6 verbatim 유지 · bot_settings.json 변경 0 · dispatch.py 변경 0 · settings.json 변경 0 · finish-task.sh 변경 0 · 코드 구현 0 · pilot dispatch 0 · locked 선언 0 · v1~v6 보존. Codex round 7 목표 = remaining 4 반영 확인 + PILOT_READINESS 재판정 (★ READY / READY_WITH_RECOMMENDATIONS 도달 시 별도 회장 결정으로만 pilot 진행). 끝
