{
  "schema": "callback_registration_status_snapshot_mismatch.v1",
  "ts_kst": "2026-05-23 20:05 KST",
  "status": "NON_BLOCKING_HARDENING_FINDING_RECORDED",
  "classification": "CALLBACK_REGISTRATION_STATUS_SNAPSHOT_MISMATCH",
  "scope_note": "task-2642 envelope payload 의 registration_status=NOT_REGISTERED 와 실제 callback 도착 사실의 불일치. callback 이 실제 도착했으므로 task-2642 lifecycle 실패 아님. non-blocking · 후속 hardening candidate.",
  "chair_directive_verbatim_260523": "envelope payload의 registration_status=NOT_REGISTERED와 실제 callback 도착 사실의 불일치는 'non-blocking hardening finding'으로 박제하라. 단, callback이 실제 도착했으므로 현재 task-2642 lifecycle을 실패로 보지는 않는다. 이 finding은 registry snapshot timing 문제인지, callback registrar emit 순서 문제인지, result.json 작성 시점 문제인지 후속 hardening candidate로 분리하라.",
  "observed_artifact": {
    "task": "task-2642",
    "main_dispatch_schedule_id": "DFC7DB5A",
    "envelope_registration_status_field": "NOT_REGISTERED",
    "실_callback_도착": true,
    "collector_receipt_status": "CONFIRMED",
    "lifecycle_outcome": "정상 도착 (회장 인정)"
  },
  "후보_root_cause_옵션_3종": [
    {
      "id": "H1",
      "name": "registry snapshot timing 문제",
      "hypothesis": "envelope 생성 시점에 registrar internal state 가 아직 REGISTERED 로 transition 안 됨. registrar emit 보다 envelope serialization 이 먼저 일어남.",
      "verification_hint": "registrar.register() 호출 ts vs envelope.write() 호출 ts 비교. registrar transaction commit 전 envelope read 가능성.",
      "remediation_direction": "envelope build 전 registrar.await_committed() 또는 registration_status read-after-commit barrier 도입"
    },
    {
      "id": "H2",
      "name": "callback registrar emit 순서 문제",
      "hypothesis": "registrar.register() 가 cron 발사 후 status update 를 emit 하는 구조. 즉 register-then-emit 이 아니라 emit-then-register 또는 register-no-status-update.",
      "verification_hint": "anu_callback_registrar.register() 코드 흐름 검토 — status field update 가 emit 후인지 전인지. emit-after-status vs status-after-emit.",
      "remediation_direction": "register-after-update 패턴 적용 (task-2635+1 envelope drift 박제와 동일 정정 — 동일 root cause 가능성)"
    },
    {
      "id": "H3",
      "name": "result.json 작성 시점 문제",
      "hypothesis": "봇 finalize 시 result.json 을 envelope build 보다 먼저 작성. registrar status 가 envelope build 시점에는 REGISTERED 였으나 result.json snapshot 시점에는 캐시된 NOT_REGISTERED.",
      "verification_hint": "result.json 생성 ts vs envelope build ts vs registrar status update ts 3개 비교. result.json snapshot 의 캐시 출처 확인.",
      "remediation_direction": "result.json 작성 시 registrar live status re-fetch (cache 사용 0) 또는 envelope serialization 와 result.json 작성 atomic transaction 묶기"
    }
  ],
  "관련_선행_사고": [
    "task-2635+1 envelope drift (registration_status=NOT_REGISTERED but cron_schedule_id=8A9EB65E · register-after-update 패턴 정정 적용)",
    "task-2634 NORMAL_CALLBACK_NOT_REGISTERED (envelope 정확 but cron 발사 0 · sendfile 만 — 별개 root cause)"
  ],
  "선행_사고와_차이": {
    "task_2635+1": "registration_status=NOT_REGISTERED + cron 실제 발사됨 → 동일 패턴 (register-after-update 정정 필요)",
    "task_2642": "registration_status=NOT_REGISTERED + callback 실제 도착 → 동일 패턴 추정 (H2 가능성 ↑)",
    "task_2634": "sendfile 만 + cron 발사 0 → 별개 root cause (dispatch entrypoint 결선 0 · task-2640 으로 해소)"
  },
  "post_task_2640_결선_status": {
    "validate_spawn_callback_contract_active_at_main": "0e172435 (PR #144 merge 후 origin/main)",
    "본_finding_과의_관계": "spawn contract validator 는 self-check (executor_key != anu_key) 검증이라 본 mismatch (status field accuracy) 와 직교"
  },
  "chair_decision_pending": [
    "후속 hardening task 발행 여부 (현재 non-blocking)",
    "옵션 H1/H2/H3 중 우선 검토 순서",
    "task-2642 real PR activation gate 후 재발 가능성 평가 (real PR lifecycle 적용 시 register-after-update 더 엄격하게 필요)"
  ],
  "non_blocking_classification_reason": [
    "callback 실제 도착 = collector_receipt_status CONFIRMED",
    "envelope 5축 외 4축 (delivery_outcome / miss_cause / root_cause_tags / canonical_root) 정상",
    "회장 verbatim '실패로 보지 않는다' 명시",
    "task-2642 mock/regression PASS 영향 0"
  ],
  "isolation_from_pr_activation": {
    "isolation_status": "독립 기록 · task-2642 본 lifecycle 정상 + real PR activation gate (별도 회장 결정) 와 분리",
    "본_파일_역할": "non-blocking hardening finding 박제만"
  },
  "related": [
    "task_2641_OWNER_GEMINI_TRIGGER_ROUTER_MERGED_260523.json",
    "feedback_normal_callback_not_registered_variant_260523.md",
    "feedback_callback_self_key_helper_not_wired_260521.md",
    "project_callback_lifecycle_2axis_schema_260522.md",
    "task-2635+1 envelope drift 관련 메모리 (선행 register-after-update 정정)"
  ]
}
