# task-2615 — Track F integration_dogfood 실행 보고

> **Lv.4 · dev5 마르둑 (executor_key=109fa85250c6d46b) 1회 한정 · TTL 3h**
> **callback owner = 독립 ANU key c119085addb0f8b7 (+49 정본 · executor self-key 절대 금지)**
> **status: DONE_PENDING_INDEPENDENT_ANU_REAUDIT**

## 1. spec 무결성

- spec path: `memory/tasks/task-2615.md`
- spec sha256: `0f4b9f83a4fb89295bc8c1b50d3d309257d3f55fe37c3c536c11944fc46e6376` ✓ (정합 확인 후 실행)

## 2. event-gated acceptance (회장 규칙2 · fixed-time/dead-man 아님)

`memory/events/callback_4tuple_index.jsonl` 의 `durable_success_writeback.v1 · DURABLE_SUCCESS_WRITTEN` 5건 정합:

- A `task-2610` → `dc4e299fdc25108a5e87afd5c8602294c460f0a4a43903c824b840a1484b26fd`
- B `task-2611+2` → `0cdc1259f2eb3fae5e77393620f6ea90edde6391bd384a31b8154e0ef6856f56`
- C `task-2612+3` → `dc62a81223117f68c7404672800cae9a5e0649dd54abcb1bad0c5a4cdab66d5e`
- D `task-2613` → `576ac7996e47d8b388776e127d7439a377ea1b3a03e31e288e50a0127b210f3c`
- E `task-2614` → `1c9d8c54d407c4c1dacb9e23d90b30cb809e6f1fc5b46e917cbb802edf9abe39`

## 3. 신규 산출물 (allowlist DISJOINT)

| 파일 | sha256 | 종류 |
| --- | --- | --- |
| `scripts/run_batch_hold_adjudicator.py` | `af441d51198792348c205c7c97b4700a580b8a46e72d48c2320252b548de1e3e` | runtime entrypoint / CLI (real) |
| `memory/events/sample.batch-hold-adjudication.result.json` | `11e02f7f0b2a4c2d3bdf89212964c4a8b5e149d4215a80728f78549207b8be43` | Track A consolidated actual output |
| `memory/events/sample.callback-gap-recovery.dogfood.json` | `6a355cf6eaa43b34af0394ed89013e20c18df5f353bfc1572a227f323423513a` | Track E §7b end-to-end actual output |
| `memory/events/task-2615.decision.json` | — | decision record |
| `memory/events/task-2615.result.json` | — | this completion record |
| `memory/reports/task-2615.md` | — | this report |

기존 Track A~E 산출물·schemas·tests·fixtures **byte-0**(read-only consume).

## 4. ACTUAL EXECUTION 결과 (cell-by-cell)

`scripts/run_batch_hold_adjudicator.py` 실 호출(Bash, real Python runtime). 6-track integration_dogfood batch:

| track | got | want | match |
| --- | --- | --- | --- |
| `task-2604` | `AUTO_REMEDIATION_HOLD` | `AUTO_REMEDIATION_HOLD` | ✓ |
| `task-2605` | `AUTO_REMEDIATION_HOLD` | `AUTO_REMEDIATION_HOLD` | ✓ |
| `task-2606` | `AUTHORITATIVE_PASS` | `PASS` (= AUTHORITATIVE_PASS) | ✓ |
| `task-2607` | `AUTHORITATIVE_PASS` | `PASS` | ✓ |
| `task-2608` | `NOT_STARTED_BY_DESIGN` | `NOT_STARTED_BY_DESIGN`/`WAITING_FOR_DEPENDENCY` | ✓ |
| `task-2609` | `AUTHORITATIVE_PASS` | `PASS` | ✓ |

배치 단언:

- `critical7_present` = `false` ✓
- `chair_escalation_required` = `false` ✓
- `auto_remediation_required` = `true` (non-Critical HOLD 자동 수렴)
- `batch_classification` = `AUTO_REMEDIATION_HOLD`
- `verdict` = `FAIL` (= 아직 all-settled 아니지만 자동 수렴 · 회장 보고 0)

`batch_hold_adjudication.schema.json` 으로 결과 검증 ✓ (`allOf` 강제 invariant 전부 통과).

## 5. 실 호출 trace (module/function level)

본 entrypoint 가 호출한 Track A~E 모듈/함수(현실 실행):

- `anu_v3.batch_hold_adjudicator.adjudicate_from_payload` (Track A — 6 track batch)
- `anu_v3.batch_hold_adjudicator.adjudicate_track` (per-track replay 4 회)
- `anu_v3.auto_remediation_planner.classify_disposition` (Track B/+2 — 2604/2605 AUTO_REMEDIATION_HOLD 분류)
- `anu_v3.critical7_classifier.classify_critical7` (Track C/+3 — 3 fixture finding)
- `anu_v3.batch_dependency_classifier.classify_track` (Track D — 2608 + dogfood)
- `anu_v3.dispatch_callback_contract.classify_dispatch_contract` (§7b 6 cases)
- `anu_v3.dispatch_callback_contract.evaluate` (fixture observation 실 호출)
- `anu_v3.dispatch_callback_contract.RecoveryWatcher.maybe_spawn` (idempotent · 2회)
- `anu_v3.dispatch_callback_contract.assert_collector_key_is_independent_anu` (self-key fail-closed)

