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

상태명: `LIMITED_RUNTIME_PILOT_DESIGN_PACKET_APPROVED_ACTIVE_FALSE`
작성: 2026-06-27 (KST) · 작성자: 아누 · 근거: main `189f1f0d` 코드 직접 감사
방법: 코드 grep + 경로 상수 직접 확인 + 디스크 실재 확인. **환각 0, 코드 라인 근거만.**

> 목적: pilot closeout에 필요한 증거(spawn 수·ledger count·duplicate·self-key·callback·owner-proof·governor
> ALLOW/DENY·callback gate·kill/N/T verdict)가 **실제 코드/파일에 남는지** 점검. 충분하면 OK, 부족하면 GAP.

---

## 1. 지표별 기록 위치 (코드 검증 완료)

**① spawn 수 (실 pickup 성공 횟수)** — ✅ 기록됨
- 파일: `memory/events/p0b_processed_ledger.jsonl` (상수 `LIVE_LEDGER_REL` driver:106)
- append: `outcome == LIVE_PROCESSED` 행만(driver:110, scan 경로). 즉 **실제 발사·처리 성공 1건 = 1줄**.
- 디스크 현재: **부재** → 지금까지 LIVE_PROCESSED 0 (B 1-shot은 relay_pending 정지라 여기 안 남음). pilot 증거 baseline = 0.

**② ledger count (활성창 N 카운트)** — ✅ 기록됨/계산됨
- 함수 `_count_active_window_pickups` (driver:544-612). 위 ledger를 읽어 `processed_at >= activation_epoch`
  행만 count(epoch-scope). stop 조건 `count >= max_count`(N=3)만, epoch-이전 break 없음(under-count 0).
- count 값 자체는 **별도 파일에 안 남고** 판정 시점에 계산 → verdict로 driver_runs.jsonl에 반영.

**③ duplicate 0 (중복 spawn/fire 차단)** — ✅ 기록됨 (2중)
- (a) dedup ledger `memory/events/callback_4tuple_index.jsonl` (governor 상수 :48). task_id+head_sha 매칭.
- (b) governor `memory/state/spawn_decisions.jsonl`에 `decision=BLOCK, reason=DEDUP_HIT` 1줄(governor:148-156,271-284).
- "duplicate 0" 확인법 = pilot 윈도우 동안 의도 외 DEDUP_HIT/중복 ALLOW 0.

**④ self-key 0 (executor self-callback 차단)** — ✅ 기록됨 (2중)
- (a) callback audit: `SELF_KEY_REFUSED` verdict → `memory/p0b_state/callback_launch_audit.jsonl`
  (분류 `_classify_owner_key`, owner_key_class="SELF").
- (b) driver: `self_key_used==True` → quarantine(`QREASON_OWNER_PICKUP_SELF_KEY_CLAIM`), wake 0, driver_runs.jsonl.
- "self-key 0" = 위 차단 라벨이 0(또는 의도된 차단만).

**⑤ callback fired 여부** — ✅ 기록됨 (verdict로 명확 구분)
- 파일: `memory/p0b_state/callback_launch_audit.jsonl` (상수 `DEFAULT_AUDIT_JSONL_REL` audit:52)
- verdict 구분(audit:55-65): `LAUNCH_ENFORCED`(surface-only, **real fire 0**) / `REAL_FIRED`(실 발사 성공·cron 등록 확인)
  / `REAL_FIRE_BLOCKED`(gate 미충족, fire 0) / `REAL_FIRE_FAILED`(시도했으나 등록 실패) / `LAUNCH_NOOP_DISABLED`(flag OFF).
- ★ raw key/argv literal은 **절대 기록 안 함**(audit:12,108,280,394) — 분류 라벨만. 보안상 양호.

**⑥ owner-proof (result.json: owner_pickup_required / authoritative / schedule_owner_proof)** — ✅ 기록됨
- 읽기/검증: `anu_result_pickup_runner.py`(`_extract_owner_pickup_eligibility` 영역, l1/l2 outcome).
- 라벨 `GATE_OWNER_PROOF_ANU`(raw key 0). collector_result.json의 `owner_proof.*`로 반영.
- freshness probe = 로컬 canonical HEAD(`git -C /home/jay/workspace rev-parse HEAD`) — CWD/worktree HEAD 아님(박제).

**⑦ governor ALLOW/DENY** — ✅ 기록됨
- 파일: `memory/state/spawn_decisions.jsonl` (상수 `DEFAULT_DECISIONS_LOG` governor:49).
- 1줄 = `{decision, reason, task_id, key, ts}`. reason enum: ALLOW/NON_TERMINAL/DEDUP_HIT/SINGLEFLIGHT_LIVE/
  RATE_EXCEEDED/LOOP_EXCEEDED/CIRCUIT_TRIP/COUNTERS_UNREADABLE/COUNTERS_SAVE_FAILED/LEDGER_UNREADABLE(fail-closed).
- 디스크 현재: 존재(2721 bytes) — 이전 검증 기록.

**⑧ callback_launch gate** — ✅ 기록됨 (2중)
- driver verdict: `memory/p0b_state/driver_runs.jsonl`의 `callback_launch_verdict`(driver:979-989).
- audit verdict: callback_launch_audit.jsonl(⑤와 동일). flag `p0b_callback_launch_enabled` OFF면 `NOOP_DISABLED`.

**⑨ kill / N exceeded / T expired verdict** — ✅ 기록됨
- 파일: `memory/p0b_state/driver_runs.jsonl` (상수 `EVIDENCE_JSONL_REL` driver:69, `_append_evidence` :979-989).
- verdict 라벨(driver:90-92 등): `NOOP_KILL_SWITCH`(:644) / `NOOP_N_EXCEEDED_AUTO_DISABLED`(:707) /
  `NOOP_T_EXPIRED_AUTO_DISABLED`(:724-731) / `NOOP_ACTIVE_EPOCH_MISSING_AUTO_DISABLED`(:694) /
  `NOOP_ACTIVE_EPOCH_INVALID_AUTO_DISABLED`(:723). 각 행에 `activation` 상태 포함.

