# task-2651 — AXIS_2_DEPENDENCY_HARDENING_CANONICAL_PROMOTION

- Level: Lv.4 (Axis 2 hooks의 PYTHONPATH 의존 제거 · utils 4종 v2 canonical 승격)
- 담당: 회장 결정 dev3 다그다 우선 / dev6 페룬 대안 / dev5 마르둑 예비 (★ dev4 비슈누 제외)
- base: origin/main 최신 + task-2649 hooks live 등록 보존 + task-2650 inbound verified 보존
- 단일소스 spec: 본 task md
- chair_authorization_id: **`CHAIR-AUTH-AXIS-2-HARDEN-20260524-JJONGS-CANONICAL-001`** (★ 회장 verbatim · marker `memory/events/chair-authorization-axis-2-harden-canonical-260524.json`)
- 전략: **S1 CANONICAL_PROMOTION** (회장 verbatim 채택)

## 목표 (회장 verbatim)
Axis 2 live hooks가 task-2644+1-dev4 worktree PYTHONPATH에 의존하지 않도록 utils 4종과 hook import 구조를 canonical live path 기준으로 안정화.

## 허용 7 (회장 verbatim)
1. utils 4종 v2를 canonical live path로 byte-identical promotion
2. sha256 byte-identical 검증
3. live hooks 3개 import 경로를 canonical path 기준으로 정리
4. settings.json에서 task-2644+1-dev4 PYTHONPATH 의존 제거 최소 변경
5. Axis 2 inbound smoke 재실행
6. task-2644+1-dev4 worktree 비활성 상태 smoke
7. 승인된 경우에만 worktree removal simulation 또는 precheck

## worktree 제거 constraint (회장 verbatim)
- task-2644+1-dev4 worktree 실제 제거는 **마지막 단계에서만**
- 제거 전 worktree-independent smoke PASS 선행 필수
- 본 task 범위 = precheck까지 + smoke 6/6 PASS 후에만 실제 제거

## 필수 smoke SH1-SH6 (회장 verbatim 6/6 PASS)
1. **SH1** canonical import PASS (`from utils.callback_collector_helper_integration import ...` etc · 4종 v2 모두)
2. **SH2** hook PYTHONPATH-free PASS (hook 3개가 task-2644+1-dev4 PYTHONPATH 없이 utils 4종 v2 호출)
3. **SH3** Axis 1 unchanged PASS (utils/callback_registration.py 등 변경 0 · regression 124/124 유지)
4. **SH4** worktree 비활성 inbound PASS (task-2644+1-dev4 PYTHONPATH 임시 제거 상태에서 UserPromptSubmit hook .callback 인식)
5. **SH5** RECEIVED_INBOUND_THIS_SESSION 5/5 재현 PASS (task-2650 패턴 fresh worktree로 재현)
6. **SH6** worktree remove 후 재실행 PASS (★ git worktree remove task-2644+1-dev4 후 SH4·SH5 재실행 모두 PASS)

## 성공 조건 7 (회장 verbatim 모두 PASS 시 LIVE_VERIFIED)
- SH1-SH6 6/6 PASS
- dependency_hardening_required=false 전환 근거 확보
- UserPromptSubmit inbound smoke PASS
- ledger pointer match PASS
- CALLBACK_COLLECTOR_PROCESSED row PASS
- settings.json 변경 PYTHONPATH 정리 범위 한정
- Axis 1/3 영향 0

## 금지 12 (회장 verbatim)
1. Axis 1 helper 변경 (utils/callback_registration.py / callback_authority_validator.py / callback_source_cross_checker.py)
2. Axis 3 touch
3. dispatch.py 변경
4. real auto-merge
5. PR #141 pilot
6. BOT App token 사용
7. live cokacdir 임의 변경
8. commit/push/PR/merge (단 utils 4종 v2 canonical 추가 + settings.json PYTHONPATH 정리 local commit은 본 chair_authorization_id 범위 허용)
9. HARNESS_ENFORCED 전체 선언
10. callback system verified 전체 선언
11. AXIS_2_FULLY_HARDENED 임의 선언
12. smoke 실패 상태에서 task-2644+1-dev4 worktree 제거

## expected_files (~10 file)
- utils/callback_collector_helper_integration.py (canonical 승격)
- utils/callback_adjudicator_v2.py (canonical 승격)
- utils/callback_next_action_runner_v2.py (canonical 승격)
- utils/source_attribution_guard_v2.py (canonical 승격)
- /home/jay/.claude/settings.json (PYTHONPATH 의존 제거 최소 patch)
- /home/jay/.claude/hooks/session_start_anu_callback_collector_v2.py (PYTHONPATH-free import 정리 시 필요한 경우만)
- /home/jay/.claude/hooks/stop_anu_callback_collector_verifier_v2.py (동일)
- /home/jay/.claude/hooks/user_prompt_submit_hook_callback_inbox_v2.py (동일)
- tests/integration/test_axis_2_dependency_hardening.py (SH1-SH6 자동화)
- memory/events/task-2651.done
- memory/events/task-2651.axis-2-hardening-result-260524.json (8 mandatory fields)
- memory/reports/task-2651.md

