# task-2613+1 — Track D auto-remediation R1 (non-Critical HIGH 자동 수렴)

> 본 spec 은 순수 Python classifier 코드 remediation. regression test·hardening·false-positive 룰 정정 코딩 작업이며 dev 팀 소관(비주얼 창작 무관).

#### allowed_resources
```yaml
allowed_resources:
  paths:
    - "anu_v3/batch_dependency_classifier.py"
    - "schemas/dependency_wait_state.schema.json"
    - "schemas/not_started_by_design.schema.json"
    - "memory/events/task-2613+1.decision.json"
    - "memory/events/task-2613+1.result.json"
    - "memory/reports/task-2613+1.md"
  forbidden_paths:
    - "memory/events/task-2613.decision.json"
    - "memory/events/task-2613.result.json"
    - "memory/events/task-2613.independent-anu-collector.adjudication.json"
    - "anu_v3/batch_hold_adjudicator.py"
    - "anu_v3/auto_remediation_planner.py"
    - "anu_v3/critical7_classifier.py"
    - "tests/**"
    - "dispatch.py"
    - "CLAUDE.md"
  commands:
    - "git log"
    - "git diff"
    - "python3 -m anu_v3.batch_dependency_classifier --mode both"
  merge_policy: "tiered"
  ttl_hours: 2
```

> **Lv**: Lv.3. **Executor**: dev3-team 다그다 (key 0b94683120a691cf) 1회 한정. **TTL**: 2h. **상태**: task-2613 독립 ANU collector adjudication = AUTO_REMEDIATION_HOLD (non-Critical HIGH×1 + MED×1, Critical7 0, SAFE 방향). ANU-Codex loop 자동 수렴 R1. 문서-only 금지. **callback: 반드시 독립 ANU key c119085addb0f8b7(executor self key 0b94683120a691cf 절대 callback-owner 금지·+49 정본).**
> **adjudication 정본**: `memory/events/task-2613.independent-anu-collector.adjudication.json`. **plan**: `memory/events/task-2613-AR1.plan.json`. **task-2613 remediation round 1 (+1).**

## 1. 목표

독립 Codex 재audit 가 확인한 task-2613 batch_dependency_classifier 의 non-Critical HIGH×1 + MEDIUM×1 결함을 교정한다. 핵심 anti-conflation 분리 invariant(I1/I2/I3)·C4(모순입력 비격상) **불변 보존**이 절대 조건. 회장 보고 0 (non-Critical 자동 수렴).

## 2. 구현 (정확히 이 2건만 · scope 외 0)

**HIGH (claim/spec-drift + recognition-breadth) — `anu_v3/batch_dependency_classifier.py`**: `build_real_contexts()` 의 `EVENT_GATED`/`AUTO_SEQ` 주석은 gate 를 `all-settled` 로 기술하나 구현(`gate_satisfied()` :97-100 · `_durable_success()`)은 `durable-success` 만 본다. 이 drift 를 교정한다 — (a) 주석/docstring 을 실제 의미(`gate 충족 = 선언 upstream 전부 durable-success`; durable-success 가 `all-settled` 보다 엄격한 fail-closed 보수 선택임을 명시)로 정합화하고, (b) `_durable_success()` 의 인식 술어를 명시 상수/docstring 으로 문서화하여 인식 폭(예: status 값 집합)을 가시화한다. **★ 절대 보존**: `I2`(¬gate_satisfied ⟹ `NOT_STARTED_BY_DESIGN`/`WAITING_FOR_DEPENDENCY`) 와 `C4`(gate 미충족+dispatch_fired 모순입력은 `DISPATCH_NOT_RECEIVED` 로 격상 금지)는 byte-단위 의미 불변 — 인식 폭을 넓히더라도 gate 미충족 → 정상보류 경로와 분리장벽을 약화시키지 않는다. 인식 폭 변경이 분리 invariant 에 영향 없음을 회귀 테스트로 실증.

**MEDIUM (enforcement-surface) — `anu_v3/batch_dependency_classifier.py` + `schemas/dependency_wait_state.schema.json`**: (a) `as_not_started_record()` 에 verdict 외 `gate_satisfied is False ∧ is_incident is False ∧ is_blocking_for_adjudicator is False` 재검증을 추가하여 classify_track 우회 직접 생성 객체로 정상보류 레코드 직렬화 차단(위반 시 `ConflationError`). (b) `schemas/dependency_wait_state.schema.json` 에 forward-invariant conditional(`allOf`/`if-then`) 추가: `verdict==DISPATCH_NOT_RECEIVED ⟹ is_incident==true ∧ is_blocking_for_adjudicator==true`; 정상보류 4종 ⟹ `is_incident==false ∧ is_blocking_for_adjudicator==false`. invariant 위반 출력을 schema 가 reject. 본 항목은 방어심층 hardening.

