{
  "marker_version": "v1",
  "marker_type": "axis_3_canary_scale_aware_prevention_guard_packet_ready",
  "recorded_at": "2026-05-25T09:25:00+09:00",
  "recorded_by": "ANU_chair_facing_session",
  "source_attribution": "INFERENCE_ONLY",
  "packet_id": "AXIS-3-SCALE-AWARE-PREVENTION-GUARD-260525",
  "supersedes_packet": null,
  "axis_id": 3,
  "canary_session_id_in_scope": "3A287AE0",
  "chair_authorization_id_required_verbatim": "(★ 회장 verbatim 발행 대기 · ANU 임의 생성 금지)",

  "design_origin": {
    "chair_verbatim_part_1_path": "회장 paste 2026-05-25 (Axis 3 canary prevention guard 1/2 · observer window guard + probe spec lock + runtime integration)",
    "chair_verbatim_part_2_path": "회장 paste 2026-05-25 (Axis 3 canary prevention guard 2/2 · scale-aware scheduling guard 정정 지시)",
    "sago_basis": [
      "memory/events/task-2656.chair-3-corrections-verified-260525.json (window_label_drift_warn=true · spec_deviation_warn t3)",
      "memory/events/task-2655.axis-3-canary-observer-120m-silent-continue-no-traffic-260524.json (intentional_window_shift 회장 정정)",
      "memory/events/task-2655.axis-3-canary-observer-240m-silent-continue-260525.json (observer chain breakdown)"
    ]
  },

  "non_negotiable_anchors_chair_verbatim": [
    "real_t0 박제 절대 유지 (2026-05-24T19:51:35+09:00)",
    "intentional window rebase = 회장 verbatim 명시 1건만 (60m → 120m label drift 정정) · ANU/봇 임의 rebase 0",
    "24h monitoring 완료 판정 = wall-clock real_t0+24h (2026-05-25T19:51:35+09:00) · scale-aware drift 적용 0",
    "vacuous PASS (real traffic 0) ≠ RUNNING 승격 근거",
    "RUNNING 승격 · full rollout · HARNESS_ENFORCED 전체 선언 · policy 승격 · BLOCK 정책 확대 · 24h 완료 선언 모두 회장 verbatim signature 강제",
    "ANU self-promotion 절대 금지",
    "회장 본 세션 적용 0 · ANU collector 세션 적용 0",
    "Axis 1/2 runtime · dispatch.py · hooks/* · settings.json · cokacdir 변경 0",
    "destructive 실 실행 0 · credential 실 read 0",
    "commit/push/PR/merge 0 (packet phase)"
  ],

  "scale_aware_drift_model": {
    "rationale": "task 수가 많아져 cron queue backlog가 누적되면 observer label drift가 구조적으로 발생. raw drift 단독 판정 시 queue 영향으로 false HOLD. queue_backlog 분리 후 정규화된 drift만 판정.",
    "three_value_drift_definition": {
      "raw_drift_m": "observer label에 박힌 expected fire 시각 - 실 processed_at (분 · 부호 있는 값 · 양수=지연)",
      "queue_backlog_m": "직전 schedule_history N건의 (실 fire_at - 등록 시 expected fire_at) 평균 또는 95퍼센타일 · cokacdir cron-history 4 source 교차로 산출 · ANU 임의값 금지",
      "normalized_drift_m": "raw_drift_m - queue_backlog_m (음수면 0으로 clamp)"
    },
    "queue_backlog_measurement_required_fields_4": [
      "sampling_window_minutes (예: 직전 60분)",
      "sample_count_n (충분 N≥5 · 부족 시 N_BELOW_THRESHOLD WARN · backlog=0 가정 금지)",
      "aggregation_method (mean | p95)",
      "data_source_attribution (cokacdir --cron-history 1차 · schedule_history JSONL 2차 · 4 source 교차)"
    ],
    "drift_thresholds_normalized_only": {
      "PASS": "normalized_drift_m ≤ 5",
      "WARN": "5 < normalized_drift_m ≤ 30",
      "HOLD_FOR_CHAIR": "normalized_drift_m > 30 (★ 회장 결정 강제)"
    },
    "queue_explainable_override": {
      "rule": "raw_drift > 30 이지만 queue_backlog로 동등 흡수 가능(normalized ≤ 30) + trigger_7 all NO + Axis 1/2 interference 0 → SILENT_CONTINUE 허용",
      "label": "QUEUE_BACKLOG_EXPLAINED_DRIFT",
      "must_record_fields_5": ["raw_drift_m", "queue_backlog_m", "normalized_drift_m", "trigger_7_breakdown", "axis_1_2_interference_count"]
    },
    "anti_gaming_rule": "normalized_drift = raw - queue 라는 사실 자체가 queue 측정을 게임화 유인 → queue_backlog_m은 봇 자체 보고 불가 · cokacdir --cron-history 원본 + schedule_history JSONL 2 source 교차만 허용 · 봇 self-report 0"
  },

  "task_priority_p0_to_p4": {
    "P0_critical_no_coalesce": [
      "rollback_trigger=true 처리",
      "Critical7 escalation",
      "hook_crash 발생",
      "Axis 1/2 interference > 0",
      "credential expansion · destructive 실행 신호"
    ],
    "P1_active_trigger_observer": [
      "trigger_7 중 1건 이상 fire 신호 감지된 observer",
      "real canary traffic 발생 직후 observer"
    ],
    "P2_normal_callback": [
      "task 종료 normal callback (collector spawn)",
      "fallback safety-net callback"
    ],
    "P3_silent_observer_coalescable": [
      "trigger_7 all NO 누적된 silent observer (60/120/180/... 240 등)",
      "본 packet의 scale-aware coalescing 대상 = P3 only"
    ],
    "P4_report_only_skippable": [
      "audit report 갱신 only",
      "INDEX rebuild · marker rotation"
    ],
    "priority_inheritance_rule": "P3 observer 진행 중 트리거 감지 발생 시 즉시 P1로 승격 · coalescing 중단 · 다음 observer 단독 발사",
    "anu_anti_loophole": "P0/P1는 절대 coalesce/skip 금지 · normalized_drift 판정과 무관하게 fire 강제"
  },

  "observer_coalescing_rules": {
    "applies_only_to": "P3 silent_observer",
    "coalesce_signal": "queue_backlog로 인해 N개 silent observer가 동일 시간 윈도에 겹쳐 fire 예정",
    "merge_into_single_catch_up_observer_required_fields_5": [
      "skipped_window_count",
      "covered_window_start (★ 가장 이른 skipped window start)",
      "covered_window_end (★ 가장 늦은 skipped window end)",
      "coalesce_reason (queue_backlog_m 값 인용 + 4 source 증거)",
      "trigger_7_aggregated (전 윈도 all NO 확인)"
    ],
    "forbidden_coalesce_conditions_4": [
      "covered window 안에 trigger_7 중 1건이라도 fire 의심 신호 → 단독 observer 분리 강제",
      "rollback_trigger=true 윈도 포함",
      "Axis 1/2 interference > 0 윈도 포함",
      "real canary traffic 발생 윈도 포함"
    ],
    "max_skipped_window_count": "3 (★ 4 이상 누적 시 HOLD_FOR_CHAIR · queue backlog 구조 자체 문제로 회장 결정)",
    "coalesce_audit_jsonl_path": "memory/system/.axis_3_canary_observer_coalesce_audit.jsonl (★ 본 packet 적용 시 신규 생성)"
  },

  "24h_monitoring_completion_judgment": {
    "basis": "wall-clock real_t0 + 24h (★ scale-aware drift 영향 0)",
    "real_t0": "2026-05-24T19:51:35+09:00",
    "real_t0_plus_24h_planned_end": "2026-05-25T19:51:35+09:00",
    "completion_required_quality_metrics_4": [
      "real_canary_traffic_count ≥ 1 (★ task-2656 = 3 충족)",
      "observer_coverage_no_uncovered_window (★ coalescing 사용 시 covered_window_start/end 합집합 = [real_t0, real_t0+24h])",
      "trigger_7 all NO 누적 (★ 24h 내내)",
      "axis_1_2_interference_count = 0 (★ 24h 내내)"
    ],
    "completion_marker_authority": "회장 verbatim signature 강제 · ANU/봇 자동 선언 0",
    "scale_aware_drift_unrelated_to_completion": "정규화 drift는 observer 진행률·HOLD 판정 용 · 24h 완료 시각 wall-clock 고정"
  },

  "running_promotion_5_condition_split": {
    "condition_1_time": "wall-clock real_t0 + 24h 도달 (2026-05-25T19:51:35+09:00 이후)",
    "condition_2_safety": "trigger_7 all NO 누적 + rollback_trigger=false + hook_crash=0 + bypass_activation=0 + false_positive=0 + interference=0",
    "condition_3_traffic": "real_canary_traffic_count ≥ 1 (vacuous PASS 단독 금지)",
    "condition_4_coverage": "monitoring_quality 4조건 (위 24h_monitoring_completion_judgment) all PASS",
    "condition_5_chair_signature": "회장 verbatim 'AXIS_3_CANARY_RUNNING_PROMOTED' + chair_authorization_id 발행",
    "and_logic": "5 조건 모두 AND · 1건 미충족 시 RUNNING 0",
    "anu_self_promotion_forbidden": "5 조건 충족됐다 해도 ANU/봇이 RUNNING 마커 박제 절대 금지 · 회장 본 세션 입력 강제"
  },

  "observer_window_guard": {
    "label_convention": "Window label = sequential counter (60m/120m/180m/... 각 collector chain 자체 t0 기준) · 실 elapsed 박제 분리 필드 'elapsed_from_real_t0_minutes' 강제",
    "label_actual_drift_record_required_fields_4": [
      "observer_label (예: +60m)",
      "actual_processed_at_kst",
      "elapsed_from_real_t0_minutes",
      "raw_drift_m / queue_backlog_m / normalized_drift_m (3-value)"
    ],
    "intentional_rebase_rule": "intentional_window_rebase=true는 회장 verbatim 명시 시에만 박제 · ANU/봇 자율 0"
  },

  "probe_spec_lock_guard": {
    "policy": "task md spec verbatim 강제 · 봇 자율 destructive 명령 선택 금지 (task-2656 t3 deviation 박제)",
    "implementation": "dispatch prompt에 'destructive probe command verbatim from task md only' 1줄 강제 + 봇 result.json에 'probe_command_verbatim_match: true/false' 필드 박제 강제",
    "violation_classification": "PROBE_SPEC_DEVIATION_WARN (Critical 아님 · 그러나 박제 + 다음 task spec recommendation 강제)",
    "fallback_safety": "봇이 deviation 시에도 destructive 5종 中 BLOCK 후보면 safety 박제 (★ task-2656 cokacdir --cron-remove case = PASS but WARN)"
  },

  "runtime_integration": {
    "pretooluse_hook_change_required": false,
    "rationale": "본 packet은 monitoring/judgment 레이어 · PreToolUse hook (runtime guard) 코드 변경 0",
    "new_audit_jsonl_paths_2": [
      "memory/system/.axis_3_canary_observer_coalesce_audit.jsonl",
      "memory/system/.axis_3_canary_drift_judgment_audit.jsonl"
    ],
    "new_marker_event_paths_template": [
      "memory/events/<task_id>.axis-3-canary-observer-Nm-(silent|drift_warn|hold_for_chair|coalesced)-YYMMDD.json"
    ]
  },

  "regression_fixtures_6": [
    {
      "id": "F1_silent_no_backlog",
      "scenario": "queue_backlog=0 + raw_drift=2m + trigger_7 all NO",
      "expected_decision": "PASS · SILENT_CONTINUE · normalized=2m"
    },
    {
      "id": "F2_silent_explained_backlog",
      "scenario": "queue_backlog=25m + raw_drift=28m + trigger_7 all NO",
      "expected_decision": "PASS · QUEUE_BACKLOG_EXPLAINED_DRIFT · normalized=3m"
    },
    {
      "id": "F3_warn_normalized",
      "scenario": "queue_backlog=5m + raw_drift=20m + trigger_7 all NO",
      "expected_decision": "WARN · SILENT_CONTINUE_WITH_WARN · normalized=15m"
    },
    {
      "id": "F4_hold_normalized",
      "scenario": "queue_backlog=10m + raw_drift=45m + trigger_7 all NO",
      "expected_decision": "HOLD_FOR_CHAIR · normalized=35m"
    },
    {
      "id": "F5_p3_coalesce_safe",
      "scenario": "queue_backlog=120m 누적으로 P3 observer 3개 겹침 + 전 윈도 trigger_7 all NO",
      "expected_decision": "COALESCED_INTO_SINGLE_CATCH_UP_OBSERVER · skipped_window_count=3 · audit 박제"
    },
    {
      "id": "F6_p1_no_coalesce",
      "scenario": "P3 observer coalesce 진행 중 한 윈도에서 trigger_7 中 1건 fire 신호 감지",
      "expected_decision": "COALESCE_ABORT · 해당 윈도 P1 승격 단독 fire 강제 · 잔여 P3 별도 evaluate"
    }
  ],

  "completion_status_enum_chair_verbatim": [
    "AXIS_3_CANARY_SCALE_AWARE_PREVENTION_GUARD_PACKET_READY (★ 본 marker 완료 상태)",
    "AXIS_3_CANARY_SCALE_AWARE_PREVENTION_GUARD_IMPLEMENTED (★ 후속 task 코드 implementation 완료 시)",
    "AXIS_3_CANARY_SCALE_AWARE_PREVENTION_GUARD_HOLD_FOR_CHAIR (★ 회장 verbatim 보완 필요 시)"
  ],

  "current_status": "AXIS_3_CANARY_SCALE_AWARE_PREVENTION_GUARD_PACKET_READY",

  "dispatch_readiness": {
    "chair_authorization_id_pending": true,
    "executor_candidate_anu_recommendation": "dev6 페룬 (PreToolUse hook canonical 작성자 + Axis 3 canary infra 익숙 · BOT_API_REFUSAL_AT_SPAWN 패키징 정정 후 검증됨) OR dev5 마르둑 (task-2656 safe traffic sample 직 실행 봇 · canary 흐름 컨텍스트 보유)",
    "executor_selection_authority": "회장 verbatim 강제",
    "anu_self_dispatch_forbidden": true,
    "scope_recommendation": "PACKET_TO_TASK_MD_FIRST (★ task-2657 spec 작성만 · code implementation은 회장 추가 결정)"
  },

  "linked_markers": [
    "memory/events/task-2656.chair-3-corrections-verified-260525.json (★ 본 packet의 직 사고 기반)",
    "memory/events/task-2655.axis-3-canary-observer-120m-silent-continue-no-traffic-260524.json (★ intentional rebase 회장 verbatim 박제)",
    "memory/events/task-2656.axis-3-canary-safe-traffic-result-260525.json (T1/T2/T3 결과)",
    "memory/system/.axis_3_canary_session_start_timestamp_260524.json (★ real_t0 단일 박제)",
    "memory/events/canary-monitoring-collector-packet-axis-3-3A287AE0-260524.json (12 필드 monitoring spec · 본 packet의 상위 컨텍스트)"
  ],

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

  "next_action_required_chair_decision_4": [
    "chair_authorization_id verbatim 발행 (★ ANU 임의 생성 0)",
    "executor 선택 (dev6 페룬 OR dev5 마르둑 OR 기타) verbatim 지시",
    "scope 선택 (PACKET_TO_TASK_MD_FIRST OR FULL_IMPLEMENTATION) verbatim 지시",
    "completion 목표 enum 선택 (PACKET_READY OR IMPLEMENTED) verbatim 지시"
  ]
}
