# HARNESS_LIVE_ACTIVATION_SMOKE_PLAN (task-2647)

- version: v1
- recorded_at: 2026-05-24
- live_change_count: 0
- chair_signature_required: true (smoke pass criteria 정의는 본 packet, 실 smoke는 활성화 후)

## 1. Smoke 정의

- 본 packet은 smoke의 "정의/판정 기준"만 담는다. 실 실행은 axis live activation dispatch에서 수행한다.
- 모든 smoke는 dry-run 가능해야 하며 live infra 변경 0 가능 (selftest 우선).
- pass criteria는 단일 명령으로 자동 판정 가능해야 한다.

## 2. Per-axis Smoke

### 2.1 축 1 (task-2646 helper)

#### 2.1.1 Pre-merge smoke (PR open 단계)
- 명령:
  ```bash
  cd /home/jay/workspace/.worktrees/task-2646-dev3
  pytest tests/regression/callback_authority_gate/ tests/test_callback_registration_helper_selftest.py -v
  python3 -m utils.callback_registration selftest
  ```
- pass criteria: 124 regression PASS · 6/6 selftest PASS · "ok": true 응답
- 추가 검증: `python3 -c "from dispatch import register_callback_via_helper, verify_actual_owner_via_helper, CALLBACK_REGISTRATION_HELPER_SCHEMA; print('OK')"` → shim re-export 확인

#### 2.1.2 Post-merge smoke (main 머지 후)
- 명령 (main 워크트리):
  ```bash
  cd /home/jay/workspace
  git pull origin main
  python3 -m utils.callback_registration selftest
  pytest tests/regression/callback_authority_gate/ -v
  ```
- pass criteria: 동일 6/6 PASS · 124 PASS
- 회장 보고: closeout marker `memory/events/task-2646.live-activation-{ts}.json` 생성

### 2.2 축 2 (task-2644+1 control plane v2)

#### 2.2.1 Pre-merge smoke (PR open 단계)
- 명령:
  ```bash
  cd /home/jay/workspace/.worktrees/task-2644+1-dev4
  pytest tests/regression/callback_control_plane_v2/ -v
  python3 -m utils.callback_collector_helper_integration --selftest
  ```
- pass criteria: 66 test PASS (8 fixture 기반 101 case 포함) · selftest "ok": true

#### 2.2.2 Hook entry dry-run smoke (settings.json 추가 전 별도 검증)
- 명령:
  ```bash
  # stdin echo로 hook script 직접 호출 (settings.json 미수정)
  echo '{"hook_event_name":"SessionStart","session_id":"smoke-test"}' | python3 /home/jay/workspace/hooks/session_start_anu_callback_collector_v2.py
  echo '{"hook_event_name":"Stop","session_id":"smoke-test"}' | python3 /home/jay/workspace/hooks/stop_anu_callback_collector_verifier_v2.py
  echo '{"hook_event_name":"UserPromptSubmit","session_id":"smoke-test","prompt":"test"}' | python3 /home/jay/workspace/hooks/user_prompt_submit_hook_callback_inbox_v2.py
  ```
- pass criteria: 모두 exit 0 + JSON 응답 + 각 < 5초 (3개 hook 모두)

#### 2.2.3 Post-activation smoke (settings.json 머지 후)
- 명령:
  ```bash
  # claude-code 새 세션 시작 후 hook 발화 여부 검증
  ls /home/jay/workspace/memory/system/callback_ledger_v2.jsonl  # 1+ entry 증가 확인
  python3 -m utils.callback_collector_helper_integration --selftest
  pytest tests/regression/callback_control_plane_v2/ -v
  ```
- pass criteria: 66 PASS · ledger entry +1 이상 · selftest PASS

### 2.3 축 3 (task-2643 PreToolUse runtime guard)

#### 2.3.1 Pre-merge smoke (PR #146)
- 명령:
  ```bash
  cd /home/jay/workspace/.worktrees/task-2643-dev6
  pytest tests/regression/test_anu_direct_polling_violation_guard.py tests/regression/test_forbidden_bash_pattern_static_guard.py tests/regression/test_pr_open_watcher_wrapper_dry_run.py tests/regression/test_closeout_grade_auto_classifier.py tests/regression/test_watcher_contract_validation.py -v
  ```
- pass criteria: 5 file 전체 PASS (forbidden pattern fixture 3개 + watcher contract fixture 9개 포함)

