# task-2649 — AXIS_2_CALLBACK_COLLECTOR_CONTROL_PLANE_LIVE_ACTIVATION 보고

- 작업자: dev4 비슈누 (dispatch executor · chair-facing 아님)
- chair_authorization_id: `CHAIR-AUTH-AXIS-2-20260524-JJONGS-INBOUND-001` (회장 verbatim · ANU random 0 · placeholder 재사용 0)
- base: origin/main `0e172435` clean
- worktree: `/home/jay/workspace/.worktrees/task-2649-dev4` (branch `task/task-2649-dev4`)
- 최종 상태: **AXIS_2_INBOUND_COLLECTOR_LIVE_VERIFIED_PARTIAL — HOLD_FOR_CHAIR (5 조건 중 4 회장 본 세션 검증 필요)**

## 1. 회장 verbatim 보고 (시작)

**AXIS_2_LIVE_ACTIVATION_ATTEMPTED** — Axis 2 hooks 3종 live settings.json 등록 + memory inbox/dedupe/audit log 초기화 + 7 검증 자동화 PASS + smoke .callback 1회 발사 PASS. 본 dispatch executor 세션은 회장-facing 아니므로 RECEIVED_INBOUND_THIS_SESSION 5 조건 중 1번 (UserPromptSubmit hook .callback 인식) 만 자동 PASS. **회장 본 세션 새로 spawn 후 직접 inbound 인식 검증 필요** → 그때 5/5 PASS 시 LIVE_VERIFIED 승격.

## 2. 변경 박제

### 2.1 live settings.json (최소 변경 · 22 line add)
- 기존 64 hooks 항목 0 변경 · env / mcpServers / enabledPlugins / theme 미변경
- UserPromptSubmit array 의 hooks 배열에 axis 2 hook 1개 append
- Stop array 의 hooks 배열에 axis 2 hook 1개 append
- SessionStart array 신설 (matcher="" · axis 2 hook 1개)
- JSON syntax PASS (python3 -m json.tool 검증)
- L1 rollback baseline: `/home/jay/.claude/settings.json.bak.task-2649-pre-axis-2-260524` (3803 bytes)

### 2.2 hooks 3 live 등록 (staged copy · sha256 박제)
| hook | sha256 | live path |
|---|---|---|
| SessionStart | `338f95fd…6297fbb` | `/home/jay/.claude/hooks/session_start_anu_callback_collector_v2.py` |
| Stop | `872683e7…e686fc` | `/home/jay/.claude/hooks/stop_anu_callback_collector_verifier_v2.py` |
| UserPromptSubmit | `706a02f4…a23aa6` | `/home/jay/.claude/hooks/user_prompt_submit_hook_callback_inbox_v2.py` |

각 hook command 형식 (env inline 박제):
```
PYTHONPATH=/home/jay/workspace/.worktrees/task-2644+1-dev4 \
ANU_WORKSPACE_ROOT=/home/jay/workspace \
ANU_CALLBACK_INBOX_DIR=/home/jay/workspace/memory/.callback_inbox \
python3 /home/jay/.claude/hooks/<hook>.py
```

### 2.3 memory 초기화
- `memory/.callback_inbox/` (신규 · `.gitkeep`)
- `memory/system/.callback_dedupe_table.jsonl` (initial empty)
- `memory/system/.stop_hook_block_audit.jsonl` (initial empty)
- `memory/system/.callback_ledger.jsonl` (Axis 1 산출물 · 변경 0)

### 2.4 smoke test .callback
- 경로: `/home/jay/workspace/memory/.callback_inbox/cb-axis2-smoke-task-2649-260524-001__sched-axis2-smoke-task-2649-260524-001__260524T1305.callback`
- callback_id: `cb-axis2-smoke-task-2649-260524-001`
- schedule_id: `sched-axis2-smoke-task-2649-260524-001`
- 회장 본 세션 spawn 시 UserPromptSubmit hook 의 additionalContext 에서 즉시 인식 가능
- ttl_at: `2026-05-27T13:05:00+09:00`

### 2.5 자동화 테스트
- `tests/integration/test_axis_2_live_inbound.py`
- 10 test PASS / 0 FAIL / 0.239s
- 검증 범위: hooks 3 live 등록 / settings.json 등록 / inbox 감지 / ledger 1:1 / self-attested 차단 / dedupe / stop block / rollback baseline 박제

### 2.6 result marker
- `memory/events/task-2649.axis-2-live-activation-result-260524.json` (9 필수 필드 · 회장 verbatim format)

## 3. 7 필수 검증 결과

