# task-2653 — AXIS_3_RESTRICTED_CANARY_RUNNING (회장 보고)

- 종결 표기: **`AXIS_3_RESTRICTED_CANARY_RUNNING`**
- chair_authorization_id: `CHAIR-AUTH-AXIS-3-CANARY-20260524-JJONGS-RESTRICTED-001` (회장 verbatim · ANU random 0)
- 실행자: dev5 마르둑 (회장 우선 명시)
- 수행 시각: 2026-05-24 19:16~19:30 KST
- worktree: `/home/jay/.cokacdir/workspace/A171B540/wt-2653-dev5` (origin/main 0e172435 기준 · branch `task/task-2653-dev5`)

## 정독 sha256 (단일 소스 입력 검증)
- task md `memory/tasks/task-2653.md` → `0b2b241dde0f877fe1c4cf8fc626ede48edb5c6721f87bf4ab58234588ae2e07` (회장 명시값 일치 ✓)
- chair auth marker → `e62450e3...3b3` (verbatim id 일치)
- canary packet → `e26b35d6...c3f`
- result marker (산출) → `ef4b6607...d11`

## 12 mandatory fields (회장 verbatim 보고)

1. **canary session id** — `dev5-canary-session-axis-3-restricted-260524-pending-explicit-spawn`. 인프라 ready 완료. 실 canary session은 `ANU_CANARY_AXIS_3=true` 환경에서 spawn될 때 `.axis_3_canary_decision_audit.jsonl`에 실제 session_id 기록.
2. **changed_files** — 13개 (settings.json patch + live hook + 2 utils + tests + 6 audit jsonl + result/done/report marker). 상세 result marker `field_02_changed_files` 참조.
3. **settings.json diff 요약** — 9 lines ADD-ONLY · `hooks.PreToolUse`에 matcher='' 항목 1개 추가 · 기존 Task/Bash matcher 항목 보존 · 다른 hook section (UserPromptSubmit/PostToolUse/Stop/SessionStart) 무변경. JSON validity PASS. 백업 sha256 `dbcbf909...`.
4. **policy map** — AUDIT_ONLY default · WARN(forbidden_path × 17 + credential_pattern × 7) · BLOCK(destructive 5종만). BLOCK 확대 절대 금지(24h + 별도 chair signature).
5. **SP1-SP7 결과** — **7/7 PASS** (실제 12/12 PASS · SP4는 5 parametrize + 1 bonus 추가)
   - SP1 normal noop PASS
   - SP2 forbidden path WARN PASS (BLOCK 0)
   - SP3 credential pattern WARN PASS (BLOCK 0)
   - SP4 destructive 5종 BLOCK PASS × 5 (정확히 5종만)
   - SP5 Axis 1/2 hook 충돌 0 PASS (callback ledger/inbox/helper write·read 모두 allow)
   - SP6 dispatch 통과 PASS (`ANU_DISPATCH_RUNNING=1` exclusion이 destructive BLOCK도 override)
   - SP7 hook crash fail-safe PASS (forced crash → exit 0 · 봇 멈춤 0)
6. **latency p50/p95/p99** — 32.83 / 33.68 / 34.54 ms (subprocess startup 포함 end-to-end · 100회 표본). target p95 ≤50ms 통과. WARN(100ms)/rollback(500ms) 미접근.
7. **false_positive_count** — 0 (canary 미가동 · log empty · downgrade rule ready)
8. **interference_count** — 0 (SP5 모든 Axis 1/2 path allow 확인)
9. **bypass_activation_count** — 0 (env var/file flag/chair signature 어느 것도 발동 0)
10. **hook_crash_count** — 0 (SP7 의도된 simulation은 별도 stage `forced_simulation`)
11. **rollback_trigger** — false (모든 임계 미접근)
12. **forbidden_action_count** — 0 (12 금지 행위 모두 0 · result marker `field_12_forbidden_breakdown` 12 sub-counter 전부 0)

## 회장 verbatim 10 canary 조건 준수 매트릭스