#### 2.3.2 Hook dry-run smoke (settings.json 추가 전)
- 명령:
  ```bash
  # 정상 Bash → allow
  echo '{"tool_name":"Bash","tool_input":{"command":"ls -la"}}' | python3 /home/jay/workspace/hooks/pre_tool_use_anu_guard.py --mode=stdin
  # → {"decision":"allow"}

  # forbidden pattern → deny
  echo '{"tool_name":"Bash","tool_input":{"command":"until gh pr view 146; do sleep 30; done"}}' | python3 /home/jay/workspace/hooks/pre_tool_use_anu_guard.py --mode=stdin
  # → {"decision":"deny", "reason":"ANU_DIRECT_CI_POLLING_FORBIDDEN", "match_group":"GROUP_2_LOOP_SLEEP_GH_POLL"}

  # 비-Bash tool → 자동 allow
  echo '{"tool_name":"Read","tool_input":{"file_path":"/tmp/x"}}' | python3 /home/jay/workspace/hooks/pre_tool_use_anu_guard.py --mode=stdin
  # → {"decision":"allow"}

  # 입력 손상 → fail-closed deny
  echo 'not_json' | python3 /home/jay/workspace/hooks/pre_tool_use_anu_guard.py --mode=stdin
  # → {"decision":"deny", "reason":"HOOK_FAIL_CLOSED"}
  ```
- pass criteria: 4 케이스 모두 정확한 decision + 각 < 5초

#### 2.3.3 Post-activation soak (settings.json 머지 + ENV gate ON 후 30분)
- 명령:
  ```bash
  # 30분 자유 Bash 사용 후 false positive 0 확인
  grep -c "HOOK_FAIL_CLOSED" /home/jay/.claude/logs/*  # 0 이어야 함
  grep -c "ANU_DIRECT_CI_POLLING_FORBIDDEN" /home/jay/.claude/logs/*  # 정상 deny만 발생
  ```
- pass criteria: HOOK_FAIL_CLOSED 0건 · 정상 deny는 forbidden pattern에만 한정 · 정상 Bash false positive 0

## 3. Integrated End-to-End Smoke (3축 모두 live merge 후)

### 3.1 시나리오 — 정상 callback lifecycle
- 사전조건: 축 1 + 축 2 모두 live merge + settings.json 3 hook entry 활성화 + 축 3 ENV gate ON
- 동작:
  1. claude-code 새 세션 시작 (SessionStart hook 발화 — 축 2)
  2. 첫 Bash tool 호출 `ls -la` (PreToolUse 통과 — 축 3 allow)
  3. dispatch.py에서 callback 등록 (helper 경유 — 축 1)
  4. 세션 종료 (Stop hook 발화 + verifier 통과 — 축 2)
- 검증:
  - `tail -n 5 /home/jay/workspace/memory/system/callback_ledger_v2.jsonl` → 새 entry
  - `python3 -m utils.callback_registration selftest` → 6/6 PASS
  - `python3 -m utils.callback_collector_helper_integration --selftest` → PASS
- pass criteria: 위 4 단계 모두 차단 없이 진행 + ledger entry 정확

### 3.2 시나리오 — forbidden polling 차단 (축 3 효과 검증)
- 동작: `until gh pr view 146; do sleep 30; done` Bash 시도
- 검증: PreToolUse hook이 deny 반환 + alternative `delegated_watcher_contract` 제시
- pass criteria: 차단 성공 + 봇 자체는 계속 동작

### 3.3 시나리오 — self-key callback 차단 (축 1 효과 검증)
- 동작: executor=owner 동일 키로 callback 등록 시도
- 검증: 
  - `register_callback(..., owner_key=executor_key, ...)` → REGISTRATION_HELPER_BYPASSED 또는 NON_AUTHORITATIVE_SELF_COLLECTOR
- pass criteria: argv=None 반환 (fail-closed) + 등록 차단

### 3.4 시나리오 — 4-source cross-check (축 1 효과 검증)
- 동작: cron-list=0 + schedule_history 부재 환경에서 status 조회
- 검증: `cross_check_sources(...)` → CALLBACK_MISSING 반환
- pass criteria: ANCHOR-3/4 충족

## 4. Smoke Pass 종합 판정

3축 모두 live merge + 위 §3.1~3.4 시나리오 모두 통과 → "INTEGRATED_LIVE_PASS"

| 단계 | 판정 |
|---|---|
| 축 1 pre-merge | 124 PASS + 6/6 selftest |
| 축 2 pre-merge | 66 PASS + integration.selftest PASS |
| 축 3 pre-merge | 5 file regression PASS + dry-run 4 case |
| 축 1 post-merge | 6/6 selftest in main |
| 축 2 post-activation | 66 PASS + ledger +1 |
| 축 3 post-soak (30min) | false positive 0 |
| Integrated §3.1 | callback lifecycle 4 단계 |
| Integrated §3.2 | forbidden polling 차단 |
| Integrated §3.3 | self-key 차단 |
| Integrated §3.4 | 4-source cross-check |

**최종 판정 조건**: 위 10개 항목 모두 PASS → INTEGRATED_LIVE_PASS

## 5. 본 task에서 한 일 / 안 한 일

- ✅ 정의/명령/판정 기준 작성
- ❌ 실제 실행 → 0 (활성화 0이므로 smoke 0)
- ❌ ledger 변경 → 0
- ❌ settings.json 수정 → 0

끝
