# v3.6 PreToolUse Shadow-Mode Rollback 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`
- 단일소스: 본 task md + task-2664 packet rollback (★ Phase 2 live 활성화 대비) read-only 참조
- 범위: **Phase 2 shadow-mode rollback plan only · 실 rollback 실행 0**
- live_settings_json_change: 0
- live_enforcement: 0
- commit_push_pr_merge: 0

## 1. 본 plan 목적

ANU v3.6 PreToolUse shadow-mode가 활성화된 직후 (★ 별도 회장 verbatim signature 후) **shadow-mode 자체에 문제 발생 시 즉시 비활성화** 하기 위한 단계별 rollback 계획을 정리한다.

★ 본 plan은 task-2664 packet `v3_6_pretooluse_rollback_plan_260525.md` (★ Phase 2 live BLOCK 대상)와 **별도**. 본 plan은 **shadow-mode 자체의 안전 비활성화** 에 집중.

★ 본 plan은 **plan only**. 실 rollback 명령 실행은 별도 task에서 진행.

## 2. Shadow-mode 단계별 rollback 가정

| stage | 의미 | rollback 적용 가능 |
| --- | --- | --- |
| Stage-0 | shadow-mode 미활성화 (★ 본 task-2665 시점) | N/A (★ rollback 대상 0) |
| Stage-1 | shadow-mode 활성화 직후 (T+0 ~ T+1h) | YES |
| Stage-2 | shadow-mode 정상 운영 (T+1h ~ T+24h) | YES (★ 본 plan 핵심) |
| Stage-3 | 24h 무사고 통과 후 Phase 3 진입 결정 직전 | YES (shadow-mode 유지/해제 결정) |

★ 본 task-2665 = Stage-0. rollback 실 명령 실행 0.

## 3. Shadow-mode False-positive trigger 정의

shadow-mode 자체는 **실 BLOCK 0** 이지만 다음 trigger 발생 시 비활성화 검토:

| SFP_ID | 정의 | 측정 방법 |
| --- | --- | --- |
| SFP-1 | hook 자체 crash (★ shadow marker 박제 실패) | hook process exit code ≠ 0 또는 timeout ≥ 1건 |
| SFP-2 | hook latency p99 > 500ms (★ Axis 3 spec latency 기준) | latency marker p99 측정 |
| SFP-3 | shadow marker schema malformed (★ JSON parse fail) | marker 파일 파싱 실패 ≥ 1건 |
| SFP-4 | normal callback envelope 차단 (★ shadow-mode 인데 차단 → 설정 오류) | normal callback 발사 명령 실 BLOCK ≥ 1건 |
| SFP-5 | hook이 deny rule pattern 매치 0인데 BLOCK 발생 (★ shadow-mode 위반) | unintended BLOCK marker ≥ 1건 |
| SFP-6 | settings.json 자체 파싱 실패로 ANU 전체 마비 | ANU normal task 실행 0 / 일정 시간 동안 |
| SFP-7 | shadow marker 박제 누락 (★ deny pattern 매치 했는데 marker 없음) | smoke regression 박제 건수 < 기대 |
| SFP-8 | task-2664 rollback plan FP-1 ~ FP-7 의 모든 trigger 가 shadow-mode 환경에서 발생 | task-2664 plan section 2 verbatim re-anchor |

## 4. Shadow-mode rollback trigger 임계값

| trigger | threshold | action |
| --- | --- | --- |
| STR-1 | SFP-1 hook crash ≥ 1건 (★ Stage-1) | **IMMEDIATE DISABLE** → hook entry 제거 후 코드 fix |
| STR-2 | SFP-2 latency p99 > 500ms 연속 3 sample | **GRADED DISABLE** → 패턴 단순화 또는 sample mode 전환 |
| STR-3 | SFP-3 marker malformed ≥ 1건 | **IMMEDIATE DISABLE** → schema fix 후 재진입 |
| STR-4 | SFP-4 normal callback 차단 ≥ 1건 | **IMMEDIATE DISABLE + 회장 verbatim 보고** (★ task-2664 TR-2 동일) |
| STR-5 | SFP-5 unintended BLOCK ≥ 1건 | **IMMEDIATE DISABLE + 회장 verbatim 보고** (★ shadow-mode 위반 = critical) |
| STR-6 | SFP-6 settings.json 파싱 실패 | **IMMEDIATE FULL DISABLE** → settings.json 복구 + 회장 verbatim 보고 |
| STR-7 | SFP-7 marker 누락 ≥ smoke 기대 건수의 5% | **GRADED RE-EVALUATION** → smoke 재실행 후 판단 |

## 5. Rollback 절차 (★ shadow-mode 활성화 후 별도 task 적용 · 본 task-2665 적용 0)

### 5.1 IMMEDIATE DISABLE (STR-1 / STR-3 / STR-4 / STR-5)

```text
[step 1] ~/.claude/settings.json 의 PreToolUse 항목 비활성화
         (★ 본 task-2665에서는 settings.json 수정 0 · 별도 task 책임)
         - 옵션 1: PreToolUse 블록 자체 제거
         - 옵션 2: PreToolUse.shadow_mode = false 또는 disabled = true 플래그 설정
[step 2] hook script 자체는 보존 (★ 코드 재사용 위해)
[step 3] memory/events/pretooluse_shadow_disabled_<unix_ts>.json marker 발행
         - trigger_id (STR-1 ~ STR-7)
         - shadow_failure_event_paths[]
         - disabled_at_kst
         - chair_authorization_id (회장 verbatim 발급 시)
[step 4] 즉시 회장 verbatim 보고 (★ ANU normal callback)
[step 5] dev bot dispatch 정지 여부 판단 (★ STR-4 / STR-5 / STR-6 시 정지)
```