| # | 조건 | 구현 위치 | 검증 |
|---|------|----------|------|
| 1 | `ANU_CANARY_AXIS_3=true` env var dev5 신규 1개만 | `pre_tool_use_runtime_guard_canary.py` L1 게이트 | bonus test |
| 2 | 기본 AUDIT_ONLY | `runtime_guard_policy_map.initial_decision_for_category` | SP1 |
| 3 | forbidden + credential 초기 WARN | 동일 함수 | SP2 / SP3 |
| 4 | BLOCK destructive 5종만 | `DESTRUCTIVE_RULE_IDS` + hook L6 게이트 | SP4 ×5 |
| 5 | crash fail-safe (tool 호출 허용) | hook `try/except` wrap + `_emit_allow()` fallback | SP7 |
| 6 | false positive 1=AUDIT_ONLY 강등 | `policy_map.downgrade` | unit-ready |
| 7 | false positive 3=session 종료+보고 | runtime 게이트 (canary monitoring 24h 운영) | 운영 단계 |
| 8 | false positive 5=L1 rollback | rollback one-liner ready | 운영 단계 |
| 9 | latency target/warn/rollback | hook `_log_latency` + per-call elapsed_ms | p95 33.68ms |
| 10 | Axis 1/2 interference 1건 L1 rollback | SP5 baseline 0 + monitoring 누적 | 운영 단계 |

## 회장 verbatim 12 금지 준수 결과

```
회장 본 세션 적용        : 0  (env var 미설정 → noop)
ANU collector 세션 적용  : 0  (env var 미설정 + L3 belt-and-suspenders)
Axis 1/2 runtime 변경    : 0  (helper/hooks/utils 일체 무수정)
dispatch.py 변경         : 0  (forbidden_paths)
settings.json 추가외 변경 : 0  (PreToolUse 1 항목 ADD-ONLY)
live cokacdir 변경       : 0
real auto-merge          : 0
PR #141 pilot            : 0
BOT App token 사용       : 0
commit/push/PR/merge     : 0  (worktree 작업만 · main 무접촉)
Axis 3 full rollout      : 0  (RESTRICTED_CANARY only)
BLOCK 정책 확대          : 0  (destructive 5종 고정)
24h 전 정책 승격         : 0
```

## 핵심 설계 결정 (회장 지침 반영)

1. **PYTHONPATH 의존 0** (Axis 2 hardening 교훈) — hook이 자체적으로 `sys.path.insert(0, WORKSPACE_ROOT)` 부트스트랩 후 `utils.runtime_guard_*`을 import. 호출자(Claude Code harness)가 PYTHONPATH를 설정할 필요 없음. 동시에 utils가 canonical 단일 source.
2. **세션 필터 4 레이어** — L1 env var (1ms 미만 fast-path) → L2 emergency bypass → L3 ANU collector exclusion → L4 dispatch exclusion. 어느 한 레이어가 깨져도 다음 레이어가 보호.
3. **fail-safe 절대 보장** — 모든 코드 경로에서 unhandled exception 발생 시 `_emit_allow()`로 tool 호출 허용 · `_log_crash`로 audit 기록. classifier import 실패도 allow. 봇 멈춤 시나리오 0.
4. **canonical utils 배치** — worktree/utils와 라이브 `/home/jay/workspace/utils/`에 동일 sha256으로 배치 (`6c998fd9...` · `bc4fda0f...`). 단일 source of truth.
5. **결과 marker 4 source attribution reconciled** — 회장 verbatim · task md · chair auth marker · canary packet 4개 source 모두 일치 확인 후 박제.

## 운영 다음 단계 (회장 결정 필요)

1. **실 canary session spawn** — 별도 Telegram task로 dev5 세션 spawn 시 `ANU_CANARY_AXIS_3=true` 환경변수 설정. 본 task 범위 외 (회장 별도 dispatch).
2. **24h monitoring** — `.axis_3_canary_*.jsonl` 6개 audit log 시계열 관찰 · false positive / interference / latency 추적.
3. **L1 rollback one-liner** — 회장 signature 발급 시 즉시 실행 가능 (result marker `rollback_one_liners_ready`).
4. **24h 후 정책 승격 또는 종료** — 회장 결정 · 본 task ttl_hours=96.

## ANU normal callback cron

`dispatch.normal_fallback_callback_helper.launch_callback` 헬퍼 경유. ANU key `c119085addb0f8b7` · executor key 분리 · envelope-only prompt (UTF-8 ≤3900B). 등록 결과는 본 보고서 말미의 cron_id로 추적 가능.

끝.