## 3. 검증 (필수 · in-module · 신규 test 파일 0)

`python3 -m anu_v3.batch_dependency_classifier --mode both` 의 기존 C1..C6 무회귀 + **신규 회귀 테스트 케이스를 `regression_cases()` 내부에 additive 추가**: (C7) gate 의미 정합화 후에도 `¬gate_satisfied ⟹ NOT_STARTED_BY_DESIGN/WAITING_FOR_DEPENDENCY` 보존(I2 불변), (C8) 인식 폭 확장 입력에서도 gate 충족+fired+미수신만 `DISPATCH_NOT_RECEIVED`·gate 미충족+fired 모순은 비격상(C4 불변 재실증), (C9) `as_not_started_record` 가 gate_satisfied=True/incident=True 객체에 `ConflationError`, (C10) 정상보류 출력 schema-valid·`DISPATCH_NOT_RECEIVED` 가 incident/blocking 누락 시 schema reject. mock-only 금지(실 entrypoint). `--mode classify` `dependency_wait_state.v1` 출력 schema-valid 유지.

## 4. expected_files allowlist (이 외 write 0)

`anu_v3/batch_dependency_classifier.py` · `schemas/dependency_wait_state.schema.json` · `schemas/not_started_by_design.schema.json` · `memory/events/task-2613+1.decision.json` · `memory/events/task-2613+1.result.json` · `memory/reports/task-2613+1.md`. **타 track(A/B/C/E/F)·task-2613.{decision,result}.json·independent-anu-collector.adjudication.json·task-2553·task-2604 multitrack·frozen anchor byte-0(read-only)**. git HEAD·branch 전후 EQUAL. **신규 test 파일 생성 금지 — 회귀 테스트는 batch_dependency_classifier.py 의 `regression_cases()` 내부에 추가(allowlist 내).**

## 5. 금지

기존 산출물 변조 · scope 확대(2건 외 수정) · `NOT_STARTED_BY_DESIGN`/`WAITING_FOR_DEPENDENCY` ↔ `DISPATCH_NOT_RECEIVED` 분리장벽 약화(I1/I2/I3·C4 의미 변경) · 문서-only/mock-only 완료 · executor self callback/collector/adjudication/dispatch · independent ANU authoritative 약화 · fallback/dead-man/fixed-time 진행트리거 · PR/branch/main write·merge·credential · claim 만 고치고 회귀 테스트 미보강.

## 6. HOLD_FOR_CHAIR

shared invariant 파손 또는 Critical7 = 전체 CHAIR_HOLD. 본 R1 자체 결함은 non-Critical → 그래도 잔존 시 AUTO_REMEDIATION_HOLD 재수렴(회장 보고 0). **분리 invariant(I1/I2/I3·C4) 약화가 발견되면 그것은 shared invariant 파손 → 즉시 HOLD_FOR_CHAIR.**

## 7. callback (a) — 독립 ANU key 강제

완료 직후 normal completion callback **ANU key c119085addb0f8b7로만 발사** → 독립 ANU collector 회수·검증·Codex 재lint·adjudication. 전 finding HIGH/CRITICAL 0 (또는 non-critical 자동분류)·재lint PASS 후 task-2613 +53 durable-success write-back → +54·+55 dogfood → {task-2610,2611,2612,2613} all-settled 시 Track E(task-2614) 자연 트리거. executor self key 0b94683120a691cf callback-owner 절대 금지(+49 정본). ANU fallback=ANU key·안전망 한정·진행 트리거 아님.

## 8. 9-R (확정 — 본 절 본문 우선)

**ANU-Codex lint = GO_READY (HIGH/CRITICAL 0)** — 2건 교정 정확(scope 외 0) · I1/I2/I3·C4 분리장벽 byte-의미 불변 실증 · `--mode both` C1..C6 무회귀 + C7..C10 PASS·mock-only FAIL · expected_files DISJOINT · shared invariant 보존 · 문서-only 금지 · 신규 test 파일 0. ANU key 로 dev3 다그다 1회 위임.

## goal_assertions (auto-generated)
- `python3 -m anu_v3.batch_dependency_classifier --mode both`