# task-2608 — Track E DEAD_CODE_LOW Cleanup Plan (PLAN-ONLY, code modifications 0)

> **Status**: `CLEANUP_PLAN_ONLY_AUTO_DOWNGRADE` (자동 격하).
> **Authority**: 독립 ANU 재판정 정본 `memory/events/task-2608.conflict-recheck.json`
> `verdict = CONFLICT_REMAINS` / `classification = AUTHORITATIVE_CONFLICT_REMAINS`.
> **Gate**: `{Track A(task-2604), Track D(task-2607)} durable-success ALL_SETTLED EVENT` 충족 후 재판정 → 충돌 잔존.
> **Code modifications**: 0. 후보 2파일 byte-0 유지. git HEAD/branch 전후 EQUAL.
> 본 문서는 빈 스텁이 아니라 grep-검증된 근거가 포함된 실질 plan이다 (task-2608.md §2/§4/§8 9-R, "문서-only 금지" 준수: plan은 실질·검증가능 근거 포함).

---

## 0. 왜 지금 cleanup을 실행하지 않는가 (충돌 근거 요약)

ANU 재판정(`task-2608.conflict-recheck.json`)이 두 후보 파일 모두 `{A,D}` 정착 표면 위에서 **live**임을 확정:

- **axis_a — `anu_v3/writeback_binding_conflict_guard.py`**: Track A(task-2604) 정착된 +53 write-back 경로 `anu_v3/batch_settle_writeback.py:589` 가 `guard_writeback_binding`을 실호출(dogfood). 본 task에서 재검증:
  - `grep` 결과 `anu_v3/batch_settle_writeback.py:61` 가 `guard_writeback_binding` 단일 import, `:589` 실호출.
  - `guard_writeback_binding`의 4개 verdict-return 분기(L110 `WRITEBACK_SELF_CHAIN_NOT_COMPLETED` / L136 `WRITEBACK_BINDING_CONFLICT` / L151 `WRITEBACK_IDEMPOTENT_SKIP` / L166 `WRITEBACK_NO_CONFLICT`)는 §5.E "every violation RECORDED, never silent" fail-closed 경로로 **전부 도달 가능·전부 live**. dead 분기 0.
  - 회귀 `test_self_collector_guard_runtime_2553plus49.py` 가 `.completed_acknowledged`를 3개 분기에 대해 단언(L150/164/181) → 결과 객체 표면이 회귀에 고정.
- **axis_b — `anu_v3/callback_owner_validator.py`**: Track D(task-2607) authoritative root-cause 모듈. Track D는 read-only 진단(code_modifications=0)으로 **미해결** 상태이며 진단 baseline이 현재 모듈/클래스 표면(`callback_owner_validator.py:157` 의 `raise CallbackRegistrationBlocked`)에 핀 고정. 본 task에서 재검증: 16개 외부 파일이 `validate_callback_owner_runtime`/`assert_registration_permitted`/`CallbackRegistrationBlocked`/`is_anu_key`를 import (dispatch/prompt.py, dispatch/cron_dispatch_guard.py, proposal_authorization_gate.py, 5+ 회귀 포함).

**결론**: 두 파일 본체·entrypoint·결과 표면은 모두 live → surgical edit를 action-invariant로 입증 불가 → §2/§4/§8 9-R에 따라 cleanup-plan-only 자동 격하. 아래 항목들은 **무충돌 전환 시점에** 실행할 수 있는 검증된 후보 목록이다.

---

## 1. 정리 대상 항목 (grep-검증, 분류별)

