# Axis 3 Phase 0 Audit Report — PreToolUse Runtime Guard

- task_id: task-2652
- axis: 3 (pretooluse_runtime_guard)
- subscope: phase_0_audit_only_not_live_activation
- chair_authorization_id: `CHAIR-AUTH-AXIS-3-PHASE0-20260524-JJONGS-PRETOOLUSE-AUDIT-001` (★ 회장 verbatim · marker `memory/events/chair-authorization-axis-3-phase0-audit-260524.json`)
- recorded_at: 2026-05-24 KST
- executor: dev6 페룬
- live_activation_status: **NOT_AUTHORIZED** (★ 본 audit ≠ live activation · 별도 chair signature 필요)
- merge_policy: audit_only_no_commit
- forbidden_action_count: 0
- single_source_sha256: `3df92aad452a056fbd3a6388d5e646f5da042ef481e0452830e1d7d60eddadfa` (task-2652.md)

## 0. 단일소스 무결성 검증

- task-2652.md sha256 = `3df92aad452a056fbd3a6388d5e646f5da042ef481e0452830e1d7d60eddadfa` ✓
- chair authorization marker = `memory/events/chair-authorization-axis-3-phase0-audit-260524.json` 존재 ✓
- chair signature packet = `memory/events/chair-signature-packet-axis-3-pretooluse-runtime-guard-260524.json` 존재 ✓
- chair_authorization_id verbatim 일치 ✓ (placeholder 0 · ANU random 0 · Axis 1/2/2-HARDEN 재사용 0)

## 1. 필수 확인 10 결과 (회장 verbatim 1:1)

### 확인 1 — task-2643 task md
- 경로: `/home/jay/workspace/memory/tasks/task-2643.md` (135 line) ✓
- Title: CI_WATCH_HANDOFF_RUNTIME_ENFORCEMENT_GATE (v2.4 Harness Recovery)
- 12 완료 산출물 + 4 트랙 (A PreToolUse Hook / B Watcher Contract+Dead-letter / C PR Open Watcher Auto-Wrapper / D Repo Regression+Auto-Classifier)
- 회장 verbatim "live `~/.claude/settings.json` 직접 수정은 최종 회장 승인 전까지 금지" 명시
- single-source spec sha256 = `f1abe811543e1f561bae8f15fc9e0fb8a90b4800dca06d3c8d9bcfdd80b2991b` (`memory/specs/system_ci_watch_handoff_runtime_enforcement_gate_spec_260523.md`)

### 확인 2 — PR #146 head 33c51992
- PR number: 146
- title: "task-2643: CI_WATCH_HANDOFF_RUNTIME_ENFORCEMENT_GATE (Harness-first · staged · HARNESS_ENFORCED_PENDING)"
- state: OPEN
- headRefName: task/task-2643-anu-restack
- headRefOid: `33c51992dbbff0d08ed598e7027c4bdbc1f894bc` ✓ (회장 명시 head sha 일치)
- baseRefName: main
- mergeStateStatus: CLEAN ✓
- mergeable: MERGEABLE
- CI status: **11/11 SUCCESS** (cancel-kill-switch · taskctl-state-guard ×2 · qc-check · hidden-path-audit · lock-in-check · merge-safety-check · gemini-review-gate · phase3-merge-gate · ci/guard · guard)
- 마지막 commit: Gemini auto-fix R4 (4 HIGH IGNORECASE 일관성 + 2 medium) — task-2643 신규 53/53 regression PASS

### 확인 3 — 실제 PreToolUse hook 파일 목록
- `hooks/pre_tool_use_anu_guard.py` (259 line · staged · live 미적용)
- 진입점: `evaluate_tool_call(payload)` / `evaluate_bash_command(command, run_in_background)`
- stdin/stdout 규약: claude-code `PreToolUse` hook contract 준수
- CLI 모드: `--mode=stdin` (default) / `--mode=dry-run --fixture=<path>`
- timeout_seconds: 5 (staged settings template 기준)
- fail-closed 4 contract: `hook_timeout` / `hook_parse_error` / `hook_internal_exception` / `config_missing` → 모두 `deny` (allow fallback 금지)

### 확인 4 — 실제 runtime guard utils 목록
- task-2643 Track A 산하 직접 utils 0개 (hook 자체가 self-contained · stdlib only)
- task-2643 Track C utils: `utils/pr_open_watcher_wrapper.py` (261 line · dry-run only · `gh pr create` live 호출 0)
- task-2643 Track D utils: `utils/closeout_grade_auto_classifier.py` (157 line · 4 enum: DOCUMENTED_ONLY / REGRESSION_GUARDED / RUNTIME_GUARDED / HARNESS_ENFORCED)
- 두 utils 모두 stdlib only import (dataclasses, enum, typing) — 추가 의존 0