**⑩ p0b_driver_enabled flag 상태** — ✅ 기록됨
- 파일 자체 `memory/state/p0b_driver_enabled` 첫 줄("enabled"/"disabled"). 원자적 write(tmp+os.replace, 0644).
- 디스크 현재: 존재 9바이트 = "disabled" (ACTIVE=false 일치).

---

## 2. 디스크 실재 baseline (2026-06-27 확인)
- `p0b_driver_enabled`=disabled · `p0b_callback_launch_enabled` 부재 · `p0b_activation_epoch` 부재 · `p0b_kill` 부재
- `p0b_processed_ledger.jsonl` **부재** (LIVE_PROCESSED 0 = real pickup 0 증거)
- `spawn_decisions.jsonl` 존재 · `callback_4tuple_index.jsonl` 존재 · `driver_runs.jsonl` 존재 · `callback_launch_audit.jsonl` 존재
- → 모든 관측 채널의 코드·파일은 실재. real fire/pickup만 0.

## 3. 추적/비추적 (.gitignore 실측)
- `memory/state/` → **전체 비추적**(`.gitignore: memory/state/`). spawn_decisions·전 flag·epoch·kill 포함.
- `memory/events/` → `heartbeat*`만 ignore. ledger 2개는 **추적 대상일 수 있음**(단 코드-only PR엔 안 들어감).
- `memory/p0b_state/` → ignore 규칙 없음 → 추적 대상일 수 있음(driver_runs·callback_launch_audit).
- ★ 그러나 pilot은 canonical local 디스크에서 돌고, 코드-only PR 정책상 이 jsonl들은 커밋되지 않는다 →
  **git history로는 증거가 안 남는다. 로컬 디스크 파일을 closeout 시 직접 수집해야 한다.**

---

## 4. OBSERVABILITY_GAP 목록 (pilot 전 보완 검토 대상)

- **GAP-1 (통합 관측면 부재)**: 9개 지표가 3개 디렉토리·5개 파일에 분산. pilot closeout 시 **단일 요약 뷰/집계
  스크립트가 없어** 운영자가 수동 cross-file 집계해야 함. → pilot은 closeout 체크리스트(수집 명령 묶음)로 보완 가능.
  코드 추가 없이 운영 절차로 메움. (코드화는 별도 안건.)
- **GAP-2 (real fire 윈도우 카운터 부재)**: real fire 수는 callback_launch_audit.jsonl의 `REAL_FIRED` 행을 ts로
  필터해 세야 함. processed_ledger처럼 **epoch-scope 카운터가 callback 축엔 없음**. → pilot 윈도우가 짧고(≤10분)
  fixture 1건이라 수동 집계로 충분. 상시 가동 전엔 카운터 코드화 권장.
- **GAP-3 (closeout 증거 아카이브 정책 부재)**: jsonl이 .gitignore(state) 또는 코드-only PR 미포함이라
  **git에 안 남음**. pilot 후 별도 아카이브(예: `memory/reports/limited_pilot_<id>/`로 복사) 절차가 미정의.
  → 산출물 1 §11 + 본 문서 §5 체크리스트로 운영 보완.
- **GAP-4 (governor 평가 조건)**: governor는 driver activation + flag_reader 활성 시에만 evaluate_spawn 호출 →
  flag OFF면 spawn_decisions에 기록 없음. pilot에서 governor 관측하려면 driver를 실제 activation 경로로 1회
  태워야 함(시나리오 A로 가능). 이는 설계 의도(default 무기록)라 결함 아님, 단 **pilot 절차에 명시 필요**.

→ GAP-1~3은 **코드 결함이 아니라 "상시 가동 전 운영/아카이브 절차 미정의"**. pilot은 closeout 체크리스트로
   메우고, 카운터·통합뷰 코드화는 activation 단계의 별도 안건으로 분리 권장.

## 5. pilot closeout 증거 수집 체크리스트 (운영 절차)
```
PID=limited_pilot_<id>; DST=memory/reports/$PID; mkdir -p $DST
cp memory/events/p0b_processed_ledger.jsonl   $DST/ 2>/dev/null   # spawn/N
cp memory/state/spawn_decisions.jsonl          $DST/              # governor ALLOW/DENY
cp memory/p0b_state/driver_runs.jsonl          $DST/              # kill/N/T verdict, callback_launch_verdict
cp memory/p0b_state/callback_launch_audit.jsonl $DST/             # callback fired / self-key
cp memory/events/callback_4tuple_index.jsonl   $DST/ 2>/dev/null  # dedup
printf "driver_enabled=%s\n" "$(cat memory/state/p0b_driver_enabled 2>/dev/null)" > $DST/final_flags.txt
# 집계: real fire 수 / N count / duplicate / self-key
grep -c '"REAL_FIRED"' $DST/callback_launch_audit.jsonl 2>/dev/null   # real fire 수
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 차단 수
```

---

## 결론 (audit 판정)
- **9개 지표 전부 코드·파일에 영속 기록됨** (raw key 0, verdict 라벨로 fire/surface 구분 명확).
- 관측 *불가능* 항목은 없음 → pilot은 **관측 가능**.
- 단 GAP-1~3(통합 뷰·real fire 카운터·아카이브)은 **운영 절차(체크리스트)로 메워야** 하며, 상시 가동(always-on)
  전에는 코드화가 바람직. **현 상태로도 1회 limited pilot의 closeout 증거 확보는 가능**.