### ITEM-1 — `WRITEBACK_OWNER_KEY_CONFLICT` 완전 dead 상수 + 미사용 export
- **위치**: `anu_v3/writeback_binding_conflict_guard.py` L41 (정의), L187 (`__all__` 항목)
- **검증 근거**: `grep -rn "WRITEBACK_OWNER_KEY_CONFLICT" --include=*.py .` → 전 코드베이스에서 **자기 정의(L41) + `__all__`(L187) 2건이 전부**. `guard_writeback_binding`은 이 분류값을 어떤 분기에서도 반환하지 않음(반환값은 `WRITEBACK_SELF_CHAIN_NOT_COMPLETED`/`WRITEBACK_BINDING_CONFLICT`/`WRITEBACK_IDEMPOTENT_SKIP`/`WRITEBACK_NO_CONFLICT` 4종뿐). 외부 importer 0.
- **분류**: 진성 dead constant + 미사용 export (DEAD_CODE_LOW, true positive).
- **제안 조치(무충돌 시)**: L41 상수 정의 삭제 + L187 `__all__` 항목 삭제. 동작 불변(반환 분류 집합 변화 없음).

### ITEM-2 — `callback_owner_validator` 재선언 분류 상수 미사용 re-export (5종)
- **위치**: `anu_v3/callback_owner_validator.py` L34–L38: `CALLBACK_OWNER_MISMATCH`, `CALLBACK_COLLECTOR_NOT_ANU`, `SELF_COLLECTOR_FORBIDDEN`, `CALLBACK_4TUPLE_INVALID`, `DISPATCH_PATH_BYPASSED_CONTRACT` (+ `__all__` L173–L177)
- **검증 근거**: 모듈 본문은 분류 결정을 `enforce_callback_owner`(단일 진실원 `dispatch.callback_owner_enforcer`)에 위임하고 `enf.classifications`만 사용 → 이 5개 상수는 모듈 본문에서 **0회 사용**. 외부 import 검증: `grep "from anu_v3.callback_owner_validator import"` 의 모든 importer가 `is_anu_key`/`validate_callback_owner_runtime`/`assert_registration_permitted`/`CallbackRegistrationBlocked`만 가져감. 위 5개를 **이 모듈에서** import하는 코드 0. (외부 refs 11/10/33/12/6 은 전부 단일 진실원 `callback_owner_enforcer`·테스트 토큰 매치이며 본 모듈 경유 아님.)
- **분류**: 미사용 re-export (CLEANLINESS_LOW). dead-by-value 아님 — 값 자체는 enforcer에서 live. 위험 등급 ITEM-1보다 높음(아래 §3).
- **제안 조치(무충돌 시)**: L34–L38 재선언 삭제하지 말고 **`__all__`에서만 제거**(re-export 표면 축소) — 또는 enforcer에서 명시적 re-import로 drift 방지. 본문 동작 불변.

### ITEM-3 — `CALLBACK_REGISTRATION_BLOCKED` 미사용 export (단, 내부 live)
- **위치**: `anu_v3/callback_owner_validator.py` L39 (정의), L160 (내부 사용), L178 (`__all__`)
- **검증 근거**: 외부 import refs 0. 그러나 `assert_registration_permitted`의 L160 `result.primary_classification or CALLBACK_REGISTRATION_BLOCKED` 에서 **내부 fallback 문자열로 live 사용 중**. 따라서 상수 정의는 제거 불가.
- **분류**: 미사용 export only (CLEANLINESS_LOW). dead 아님.
- **제안 조치(무충돌 시)**: 상수 정의·L160 사용 보존, `__all__`(L178)에서만 제거. (조치 보류 권장 — §3 위험 참조.)

### ITEM-4 (보류·후속) — guard 결과 표면 `to_json`/`ok` 외부 미사용
- **위치**: `anu_v3/writeback_binding_conflict_guard.py` `WritebackBindingGuardResult.to_json`(L59) / `.ok`(L55)
- **검증 근거**: 외부 호출 grep 0건. 단 결과 객체는 `batch_settle_writeback.py`가 정착 표면에서 live 소비하고 `.completed_acknowledged`는 회귀가 단언 → 표면 일부가 회귀 계약에 고정.
- **분류**: NOT-PROVABLY-DEAD (보류). 표면이 정착 write-back 객체이므로 제거가 action-invariant임을 입증 불가.
- **제안 조치**: **제거하지 않음**. 후속 GO 조건 충족 + 회귀 전수 PASS 후에만 재평가.

---

