import hashlib
import json
import os
import re
from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo

ROOT = Path(__file__).resolve().parents[1]
REPO = Path('/workspace/contextra-analytics-runtime-lifecycle-refactor')
DOC = REPO / 'docs/profiles/ltb1021/topics/runtime-lifecycle/analysis/20261101T143020+0900-analysis-camera24-event-rearm-and-tracking.md'
OWNER = DOC.parent.parent / 'README.ko.md'
os.umask(0o077)
now = datetime.now(ZoneInfo('Asia/Seoul')).isoformat(timespec='seconds')
assert 'analysis/' + DOC.name in OWNER.read_text()
for link in re.findall(r'\]\(([^)]+)\)', OWNER.read_text()):
    if DOC.name in link:
        assert (OWNER.parent/link).is_file()
items = []
for path in sorted(ROOT.rglob('*')):
    if path.is_file() and '__pycache__' not in path.parts and path.name != 'manifest.json':
        path.chmod(0o600)
        items.append(dict(path=str(path.relative_to(ROOT)), size_bytes=path.stat().st_size,
                          sha256=hashlib.sha256(path.read_bytes()).hexdigest()))
manifest = dict(schema_version='codex.artifact-manifest.v1', created_at=now,
    profile='ltb1021', project='contextra', task='camera24-event-silence', run_id=ROOT.name,
    lifecycle='durable-large', cleanup_candidate_at='manual-review', files=items,
    report=str(DOC), report_sha256=hashlib.sha256(DOC.read_bytes()).hexdigest(),
    operational_changes=[], synthetic_probe_only=True)
(ROOT/'shared/manifest.json').write_text(json.dumps(manifest,ensure_ascii=False,indent=2)+'\n')
receipt_root = Path('/tmp/codex/ltb1021') / ROOT.name
receipt_root.mkdir(parents=True, exist_ok=True, mode=0o700)
receipt = dict(schema_version='ltb1021.codex_hub.report_receipt.v1',
    receipt_id='20261101-camera24-event-silence-r01', timestamp=now, session_alias='work-session',
    task='camera24 후속 Event 미발급 원인 및 Tracker frame_rate 차이 기록',
    results=['같은 run 약18분 Event1건, 후속 빨강은 최초 ID 유지. 외부cooldown 차단0으로 AI episode 재무장 지점 확인.',
             '최초 Event 아티팩트READY/SENT HTTP200과 Web AI_EVENT row576376 및 두 미디어 존재 교차 확인.',
             '설치 supervision0.30.2의 lost-track 공식 확인: frame_rate10/30은 실제10FPS에서 약1초/3초 보관 차이.',
             'Owner와 분석 문서에 FIGHT-EVENT-REARM-01, DIAG-01, TRACK-CADENCE-01 후속 항목 기록.', str(DOC)],
    verify=['실제6source SHA256 일치, 동일run/Frame 순서/빨강 Event 참조 검증.',
            'synthetic Episode3사례 통과; 600초 혼합관측의 장기잠금 경로와 정상quiet/만료 재무장 구분.',
            '문서 링크와 git diff --check. 운영 설정/서비스/채널/모델/실제 Event 변경 없음.'],
    commits=[], remaining=['R5 판정과 분리한 재무장/지속 사건 재알림 정책 합의 및 구현 필요.',
                           '개별quiet 탈락 원인 진단과 Tracker 보관시간 동일입력 비교는 보류.',
                           '브라우저 과거 팝업 자체는 미검증.'])
receipt_path = receipt_root/'receipt.json'
receipt_path.write_text(json.dumps(receipt,ensure_ascii=False,indent=2)+'\n')
receipt_path.chmod(0o600)
print(json.dumps({'files':len(items),'receipt':str(receipt_path),'report':str(DOC)}))
