# v3.6 PreToolUse Shadow-Mode Activation Plan (Track C-1 · Phase 2)

- task_id: task-2665
- chair_authorization_id: `CHAIR-AUTH-V3-6-SHADOW-MODE-PACKET-20260525-JJONGS-PHASE-2-001`
- executor: dev3 다그다 (Track C-1)
- base_commit: origin/main `2752182a` (PR #148 merged)
- 단일소스: 본 task md + task-2664 packet 4종 (★ read-only 참조)
- 범위: **Phase 2 shadow-mode 활성화 plan only · packet/spec only**
- live_settings_json_change: 0
- live_enforcement: 0
- commit_push_pr_merge: 0
- pretooluse_full_live_enforcement: 0
- BLOCK_policy_expansion: 0
- policy_promotion: 0
- HARNESS_ENFORCED_global_declaration: 0
- Axis_3_RUNNING_auto_declaration: 0

## 1. 본 plan 목적

ANU v3.6 Runtime Harness Enforcement Layer의 PreToolUse hook 을 **실제 BLOCK 없이 marker 만 기록하는 shadow-mode**로 전환하기 위한 단계별 활성화 계획을 정리한다.

★ 본 plan은 **plan only**. 실제 settings.json 수정/hook script 배포/shadow-mode 활성화 명령은 본 packet 박제 후 **별도 회장 verbatim signature 강제** 진입 후 진행.

## 2. Phase 정의 (task-2664 packet section 3 verbatim re-anchor)

| Phase | 범위 | 본 task-2665 | 다음 task |
| --- | --- | --- | --- |
| Phase 0/1 | spec packet 작성 (deny rule / allow contract / rollback / regression 설계) | 완료 (task-2664) | — |
| **Phase 2** | **shadow-mode activation plan + smoke + rollback + false-positive audit plan** | **본 task** | — |
| Phase 3 | restricted live 적용 (★ 특정 deny rule 1-2개부터 진짜 BLOCK) | 0 | chair verbatim signature 필요 |
| Phase 4 | full live 적용 | 0 (★ BLOCK 정책 확대 spec 8B.14 위반 회장 결정 강제) | chair verbatim signature 필요 |

★ 본 task-2665 종결 시점에서 Phase 2 plan packet 만 존재. Phase 2 실제 활성화/Phase 3 이상 진입은 별도 chair verbatim signature 필수.

## 3. Shadow-mode 정의 (spec 8B.7 anchor)

**shadow-mode** = PreToolUse hook 가 deny rule pattern을 평가하지만 **return verdict = ALLOW + marker 박제만 수행** 하는 모드.

| 항목 | shadow-mode | restricted live | full live |
| --- | --- | --- | --- |
| hook 평가 | YES | YES | YES |
| deny event marker 박제 | YES | YES | YES |
| 실제 tool execution BLOCK | **NO** (★ 핵심) | 선택 1-2 rule 만 | 전체 deny rule |
| ANU 정상 작업 영향 | 없음 (★ marker only) | 1-2 rule 영향 | 전체 영향 |
| 본 task-2665 | plan only | 무관 | 무관 |

## 4. Pre-activation 게이트 (본 plan 단계 전 필수 충족)

다음 6개 게이트 모두 PASS 시에만 Phase 2 shadow-mode 실 활성화 후속 task 진입 허용.

| gate_id | 조건 | 본 task-2665 시점 |
| --- | --- | --- |
| PG-1 | task-2664 V3_6_PRETOOLUSE_LIVE_ENFORCEMENT_PACKET_READY 박제 완료 | ✅ PASS (★ 4 source 교차) |
| PG-2 | chair_authorization_id `CHAIR-AUTH-V3-6-SHADOW-MODE-PACKET-20260525-JJONGS-PHASE-2-001` 발행 완료 | ✅ PASS (★ 본 task) |
| PG-3 | shadow-mode activation/smoke/rollback/false-positive audit plan 4종 작성 | ✅ 본 task 완료 시 PASS |
| PG-4 | task-2664 packet 4종 read-only 참조 (수정 0) | ✅ PASS |
| PG-5 | Track A-1 (PR #149) / Track B-1 (Axis 3 observer chain) / Track D-1 (task-2666) 파일 충돌 0 | ✅ PASS (★ section 9 참조) |
| PG-6 | 별도 회장 verbatim signature (★ Phase 2 실 활성화용) | ⛔ PENDING (★ 본 packet 박제 후 회장 발행) |

★ PG-1 ~ PG-5 = 본 task-2665 범위. PG-6 = 본 task 종결 후 회장 결정.

## 5. Shadow-mode activation 단계 (plan only · 실 실행 0)

### 5.1 단계 S1 — hook script 작성 (별도 task)

- 작성 대상: `hooks/v3_6_pretooluse_shadow.py` (★ 본 task에서 작성 0)
- 입력: tool name / command / context (run_in_background / cwd / session_owner)
- 출력: `{"verdict": "ALLOW", "shadow_marker": {...}}` (★ shadow-mode 핵심 — verdict 항상 ALLOW)
- 동작:
  1. deny rule pattern (DR-1 ~ DR-17) 17 매치 평가
  2. allow contract schema 평가 (AC-1 ~ AC-10)
  3. 매치 발생 시 marker 박제 (★ `memory/events/pretooluse_shadow_<unix_ts>.json`)
  4. 항상 ALLOW 반환 (★ 실 BLOCK 0)
- 본 task-2665 적용: **0** (★ plan only)

### 5.2 단계 S2 — fixture 작성 (별도 task)

- 작성 대상: `hooks/fixtures/v3_6_pretooluse_shadow_*.json` (★ 본 task에서 작성 0)
- task-2664 packet section 5.4 후보 list 재사용
  - `bzaona6au_session_bound_direct_polling_violation.json`
  - `delegated_watcher_contract_bound_polling_allow.json`
  - `gh_run_watch_direct_wait_violation.json`
  - `admin_override_attempt_violation.json`
  - `bot_app_token_direct_use_violation.json`
  - `chair_authorization_creation_attempt_violation.json`
- 본 task-2665 적용: **0** (★ plan only)

### 5.3 단계 S3 — settings.json 추가 (별도 task)

- 변경 대상: `~/.claude/settings.json` (★ 본 task forbidden_paths · 본 task 변경 0)
- 추가 항목 후보:
  ```json
  {
    "PreToolUse": {
      "shadow_mode": true,
      "hook_script": "hooks/v3_6_pretooluse_shadow.py",
      "fallback_verdict": "ALLOW",
      "timeout_ms": 100,
      "fail_safe": "fail_open"
    }
  }
  ```
- 본 task-2665 적용: **0** (★ plan only · settings.json 변경 0)

### 5.4 단계 S4 — shadow-mode 활성화 명령 (별도 task)

- 실 활성화: 별도 chair verbatim signature 후 별도 dev bot dispatch
- 활성화 시점 marker: `memory/events/pretooluse_shadow_mode_activated_<unix_ts>.json`
- 본 task-2665 적용: **0** (★ plan only)

### 5.5 단계 S5 — 24h observation (별도 task)

- 운영 시간: 최소 24h
- 측정 항목:
  - shadow marker 총 발생 건수
  - DR-1 ~ DR-17 별 매치 분포
  - allow contract pattern (AL-1 ~ AL-4) 분포
  - hook latency p50 / p90 / p99 (★ ≤ 500ms 목표)
  - hook crash count (★ 0 목표)
  - normal callback 발사 영향 여부 (★ 0건 목표)
- 본 task-2665 적용: **0** (★ plan only)

### 5.6 단계 S6 — 24h 무사고 검증 + Phase 3 진입 결정 (별도 task)

- 무사고 기준 (FS-6 spec 8B.13 verbatim):
  - shadow marker 박제 정상 진행 (★ marker 누락 0)
  - hook latency p99 ≤ 500ms
  - hook crash 0건
  - normal callback 차단 0건
  - false-positive 후보 식별 (★ 본 plan FP-1 ~ FP-7 분류)
- 무사고 검증 후 **별도 회장 verbatim signature** → Phase 3 진입 또는 shadow-mode 유지 결정
- 본 task-2665 적용: **0** (★ plan only)

## 6. Activation 전 필수 검증 항목

| check_id | 검증 항목 | 본 task-2665 |
| --- | --- | --- |
| AV-1 | task-2664 packet 4종 sha256 fingerprint 박제 | ✅ (★ section 12) |
| AV-2 | 본 task md sha256 일치 | ✅ |
| AV-3 | chair_authorization_id verbatim 일치 | ✅ |
| AV-4 | base origin/main HEAD `2752182a` 일치 | ✅ |
| AV-5 | Track A-1 / B-1 / D-1 file overlap 0 | ✅ (★ section 9) |
| AV-6 | forbidden_paths 정합성 PASS | ✅ |
| AV-7 | 실 hook 배포 0 / settings.json 변경 0 | ✅ |
| AV-8 | commit/push/PR/merge 0 | ✅ |

## 7. Shadow-mode 활성화 시 marker schema (참조 only · 적용 0)

```json
{
  "schema": "anu.v3_6.pretooluse_shadow_marker.v1",
  "marker_type": "pretooluse_shadow_evaluation",
  "recorded_at_kst": "<ISO_8601>",
  "tool": "Bash",
  "requested_command_hash": "sha256:...",
  "background": true,
  "session_owner": "<owner_id>",
  "matched_deny_rule_id": "DR-1",
  "matched_deny_patterns": ["run_in_background", "gh pr view", "statusCheckRollup", "sleep"],
  "shadow_verdict": "ALLOW",
  "would_be_live_verdict": "DENY",
  "allow_contract_present": false,
  "allow_contract_validation": null,
  "hook_latency_ms": 45,
  "event_path": "memory/events/pretooluse_shadow_<unix_ts>.json"
}
```

★ 본 schema는 **참조용**. 실제 hook script 작성은 별도 task.

## 8. Shadow-mode default policy (★ ANCHOR 6 일치)

| anchor | 본 plan 일치 |
| --- | --- |
| Phase 2 shadow-mode packet/spec only · live enforcement 적용 0 · live settings.json 변경 0 | ✅ |
| Track A-1 / B-1 / D-1 파일 충돌 0 · task-2664 packet read-only 참조 | ✅ |
| shadow-mode activation/smoke/rollback/false-positive audit 4종 plan 필수 | ✅ (본 plan + 3 sibling plan) |
| live 적용은 본 packet 박제 후 별도 회장 verbatim signature 강제 · 본 task는 plan only | ✅ |
| Axis 1/2/3 runtime · dispatch.py · live settings.json · hooks/* 변경 0 · commit/push/PR/merge 0 | ✅ |
| Axis 3 RUNNING 자동 선언 0 · HARNESS_ENFORCED 전체 선언 0 · BLOCK 정책 확대 0 | ✅ |

## 9. 병행 충돌 매트릭스 (★ Track A-1 / B-1 / D-1 / task-2664)

| 파일 prefix | Track A-1 (PR #149) | Track B-1 (Axis 3 observer) | Track D-1 (task-2666 backlog) | task-2664 | task-2665 (본) | overlap |
| --- | --- | --- | --- | --- | --- | --- |
| `memory/specs/v3_6_pretooluse_shadow_mode_*.md` | NO | NO | NO | NO | **YES** | 0 |
| `memory/events/task-2665.*` | NO | NO | NO | NO | **YES** | 0 |
| `memory/reports/task-2665.md` | NO | NO | NO | NO | **YES** | 0 |
| `memory/specs/v3_6_pretooluse_live_enforcement_packet_*.md` | NO | NO | NO | YES | **NO (read-only)** | 0 |
| `memory/specs/v3_6_pretooluse_deny_rule_*.md` | NO | NO | NO | YES | **NO (read-only)** | 0 |
| `memory/specs/v3_6_pretooluse_allow_contract_*.md` | NO | NO | NO | YES | **NO (read-only)** | 0 |
| `memory/specs/v3_6_pretooluse_rollback_plan_*.md` (★ task-2664) | NO | NO | NO | YES | **NO (read-only)** | 0 |
| `memory/specs/backlog_*.md` | NO | NO | YES | NO | NO | 0 |
| `memory/events/task-2666*` | NO | NO | YES | NO | NO | 0 |

★ **overlap = 0** (전 Track / task-2664 충돌 0)

## 10. 본 plan 적용 anchor

- ANCHOR-1: Phase 2 shadow-mode packet/spec only · live enforcement 적용 0 · live settings.json 변경 0 ✅
- ANCHOR-2: Track A-1 / B-1 / D-1 파일 충돌 0 · task-2664 packet read-only 참조 ✅
- ANCHOR-3: shadow-mode activation/smoke/rollback/false-positive audit 4종 plan 필수 ✅
- ANCHOR-4: live 적용은 본 packet 박제 후 별도 회장 verbatim signature 강제 · 본 task는 plan only ✅
- ANCHOR-5: Axis 1/2/3 runtime · dispatch.py · live settings.json · hooks/* 변경 0 · commit/push/PR/merge 0 ✅
- ANCHOR-6: Axis 3 RUNNING 자동 선언 0 · HARNESS_ENFORCED 전체 선언 0 · BLOCK 정책 확대 0 ✅

## 11. recommended next action

본 task-2665 종결 후:

1. ★ **회장 verbatim signature 발행** — `CHAIR-AUTH-V3-6-SHADOW-MODE-LIVE-ACTIVATION-<YYYYMMDD>-JJONGS-001` 형식 권장
2. ★ 별도 dev bot dispatch (★ 본 task-2665 dev3 다그다 외 다른 봇 권장)
3. ★ Step S1 (hook script 작성) → S2 (fixture) → S3 (settings.json 추가) → S4 (활성화) → S5 (24h observation) → S6 (Phase 3 진입 결정) 순차 진행
4. ★ 본 plan + sibling 3 plan (smoke / rollback / false-positive audit) 직접 reference

★ **회장 verbatim signature 없이 settings.json 변경 / hook 배포 / shadow-mode 활성화 시도 0** (★ 본 packet anchor)

## 12. task-2664 packet 4종 read-only 참조 sha256 (박제)

| 파일 | sha256 |
| --- | --- |
| `v3_6_pretooluse_live_enforcement_packet_260525.md` | `a3cda54a84ec79191ea0af536383e1fd647d384f3347c29d24626e2cad5f33c5` |
| `v3_6_pretooluse_deny_rule_candidates_260525.md` | `7ce1d11b043d71e71f1dcae48ceb8806af7438d5a7ee420ad43df1d4b4001a66` |
| `v3_6_pretooluse_allow_contract_candidates_260525.md` | `6eee7f640465e282c1ce8fe5b9ed86b4986a47bae421c35ed3f1ae65664d1da7` |
| `v3_6_pretooluse_rollback_plan_260525.md` | `590c916956ce3fda59a9369e22e4ca691ab31419585027bc26e634626cb74c02` |
| `task-2664.v3-6-pretooluse-live-enforcement-packet-260525.json` (final_verdict) | `8ee6122b5d0731b9b7293ea8395d444f353bb7ca93b80af5b3de23d38b42f05f` |

★ 위 5 파일 본 task-2665 작업 중 수정 0 (read-only).

## 13. forbidden actions (본 plan 작성 중 0)

- live settings.json 변경 = 0
- hooks/** 변경 = 0
- dispatch.py 변경 = 0
- Axis 1/2 runtime 변경 = 0
- commit/push/PR/merge = 0
- task-2662 / task-2663 / task-2664 / task-2666 파일 touch = 0
- watcher_contracts 디렉터리 생성 = 0
- HARNESS_ENFORCED 전체 선언 = 0
- BLOCK 정책 확대 = 0
- Axis 3 RUNNING 자동 선언 = 0
- policy 승격 = 0
- 실 shadow-mode 활성화 명령 실행 = 0

**forbidden_action_count = 0**

끝