| # | 검증 | 결과 |
|---|---|---|
| 1 | UserPromptSubmit hook 이 callback inbox 감지 | **PASS** (live smoke 결과 pending_count=1, additionalContext 정상 주입) |
| 2 | RECEIVED_INBOUND_THIS_SESSION 5 조건 5/5 검증 | **1/5 PASS · 4/5 HOLD** (본 세션 chair-facing 아님 · 회장 본 세션 검증 필요) |
| 3 | callback_id + schedule_id ↔ ledger row 1:1 매칭 | **PASS** (test_03 + smoke ledger_pointer 박제) |
| 4 | self-attested result 만으로 수신 처리 금지 | **PASS** (Stop hook block 조건 #7 활성 · test_04 PASS) |
| 5 | duplicate callback dedupe 처리 | **PASS** (dedupe table 초기화 · primary key=callback_id · test_05 PASS) |
| 6 | Stop hook 미처리 callback 시 종료 차단 | **PASS** (Stop hook 10 조건 + v2 3 조건 활성 · test_06 PASS) |
| 7 | hook crash L1/L2 rollback 박제 | **PASS** (baseline backup 존재 · 5분/30sec doctrine packet field_08 박제 · test_07 PASS) |

## 4. RECEIVED_INBOUND_THIS_SESSION 5 조건 세부

| # | 조건 | 자동 검증 | 회장 본 세션 책임 |
|---|---|---|---|
| 1 | UserPromptSubmit hook 이 .callback 파일 인식 | **PASS** | — |
| 2 | ledger_pointer 가 Axis 1 ledger row 와 1:1 매칭 | 박제만 | **검증 필요** |
| 3 | source_attribution == CALLBACK_COLLECTOR_PROCESSED | 박제만 | **명시 필요** |
| 4 | callback 정보 응답 활용 | — | **필수** |
| 5 | next_action 본 세션 실행 또는 결정 | — | **필수** |

## 5. 의존성 fragility 박제 (회장 보고 필수)

- `utils/callback_collector_helper_integration.py` / `source_attribution_guard_v2.py` / `callback_next_action_runner_v2.py` / `callback_adjudicator_v2.py` 4종은 **origin/main 에 미머지** (task-2644+1 산출물 · `LIVE_NOT_APPLIED` status).
- live hooks 3 의 import 가능성은 `PYTHONPATH=/home/jay/workspace/.worktrees/task-2644+1-dev4` 박제로 보장.
- worktree 가 정리되면 hooks crash → L1 rollback 자동 발동.
- 향후 task-2644+1 산출물 정식 머지 시 PYTHONPATH 박제 제거 가능.

## 6. forbidden 12 audit — 위반 0

| # | 금지 | 결과 |
|---|---|---|
| 1 | Axis 3 touch | 0 |
| 2 | Axis 1 helper 변경 | 0 |
| 3 | dispatch.py 변경 | 0 |
| 4 | real auto-merge | 0 |
| 5 | PR #141 pilot | 0 |
| 6 | BOT App token 사용 | 0 |
| 7 | commit / push / PR / merge | 0 |
| 8 | chair_authorization_id 변형 | 0 (verbatim 100% 일치) |
| 9 | HARNESS_ENFORCED 전체 선언 | 0 |
| 10 | callback system verified 전체 선언 | 0 |
| 11 | settings.json 승인 hooks 3개 외 변경 | 0 (env / mcpServers 미변경) |
| 12 | live cokacdir 임의 변경 | 0 |

## 7. 회장 회신 요청 사항 (HOLD_FOR_CHAIR)

1. 회장 본 세션 새로 spawn (즉시 가능 · 본 result marker 박제 후)
2. 새 세션 첫 prompt 제출 시 UserPromptSubmit hook 의 additionalContext 에 `cb-axis2-smoke-task-2649-260524-001` 인식 여부 직접 확인
3. ledger row 작성 + source_attribution=`CALLBACK_COLLECTOR_PROCESSED` 명시
4. callback 정보 본 세션 응답에 직접 활용
5. next_action 본 세션 내 실행 또는 결정
6. 5/5 PASS 시 본 marker 의 report_state 를 **AXIS_2_INBOUND_COLLECTOR_LIVE_VERIFIED** 로 승격
7. 5/5 미달 시 L1 rollback (즉시) — `cp /home/jay/.claude/settings.json.bak.task-2649-pre-axis-2-260524 /home/jay/.claude/settings.json`

## 8. 회장 verbatim 보고 (종결 후보)

**AXIS_2_INBOUND_COLLECTOR_LIVE_VERIFIED_PARTIAL_HOLD_FOR_CHAIR_VALIDATION** — Axis 2 hooks 3 live activation 완료 (settings.json patch + hooks copy + memory init + 10 자동 test PASS + smoke .callback 1회 발사 PASS). 회장 본 세션 새로 spawn 후 5 조건 2~5 직접 검증 시 LIVE_VERIFIED 승격, 미달 시 L1 rollback 즉시 가능. Forbidden 12 위반 0, chair_authorization_id verbatim 일치.

끝