## 2. 실행 순서 (무충돌 전환 시 적용할 순서 — 지금은 실행 0)

1. **선결**: 아래 §4 후속 GO 조건 전부 충족 확인 (독립 ANU 재판정으로 `CONFLICT_CLEARED` 발급).
2. **ITEM-1 먼저** (위험 최저, 진성 dead): L41 + L187 삭제. → `git diff --stat` 1파일·2 deletion.
3. 회귀 전수 재실행: `tests/regression/test_self_collector_guard_runtime_2553plus49.py`, `test_authoritative_verdict_selector_2553plus49.py`, `test_callback_owner_validation_2553plus49.py` + `batch_settle_writeback` 경로 스모크. 영향 0 입증(diff=동일 verdict 집합).
4. **ITEM-3** (`__all__`만 축소, 정의 보존): re-export 표면만 축소.
5. **ITEM-2** (re-export 표면 축소): 단계적으로 1상수씩, 각 단계 회귀 전수.
6. **ITEM-4는 마지막·별도 GO**: Track D 진단 해소(resolved) 이후에만 재평가.
7. 각 단계마다 byte 불변 항목 sha256 재검증 + git HEAD/branch 무변동 확인. 한 단계라도 회귀 실패 시 즉시 롤백·HOLD_FOR_CHAIR.

순서 원칙: **위험 오름차순(ITEM-1 → 3 → 2 → 4)**, 단계 간 회귀 게이트 필수, 1 커밋 1 항목.

---

## 3. 항목별 리스크

- **ITEM-1**: 리스크 **매우 낮음**. 전 코드베이스 참조 0, 반환값 집합 불변, importer 0. 잔여 리스크: 외부 schema 소비자가 문자열 `"WRITEBACK_OWNER_KEY_CONFLICT"`를 하드코딩했을 가능성(grep로 .py 한정 — 비-py 소비자 미확인). 완화: 비-py(grep JSON/MD) 사전 스윕.
- **ITEM-2**: 리스크 **중간**. `__all__` 축소만 해도 `from ... import *` 사용처가 있으면 NameError 가능. drift 위험: 단일 진실원과 재export 동기화 깨짐. 완화: `import *` 사용처 grep 선검증 + enforcer 명시 re-import 전환.
- **ITEM-3**: 리스크 **낮음~중간**. 정의·L160 보존하므로 동작 불변, 그러나 `__all__` 축소가 외부 `import *`를 깰 수 있음. 완화: ITEM-2와 동일.
- **ITEM-4**: 리스크 **높음**. 결과 객체가 Track A 정착 write-back 표면 + 회귀 계약(`completed_acknowledged`)에 고정. 제거가 동작 변경 유발 가능 → §6 HOLD_FOR_CHAIR("cleanup이 동작 변경 유발") 트리거 위험. **보류 확정**.
- **공통 리스크**: 두 후보 파일은 현재 git untracked(`??`) 상태이나 `task/task-2553p1-f1-clean-replacement` 브랜치 작업 표면. 어떤 항목이든 적용 시 git HEAD/branch 전후 EQUAL 불변, 기존 task-2553 산출물·frozen anchor byte-0 위반 금지.

---

## 4. 후속 GO 조건 (어떤 조건이 충족되면 무충돌 전환 → surgical cleanup 가능한가)

surgical cleanup은 아래 조건이 **전부** 충족되고 독립 ANU가 재판정으로 `CONFLICT_CLEARED`(authoritative=독립 ANU only)를 발급할 때에만 가능. 각 조건은 검증 가능해야 한다(증거 산출물 명시).

**GO-COND-A — Track A 정착 표면 분리 (writeback_binding_conflict_guard.py 대상)**
1. `anu_v3/batch_settle_writeback.py`가 더 이상 `guard_writeback_binding`을 정착(durable-success) write-back 경로에서 소비하지 않음, 또는 소비 경로가 frozen-stable(추가 변경 0)으로 동결됨.
   - 검증: `grep -rn "guard_writeback_binding" anu_v3/batch_settle_writeback.py` 결과가 dead/주석 경로이거나, +53/+54/+55 enactor 체인 동결 증명서(독립 ANU writeback_id 기록) 존재.