### 확인 5 — canonical live path 적용 가능성
- staged settings template (`memory/specs/staged_settings_template_pre_tool_use_anu_guard_260523.json`)의 `command` 필드 = `python3 <REPO_ROOT>/hooks/pre_tool_use_anu_guard.py --mode=stdin`
- `<REPO_ROOT>` 플레이스홀더를 canonical `/home/jay/workspace` 로 치환 시 PYTHONPATH 의존 0 (Axis 2 hardening 교훈 적용)
- hook 파일 자체가 stdlib only — `sys.path` 조작 / `importlib.util.spec_from_file_location` 사용 0
- canonical live target layout 후보:
  - `/home/jay/.claude/settings.json` hooks.PreToolUse 항목 추가
  - `/home/jay/workspace/hooks/pre_tool_use_anu_guard.py` (canonical · worktree 의존 0)
- ENV gate: `CLAUDE_PRE_TOOL_USE_HOOK_ENABLED=1` (즉시 toggle off 가능)
- 결론: **canonical live path 적용 가능** (단 live activation 자체는 별도 chair signature 필요 · 본 Phase 0 범위 외)

### 확인 6 — Axis 1/2 hook 및 utils와 import 충돌 여부
- task-2643 hook `hooks/pre_tool_use_anu_guard.py` import: `argparse`, `json`, `re`, `sys`, `pathlib`, `typing` (stdlib only) ✓
- task-2643 `utils/pr_open_watcher_wrapper.py` import: `dataclasses`, `typing` (stdlib only) ✓
- task-2643 `utils/closeout_grade_auto_classifier.py` import: `dataclasses`, `enum`, `typing` (stdlib only) ✓
- Axis 1 helper 3종 (utils/callback_registration · authority_validator · source_cross_checker) import 의존: **0**
- Axis 2 utils 4종 v2 (callback_collector_helper_integration · callback_adjudicator_v2 · callback_next_action_runner_v2 · source_attribution_guard_v2) import 의존: **0**
- settings.json 슬롯 충돌: Axis 1/2는 `SessionStart` / `Stop` / `UserPromptSubmit` 슬롯 · Axis 3은 `PreToolUse` 슬롯 → 슬롯 분리 ✓
- 결론: **import collision = ZERO** (상세는 `axis_3_axis_1_2_import_collision_analysis_260524.md`)

### 확인 7 — forbidden path list 확정안
상세 파일: `memory/specs/axis_3_forbidden_paths_finalized_260524.md`. 핵심 7 entry (chair packet field_07 baseline 기반):
- `/home/jay/.env*` (credential)
- `/home/jay/.claude/settings.local.json` (secrets · live infra)
- `/home/jay/.claude/settings.json` (★ Axis 3 본인이 수정 대상이지만 임의 수정 차단)
- `/usr/local/bin/cokacdir` (live infra)
- `.github/**` (CI config)
- `**/credentials*`
- `/home/jay/.ssh/**` (ssh key)

### 확인 8 — destructive command list 확정안
상세 파일: `memory/specs/axis_3_destructive_commands_finalized_260524.md`. task-2643 hook 5 그룹 + 추가 5 destructive 후보:
- BACKGROUND_GH_PR_POLL / LOOP_SLEEP_GH_PR_POLL / GH_RUN_WATCH_POLL / SEMANTIC_CI_GEMINI_WAIT / EXPLICIT_FORBIDDEN_ACTION (task-2643 5 그룹 그대로)
- 추가: `rm -rf /` · `git push --force` (origin/main 대상) · `git reset --hard <not_current_branch>` · `git branch -D main` · `cokacdir --cron-remove <임의 schedule>`

### 확인 9 — SP1-SP7 smoke 설계 확정
상세 파일: `memory/specs/axis_3_smoke_set_SP1_SP7_finalized_260524.md`. chair signature packet field_05 verbatim 7 step:
- SP1 normal tool noop / SP2 forbidden path BLOCK / SP3 credential pattern BLOCK·WARN / SP4 destructive command BLOCK·WARN / SP5 Axis 1/2 충돌 0 / SP6 dispatch.py 정상 통과 / SP7 hook crash fail-safe

### 확인 10 — rollback L1/L2 확정
상세 파일: `memory/specs/axis_3_rollback_plan_finalized_260524.md`. chair signature packet field_06 verbatim + task-2643 rollback plan 통합. ENV toggle / settings 백업본 / git revert / 자동 disable trigger 6 시나리오 박제.

## 2. live target 후보 목록 (★ Phase 0 분석만 · 실행 0)

- `/home/jay/.claude/settings.json` hooks.PreToolUse 배열 (staged template → live 병합 대상)
- `/home/jay/workspace/hooks/pre_tool_use_anu_guard.py` (canonical live path · `<REPO_ROOT>` 치환 결과)
- `/home/jay/.claude/settings.json.backup.<ts>` (rollback용 백업본 · 적용 직전 자동 생성)
- ENV variable: `CLAUDE_PRE_TOOL_USE_HOOK_ENABLED` (default unset = OFF · `=1` = ON)

