# P0-B ANU pickup runner — Controlled Pilot 설계서 (1회성)

> task-2729+5 | 작성일 2026-06-05 | 작성자 비슈누(개발4팀장) | 상태 **DESIGN-ONLY (실행 회장 승인 대기)**
> 본 문서는 **설계**이며, 본 task 에서 pilot 을 **실제로 실행하지 않는다**. ACTIVE=false 유지.

---

## 0. 전제 / 불변 조건

- 최종 상태 고정: **IMPLEMENTED / WIRED candidate / ACTIVE=false** (PASS여도 production ACTIVE 기록 금지).
- 모든 pilot 절차는 **isolated temp root** 에서만 수행 (canonical `/home/jay/workspace` memory/events·ledger·state 무영향).
- `systemctl enable --now` 금지, systemd user unit 설치/수정 금지, real ANU spawn 금지, 실제 merge/push/comment 0.
- ACTIVE=true 전환은 **별도 task + 회장 승인** 대상. 본 pilot 통과는 그 전제조건일 뿐 자동 승격 아님.

## 1. 목적 (회장 pilot 조건 8 매핑)

| # | 회장 조건 | 본 설계 반영 |
|---|---|---|
| 1 | 1회성 pilot만 | §3 단일 실행, recurring 없음 |
| 2 | noop fixture / terminal marker 안전 fixture 기준 | §2 fixture A(noop)·B(terminal pre-acked) |
| 3 | pickup runner 1회만 발사 검증 | §4 성공기준 G3 (pickup_calls==1) |
| 4 | duplicate pickup 0 | §4 G4 (재실행 누적 pickup_calls==1) |
| 5 | terminal marker 존재 시 no-op | §4 G5 (fixture B → SKIP, pickup_calls==0) |
| 6 | 실제 merge/push/comment/spawn 0 | §4 G6 (argv build-only, 실행 0) |
| 7 | pilot 후 ACTIVE=false 유지 | §6 종료 절차 |
| 8 | ACTIVE=true 별도 승인 | §0 / §7 |

## 2. Fixture (안전 fixture 만 사용)

격리 root = `mktemp -d`(예: `/tmp/p0b_pilot_XXXX`) 아래에 canonical 구조 재현:
`memory/events/`, `memory/state/`, `memory/p0b_state/{quarantine,processed}/`.

- **Fixture A — noop authoritative result**: `memory/events/task-pilot-noop.result.json`
  - payload: `{task_id, completion_signal:"EXECUTOR_RESULT_WRITTEN", collector_envelope:{schedule_id, self_key_used:false, collector_role:"ANU"}}`
  - mtime 을 now-10s 로 설정(readiness aging 통과). owner proof 는 주입 `verify_fn → AUTHORITATIVE` 로 모의(실 cron-history 조회 0).
  - pickup 은 **fake pickup_fn** 으로 모의 → 실제 wake/cron 발사 0.
- **Fixture B — terminal pre-marked result**: Fixture A + 동일 디렉토리에 `task-pilot-noop.pickup.done` 마커 선재.
  - 기대: terminal no-op (SKIP), pickup 미호출.

★ 실 ANU key·실 schedule·실 cron-history 는 일절 사용하지 않는다. sealed-key 경로는 `sealed_key_loader=lambda:None`(fail-closed) 또는 fake pickup_fn 로 종단.

## 3. 절차 (1회성, 격리 root)

1. 격리 root 생성 + Fixture A 배치.
2. activation flag 를 격리 root 의 `memory/state/p0b_driver_enabled` 에 `enabled` 로 기록 **(격리 root 한정 — canonical flag 절대 미생성)**.
3. `scan_once(root=격리root, flag_reader, pickup_fn=fake, verify_fn=AUTHORITATIVE, clock=fixed, ledger_path=격리root ledger)` 1회 실행 → record 수집.
4. **재실행**(동일 root, paths=None glob) 1회 → duplicate 방지 확인.
5. 격리 root 를 Fixture B 로 교체(별도 root) → `scan_once` 1회 → terminal no-op 확인.
6. 모든 절차 종료 후 격리 root 삭제(`rm -rf`), canonical 스냅샷 before/after 동일 확인.

