# P0-B legacy cutoff & 126 backlog 처분 정책 (task-2729+7)

> 작성일: 2026-06-06 | 작성: 헤르메스(개발1팀) | 근거: pickup_activation_readiness_audit_260606.json (C1 BLOCKER)
> 상태: 구현 반영(옵션 A) — 실제 backlog 처분은 회장 별도 승인 사항(미실행)

## 1. 배경 (Situation)

P0-B pickup driver(`dispatch/anu_pickup_driver.py`) activation readiness audit(260606) 결과:

- canonical `memory/events/task-*.result.json` = **126건** (terminal marker 0건)
- audit 시뮬레이션 verdict 분포: **QUARANTINE 126 / WAKE_BUILT 0**
- 원인: `scan_once` 가 무제한 `sorted(glob)` 전수 처리 + 126 legacy result.json 이 신규 pickup 대상으로 오인 → 첫 activation 시 owner_proof_fail 로 126건 일괄 quarantine MOVE = **canonical mass mutation**

이는 BLOCKER(C1). activation 전 반드시 해소 필요.

## 2. 핵심 문제 (Complication)

126 legacy backlog 를 "어떻게 처분하느냐"가 canonical mutation 0 달성의 핵심이다. 실제 파일을
이동/삭제/표기하면 canonical write 가 발생하고, 이는 본 task LOCK(canonical write 금지) 및
회장 승인 범위를 벗어난다.

## 3. 정책 결정 (Question → Answer)

**Q: 126 legacy backlog 를 canonical write 없이 안전하게 배제할 수 있는가?**

**A: 가능. legacy cutoff(activation_epoch 기준 skip)로 "이동 없이 verdict 만" 남긴다 (옵션 A).**

### 3.1 옵션 비교

| 옵션 | 방식 | canonical write | 회장 승인 | 본 task 채택 |
|------|------|-----------------|-----------|--------------|
| A (권장·채택) | legacy cutoff skip — activation_epoch 이전 result.json 은 NOOP_LEGACY_SKIP (이동 0) | **0** | 불요 | ✅ 구현 반영 |
| B | 126건 일괄 `.pickup.acked` 명시 종결 | 필요(marker write) | 필요 | ❌ 설계 제안만 |
| C | 126건 archive 디렉토리로 move | 필요(파일 이동) | 필요 | ❌ 설계 제안만 |

옵션 A는 126 backlog 를 **물리적으로 건드리지 않는다**. 파일은 events/ 에 그대로 잔류하되,
driver 가 verdict(NOOP_LEGACY_SKIP)만 기록하고 wake/quarantine/move 0 으로 무시한다.

## 4. legacy cutoff 메커니즘 (옵션 A 구현 사양)

### 4.1 activation_epoch 마커
- 경로: `memory/state/p0b_activation_epoch` (driver **읽기 전용**)
- 내용: unix timestamp(float) 1줄. activation 시각.
- 생성 주체: activation 수행자(entrypoint, **본 task 범위 밖** — 별도 승인). driver 는 생성하지 않음.
- driver 읽기 함수: `read_activation_epoch()` — 부재/파싱실패 → `None`.

### 4.2 판정 규칙 (`_legacy_cutoff_check`)
- `activation_epoch is None` (부재/불명확) → **fail-open 금지** → skip(`epoch_absent`).
- result.json stat 실패 → 보수적 skip(`legacy_stat_fail`) — canonical 무수정.
- `result mtime < activation_epoch` → skip(`pre_activation_epoch`) — **legacy**.
- `result mtime >= activation_epoch` → 정상 decision path (activation 이후 신규 result).

### 4.3 NOOP_LEGACY_SKIP 효과
- move 0 · wake 0 · quarantine 0 · canonical 무수정.
- verdict 만 DriverRecord/evidence 에 남음 (관측 가능).

### 4.4 fail-closed 보장 (회장 verbatim #4)
activation_epoch 이 없으면 전수 NOOP_LEGACY_SKIP 으로 멈춘다. 즉 epoch 마커가 생성되기 전까지
driver(`legacy_cutoff=True`)는 어떤 result.json 도 처리하지 않는다. 이는 "epoch 불명확 시 fail-open
금지"를 코드로 강제한다. production main()은 `scan_once(CANONICAL_ROOT, legacy_cutoff=True)` 호출.

## 5. MAX_FILES 상한 (보강)

- `scan_once` 단일 cycle 처리 상한 `MAX_FILES=50` (안전한 상한). 초과분은 다음 cycle.
- 초과 시 **전수 처리 금지** → 처리분 bounded + `NOOP_MAX_FILES_DEFER` summary record 1건으로 관측.
- runaway(126+ 일괄 처리) 2차 방어선. legacy cutoff 가 1차, MAX_FILES 가 2차.

## 6. 126 backlog 실제 처분: 불요 (본 task)

옵션 A 채택으로 **126 result.json 실제 이동/삭제/표기 불필요**. 파일은 그대로 두고 cutoff 로 배제.
isolated temp root 재-audit 실증: 126 legacy 전부 NOOP_LEGACY_SKIP, canonical delta 0,
quarantine/processed 디렉토리 미생성, pickup 호출 0.

옵션 B/C(명시 종결/archive)는 운영상 events/ 청소가 필요할 때 **회장 별도 승인** 하에 후속 task 로 수행.
본 정책은 A 기준이며 B/C 는 설계 제안(실행 0)으로만 보존한다.

## 7. 후속 (controlled pilot 재수행)

legacy cutoff 추가로 decision path 분기 변경(NOOP_LEGACY_SKIP 신규). task-2729+6 controlled pilot 을
cutoff skip 케이스 포함하여 **1회 재수행** 권장(별도 회장 승인). 본 정책/구현은 그 입력 자료.

## 8. 불변식 (유지 확인)

- canonical write: 0 (events/ledger/state/systemd 무수정)
- production ACTIVE: false 고정 (flag 부재, systemd 미설치)
- systemd enable: 0
- raw ANU key 출력: 0
- 126 backlog 실제 처분: 0 (옵션 A skip)
