# task-2777 — read-only `anu_control_status.py` (자동화 조종석, ACTIVE=false)

상태명: `TASK2777_ANU_CONTROL_STATUS_READONLY_IMPLEMENTATION_DONE_ACTIVE_FALSE`
담당: dev2-team · 회장 승인: 2026-06-28 (read-only control panel/status command 1건)
판정: **MERGE_CANDIDATE** (merge 금지 — ANU 독립검증 → fresh Gemini → CI → merge candidate 보고로만)
설계 단일소스: `control_panel_status_command_spec_260628.md` + `capability_matrix_update_plan_260628.md`

## 1. 목적
회장이 ANU 자동화 상태를 **한눈에 read-only로 관측**하고 다음에 무엇을 승인해도
되는지 판단하는 조종석. **자동화 실행이 아니다 — 순수 관측 도구.**

## 2. expected_files (외 변경 0)
- `scripts/anu_control_status.py` — read-only collector + human/`--json` formatter
- `tests/regression/test_anu_control_status_2777.py` — read-only invariant + 정확성 회귀
- `memory/reports/task-2777.md` — 본 보고서
- `memory/events/task-2777.done` — 완료 마커

(`.github/**`·`scripts/finish-task.sh`·`dispatch/anu_pickup_driver.py`·`memory/state/**`·
inbox/archive/quarantine 등 forbidden_paths 무변경. `memory/tasks/task-2777.md` 작업지시서는
커밋 대상 아님 — 미변경/미커밋.)

## 3. 구현 요약
- 출력 2형식: human-readable summary + `--json`.
- 표시 항목(전부): automation level · ACTIVE · flags(driver/event_strategy/callback/
  epoch+age/kill) · last verdict · last evidence(안전 필드만) · REAL_FIRED/LIVE_PROCESSED/
  LIVE_PENDING_OWNER_PROOF total · live_inbox/p0b_inbox/archive/pending fixture quarantine count ·
  systemd(is-active/is-enabled) · cron(UNKNOWN) · git branch/HEAD/origin·main·synced ·
  tracked dirty count · pending approvals · next allowed action · forbidden actions · warnings.
- 데이터 소스 매핑은 spec §2 그대로(파이썬 read / `git rev-parse·branch·status` /
  `systemctl --user is-active·is-enabled`). 부재 → absent/0/unknown (추정 금지·crash 0).

### WIRED ≠ ACTIVE
gated 축(limited gate·live_inbox wiring·owner-proof·event_strategy·normal callback launcher·
limited_runtime)은 전부 `WIRED(gated, ACTIVE=false)` 로만 표기. 어떤 축도 active 처럼 쓰지 않음.

### automation level 판정
전 flag OFF + LIVE_PENDING_OWNER_PROOF ≥1 + LIVE_PROCESSED 0 + ACTIVE=false →
`L2_DONE_L3_BLOCK_EVIDENCE_ACTIVE_FALSE`. LIVE_PROCESSED 0 이면 L3 PASS 로 올리지 않음.
모호 → `INDETERMINATE_REVIEW_REQUIRED`.

### cron count — raw key 금지
cron-list 는 key 가 필요하나 sealed loader 기반 read-only cron helper 가 없으므로
**raw key 를 만들지 않고** `cron = "UNKNOWN_KEY_REQUIRED"`. raw key literal 을
code/test/log/output 어디에도 남기지 않음. 새 key path 생성 0. cron-list 직접 호출 0.

## 4. read-only 절대 불변 (코드 차원)
모듈 전체에 `open(...,'w'/'a'/'x')` 0 · `os.remove/rename/replace` 0 · subprocess write/
mutation 0. subprocess 는 read-only 조회만(`git rev-parse/branch/status --porcelain`,
`systemctl --user is-active/is-enabled`). flag/state/evidence/driver/fixture/callback/
real fire/systemd/cron/archive/key/git checkout·reset·clean 전부 0.

## 5. 실측 출력 (production root, 2026-06-28)
- automation level: `L2_DONE_L3_BLOCK_EVIDENCE_ACTIVE_FALSE` · ACTIVE=false
- flags: driver=disabled · event_strategy/callback/epoch/kill 전부 absent
- last verdict: `NOOP_DISABLED`
- REAL_FIRED 1 · LIVE_PROCESSED 0 · LIVE_PENDING_OWNER_PROOF 1
- live_inbox 0 · p0b_inbox 0 · archive 28 · pending fixture quarantine 2
- systemd anu-pickup.path: is-active=inactive · is-enabled=disabled · cron=UNKNOWN_KEY_REQUIRED
- git: branch=task-2777-… · HEAD==origin/main==`1ee4204f` · synced=true · tracked_dirty=0
→ capability_matrix_update_plan_260628.md §2 실측과 완전 일치.

## 6. 테스트 (tests/regression/test_anu_control_status_2777.py — 13건 PASS)
- read-only 보장: 격리 tmp root 전후 전체 파일 sha256+mtime+size 불변 · 파일 생성/삭제 0 · append 0
- absent graceful: 소스 전무 → crash 0 · 안전 기본값
- level 정확: LIVE_PENDING 1·LIVE_PROCESSED 0·ACTIVE=false → L2_DONE_L3_BLOCK_EVIDENCE_ACTIVE_FALSE (+ unit 케이스)
- JSON schema: 필수 key 존재 · 값 타입 안정 · round-trip
- raw key 미출력: sealed key env(sentinel) 가 human/json 에 0 · cron UNKNOWN
- no driver execution: driver_runs.jsonl append 0
- no flag write: driver/event_strategy/callback/epoch/kill 생성·수정 0
- dirty count: git read-only(비-git tmp root → unknown, `.git` 생성 0) + 파서 unit
- human/json smoke · cron UNKNOWN · WIRED≠ACTIVE 라벨

## 7. 회귀 (전부 PASS — 152건)
- 신규 2777 (13) · `test_live_inbox_evidence_wiring_2776` (6) ·
  `test_limited_activation_bounds_2775` (63) · `test_p0b_event_strategy_2760` +
  `_wiring_2760` (36) · `test_anu_pickup_driver_2721` (34) · `py_compile` PASS.

## 8. PR 게이트 자가확인
- expected_files 외 0 · 2777 PASS · 2776 PASS · read-only invariant PASS ·
  raw key/secret 0 · ACTIVE=false 유지 · real fire 0 · flags OFF · systemd inactive·disabled ·
  cron 신규 등록 0 · archive 28 보존 · pending fixture quarantine 2 보존.
- bounded fix: HIGH/Critical 0 · medium 0 (style: Pyright 미사용변수 2건 즉시 정리).

## 9. 금지 준수
flag ON / driver 실행 / fixture / real fire / LIVE_PROCESSED / systemd start·enable /
recurring / archive·quarantine 이동 / key rotation / production activation / **merge** — 전부 미수행.

## 10. 다음 (ANU/회장)
**merge 금지.** ANU 독립검증 → fresh Gemini(HIGH/Critical 0 확인) → CI green →
MERGE_CANDIDATE 최종 판정. 이후 후보: D(LIVE_PROCESSED surface-only preflight, design-only).
