{
  "marker_version": "v1",
  "marker_type": "callback_fire_at_delay_audit_packet_ready",
  "recorded_at": "2026-05-25T14:55:00+09:00",
  "recorded_by": "ANU_chair_facing_session",
  "source_attribution": "LOG_LOOKUP_PROACTIVE",
  "packet_id": "CALLBACK-FIRE-AT-DELAY-AUDIT-PACKET-260525",
  "chair_directive_origin": "회장 verbatim 2026-05-25 (task-2659 PR #147 PASS_WITH_2_OBSERVATIONS 유지 + callback scheduling policy audit packet 요청 · 끝 sentinel)",
  "current_status": "CALLBACK_FIRE_AT_DELAY_AUDIT_PACKET_READY",
  "chair_authorization_id_required_verbatim_for_remediation_execution": "(★ 별도 remediation execution task 시 회장 verbatim 발행 필요 · 본 packet은 박제만)",

  "task_2659_acceptance_chair_verbatim_4": [
    "task-2659 PR #147 / Phase 1 canonical promotion 자체 PASS_WITH_2_OBSERVATIONS 유지",
    "ANU callback collector 수신 자체는 정상",
    "문제는 callback scheduling policy (★ 14분 의도적 fire_at delay)",
    "고정시각/dead-man 트리거로 인한 idle gap 재발 위험 있음"
  ],

  "audit_required_inclusion_1_anu_callback_registrar_default": {
    "file": "utils/anu_callback_registrar.py",
    "function": "register_normal_callback(envelope, delay_seconds=10)",
    "default_delay_seconds": 10,
    "default_delay_classification": "10 SECONDS (★ 분 아님)",
    "callable_directly_by_bot": "★ 가능 · 그러나 봇은 일반적으로 finish-task.sh 경유"
  },

  "audit_required_inclusion_2_finish_task_callback_call_site": {
    "file": "scripts/finish-task.sh",
    "line": 1369,
    "verbatim_command": "--prompt \"$T2626_ENVELOPE\" --at \"10m\"",
    "smoking_gun_finding": "★ finish-task.sh 가 --at \"10m\" 으로 하드코딩 호출 (★ 모든 봇 completion callback 무조건 10분 delay)",
    "block_anchor": "task-2626 ADDITIVE wiring · canonical_root=/home/jay/workspace · ANU-key 단일 launcher 경유",
    "comment_context": "5.5. [task-2626] callback runtime enforcement gate (ADDITIVE · 완전 방어 · 비차단)"
  },

  "audit_required_inclusion_3_direct_workflow_and_helper_defaults": {
    "helper_module": "dispatch/normal_fallback_callback_helper.py",
    "helper_default_at": "lp.add_argument(\"--at\", default=\"10m\") (line 617)",
    "helper_zero_mutation_layer_A": "★ ZERO cron register/remove · ZERO subprocess · ZERO cokacdir exec · 단순 request descriptor build + owner key validation",
    "actual_cron_register_done_by": "★ caller (★ finish-task.sh 또는 외부 authorized session) · cokacdir --cron 실행은 helper 외부",
    "direct_workflow_md_lines": "538-547 · 'callback prompt UTF-8 ≤3900 bytes + envelope-only · normal/fallback launcher 강제 · fallback recovery-only'",
    "direct_workflow_md_no_fire_at_policy": "★ DIRECT-WORKFLOW.md 에 fire_at delay 정책 명시 0 (★ envelope size · launcher 강제만)"
  },

  "audit_required_inclusion_4_task_2659_why_14_25_00": {
    "envelope_fire_at_kst": "2026-05-25T14:25:00+09:00 (★ FDE3D8EC schedule_id · 회장 paste envelope)",
    "computation_trace": {
      "bot_done_emit_at_kst": "2026-05-25T14:10:51+09:00 (worktree mtime)",
      "bot_finish_task_callback_register_at_kst_estimated": "2026-05-25T14:15:00+09:00 (★ 14:25:00 - '10m' from finish-task.sh 하드코딩)",
      "finish_task_sh_arg": "--at \"10m\"",
      "cokacdir_resolves_10m_to_absolute": "★ 등록 시점 + 10분 = 14:25:00 (정확 일치)"
    },
    "intentional_vs_accidental": "★ INTENTIONAL_AT_SYSTEM_LEVEL (★ finish-task.sh 하드코딩) · NOT bot-specific decision (★ 봇 자체 자율 0)",
    "scope_of_impact": "★ finish-task.sh 호출하는 모든 task 의 normal callback 이 무조건 ≥10분 delay"
  },

  "audit_required_inclusion_5_task_2659_full_timing_chain": {
    "fact_source": "★ schedule_history F75E49AF.log + FDE3D8EC.log + worktree mtime + chair paste envelope · 4 source 교차",
    "timeline_chair_facing": [
      "13:59:03 task md 작성 (ANU)",
      "14:00:23 ANU dispatch cron register (F75E49AF)",
      "14:00:53 dispatch cron fire (★ +30s · 정상)",
      "14:00:53 → 14:12:36 봇 작업 (duration 11m 40s)",
      "14:10:51 봇 .done emit (★ worktree mtime)",
      "14:15:00 ★ 봇 finish-task.sh callback register (--at \"10m\" 하드코딩 · 추정 시각)",
      "14:25:00 ★ ANU callback cron fire (★ register + 10m = 절대시각)",
      "14:25:01 ANU collector spawn (FDE3D8EC ts - duration 173s)",
      "14:27:54 ANU collector done (FDE3D8EC ts)",
      "회장 envelope 인지 ≈ 14:25 (★ sendfile 또는 collector outbound)",
      "회장 message → ANU chair_facing_session 14:38 (★ message-driven activate)"
    ],
    "gap_root_cause_confirmed": "★ finish-task.sh:1369 --at \"10m\" 하드코딩이 9-14분 idle gap 의 직접 원인 (★ 봇/ANU collector 결함 아님)"
  },

  "audit_required_inclusion_6_normal_vs_dead_man_distinction": {
    "current_state_no_distinction": true,
    "current_finish_task_sh_behaviour": "★ normal callback (★ task 완료 후 즉시 진행 trigger) 과 fallback safety-net (★ 미발사 회복 dead-man) 을 동일하게 10분 delay 강제",
    "anu_memory_anchor_violated": "feedback_progress_trigger_on_normal_callback_not_deadman_260518 — '진행 트리거=normal callback · 고정시각/dead-man 게이트를 진행 트리거로 쓰면 ~수십분~수시간 idle 갭'",
    "fallback_module_evidence": "utils/anu_callback_fallback.py · ANCHOR-4 fallback cancel-on-success = REGISTERED status · 즉 fallback 은 normal callback 이 REGISTERED 되면 cancel · 그러나 fire_at delay 자체는 동일 '10m'",
    "direct_workflow_md_544": "fallback 은 recovery-only · final report trigger 금지"
  },

  "audit_required_inclusion_7_normal_callback_within_30s": {
    "feasibility": true,
    "evidence": "★ register_normal_callback(delay_seconds=10) default 자체가 10초 (★ 분 아님) · 즉 anu_callback_registrar 수준에서는 30s 이내 fire 기술적 가능",
    "current_bottleneck": "finish-task.sh:1369 --at \"10m\" 하드코딩이 30s 이내를 차단",
    "fix_scope": "★ finish-task.sh:1369 변경 · helper default \"10m\" → \"10s\" 변경 (★ 별도 remediation task)",
    "side_effect_consideration": [
      "★ 작업 종료 직후 즉시 fire 시 git push / PR open / CI 동기화 시점 미완료 가능성 → result/done 박제 직후 fire 시 race condition 검토 필요",
      "★ ANU collector cold start latency (★ 173s task-2659 evidence) 는 별도 issue · fire_at delay 와 무관"
    ]
  },

  "audit_required_inclusion_8_fallback_separation": {
    "feasibility": true,
    "current_mechanism": "★ utils/completion_callback_fallback_cancel.cancel_fallback_on_success · normal callback REGISTERED 시 fallback cancel",
    "separation_proposal": {
      "normal_callback": "delay_seconds ≤ 30s (event-driven · 진행 trigger)",
      "fallback_callback": "delay_seconds ≥ 600s (recovery-only · normal 발사 실패 시 회수)",
      "naming_role_separation": "★ source_attribution / collector_role 필드 분리 · normal=ANU_NORMAL_COLLECTOR · fallback=ANU_FALLBACK_RECOVERY_COLLECTOR",
      "cancel_on_success_logic": "normal REGISTERED 시 fallback 즉시 cancel · 현재 박제 mechanism 재사용"
    }
  },

  "proposed_thresholds_chair_verbatim_4": {
    "normal_callback_target": "delay_seconds ≤ 30 (★ 회장 정책 방향 1)",
    "fallback_dead_man_target": "delay_seconds ≥ 600 (★ 회장 정책 방향 2)",
    "delay_gt_60_reason_required": "★ delay_seconds > 60 이면 reason 필수 (★ 회장 정책 방향 5)",
    "delay_gt_300_block_or_reclassify": "★ delay_seconds > 300 이면 HOLD_FOR_CHAIR 또는 fallback 으로 재분류 (★ 회장 정책 방향 6)"
  },

  "policy_direction_chair_verbatim_6": [
    "normal callback: done/result/report 작성 직후 30초 이내 fire",
    "fallback/dead-man callback: 10~15분 이상 가능",
    "normal callback 과 fallback callback 이름/role/source_attribution 분리",
    "normal callback 을 고정시각 round-up 으로 지연시키지 말 것",
    "delay_seconds > 60 이면 reason 필수",
    "delay_seconds > 300 이면 HOLD_FOR_CHAIR 또는 fallback 으로 재분류"
  ],

  "forbidden_chair_verbatim_8_maintained": [
    "코드 수정 (★ 본 packet 박제만)",
    "live settings.json 변경",
    "dispatch.py 변경",
    "Axis 1/2/3 runtime 변경",
    "PR #147 merge",
    "auto-merge",
    "policy 즉시 적용",
    "commit/push/PR/merge"
  ],

  "anu_recommendation_for_remediation_phase_2": {
    "scope": "remediation execution task (★ 본 packet 별도 후속)",
    "files_to_change_minimal": [
      "scripts/finish-task.sh:1369 --at '10m' → '10s' (★ normal 진행 trigger)",
      "dispatch/normal_fallback_callback_helper.py:617 default '10m' → '10s' (★ argparse default)",
      "(별도) fallback launcher 신규 추가 또는 분기 — fallback 만 --at '15m' 유지 + cancel-on-success"
    ],
    "regression_required": [
      "normal callback ≤ 30s fire 확인 (★ 봇 .done → cron fire timestamp gap 측정)",
      "fallback launcher 별도 호출 시 ≥ 600s fire 확인",
      "normal REGISTERED 시 fallback cancel 정상 (★ 기존 mechanism 회귀 0)",
      "delay_seconds > 60 reason 강제 enforce 검증",
      "delay_seconds > 300 HOLD_FOR_CHAIR 또는 fallback 재분류 enforce 검증"
    ],
    "rollback_plan": "★ scripts/finish-task.sh:1369 + helper default 원복 (git revert)",
    "side_effect_audit_required": [
      "★ git push / PR open / CI 동기화 시점이 .done emit 이전 완료되는지 (★ race condition)",
      "★ result/done/report 박제 시점 vs callback fire_at 간 동기화 (★ 30s 이내 race 가능성)"
    ]
  },

  "next_action_required_chair_decision_4": [
    "remediation execution task 진행 여부 결정 (★ PR-based via dev bot 또는 anu-direct read-only fix 분리)",
    "executor 선택 (★ task-2659 dev6 페룬 본인 audit 부적절 · dev1 헤르메스 또는 composite ③ 권장)",
    "chair_authorization_id verbatim 발행 (★ ANU 임의 생성 0)",
    "scope 선택 (★ Phase 2 normal default 변경만 / Phase 3 fallback 분리 추가 / Phase 4 threshold enforce 코드화)"
  ],

  "current_axis_3_canary_monitoring_unchanged_anchor": {
    "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": 4.9,
    "running_promotion_blocked_anchor_maintained": true,
    "next_observer_expected": "+960m schedule_id 7F77793F · fire 14:50:00 KST"
  },

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

  "linked_markers": [
    "memory/events/task-2659.dispatch-submitted-phase-1-canonical-promotion-260525.json (★ task-2659 dispatch 박제)",
    "memory/events/task-2658.spawn-visibility-guard-implemented-chair-verified-260525.json (★ 직 직전 IMPLEMENTED 박제)",
    "memory/events/task-2658.chair-verified-plus-adoption-packet-required-260525.json (★ Phase 분리 박제)",
    "memory/events/spawn-visibility-guard-adoption-packet-260525.json (★ ANU adoption packet)"
  ]
}
