{
  "packet_version": "v1",
  "packet_type": "dependency_hardening_packet_axis_2",
  "recorded_at": "2026-05-24T16:40:00+09:00",
  "recorded_by": "ANU_chair_facing_session",
  "source_attribution": "CALLBACK_LEDGER_RECONCILED",

  "scope_note": "본 packet은 실행/적용 승인 아님. Axis 2 dependency hardening 준비 단계 (회장 verbatim 2026-05-24). Axis 3 packet 준비 전 우선순위.",

  "axis_id": 2,
  "axis_name": "callback_collector_control_plane",
  "axis_2_live_status_input": "AXIS_2_INBOUND_COLLECTOR_LIVE_VERIFIED_WITH_DEPENDENCY_WARN",
  "axis_2_live_status_marker_ref": "memory/events/task-2650.axis-2-live-verified-with-dependency-warn-260524.json",
  "fragile_live_wiring_marker_ref": "memory/events/task-2649.axis-2-dependency-hardening-required-260524.json",

  "hardening_target_purpose_chair_verbatim": "utils 4종과 hook import 구조를 canonical live path 기준으로 안정화하고, task-2644+1-dev4 worktree 제거 후에도 UserPromptSubmit inbound smoke가 PASS하는지 검증",

  "field_01_current_fragile_state": {
    "live_hooks_path": "/home/jay/.claude/hooks/ (session_start_anu_callback_collector_v2.py + stop_anu_callback_collector_verifier_v2.py + user_prompt_submit_hook_callback_inbox_v2.py)",
    "live_hooks_import_dependency": "PYTHONPATH=/home/jay/workspace/.worktrees/task-2644+1-dev4 (utils 4종 v2)",
    "utils_v2_modules_currently_in_worktree_only": [
      "utils/callback_collector_helper_integration.py",
      "utils/callback_adjudicator_v2.py",
      "utils/callback_next_action_runner_v2.py",
      "utils/source_attribution_guard_v2.py"
    ],
    "canonical_live_path_status": "origin/main 및 /home/jay/workspace/utils/ canonical 위치에 위 4종 미존재"
  },

  "field_02_hardening_candidate_strategies": [
    {
      "strategy_id": "S1_CANONICAL_PROMOTION",
      "description": "utils 4종 v2를 canonical live path (/home/jay/workspace/utils/) 로 승격 · origin/main commit · worktree 제거 후에도 import 가능",
      "pro": "PYTHONPATH 의존 0 · 표준 import · 가장 안정적",
      "con": "live infra 변경 (canonical path 추가) · 회장 별도 signature 필요 · Axis 1 helper 변경 0 보장 필요"
    },
    {
      "strategy_id": "S2_HOOK_INLINE",
      "description": "utils 4종 핵심 함수를 hook 파일 내부에 inline 복사 · import 의존 제거",
      "pro": "외부 의존 0 · hook 자체 독립 실행 · canonical path 변경 0",
      "con": "코드 중복 (hook 3개 × utils 4종 함수) · 유지보수 부담 · Axis 1 helper 호출 패턴 일관성 저하"
    },
    {
      "strategy_id": "S3_SPEC_FROM_FILE_LOCATION",
      "description": "hook 내부에서 importlib.util.spec_from_file_location 으로 utils 4종을 절대 경로로 직접 로드 · PYTHONPATH 의존 제거",
      "pro": "canonical path 변경 0 · hook 파일만 수정 · worktree 경로 hardcoded 가능",
      "con": "여전히 worktree 경로 의존 (hardcoded) · worktree 제거 시 hook crash · 진정한 hardening 아님"
    },
    {
      "strategy_id": "S4_HYBRID",
      "description": "S1 canonical promotion + S3 fallback (canonical path 우선 import · 실패 시 worktree fallback)",
      "pro": "canonical 우선 · backward-compat · gradual migration",
      "con": "복잡도 증가 · 두 경로 모두 유지 부담"
    }
  ],

  "field_03_anu_recommended_strategy": {
    "strategy_id": "S1_CANONICAL_PROMOTION",
    "reasoning": "회장 verbatim 'canonical live path 기준으로 안정화'에 가장 정확 부합 · S3는 worktree 경로 hardcoded로 진정한 hardening 아님 · S2는 코드 중복 부담 · S4는 과도한 복잡도",
    "additional_safeguards_required": [
      "utils 4종 v2 canonical 승격 시 v1 schemas와 충돌 없음 검증",
      "Axis 1 helper (utils/callback_registration.py 등) 변경 0 보장",
      "task-2644+1-dev4 worktree와 canonical utils 4종 v2 byte-identical 검증 (sha256 비교)",
      "승격 후 worktree 제거 smoke test (worktree 제거 → hook trigger → import 성공 PASS)"
    ]
  },

  "field_04_hardening_steps_s1_canonical_promotion": [
    "1. task-2644+1-dev4 worktree utils 4종 v2 파일 → canonical path /home/jay/workspace/utils/ 복사 (cp · sha256 byte-identical 검증)",
    "2. local commit (utils 4종 v2 추가 · main branch · push 0)",
    "3. import smoke test: python3 -c 'from utils import callback_collector_helper_integration; ...' (canonical path 동작 PASS)",
    "4. live hook 3개의 PYTHONPATH 의존 제거 (settings.json 또는 hook 파일 내부 env 설정 정리)",
    "5. UserPromptSubmit inbound smoke 재실행 (★ task-2644+1-dev4 worktree 임시 비활성화 또는 PYTHONPATH 제거 상태에서 inbound 5/5 PASS 검증)",
    "6. 검증 PASS 시 task-2644+1-dev4 worktree 정식 제거 (git worktree remove) 후 재smoke 1회",
    "7. dependency_hardening_required=false 토글 + AXIS_2_FULLY_HARDENED 승격 가능 (회장 verbatim signature 별도)",
    "8. canonical promotion result marker 박제"
  ],

  "field_05_rollback_plan": {
    "L1_rollback_trigger_30sec": [
      "canonical promotion 후 hook import crash",
      "smoke 5조건 中 1건이라도 fail",
      "Axis 1 helper 동작 변화 (regression baseline 변화)"
    ],
    "L1_rollback_action": "canonical utils 4종 v2 git revert + PYTHONPATH 의존 복원 + task-2644+1-dev4 worktree 보존 상태로 회귀",
    "L2_rollback_trigger_5min": [
      "smoke 재실행 5회 연속 실패",
      "task-2644+1-dev4 worktree 제거 후 hook crash 발생"
    ],
    "L2_rollback_action": "Axis 2 hooks 비활성화 (settings.json hooks 항목 제거) + AXIS_2 RUNTIME_GUARDED 복귀 + 회장 보고",
    "chair_rollback_trigger": "회장 verbatim revert signature 시 즉시 rollback"
  },

  "field_06_smoke_test_set_post_hardening": [
    "SH1: canonical path에서 utils 4종 v2 import 성공",
    "SH2: hook 3개가 PYTHONPATH 의존 없이 utils 4종 v2 정상 호출",
    "SH3: Axis 1 helper (utils/callback_registration.py 등) 변경 0 확인 · regression baseline 124/124 유지",
    "SH4: task-2644+1-dev4 worktree 임시 PYTHONPATH 제거 상태에서 UserPromptSubmit hook .callback 감지 PASS",
    "SH5: Axis 1 helper 사전 등록 → ledger row → inbox 정식 투입 → 5조건 5/5 PASS (task-2650 패턴 재현)",
    "SH6: task-2644+1-dev4 worktree 정식 git worktree remove 후 SH4·SH5 재실행 PASS"
  ],
  "smoke_pass_threshold": "SH1-SH6 모두 PASS (6/6) · 1건이라도 fail 시 L1 rollback",

  "field_07_chair_signature_required_fields": [
    "chair_authorization_id (★ Axis 2 동일 ID 재사용 또는 신규 hardening 전용 ID)",
    "activation_scope (canonical promotion utils 4종 v2 + hook import 정리)",
    "activation_target_path (utils/ canonical · hook 파일 path)",
    "rollback_triggers (L1/L2)",
    "smoke_pass_criteria (SH1-SH6 6/6)",
    "live_settings_modification_allowed (false · hook 자체 수정만)",
    "worktree_removal_authorized (★ task-2644+1-dev4 worktree 제거 권한 별도 명시)"
  ],

  "field_08_forbidden_during_hardening": [
    "Axis 1 helper (utils/callback_registration.py / callback_authority_validator.py / callback_source_cross_checker.py) 변경 (호출만 허용)",
    "Axis 3 touch",
    "dispatch.py 변경",
    "real auto-merge",
    "PR #141 pilot",
    "BOT App token 사용",
    "live settings.json 추가 변경 (PYTHONPATH 정리 제외)",
    "live cokacdir 임의 변경",
    "HARNESS_ENFORCED 전체 선언",
    "callback system verified 전체 선언",
    "AXIS_2_FULLY_HARDENED 표현 (★ smoke SH1-SH6 PASS 후 회장 verbatim signature 후에만 허용)",
    "task-2644+1-dev4 worktree 임의 제거 (★ smoke SH4 PASS 후 회장 verbatim worktree_removal_authorized 후에만)"
  ],

  "expected_files_for_future_hardening_task": [
    "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/hooks/session_start_anu_callback_collector_v2.py (PYTHONPATH 정리)",
    "/home/jay/.claude/hooks/stop_anu_callback_collector_verifier_v2.py (PYTHONPATH 정리)",
    "/home/jay/.claude/hooks/user_prompt_submit_hook_callback_inbox_v2.py (PYTHONPATH 정리)",
    "tests/integration/test_axis_2_dependency_hardening.py (SH1-SH6)",
    "memory/events/task-<NNNN>.axis-2-hardening-result-260524.json",
    "memory/events/task-<NNNN>.done"
  ],

  "completion_state": "AXIS_2_DEPENDENCY_HARDENING_PACKET_READY",
  "next_action_required": "회장 verbatim signature for Axis 2 hardening task · 신규 chair_authorization_id 또는 Axis 2 동일 ID 결정 + executor 선택 (★ dev3 다그다 적합도 높음 — task-2646 helper 원작자 · canonical promotion 작업 적임 · dev6 페룬 대안)",
  "axis_3_packet_status": "BLOCKED_UNTIL_AXIS_2_HARDENING_COMPLETE (회장 verbatim 우선순위)",
  "chair_directive_ref": "회장 verbatim 2026-05-24 Axis 3 전 Axis 2 dependency hardening 우선 + utils 4종 canonical 안정화 + worktree 제거 후 smoke PASS 검증"
}
