# Control Panel / Status Command Spec (read-only 조종석)

작업 상태명: `CONTROL_PANEL_CAPABILITY_MATRIX_PREP_APPROVED_ACTIVE_FALSE`
작성: 2026-06-28 (KST) · 작성자: 아누 · canonical main `1ee4204f` · **raw key redacted**

> ★ spec 문서. **read-only status command 설계까지**. 코드 구현 착수 아님(별도 승인). status command는 어떤
> flag/driver/fixture/callback/fire/systemd/cron/archive/key도 **생성·수정·실행하지 않는다**(순수 관측).

## 1. 설계 원칙
- **read-only 절대 불변**: cat/test/ls/grep/git rev-parse/cokacdir --cron-list(조회) 만. write 0.
- 출력 2형식: **human-readable summary** + **`--json` mode**.
- JSON 필드: `automation_level · active · flags · counts · last_verdict · last_evidence · next_allowed_action ·
  forbidden_actions · git · pending_approvals`.
- 실패 안전: 소스 파일 부재/파싱 실패는 "absent/0/unknown"으로 표기(크래시 0, 추정 금지).
- ★ raw key 0: cron-list 호출 시 key는 환경변수/sealed loader 경유(문서·출력에 literal 0).

## 2. 항목별 read-only 소스 매핑 (회장 명시 항목 전부)
| 항목 | read-only 소스 | 비고 |
|---|---|---|
| current automation level | flags 조합 → L0~L7 판정 함수 | §3 판정규칙 |
| ACTIVE true/false | `cat memory/state/p0b_driver_enabled` == "enabled" | |
| p0b_driver_enabled | `cat memory/state/p0b_driver_enabled` | absent→disabled |
| p0b_event_strategy_enabled | `test -e memory/state/p0b_event_strategy_enabled` | |
| p0b_callback_launch_enabled | `test -e memory/state/p0b_callback_launch_enabled` | |
| p0b_activation_epoch / epoch age | `cat memory/state/p0b_activation_epoch` + (now-epoch) | absent→none |
| p0b_kill | `test -e memory/state/p0b_kill` | |
| last verdict | `tail -1 memory/p0b_state/driver_runs.jsonl` → .verdict | |
| last evidence line | `tail -1 memory/p0b_state/driver_runs.jsonl` (raw key 0) | |
| REAL_FIRED total | `grep -c REAL_FIRED memory/p0b_state/callback_launch_audit.jsonl` | |
| LIVE_PROCESSED total | `grep -c LIVE_PROCESSED memory/events/p0b_processed_ledger.jsonl` | 부재→0 |
| LIVE_PENDING_OWNER_PROOF total | `grep -c LIVE_PENDING_OWNER_PROOF memory/p0b_state/driver_runs.jsonl` | |
| live_inbox count | `ls memory/events/p0b_live_inbox/task-*.result.json \| wc -l` | |
| p0b_inbox count | `ls memory/events/p0b_inbox/task-*.result.json \| wc -l` | |
| archive count | `ls memory/reports/p0b_inbox_backlog_archive_260627/task-*.result.json \| wc -l` | |
| pending fixture quarantine count | `find memory/reports -path '*pending_fixture_quarantine*' -name '*.result.json' \| wc -l` | |
| systemd status | `systemctl --user is-active/is-enabled anu-pickup.path` | |
| cron count | `cokacdir --cron-list ...(key sealed)` → len(schedules) | |
| git branch/HEAD/origin/main | `git branch --show-current`·`git rev-parse HEAD origin/main` | |
| tracked dirty count | `git status --porcelain=v1 \| grep -cE '^ (M\|D)'` | |
| pending approvals | Framework §4 승인경계 중 "다음 후보" 표시(정적 목록) | |
| next allowed action | level+flags → Framework §8 순서 기반 판정 | |
| forbidden next action | Framework §10 금지 목록(정적) | |

