# v3.6 PreToolUse Rollback Plan (Track C · Phase 0/1)

- task_id: task-2664
- chair_authorization_id: `CHAIR-AUTH-V3-6-PRETOOLUSE-PACKET-20260525-JJONGS-PHASE-0-1-001`
- 단일소스: ANU v3 master spec section 8B.10 ~ 8B.14 (line 1611-1697)
- 범위: **Phase 0/1 only** · rollback plan 작성 · live application 0
- live_enforcement: 0
- commit_push_pr_merge: 0
- base_commit: origin/main `2752182a`

## 1. 적용 가정

본 rollback plan은 다음 두 시점을 대비한다.

1. **Phase 1 shadow-mode 활성화 직후** — deny event marker만 기록, 실 차단 0. False-positive 박제만 발생.
2. **Phase 2 restricted live 활성화 후** — 실제 BLOCK 발생. False-positive 또는 정상 작업 차단 시 즉시 롤백.

(★ 본 task-2664는 Phase 0/1 only. Phase 2 활성화는 별도 chair signature 후 진행)

## 2. False-positive trigger 정의

다음 중 하나라도 발생 시 rollback 검토:

| FP_ID | 정의 | 측정 방법 |
| --- | --- | --- |
| FP-1 | dev bot watcher 정상 polling이 DENY로 분류 | deny event marker에서 owner ∈ dev1~dev7 비율 ≥ 1건 |
| FP-2 | ci_watch_handoff_runner 정상 호출이 DENY | deny event marker owner == `ci_watch_handoff_runner` 비율 ≥ 1건 |
| FP-3 | 1회성 read-only `gh pr view` (non-loop) DENY | background=false AND no sleep AND DENY marker ≥ 1건 |
| FP-4 | normal ANU callback envelope routing 차단 | callback envelope 발사 명령 DENY ≥ 1건 |
| FP-5 | hook crash (hook 자체 실행 실패) | hook process exit code ≠ 0 또는 timeout ≥ 1건 |
| FP-6 | hook latency p99 > 500ms (★ Axis 3 spec latency 기준) | hook 측정 latency 박제 |
| FP-7 | normal tool call 전반 차단 (bypass=0인데 ALLOW count == 0) | hour 단위 ALLOW count vs DENY count |

## 3. Rollback trigger 임계값 (Phase 2 권장)

| trigger | threshold | action |
| --- | --- | --- |
| TR-1 | FP-1 ~ FP-3 누적 ≥ 1건 (★ Phase 2 shadow → live 전환 직후 24h 내) | **IMMEDIATE ROLLBACK** → live deny 해제 후 shadow-mode 복귀 |
| TR-2 | FP-4 ≥ 1건 (★ callback chain 차단은 직접 영향) | **IMMEDIATE ROLLBACK + 회장 verbatim 보고** |
| TR-3 | FP-5 hook crash ≥ 1건 | **IMMEDIATE ROLLBACK** → hook 비활성화 + 코드 fix 후 재진입 |
| TR-4 | FP-6 latency p99 > 500ms 연속 3 sample | **GRADED ROLLBACK** → match pattern 단순화 또는 sample mode 전환 |
| TR-5 | FP-7 ALLOW count = 0 for ≥ 1h (★ 정상 tool call 전면 차단) | **IMMEDIATE ROLLBACK** + 회장 verbatim 보고 |

## 4. Rollback 절차 (Phase 2 활성화 후 사용 · 본 task-2664 적용 0)

### 4.1 IMMEDIATE ROLLBACK (TR-1/TR-2/TR-3/TR-5)