## 3. PR #146 staged 파일 목록 요약 (49 file)

- spec/template 4: 본 spec md / staged settings template / rollback plan / final activation packet
- hook 1: `hooks/pre_tool_use_anu_guard.py`
- schemas 2: `schemas/watcher_contract_v1.json` / `schemas/watcher_dead_letter_v1.json`
- utils 2: `utils/pr_open_watcher_wrapper.py` / `utils/closeout_grade_auto_classifier.py`
- fixtures 24: closeout_grade 2 시나리오 × 3 + forbidden_bash_pattern 3 시나리오 × 3 + pr_open_watcher_wrapper 6 시나리오 × 3 + watcher_contract 1 시나리오 × 3 = 36 (실제 합산)
- regression tests 5: test_anu_direct_polling_violation_guard / test_closeout_grade_auto_classifier / test_forbidden_bash_pattern_static_guard / test_pr_open_watcher_wrapper_dry_run / test_watcher_contract_validation
- dry-run report 1: `memory/events/pre_tool_use_anu_guard_dry_run_report_260523.json` (11 cases: 7 deny + 4 allow + 1 fail-closed)
- lock 1: `.tasks/locks/task-2643.lock`
- live settings.json 수정 0 ✓ · live cokacdir 수정 0 ✓ · forbidden 25종 무수정 ✓

## 4. Axis 2 hardening 교훈 적용 가능성 (chair packet field_08)

- lesson_1 canonical path first: ✓ adopted (canonical `/home/jay/workspace/hooks/` 경로 사용)
- lesson_2 no worktree hardcoded import: ✓ adopted (hook은 stdlib only · sys.path 조작 0)
- lesson_3 chair_authorization_id verbatim: ✓ adopted (본 Phase 0 marker verbatim · placeholder 0)
- lesson_4 real value verification 8 pattern: 후속 live activation task에서 적용 (Phase 0 범위 외)
- lesson_5 dependency hardening carry: ✓ adopted (utils 직접 의존 0 + stdlib only)

## 5. 위반 시그널 점검 (회장 verbatim 13 금지)

| # | 회장 verbatim 금지 | 본 audit 진행 시 위반 발생 | 박제 |
|---|---|---|---|
| 1 | live settings.json 수정 | NO | 본 audit `~/.claude/settings.json` 미접근 |
| 2 | live cokacdir 수정 | NO | `/usr/local/bin/cokacdir` 미접근 |
| 3 | hook live 등록 | NO | hook 등록 절차 미실행 |
| 4 | Axis 1 helper 변경 | NO | utils/callback_registration·authority_validator·source_cross_checker 미접근 |
| 5 | Axis 2 hooks/utils 변경 | NO | v2 4 utils + 3 hooks 미접근 |
| 6 | dispatch.py 변경 | NO | dispatch.py 미접근 |
| 7 | commit/push/PR/merge | NO | git 변경 0 (read-only show/log/diff만) |
| 8 | real auto-merge | NO | auto-merge 미실행 |
| 9 | PR #141 pilot | NO | PR #141 미접근 |
| 10 | BOT App token 사용 | NO | BOT_APP_TOKEN 미사용 |
| 11 | HARNESS_ENFORCED 선언 | NO | 본 audit `HARNESS_ENFORCED_PENDING` 그대로 보존 |
| 12 | callback system verified 전체 선언 | NO | 본 audit Axis 3 Phase 0 단독 검증 |
| 13 | Axis 3 live activation 실행 | NO | live target 후보 분석만 · 실행 0 |

→ **forbidden_action_count = 0**

## 6. 완료 상태

- 9 expected_files 모두 생성 ✓
- result marker 박제 ✓ (`memory/events/task-2652.axis-3-phase-0-audit-result-260524.json`)
- .done 생성 ✓ (`memory/events/task-2652.done`)
- 회장 보고: **`AXIS_3_PHASE0_AUDIT_READY_FOR_SIGNATURE`**

## 7. 다음 단계 권고 (★ 본 audit 결정 0 · 회장 결재 대상)

1. 회장 verbatim signature 발급 (실 `chair_authorization_id` for live activation = `CHAIR-AUTH-AXIS-3-LIVE-...` 형식 · 별도)
2. 별도 Axis 3 live activation task 발행 (예: task-2653 또는 회장 명시)
3. pre-activation smoke 5 step 실행 (`memory/specs/task_2643_final_activation_packet_template_260523.json` 참조)
4. 8 실제값 패턴 적용 (Axis 1 verified pattern: real cron registration / argv_generated / cron_id_fired / schedule_history / cron-history owner key match / result artifact / ledger row / live_enforcement)

끝