## finalize 프로토콜
1. base = origin/main + task-2649/2650 staged 보존 · 별도 worktree task-2651-dev3
2. utils 4종 v2 byte-identical copy: task-2644+1-dev4 → canonical /home/jay/workspace/utils/ (sha256 4쌍 1:1 검증)
3. local commit (utils 4종 v2 canonical 추가 · main branch · push 0)
4. SH1 canonical import smoke
5. settings.json 최소 patch (PYTHONPATH 항목에서 task-2644+1-dev4 제거)
6. hook 파일 PYTHONPATH-free import 정리 (필요시 importlib spec_from_file_location → 표준 import 변환)
7. SH2 hook PYTHONPATH-free smoke
8. SH3 Axis 1 unchanged regression (124/124)
9. SH4 worktree 비활성 inbound smoke (PYTHONPATH 임시 제거)
10. SH5 RECEIVED_INBOUND_THIS_SESSION 5/5 재현 (task-2650 패턴 / Axis 1 helper 사전 등록 → ledger row → inbox → 5 조건)
11. SH6 git worktree remove task-2644+1-dev4 → SH4·SH5 재실행 PASS
12. 6/6 PASS 시 dependency_hardening_required=false 토글 + AXIS_2_DEPENDENCY_HARDENED_CANONICAL_LIVE_PATH_VERIFIED 박제
13. result marker 박제 (8 mandatory fields)
14. ANU normal callback cron (helper 사용 · ANU key · 4 source · 8 실제값)

## 회장 보고 형식 (3 종결 中 1)
- 성공: **`AXIS_2_DEPENDENCY_HARDENED_CANONICAL_LIVE_PATH_VERIFIED`**
- 5/5 미달: **`AXIS_2_DEPENDENCY_HARDENING_HOLD_FOR_CHAIR`**
- hook crash: **`AXIS_2_ROLLBACK_REQUIRED`**

## 보고 필수 8 fields (회장 verbatim)
- changed_files
- utils 4종 canonical sha256
- settings.json diff 요약
- PYTHONPATH 제거 여부
- SH1-SH6 결과
- worktree 제거/비활성 검증 결과
- dependency_hardening_required 최종값
- forbidden_action_count

## frozen anchor
- ANCHOR-1: "chair_authorization_id = CHAIR-AUTH-AXIS-2-HARDEN-20260524-JJONGS-CANONICAL-001 verbatim 그대로"
- ANCHOR-2: "S1 CANONICAL_PROMOTION 전략 채택 · utils 4종 byte-identical 승격"
- ANCHOR-3: "task-2644+1-dev4 worktree 실제 제거는 SH4·SH5 PASS 후에만"
- ANCHOR-4: "SH1-SH6 6/6 PASS 시에만 LIVE_VERIFIED 승격"
- ANCHOR-5: "Axis 1 helper 변경 0 · Axis 3 touch 0 · dispatch.py 변경 0"
- ANCHOR-6: "settings.json 변경 PYTHONPATH 정리 범위 한정"
- ANCHOR-7: "AXIS_2_FULLY_HARDENED 임의 선언 금지 (회장 verbatim signature 별도 필요)"

## allowed_resources (본 task의 capability)

```yaml
allowed_resources:
  paths:
    - "utils/callback_collector_helper_integration.py"
    - "utils/callback_adjudicator_v2.py"
    - "utils/callback_next_action_runner_v2.py"
    - "utils/source_attribution_guard_v2.py"
    - "/home/jay/.claude/settings.json"
    - "/home/jay/.claude/hooks/session_start_anu_callback_collector_v2.py"
    - "/home/jay/.claude/hooks/stop_anu_callback_collector_verifier_v2.py"
    - "/home/jay/.claude/hooks/user_prompt_submit_hook_callback_inbox_v2.py"
    - "tests/integration/test_axis_2_dependency_hardening.py"
    - "memory/system/.callback_ledger.jsonl"
    - "memory/system/.callback_dedupe_table.jsonl"
    - "memory/.callback_inbox/**"
    - "memory/tasks/task-2651.md"
    - "memory/reports/task-2651.md"
    - "memory/events/task-2651.done"
    - "memory/events/task-2651.axis-2-hardening-result-260524.json"
    - "INDEX.md"
  forbidden_paths:
    - "/home/jay/.claude/settings.local.json"
    - "/usr/local/bin/cokacdir"
    - ".github/**"
    - "utils/callback_registration.py"
    - "utils/callback_authority_validator.py"
    - "utils/callback_source_cross_checker.py"
    - "schemas/**"
    - "dispatch.py"
    - "scripts/finish-task.sh"
    - "utils/replacement_pr_runner.py"
    - "memory/tasks/task-2644*"
    - "memory/tasks/task-2645*"
    - "memory/tasks/task-2646*"
    - "memory/tasks/task-2647*"
    - "memory/tasks/task-2648*"
    - "memory/tasks/task-2649*"
    - "memory/tasks/task-2650*"
    - "memory/tasks/task-2643*"
    - "memory/tasks/task-2641*"
    - "memory/tasks/task-2642*"
    - "**/.env*"
    - "**/credentials*"
  commands:
    - "pytest"
    - "python3 -m py_compile"
    - "python3 -m json.tool"
    - "git status"
    - "git diff"
    - "git add"
    - "git commit"
    - "git log"
    - "git checkout"
    - "git branch"
    - "git worktree"
    - "git revert"
    - "sha256sum"
    - "wc"
    - "printf"
    - "ls"
    - "grep"
    - "find"
    - "cokacdir --cron"
    - "cokacdir --cron-history"
    - "cokacdir --cron-list"
    - "cp"
    - "diff"
  merge_policy: "local_main_axis_2_harden_only"
  ttl_hours: 96
```

끝
