# Limited Runtime Pilot — Observability Audit **v2** (산출물 3/4)

작업 상태명: `LIMITED_RUNTIME_PILOT_DESIGN_PACKET_V2_REDACT_AND_REVISION_APPROVED_ACTIVE_FALSE`
작성: 2026-06-27 (KST) · 작성자: 아누 · 근거: main `189f1f0d` 코드 직접 감사 · v1 보정본
**raw key redacted / no literal key retained.**

> v1 대비 변경: ① closeout archive를 "권장"→**Phase 1 pilot closeout 필수 조건**으로 격상 ② surface-only / real-fire
> 시나리오별 **반드시 남아야 할 지표** 분리 ③ LIVE_PROCESSED 의미 정밀화(real fire와 독립). 감사 본문(지표별
> 기록 위치)은 v1 검증 결과 유지.

---

## 1. 지표별 기록 위치 (v1 검증 유지 — 요약)
- ① spawn/실 pickup → `memory/events/p0b_processed_ledger.jsonl`(`LIVE_LEDGER_REL` driver:106, outcome==LIVE_PROCESSED)
- ② N count → `_count_active_window_pickups`(driver:544-612), 위 ledger epoch-scope 계산
- ③ duplicate → `memory/events/callback_4tuple_index.jsonl` + `memory/state/spawn_decisions.jsonl`(DEDUP_HIT)
- ④ self-key → `callback_launch_audit.jsonl`(SELF_KEY_REFUSED) + driver quarantine
- ⑤ callback fired → `callback_launch_audit.jsonl` verdict(LAUNCH_ENFORCED surface / REAL_FIRED / NOOP_DISABLED / BLOCKED / FAILED)
- ⑥ owner-proof → `anu_result_pickup_runner.py` l1/l2 outcome(라벨 GATE_OWNER_PROOF_ANU, raw key 0)
- ⑦ governor ALLOW/DENY → `memory/state/spawn_decisions.jsonl`
- ⑧ callback_launch gate → `driver_runs.jsonl`(callback_launch_verdict) + audit.jsonl
- ⑨ kill/N/T verdict → `memory/p0b_state/driver_runs.jsonl`(EVIDENCE_JSONL_REL driver:69)
- ⑩ driver flag → `memory/state/p0b_driver_enabled`
- raw key/argv literal **절대 미기록**(audit:12,108,280,394).

## 2. ★ LIVE_PROCESSED 정밀화 (v2 — real fire와 독립)
- `LIVE_PROCESSED`(driver:110, append :2182/2195) = pickup이 owner-proof gate 통과 + processed move 성공 시 기록.
  **callback real fire 성공 여부와 별개**(callback 단계 결과는 같은 행의 `callback_launch_verdict`로 구분).
- 즉 surface-only(real fire 0)라도 **pickup이 끝까지 가면 LIVE_PROCESSED는 남는다**(callback_launch_verdict=
  LAUNCH_ENFORCED/NOOP_DISABLED). owner-proof 미통과면 `LIVE_PENDING_OWNER_PROOF`로 fire 0·ledger 미append.
- ∴ "surface-only면 LIVE_PROCESSED가 무조건 빈다"는 부정확. **빌 수도(gate 차단/미완), 남을 수도(완료) 있다** →
  성공 판정은 ledger 유무가 아니라 **verdict 조합**으로 한다.

## 3. 시나리오별 "반드시 남아야 할 지표" (★v2 분리)
**Phase 1 surface-only (real fire 0)** — 성공 시 다음이 남아야:
- driver_runs verdict = `LIVE_PROCESSED`(완료) 또는 의도된 `LIVE_PENDING_OWNER_PROOF`(gate 차단 시연)
- callback_launch_audit verdict ∈ {`LAUNCH_ENFORCED`, `NOOP_DISABLED`}, **`REAL_FIRED` 0건**
- spawn_decisions: 의도 외 ALLOW 0 / DEDUP_HIT 0
- callback_launch_audit: `SELF_KEY_REFUSED` 의도 외 0
- final `p0b_driver_enabled` = "disabled"
- (processed_ledger LIVE_PROCESSED는 0 또는 1 — 필수 성공조건 아님)