## 6. §6b callback-gap recovery end-to-end (mock-only FAIL · 회장 야간 verbatim)

`memory/fixtures/task-2614.case-callback-gap.json` (sha256 `ac9dc14a9e49a48882f9838589235961631d33842fd72d651486424b599b8e36`) read-only consume.

| case | 결과 |
| --- | --- |
| (a) normal+fallback present | `CONTRACT_OK` · `fallback_cancel_on_success=True` ✓ |
| (b) normal-missing + fallback | `FALLBACK_RECOVERY` · `recovery_required=False` · `fixed_time_or_dead_man=False` ✓ |
| (c) result+normal-missing+fallback-missing | `DISPATCH_CONTRACT_VIOLATION` · `recovery_required=True` · `collector_key=c119085addb0f8b7` · `executor_self_key_forbidden=True` ✓ |
| (d) idempotent (동일 task 2회 호출) | 실제 spawn 1회 · `r2.duplicate_suppressed=True` · `actual_spawn_count=1` ✓ |
| (e) 조건 미충족 (normal present) | spawned=False · `fixed_time_or_dead_man=False` · 진행트리거화 0 ✓ |
| (f) executor self-key fail-closed | canonical `EXECUTOR_SELF_KEY_FORBIDDEN(1e41a2...)` 및 dev5 마르둑 self key `109fa85250c6d46b` 모두 `ExecutorSelfKeyForbidden` raise ✓ |

640665C8 안티패턴(무조율 dead-man/fixed-time 진행트리거) 코드 경로 0 — 재발 차단.

## 7. self-chain 차단 + independent ANU authoritative 실증

- self-chain collector/adjudication/dispatch: **금지** (`assert_collector_key_is_independent_anu` 가 collector_key != `c119085addb0f8b7` 또는 == executor_self_key 일 때 `ExecutorSelfKeyForbidden` raise).
- AUTHORITATIVE_PASS 권위: independent ANU verdict 만 (Track A `_independent_anu` 가 collector_key/executor_key/role/session 4 조건 동시 확인 — `bare authoritative_is_independent_anu=True` 자칭은 §5.D fail-closed → `HOLD_CANDIDATE`).
- 본 dogfood 의 2606/2607/2609 AUTHORITATIVE_PASS 는 `collector_key=c119085addb0f8b7 ≠ executor_key=exec-26XX-stub · role=ANU · session 비-self` 4 조건 동시 충족으로만 부여됨.

## 8. 무회귀 (기존 Track A~E regression PASS)

```
python3 -m pytest tests/regression/test_batch_hold_adjudication.py \
                  tests/regression/test_critical7_classifier.py \
                  tests/regression/test_auto_remediation_planner.py \
                  tests/regression/test_dependency_wait_classification.py \
                  tests/regression/test_dispatch_callback_contract.py -q
→ 77 passed
```

ledger 1c9d8c54 의 `codex_reaudit: "...spec-mandated regression (a)~(f)+77 PASS 무회귀"` 와 정합.

## 9. 금지 사항 준수 확인

- git HEAD `20456b5f83fc039f2fd6f50f4b94095c29b41bfb` ↔ 작업 후 동일 (`EQUAL`) ✓
- branch `task/task-2553p1-f1-clean-replacement` 불변 ✓
- 커밋 0 · PR/branch/main write 0 · merge 0 · credential 0
- premature write-back 0 (durable-success ledger 기록은 independent ANU re-audit 의 책임)
- 문서-only 0 · disposition-only 0 · mock-only 0 (모든 단언은 real runtime invocation 으로 산출)
- executor self-* 0 (collector/adjudication/dispatch 모두 independent ANU key 또는 합성 분리 key 사용)
- Track A~E 산출물 byte-0 — 5 모듈 sha256 사전/사후 일치
- task-2553·task-2604 multitrack·frozen anchor 무수정

## 10. 9-R / re-lint 결론

§6b 회장 야간 보강(callback-gap recovery end-to-end) 증강에 대한 ANU-Codex re-lint 통과: expected_files DISJOINT · runtime entrypoint/CLI · 2604/2605/2608/2609 재현 실증 · callback-gap end-to-end · independent ANU authoritative · shared invariant 보존 · 문서-only 아님 — 회장 verbatim §1·§2·§3·§4·§5·§6·§6b·§7·§8·§9·§10 전부 만족.

## 11. callback (a) 후속

본 normal completion callback 은 본 executor session 외부에서 **독립 ANU key `c119085addb0f8b7` 전용**으로 발사된다. executor self-key `109fa85250c6d46b` 사용 금지 (+49 정본). 독립 ANU collector 가 결과 회수 → adjudication → Codex re-lint → HIGH/CRITICAL 0 또는 non-Critical 자동분류 → durable_success_writeback.v1 ledger 1 row 추가 후 task-2615 가 fully settled.

상태: **DONE_PENDING_INDEPENDENT_ANU_REAUDIT**.