> 본 절차는 `scripts/harness/v36/anu_pickup_p0b_audit_decision_check.py` 의 DC3/DC9/DC4 시나리오와 **동일 메커니즘**이다. 즉 decision-check 하니스가 본 pilot 의 dry-run 대체 증거를 이미 제공한다. 실제 pilot 은 회장 승인 시 동일 절차를 systemd 트리거 경유로 1회 재현.

## 4. 성공 기준 (Gate)

- **G1 감지**: Fixture A → driver 가 target 으로 인식, `process_one` 6조건 통과. (decision-check DC3 actual=WAKE_BUILT)
- **G2 비활성 기본**: flag 부재/`disabled` → `NOOP_DISABLED`, pickup 미호출. (DC1)
- **G3 단일 발사**: Fixture A 1회 scan → `pickup_calls == 1` **정확히**.
- **G4 duplicate 0**: 재실행 후 누적 `pickup_calls == 1` (processed 이동으로 2회차 대상 0). (DC9)
- **G5 terminal no-op**: Fixture B → `PICKUP_SKIP`, `pickup_calls == 0`. (DC4)
- **G6 실발사 0**: argv 는 build-only, 실제 cron register/subprocess/merge/push/comment/spawn 0. driver 는 argv 미실행(P0-a dry_run).
- **G7 키 노출 0**: pilot 로그/증거에 ANU key raw(16hex/c119085 전체키) 0.
- **G8 canonical 무영향**: pilot before/after canonical `memory/events`·ledger·`memory/state` 변화 0.

전 Gate PASS = pilot PASS. 단 PASS 도 ACTIVE 승격 아님(§0).

## 5. 중단 조건 (하나라도 → 즉시 HOLD_FOR_CHAIR, pilot 중지)

1. canonical root write 필요 발생. 2. production ledger/events/state write 필요. 3. systemd enable/install 필요. 4. ANU key raw 노출 위험. 5. duplicate pickup 방지 불명확. 6. runaway guard 불충분. 7. real ANU spawn 필요. 8. pickup runtime 파일 수정 필요. 9. expected_files 초과. 10. ACTIVE=true 필요.

## 6. 종료 절차

- 격리 root 전부 삭제. canonical 스냅샷 동일 재확인.
- 결과를 `memory/reports/` 에 요약 기록(증거: decision-check summary JSON).
- activation flag 는 canonical 에 **미생성 상태 유지**(default DISABLED). 본 pilot 어떤 단계도 canonical flag 를 켜지 않는다.

## 7. 활성화 전 보완 항목 (CAVEAT — 별도 활성화 task 의 input)

- **C1 (HIGH)**: `scan_once` MAX_FILES 상한 부재 → 무제한 result pickup 가능. 활성화 전 상한+초과 시 deferred 처리 구현 필요.
- **C2 (MED)**: ledger/marker 쓰기 실패가 현재 fail-safe pass(무음). 활성화 전 명시적 실패 관측/알림 필요.
- **C3 (LOW/확인완료)**: preflight raw_key 286건은 pickup 스택 밖 venv hex — 본 스택 노출 0 확정.
- 단일 발사 보증은 entrypoint flock(single-flight) + driver default DISABLED + terminal/dedupe no-op 의 3중 방어에 의존. systemd `.path` 재트리거 빈도에 대한 debounce 는 entrypoint flock 으로 흡수됨을 활성화 task 에서 부하 검증할 것.

## 8. 산출 판정

본 설계 + decision-check dry-run 증거(11/11 PASS, canonical_untouched, raw_key_exposure 0) → **DISPATCH_READY_FOR_CONTROLLED_PILOT**.
실제 pilot 실행 및 ACTIVE=true 전환은 **회장 승인 대기**.