**Phase 2 real fire 1-shot (별도 승인)** — 성공 시 추가로:
- callback_launch_audit verdict = `REAL_FIRED` **정확히 1건**(2건+ = 실패)
- processed_ledger LIVE_PROCESSED 1건 + owner-proof 라벨
- cron 등록 확인(REAL_FIRED는 cron 등록 확인 후 기록, audit:439)

## 4. 추적/비추적 (.gitignore 실측)
- `memory/state/` → 전체 비추적. `memory/events/` → heartbeat만 ignore. `memory/p0b_state/` → ignore 규칙 없음.
- 코드-only PR 정책상 이 jsonl들은 커밋 안 됨 → **git history로 증거 안 남음 → 로컬 디스크 직접 수집 필수**.

## 5. ★ CLOSEOUT ARCHIVE — Phase 1 pilot **필수 조건** (v2 격상)
v1의 GAP-1~3(통합 뷰·real fire 카운터·아카이브)은 pilot **실행 blocker는 아니나 Phase 1 closeout 필수 조건**이다.
archive 미완 = closeout 미완 = pilot 미종결. 종료 시 **반드시** 다음을 `memory/reports/limited_pilot_<id>/`에 보존:
- driver_runs snapshot
- callback_launch_audit snapshot
- spawn_decisions snapshot
- callback_4tuple_index snapshot
- final_flags (p0b_driver_enabled 값 + callback/epoch/kill 마커 부재 확인)
- cron 0 확인 결과
- systemd inactive/disabled 확인 결과
- ACTIVE=false 확인 결과
- pilot summary markdown (성공/실패 상태명 + §3 지표 판정)

## 6. closeout archive 절차 (raw key 0)
```
# ANU_OWNER_KEY 는 sealed loader/환경변수 주입 — 문서에 literal 미기재
PID=limited_pilot_<id>; DST=memory/reports/$PID; mkdir -p $DST
cp memory/p0b_state/driver_runs.jsonl           $DST/
cp memory/p0b_state/callback_launch_audit.jsonl $DST/
cp memory/state/spawn_decisions.jsonl           $DST/
cp memory/events/callback_4tuple_index.jsonl    $DST/ 2>/dev/null
cp memory/events/p0b_processed_ledger.jsonl     $DST/ 2>/dev/null
printf "driver_enabled=%s\n" "$(cat memory/state/p0b_driver_enabled 2>/dev/null)" > $DST/final_flags.txt
for m in p0b_callback_launch_enabled p0b_activation_epoch p0b_kill; do \
  test ! -e memory/state/$m && echo "$m=absent" >> $DST/final_flags.txt; done
systemctl --user is-active anu-pickup.path  >> $DST/final_flags.txt 2>&1
systemctl --user is-enabled anu-pickup.path >> $DST/final_flags.txt 2>&1
/usr/local/bin/cokacdir --cron-list --chat "$CHAT_ID" --key "$ANU_OWNER_KEY" > $DST/cron_list.json
# 집계
grep -c '"REAL_FIRED"'      $DST/callback_launch_audit.jsonl 2>/dev/null   # real fire 수(Phase1=0 기대)
grep -c 'LAUNCH_ENFORCED'   $DST/callback_launch_audit.jsonl 2>/dev/null   # surface-only 수
grep -c 'LIVE_PROCESSED'    $DST/p0b_processed_ledger.jsonl  2>/dev/null   # pickup 완료 수
grep -c 'DEDUP_HIT'         $DST/spawn_decisions.jsonl       2>/dev/null   # 중복 차단 수
grep -c 'SELF_KEY_REFUSED'  $DST/callback_launch_audit.jsonl 2>/dev/null   # self-key 차단 수
```

## 7. 남는 GAP (코드화는 activation 단계 별도 안건)
- 통합 요약 뷰 / real fire epoch-scope 카운터 = 상시 가동 전 코드화 권장. Phase 1은 §6 수동 집계로 충족.
- 이들은 **Phase 1 blocker 아님**(수동 archive로 메움), 다만 always-on 전 코드화 권장은 유지.

---

## 결론 (v2)
- 관측 불가 지표 없음 → Phase 1 관측 가능. **closeout archive를 필수 조건으로 격상**(§5).
- surface-only 성공은 **verdict 조합**으로 판정(LIVE_PROCESSED 유무 아님, §2-3).