## 3. automation level 판정 규칙 (read-only 추론)
- 전 flag OFF + dirty 무관 → **L0/L2-ready** (현재).
- driver_enabled=enabled + epoch + event_strategy ON + callback OFF → **L2/L3 실행중**(관측 시점).
- callback_launch_enabled ON + real_launch_fn → **L4 가능**.
- systemd active → **L6**. 
- ★ 판정은 "현재 flag 스냅샷" 기반 관측. 실행 권한 없음. 모호하면 "level=indeterminate" 표기.
- 현재 실측: 전 flag OFF → **level 표시 = "L2_DONE / L3_BLOCK_EVIDENCE / ACTIVE=false"**(직전 OBSERVED 반영).

## 4. 권장 구현 방향 (구현은 별도 승인)
- 후보 파일: **`scripts/anu_control_status.py`** (또는 `dispatch/anu_control_status.py`).
- 동작: 위 §2 소스를 read-only 수집 → human-readable 표 + `--json` 출력.
- JSON 예시 키:
  ```json
  {"automation_level":"L2_DONE_L3_BLOCK_EVIDENCE","active":false,
   "flags":{"driver":"disabled","event_strategy":"absent","callback":"absent","epoch":"absent","kill":"absent"},
   "counts":{"REAL_FIRED":1,"LIVE_PROCESSED":0,"LIVE_PENDING_OWNER_PROOF":1,
             "live_inbox":0,"p0b_inbox":0,"archive":28,"pending_fixture_quarantine":2},
   "last_verdict":"NOOP_DISABLED","git":{"branch":"main","head":"1ee4204f","synced":true,"tracked_dirty":0},
   "systemd":"inactive/disabled","cron":0,
   "next_allowed_action":"design-only (D LIVE_PROCESSED preflight) or read-only audit",
   "forbidden_actions":["flag ON","driver run","real fire","merge","systemd enable","key rotation"]}
  ```
- **불변(코드 차원)**: 함수 전체가 subprocess write 0 · open(...,'w') 0 · os.remove/rename 0 · cron 등록 0.

## 5. expected_files 후보 (구현 시)
- `scripts/anu_control_status.py` (read-only collector + formatter)
- `tests/regression/test_anu_control_status_*.py` (1개)
- (선택) `memory/reports/task-<id>.md`

## 6. 필요 테스트 후보 (구현 시)
- read-only 보장: 실행 전후 canonical state/flag/inbox/ledger 줄 수 **불변** (write 0 입증)
- 각 항목 정확 수집(격리 tmp root fixture로 known 값 → 출력 매칭)
- 소스 부재 시 absent/0 graceful(크래시 0)
- `--json` 스키마 안정성
- raw key 미출력(cron-list key literal 0)
- automation level 판정 정확(flag 조합별)

## 7. 완료 보고용 정리
- **capability matrix update plan**: `memory/reports/capability_matrix_update_plan_260628.md`
- **control panel status command spec**: 본 문서
- **현재 automation level**: L2 완료 + L3 차단층 evidence (ACTIVE=false)
- **verified/wired/active**: live_inbox wiring VERIFIED·WIRED·MERGED / Phase1 observed VERIFIED by direct evidence / ACTIVE=false·ENFORCED=false
- **status command 구현 필요 여부**: 권장(조종석 실체화). 단 **별도 승인 후** read-only 구현
- **expected_files 후보**: scripts/anu_control_status.py + test 1개
- **테스트 후보**: §6
- **다음 승인 가능한 가장 안전한 전진 단계**: **read-only `anu_control_status.py` 구현**(write 0 보장 테스트 포함)
  → 조종석 실체화. 그 다음 D(LIVE_PROCESSED surface-only preflight 설계). 둘 다 실행/flag 0.

## 8. 금지 (유지)
status command read-only 위반 금지 · flag/driver/fixture/callback/fire/systemd/cron/archive/key 조작 금지 ·
code 수정 착수 금지(spec까지) · 새 PR/merge 금지 · ACTIVE=false 대기.
