{
  "marker_version": "v1",
  "marker_type": "spawn_visibility_guard_adoption_packet_ready",
  "recorded_at": "2026-05-25T13:30:00+09:00",
  "recorded_by": "ANU_chair_facing_session",
  "source_attribution": "INFERENCE_ONLY",
  "packet_id": "SPAWN-VISIBILITY-GUARD-ADOPTION-PACKET-260525",
  "supersedes_packet": null,
  "chair_directive_origin": "회장 verbatim 2026-05-25 (source collector / spawn checker adoption packet을 작성하라 · 끝 sentinel 확인)",
  "chair_authorization_id_required_verbatim_for_adoption_execution": "(★ 별도 adoption execution task 시 회장 verbatim 발행 필요 · 본 packet은 박제만)",
  "current_status": "SPAWN_VISIBILITY_GUARD_ADOPTION_PACKET_READY",

  "non_negotiable_anchors_chair_verbatim_8": [
    "즉시 main 반영 0",
    "live settings.json 변경 0",
    "dispatch.py 변경 0",
    "Axis 3 RUNNING 선언 0",
    "full rollout 0",
    "HARNESS_ENFORCED 전체 선언 0",
    "commit/push/PR/merge 0",
    "기존 observer chain 중단 0"
  ],

  "expressions_forbidden_chair_verbatim_4_continuing": [
    "COMMON_TOOL_ADOPTED",
    "ANU spawn checker replaced",
    "production adopted",
    "live dispatch verification upgraded"
  ],

  "required_inclusion_1_worktree_only_implementation_file_list": {
    "worktree_path": "/home/jay/workspace/.worktrees/task-2658-dev6",
    "branch": "task/task-2658-dev6",
    "base_commit": "0e172435 (origin/main: Merge PR #144 task-2641)",
    "untracked_in_worktree_must_promote_or_decline": [
      "utils/anu_spawn_visibility_guard/__init__.py",
      "utils/anu_spawn_visibility_guard/path_resolver.py",
      "utils/anu_spawn_visibility_guard/source_collector.py",
      "utils/anu_spawn_visibility_guard/status_classifier.py",
      "utils/anu_spawn_visibility_guard/timeout_gate.py",
      "tests/anu_spawn_visibility_guard/__init__.py",
      "tests/anu_spawn_visibility_guard/test_regression_6.py"
    ],
    "memory_artifact_worktree_only": [
      "memory/events/task-2658.done",
      "memory/events/task-2658.spawn-visibility-guard-result-260525.json",
      "memory/reports/task-2658.md"
    ],
    "pycache_excluded": "__pycache__/* (★ runtime cache · adoption 제외)",
    "total_promotion_candidate_count": 10
  },

  "required_inclusion_2_main_repo_absent_file_list": {
    "main_repo_check_at_kst": "2026-05-25T13:24:00+09:00",
    "absent_in_main_repo_confirmed": [
      "utils/anu_spawn_visibility_guard/ (★ 디렉터리 자체 부재)",
      "tests/anu_spawn_visibility_guard/ (★ 디렉터리 자체 부재)",
      "memory/events/task-2658.* (★ result/done 부재)",
      "memory/reports/task-2658.md (★ 부재)"
    ],
    "main_repo_head_unchanged": "d4098b04 task-2642 — CI_WATCH_HANDOFF_RUNNER",
    "interpretation": "★ 회장 anchor 정확히 준수 (commit/push/PR/merge 0) · 그러나 결과적으로 main repo에서 본 guard 사용 0"
  },

  "required_inclusion_3_canonical_promotion_needed": {
    "anu_judgment": true,
    "rationale": "★ 본 guard는 ANU 공통 spawn 검증 도구 (회장 결정 1: utils/anu_spawn_visibility_guard/*). worktree-only 잔류 시 ANU가 다음 dispatch 검증에 호출 불가 · task-2657 WARN 1 재발 위험 잔존.",
    "promotion_targets_2": [
      "main repo utils/anu_spawn_visibility_guard/* (★ source 5개)",
      "main repo tests/anu_spawn_visibility_guard/* (★ test 1개 + __init__)"
    ],
    "promotion_method_options_3": [
      {
        "option_a_direct_pr_via_dev_bot": "★ dev6 페룬 또는 dev bot 이 task/task-2658-dev6 브랜치 push + PR open · CI/Gemini watcher 일반 흐름 · ANU 회장 승인 강제",
        "option_a_constraint": "회장 verbatim 'commit/push/PR/merge 0' anchor와 충돌 → 별도 chair_authorization 필요"
      },
      {
        "option_b_anu_local_promotion_no_git": "★ utils/tests 디렉터리만 main repo로 cp · git untracked 유지 · 회장 결정 후 별도 commit task 분리",
        "option_b_constraint": "★ git unstaged 상태로 ANU 호출 가능하나 finish-task / CI 흐름에서 추적 불가 · audit trail 약화"
      },
      {
        "option_c_packet_only_freeze": "★ 본 packet으로 박제만 · 실 adoption은 추후 별도 task · 본 PR 자동 무효 (worktree TTL 72h)",
        "option_c_constraint": "★ task-2657 WARN 1 재발 위험 가장 큼"
      }
    ],
    "anu_recommendation": "★ option_a_direct_pr_via_dev_bot (★ 회장 별도 chair_authorization 필요 · merge 시점 회장 결정 · auto-merge 0)"
  },

  "required_inclusion_4_existing_anu_spawn_verification_call_sites": {
    "grep_method": "grep -lE 'worktrees|cokacdir/workspace|spawn.*verif|silent.*drop' utils/*.py",
    "discovered_call_site_candidates_5": [
      {
        "path": "utils/canonical_workspace_resolver.py",
        "role_anu_hypothesis": "★ canonical workspace 경로 결정 · 본 guard path_resolver와 직접 연관"
      },
      {
        "path": "utils/worktree_resolver.py",
        "role_anu_hypothesis": "★ worktree resolution · 본 guard의 worktree 후보 2종 grep 로직과 직접 통합 후보"
      },
      {
        "path": "utils/callback_collector_helper_integration.py",
        "role_anu_hypothesis": "★ callback collector · 본 guard의 callback recovery evidence 적용 후보"
      },
      {
        "path": "utils/lifecycle_reconciliation_manager.py",
        "role_anu_hypothesis": "★ lifecycle reconciliation · 본 guard의 status enum 5와 dispatch lifecycle 연결 후보"
      },
      {
        "path": "utils/merge_ready_states.py",
        "role_anu_hypothesis": "★ merge ready state · 본 guard의 SPAWN_VERIFIED + CALLBACK_RECOVERED_AFTER_VISIBILITY_GAP 결과 활용 후보"
      }
    ],
    "dispatch_py_check": "grep 결과 0 · dispatch.py에 spawn 검증 직접 호출 없음 (회장 anchor dispatch.py 변경 0 자연 부합)",
    "anu_runtime_check_method": "★ ANU 자체는 LLM agent · 코드 없음 · ANU는 본 guard를 prompt level에서 'tool call로 호출하라'는 운영 규칙 형태로 적용 · 봇 spawn 검증 시 dispatch 직후 ANU가 source_collector 호출 강제"
  },

  "required_inclusion_5_existing_4_source_checker_integration": {
    "existing_4_source_attribution_anchors": [
      "schedule_history (cokacdir cron-history + JSONL)",
      "cron-history owner key (4 source 교차의 원본)",
      "envelope (callback envelope 또는 paste)",
      "result artifact (memory/events/<task>.*.json)"
    ],
    "new_guard_8_source_relation": {
      "schedule_history": "★ source_collector source #6 (직접 통합)",
      "cron_history_owner_key": "★ source_collector 외부 source · 별도 helper 또는 prompt level 검증",
      "envelope": "★ source_collector source #8 (callback_inbox.acked 매핑)",
      "result_artifact": "★ source_collector source #7 (result/report/done 트리오)",
      "extra_new_sources_4": [
        "legacy /home/jay/workspace/.worktrees/<task>-<team> (★ source #1)",
        "cokacdir /home/jay/.cokacdir/workspace/<schedule_id>/wt-<task>-<team> (★ source #2)",
        "schedule_id workspace dir (★ source #3)",
        "executor process (★ source #4)",
        "wt-<task_id>-<team> glob pattern (★ source #5)"
      ]
    },
    "integration_pattern": "★ 4 source 교차는 일반 dispatch lifecycle / 8 source 는 spawn 단계 확장 · 둘 다 ledger reconciled 분류 적용 가능 · ledger source enum 확장 권장 (callback_ledger.jsonl에 source 라벨 컬럼 8개 추가)",
    "two_source_minimum_cross_check_rule_chair_verbatim_2": "★ 회장 결정 2 (self-attestation 단독 금지 · 최소 2 source 교차) 본 guard에 1차 적용 · 기존 4 source attribution doctrine과 일관성 유지"
  },

  "required_inclusion_6_legacy_cokacdir_dual_search_application": {
    "implementation_in_guard": "★ utils/anu_spawn_visibility_guard/path_resolver.py (★ legacy /home/jay/workspace/.worktrees/wt-<task>-<team> + cokacdir /home/jay/.cokacdir/workspace/<schedule_id>/wt-<task>-<team> 두 후보 glob 강제)",
    "real_world_evidence_dual_pattern_required": [
      "task-2657 worktree at cokacdir /home/jay/.cokacdir/workspace/426931FE/wt-2657-dev6",
      "task-2658 worktree at legacy /home/jay/workspace/.worktrees/task-2658-dev6 (★ 정반대 위치 사용 실증 · task-2657 직 후 dispatch에서 패턴 변동 관측)"
    ],
    "anu_application_at_packet_level": "★ ANU prompt 운영 규칙에 'spawn 측정 시 worktree 후보 2 경로 모두 조회' 강제 (★ task-2657 WARN 1 직접 반영)",
    "anu_dispatch_marker_field_mandate": "★ 매 dispatch 박제 marker에 worktree_candidate_paths 2종 field 필수 박제 (★ 본 task-2658 dispatch marker 적용 완료 실증)"
  },

  "required_inclusion_7_recovery_evidence_application": {
    "recovery_evidence_sources_dual_chair_verbatim_2": [
      "result/report/done marker (memory/events/<task>.done + memory/events/<task>.*-result-*.json + memory/reports/<task>.md)",
      "memory/.callback_inbox/*.acked (★ callback inbox ack JSONL)"
    ],
    "two_source_cross_check_rule_chair_verbatim": "★ self-attestation 단독 금지 · 최소 2 source 교차 (회장 결정 2)",
    "implementation_in_guard": "★ utils/anu_spawn_visibility_guard/source_collector.py (source #7 + source #8) + status_classifier.py (CALLBACK_RECOVERED_AFTER_VISIBILITY_GAP 분류 + 2 source 교차 강제)",
    "anu_application": "★ ANU spawn 측정 시 4 source 0 결과여도 result/done + callback_inbox.acked 2 source 교차 시 CALLBACK_RECOVERED_AFTER_VISIBILITY_GAP 분류 · TRUE_SILENT_DROP 단정 금지"
  },

  "required_inclusion_8_true_silent_drop_timeout_application": {
    "hard_timeout_minutes_chair_verbatim": 30,
    "timeout_start_anchor": "fire_at_kst (cron 등록 시 expected fire 시각)",
    "exception_conditions_chair_verbatim_3_any": [
      "schedule_history pending",
      "result marker present",
      "callback envelope present (또는 callback_inbox.acked)"
    ],
    "implementation_in_guard": "★ utils/anu_spawn_visibility_guard/timeout_gate.py + status_classifier.py (R5 fixture에서 hard_timeout + 60s 경과 + 전 source 부재 → TRUE_SILENT_DROP)",
    "anu_application": "★ ANU spawn 측정 시 30분 hard timeout 적용 · 예외 3건 중 하나라도 있으면 SPAWN_PENDING 또는 SPAWN_VISIBILITY_GAP 분류 · 단정 금지"
  },

  "required_inclusion_9_existing_observer_callback_chain_impact": {
    "axis_3_canary_observer_chain_impact": "ZERO (★ utils/axis_3_canary_scale_aware_guard/* 미수정 · 본 guard module location utils/anu_spawn_visibility_guard/* 분리)",
    "callback_ledger_impact": "ZERO at packet level (★ 본 packet은 박제만 · source 라벨 컬럼 8개 확장은 별도 adoption execution task 시 검토)",
    "lifecycle_reconciliation_manager_impact": "ZERO at packet level (★ 잠재 통합 후보로만 박제)",
    "dispatch_py_impact": "ZERO (★ 회장 anchor 자연 부합)",
    "live_settings_json_impact": "ZERO",
    "hooks_impact": "ZERO (★ PreToolUse hook 변경 0)",
    "existing_observer_chain_continuation": "★ 정상 지속 (현재 +780m 인정 · 다음 +840m schedule_id 2A61D821 예상 · 본 packet 작성 중에도 격리 유지)",
    "axis_1_2_runtime_impact": "ZERO"
  },

  "required_inclusion_10_rollback_plan": {
    "scope": "★ 본 packet 자체는 박제만 · rollback 무효 (★ 코드 변경 0)",
    "future_adoption_execution_rollback": {
      "option_a_pr_revert": "★ option_a (direct PR via dev bot) 채택 시 · git revert <merge_sha> · 회장 verbatim 강제",
      "option_b_local_cp_undo": "★ option_b (anu local promotion) 채택 시 · rm -rf utils/anu_spawn_visibility_guard tests/anu_spawn_visibility_guard · git status untracked 원상 복구",
      "option_c_no_adoption_no_rollback": "★ option_c (packet only freeze) 채택 시 · rollback 무효 · worktree TTL 72h 자동 정리",
      "rollback_trigger_conditions": [
        "Axis 3 RUNNING 자동선언 시도 감지 → 즉시 rollback",
        "PreToolUse runtime / Axis 1/2 / dispatch.py / live settings.json 변경 감지 → 즉시 rollback",
        "false negative 새 발생 (worktree 위치 누락 case) → guard 자체 결함 수정 patch 우선 · rollback 차순위"
      ]
    },
    "worktree_ttl_anchor": "★ task md ttl_hours=72 · 2026-05-28 부근 worktree 정리 · adoption 결정 전 회장 verbatim 권장"
  },

  "anu_recommendation_summary_for_chair": {
    "1_adoption_option": "★ option_a_direct_pr_via_dev_bot (★ dev6 페룬 또는 dev bot · task/task-2658-dev6 push + PR open · 회장 별도 chair_authorization 강제)",
    "2_post_adoption_call_site_integration_phase_2": "★ 별도 task로 utils/worktree_resolver.py + utils/canonical_workspace_resolver.py + utils/callback_collector_helper_integration.py 에 source_collector import 추가 (★ 본 packet 적용 후 회장 결정 필요)",
    "3_ledger_source_label_extension_phase_3": "★ callback_ledger.jsonl source 라벨 컬럼 8개 확장 (★ 본 packet 적용 + call site 통합 후 회장 결정)",
    "4_axis_3_canary_running_promotion_anchor_maintained": "★ adoption 진행과 독립적으로 RUNNING 승격 금지 anchor 유지 · real_t0+24h 후 task-2657 guard 5조건 AND gate 별도"
  },

  "next_action_required_chair_decision_5": [
    "adoption execution 진행 여부 결정 (★ option_a / option_b / option_c)",
    "adoption execution 시 chair_authorization_id verbatim 발행",
    "adoption execution 시 executor 선택 (dev6 페룬 권장)",
    "phase 2/3 (call site integration · ledger 확장) 진행 여부 별도 결정",
    "worktree TTL 72h 도달 (2026-05-28) 전 adoption 결정 권장"
  ],

  "current_axis_3_canary_monitoring_unchanged": {
    "current_status": "AXIS_3_CANARY_SAFE_TRAFFIC_SAMPLE_RECORDED + MONITORING_SILENT_CONTINUE_WITH_TRAFFIC_SAMPLE",
    "real_t0_plus_24h_target": "2026-05-25T19:51:35+09:00",
    "remaining_hours_approx": 6.4,
    "running_promotion_blocked_anchor_maintained": true,
    "next_observer_expected": "+840m schedule_id 2A61D821"
  },

  "anu_action_count": 1,
  "anu_polling_count": 0,
  "anu_direct_collector_spawn": 0,
  "code_infra_mutation": 0,
  "commit_push_pr_merge_count": 0,

  "linked_markers": [
    "memory/events/task-2658.chair-verified-plus-adoption-packet-required-260525.json (★ 직전 회장 verbatim 박제)",
    "memory/events/task-2658.spawn-visibility-guard-implemented-chair-verified-260525.json (★ task-2658 IMPLEMENTED 박제)",
    "/home/jay/workspace/.worktrees/task-2658-dev6/memory/events/task-2658.spawn-visibility-guard-result-260525.json (★ executor result · regression 7/7)",
    "/home/jay/workspace/.worktrees/task-2658-dev6/memory/reports/task-2658.md (★ executor report)",
    "memory/events/spawn-visibility-false-negative-prevention-guard-packet-260525.json (★ ANU 원 packet)",
    "memory/tasks/task-2658.md (★ task spec)",
    "memory/events/task-2657.axis-3-canary-scale-aware-guard-implemented-chair-verified-260525.json (★ WARN 1 사고 박제 · 본 guard 사유)"
  ]
}