2. 회귀 3건(`test_self_collector_guard_runtime/_authoritative_verdict_selector/_callback_owner_validation_2553plus49`)이 ITEM-1 제거 diff에 대해 전수 PASS, verdict 집합 불변.
   - 검증: 회귀 실행 로그 + before/after verdict 집합 동일 diff.
- **이 조건만 충족 시**: ITEM-1·(조건부)ITEM-4 일부 GO 가능.

**GO-COND-B — Track D 진단 해소 (callback_owner_validator.py 대상)**
1. Track D(task-2607) 진단이 read-only "diagnosed"에서 **"resolved"** 로 전환(별도 승인 task로 root-cause 수정 완료), 진단 baseline이 더 이상 현재 모듈/클래스 표면에 핀 고정되지 않음.
   - 검증: Track D resolved 정본 이벤트(독립 ANU authoritative) + `callback_owner_validator.py:157` 재현 의존이 해제되었다는 회귀 증명.
2. `test_23`-계열(2-module-instance class identity 재현)이 모듈 표면 변경에 비의존이 되었음을 입증.
   - 검증: `CallbackRegistrationBlocked` 클래스 identity 재현 테스트가 import 표면 변경에 robust함을 보이는 회귀.
3. 16개 외부 importer가 `import *` 비사용임을 확인(ITEM-2/3 `__all__` 축소 안전).
   - 검증: `grep -rn "from anu_v3.callback_owner_validator import \*"` 결과 0건.
- **이 조건만 충족 시**: ITEM-2·ITEM-3 GO 가능.

**GO-COND-C — 공통 게이트 (모든 항목 공통, 진행트리거 아님·event-driven)**
1. 독립 ANU 재판정 `verdict = CONFLICT_CLEARED` 발급 (authoritative = 독립 ANU only, executor self key 불사용).
2. 적용 직전·직후 byte-0 항목 sha256 재검증 통과, git HEAD/branch 전후 EQUAL, 기존 task-2553 산출물·frozen anchor byte-0.
3. surgical cleanup이 §6 HOLD_FOR_CHAIR 항목(동작 변경 유발 등)을 트리거하지 않음을 사전 입증.
- fixed-time/dead-man/fallback은 진행트리거가 아니며, 위 조건은 모두 **event-driven**(재판정 EVENT)로만 발화.

**GO 우선순위 매핑**: GO-COND-A ⇒ ITEM-1(즉시), ITEM-4(조건부 후속). GO-COND-B ⇒ ITEM-2, ITEM-3. GO-COND-C는 모든 항목의 공통 전제.

---

## 5. 산출 불변식 / 검증 체크리스트 (본 task 실제 수행 결과)

- `anu_v3/writeback_binding_conflict_guard.py` sha256 = `a559b0d72c708527eb08ae83c39fb6bac8c80bc30c29f556ef83cfcde575fa59` — baseline 일치, **byte-0 유지**.
- `anu_v3/callback_owner_validator.py` sha256 = `b6968c976e49d81872377c6cbe7e0f944e8bf5773942aaa3c99c8d7077dbcbe7` — baseline 일치, **byte-0 유지**.
- `memory/tasks/task-2608.md` sha256 = `68deb874f21ad0942b3f792303cbc20d2363cb6adaf40ad0a6cacf6f3b0f2598` — 정본 일치.
- git HEAD = `20456b5f83fc039f2fd6f50f4b94095c29b41bfb`, branch = `task/task-2553p1-f1-clean-replacement` — 재판정 정본과 일치, 전후 EQUAL.
- code_modifications = 0. 후보 2파일·기존 task-2553 산출물·frozen anchor 무변동. write = allowlist 4 산출물(+본 plan) 한정.
- HOLD_FOR_CHAIR(§6) 트리거 0 (plan-only는 §2/§4/§8 9-R 명시 정상 경로).
