#!/usr/bin/env python3
"""task-2990-ciwatch ANU 완료 콜백 등록. 내용확정 -> sha256 -> 발사 순서 엄수."""
import hashlib, json, subprocess, sys, datetime

sys.path.insert(0, "/home/jay/workspace")
from dispatch import normal_fallback_callback_helper as m  # noqa: E402

REPORT = "/home/jay/workspace/memory/reports/task-2990-ciwatch.md"
ANU_KEY_FILE = ("/home/jay/.cokacdir/bot_keys/"
                "f392d0e199d4177b4e209bca7fd61066e10056034678934cc2798be054dbcc61.key")

# 1) 내용 확정 후 sha256 (이후 보고서 수정 금지)
digest = hashlib.sha256(open(REPORT, "rb").read()).hexdigest()

summary = ("PR #239 CI 11/11 GREEN(8m03s) -> squash MERGED d09870893cbfdaa7bde17fe588ce6c196159928d. "
           "changed_files 10 == expected_files 10 EXACT(머지전 2회 대조). "
           "forbidden 0건 - supabase/migrations 혼입 없음(task-2991 영역 무침범). "
           "blob sha head 5e991e7 vs merge: 10/10 IDENTICAL, squash 커밋 초과유입 0. "
           "origin/main HEAD == merge sha. 코드수정 0줄(자동수정 금지 준수). "
           "terminal_state=MERGE_READY. "
           "미해결: 프로덕션 미배포(npm run build+배포 별도 필요) / "
           "동의저장 auth metadata 임시수단 정식화는 후속 / "
           "cron 단독실행이라 task-timer 미등록(고스트 아님).")

at = m.build_absolute_at_for_normal_delay(60)

envelope = "\n".join([
    "task_id=task-2990-ciwatch",
    "callback_kind=normal",
    "collector_role=ANU",
    "owner_key=c119085addb0f8b7",
    "chat_id=6937032012",
    "canonical_root=/home/jay/workspace",
    "report_path=" + REPORT,
    "result_path=",
    "sha256=" + digest,
    "summary=" + summary,
    "at=" + at,
    "source_attribution=dev2-team(odin) ci-watch handoff executor",
])

nbytes = len(envelope.encode("utf-8"))
print("envelope bytes:", nbytes, "sha256:", digest[:12])
if nbytes > 3900:
    print("ABORT: envelope over 3900 bytes")
    sys.exit(1)

d = m.launch_callback(
    kind="normal",
    task_id="task-2990-ciwatch",
    executor_key="fedf78d1d09509f5",   # dev2 self key
    owner_key="c119085addb0f8b7",       # ANU
    chat_id="6937032012",
    prompt=envelope,
    at=at,
    canonical_root="/home/jay/workspace",
)
print("status:", getattr(d, "status", d))
argv = getattr(d, "argv", None)
if not argv:
    print("ABORT: argv None (fail-closed)")
    sys.exit(2)

# --key <값> -> --key-file 치환 (프로세스 목록 키 노출 방지)
safe = []
i = 0
while i < len(argv):
    if argv[i] == "--key":
        safe += ["--key-file", ANU_KEY_FILE]
        i += 2
    else:
        safe.append(argv[i])
        i += 1

print("firing:", " ".join(x if not x.startswith("c1190") else "<redacted>" for x in safe)[:400])
p = subprocess.run(safe, capture_output=True, text=True, timeout=120)
print("rc:", p.returncode)
print("stdout:", p.stdout.strip()[:800])
print("stderr:", p.stderr.strip()[:400])

out = {}
try:
    out = json.loads(p.stdout.strip().splitlines()[-1])
except Exception:
    pass

rec = {
    "schema": "utils.anu_callback_registrar.v2",
    "task_id": "task-2990-ciwatch",
    "executor_name": "dev2-team",
    "report_path": REPORT,
    "result_path": "",
    "registration_intent": True,
    "registration_attempted": True,
    "registration_result_status": "REGISTERED" if out.get("status") == "ok" else "UNCONFIRMED",
    "delivery_method": "anu_cron_callback",
    "collector_role": "ANU",
    "anu_key": "c119085addb0f8b7",
    "commit_sha": "d09870893cbfdaa7bde17fe588ce6c196159928d",
    "pr_number": 239,
    "terminal_state": "MERGE_READY",
    "report_sha256": digest,
    "cron_schedule_id": out.get("id", ""),
    "envelope_utf8_bytes": nbytes,
    "registered_at_ts": datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"),
    "callback_schedule_created": False,
}
path = "/home/jay/workspace/memory/events/anu_callback/task-2990-ciwatch-normal-completion.json"
open(path, "w").write(json.dumps(rec, ensure_ascii=False, indent=2))
print("record:", path)