```text
[step 1] ~/.claude/settings.json 의 PreToolUse hook 항목을 비활성화
         (★ 본 task-2664에서는 settings.json 수정 0 · Phase 2 별도 task 책임)
[step 2] hook script 자체는 보존 (★ deny rule 패턴/allow contract 검증 코드 재사용)
[step 3] memory/events/pretooluse_rollback_<unix_ts>.json marker 발행
         - false_positive_event_paths[]
         - trigger_id
         - rolled_back_at_kst
         - chair_authorization_id (회장 verbatim 발급 시)
[step 4] 즉시 회장 verbatim 보고 (★ ANU normal callback)
[step 5] dev bot dispatch 정지 (★ Track A/B/C 무관 · runner 안정 시 재개)
```

### 4.2 GRADED ROLLBACK (TR-4)

```text
[step 1] 가장 latency 큰 deny rule 식별 (★ semantic 패턴 DR-7/8/9 가능성)
[step 2] 해당 rule만 shadow-mode 로 전환 (★ deny → marker만 기록)
[step 3] 24h observation → false-positive 0 확인 시 점진 재적용
[step 4] 회장 verbatim 보고
```

## 5. Rollback decision matrix

| 상황 | 권장 조치 |
| --- | --- |
| Phase 0 (본 packet 작성) | rollback 자체 N/A · spec 변경만 |
| Phase 1 shadow-mode | deny event marker 검토 후 spec 보정 · settings.json 변경 0 |
| Phase 2 restricted live + FP-1 ~ FP-3 | TR-1 즉시 적용 |
| Phase 2 restricted live + FP-4 (callback 차단) | TR-2 즉시 적용 + 회장 보고 |
| Phase 2 restricted live + FP-5 (hook crash) | TR-3 즉시 적용 |
| Phase 2 restricted live + FP-6 (latency 초과) | TR-4 graded rollback |
| Phase 2 restricted live + FP-7 (전면 차단) | TR-5 즉시 적용 + 회장 보고 |

## 6. Rollback 시 보존 정책

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

1. **deny event marker history** — `memory/events/tool-call-denied-*.json` 박제 유지
2. **hook script source** — 코드 자체는 보존 · 비활성화만
3. **fixture / regression** — 향후 재진입 시 재검증 용도
4. **memory/specs/v3_6_pretooluse_*.md** — spec packet 유지
5. **chair_authorization_id ledger** — verbatim 발행 이력 유지

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

1. **~/.claude/settings.json 의 hook entry** — 즉시 제거 또는 disabled flag 설정
2. **live BLOCK 권한** — settings.local.json 의 deny 정책 제거
3. **HARNESS_ENFORCED 표현** — memory 박제에서 표현 제거

(★ 본 task-2664에서 settings.json 직접 수정 0 · 본 절차는 Phase 2 별도 task에서 적용)

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

spec 8B.13 line 1683: `false-positive escape hatch는 chair-approved only`.

```text
- 임시 우회 (Phase 2 live 활성화 후):
  - chair_authorization_id 발급 → marker 박제 → 우회 명령 1회 허용
  - 우회 marker: memory/events/pretooluse_chair_approved_bypass_<unix_ts>.json
- 임의 우회 금지:
  - ANU 본체가 chair_authorization_id 자체 발급은 DR-12 (chair_authorization 자기발급) 위반
```

## 8. Phase 0/1 본 task 적용 범위

- **Phase 0**: rollback plan 작성만 (★ 본 문서)
- **Phase 1**: shadow-mode 적용 시 본 plan 의 FP-1 ~ FP-7 분류 기준 사용
- **Phase 2+**: 본 plan의 4.1 / 4.2 절차 적용 (★ 별도 chair signature 후)

## 9. forbidden actions (본 packet 작성 중 0)

- live settings.json 변경 = 0
- hooks/** 변경 = 0
- dispatch.py 변경 = 0
- Axis 1/2 runtime 변경 = 0
- commit/push/PR/merge = 0
- task-2662 / task-2663 파일 touch = 0
- 실제 rollback 명령 실행 = 0 (★ Phase 0/1 본 task 무관)
- HARNESS_ENFORCED 전체 선언 = 0

forbidden_action_count = **0**

끝