### 5.2 IMMEDIATE FULL DISABLE (STR-6)

```text
[step 1] ~/.claude/settings.json 백업 복구 (★ Phase 2 활성화 전 백업 필수)
[step 2] PreToolUse 항목 완전 제거
[step 3] memory/events/pretooluse_shadow_full_disabled_<unix_ts>.json marker 발행
[step 4] ANU normal task 동작 검증
[step 5] 회장 verbatim 보고
```

### 5.3 GRADED DISABLE (STR-2 / STR-7)

```text
[step 1] 가장 latency 큰 deny rule 또는 marker 누락 deny rule 식별
         (★ semantic 패턴 DR-7/8/9 가능성)
[step 2] 해당 rule 만 sample mode 전환 (★ 매 10번째 호출만 평가)
         또는 hook script 단순화
[step 3] 24h observation → 정상 작동 시 점진 재적용
[step 4] 회장 verbatim 보고
```

## 6. Rollback decision matrix

| 상황 | 권장 조치 |
| --- | --- |
| Stage-0 (본 packet 작성) | rollback 자체 N/A · plan 변경만 |
| Stage-1/2 + SFP-1 (hook crash) | STR-1 IMMEDIATE DISABLE |
| Stage-1/2 + SFP-2 (latency 초과) | STR-2 GRADED DISABLE |
| Stage-1/2 + SFP-3 (marker malformed) | STR-3 IMMEDIATE DISABLE |
| Stage-1/2 + SFP-4 (callback 차단) | STR-4 IMMEDIATE DISABLE + 회장 보고 |
| Stage-1/2 + SFP-5 (unintended BLOCK) | STR-5 IMMEDIATE DISABLE + 회장 보고 |
| Stage-1/2 + SFP-6 (settings.json fail) | STR-6 IMMEDIATE FULL DISABLE + 회장 보고 |
| Stage-1/2 + SFP-7 (marker 누락) | STR-7 GRADED RE-EVALUATION |
| Stage-3 (24h 무사고 통과) | rollback 불필요 · Phase 3 진입 결정 |

## 7. Shadow-mode → Phase 3 → Phase 2 재진입 (회복 절차)

shadow-mode 비활성화 후 재진입 절차:

1. trigger 원인 fix (★ 별도 task)
2. fixture 재작성 (★ regression 보강)
3. smoke 재실행 (★ task-2665 smoke plan 참조)
4. PC-1 ~ PC-10 모두 PASS 확인
5. 회장 verbatim signature 재발행 (★ `CHAIR-AUTH-V3-6-SHADOW-MODE-RESUME-<YYYYMMDD>-JJONGS-001` 형식 권장)
6. shadow-mode 재활성화
7. 24h re-observation 후 Phase 3 진입 검토

★ 모든 단계 본 task-2665 적용 0 (plan only).

## 8. Rollback 시 보존 정책

다음은 rollback 시에도 **보존**:

1. **shadow marker history** — `memory/events/pretooluse_shadow_*.json` 박제 유지
2. **hook script source** — 코드 자체는 보존 (재사용 위해)
3. **fixture / smoke regression** — 향후 재진입 시 재검증 용도
4. **memory/specs/v3_6_pretooluse_shadow_mode_*.md** — spec packet 유지 (★ 본 task-2665 산출물)
5. **task-2664 packet 4종** — 영구 보존 (★ read-only)
6. **chair_authorization_id ledger** — verbatim 발행 이력 유지
7. **rollback marker history** — `memory/events/pretooluse_shadow_disabled_*.json` 영구 박제

다음은 rollback 시 **삭제 또는 비활성화**:

1. **~/.claude/settings.json 의 PreToolUse hook entry** — 즉시 제거 또는 disabled flag 설정
2. **shadow_mode 플래그** — false 또는 항목 제거
3. **HARNESS_ENFORCED 표현** — memory 박제에서 표현 제거 (★ shadow-mode는 HARNESS_ENFORCED 아님)

★ 본 task-2665에서 settings.json 직접 수정 0 · 본 절차는 별도 task에서 적용.

## 9. False-positive escape hatch (chair-approved only)

task-2664 packet section 7 verbatim re-anchor:

```text
- 임시 우회 (shadow-mode 활성화 후):
  - chair_authorization_id 발급 → marker 박제 → 우회 명령 1회 허용
  - 우회 marker: memory/events/pretooluse_shadow_chair_approved_bypass_<unix_ts>.json
- 임의 우회 금지:
  - ANU 본체가 chair_authorization_id 자체 발급은 DR-12 (chair_authorization 자기발급) 위반
  - task-2664 packet deny rule DR-12 verbatim 일치
```

## 10. Stage 별 적용 범위 (★ ANCHOR 준수)

- **Stage-0 (본 task-2665)**: rollback plan 작성만 (★ 본 문서)
- **Stage-1/2 (별도 task)**: 본 plan의 STR-1 ~ STR-7 절차 적용
- **Stage-3 (별도 task)**: shadow-mode → Phase 3 진입 결정 · rollback 불필요 가정

## 11. 본 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 rollback plan 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 ✅

## 12. 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
- 실 rollback 명령 실행 = 0
- HARNESS_ENFORCED 전체 선언 = 0
- BLOCK 정책 확대 = 0
- Axis 3 RUNNING 자동 선언 = 0
- policy 승격 = 0

**forbidden_action_count = 0**

끝
