import datetime
import json
import os
from pathlib import Path
import subprocess

os.umask(0o077)
HERE=Path(__file__).parent
REPO=Path('/workspace/contextra-analytics-runtime-lifecycle-refactor')
JOB='20260918-contextra-web-start-reflected-r01'
ROOT=Path('/tmp/codex/ltb1021/git-closeout')/JOB
ROOT.mkdir(mode=0o700)
def cmd(args):
    result=subprocess.run(args,text=True,capture_output=True,timeout=90)
    if result.returncode:raise RuntimeError(result.stdout+result.stderr)
    return result.stdout
def save(path,value):
    with path.open('x') as f:json.dump(value,f,indent=2,ensure_ascii=False)
paths=cmd(['git','-C',str(REPO),'diff','--name-only']).splitlines()+cmd(['git','-C',str(REPO),'ls-files','--others','--exclude-standard']).splitlines()
assert len(paths)==2 and not cmd(['git','-C',str(REPO),'diff','--cached','--name-only']).strip()
cmd(['git','-C',str(REPO),'diff','--check'])
ready=json.loads((HERE/'ready.json').read_text())
save(Path('/workspace/contextra-runtime-config/web-start-candidate-20260918/activated-20260918.json'),
    dict(image=ready['image'],compose_command=ready['compose_command'],at=ready['at'],
         artifact_enabled=True,monitoring_started=False,autostart_performed=False))
receipt=dict(schema_version='ltb1021.codex_hub.report_receipt.v1',receipt_id=JOB,
    timestamp=datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9))).isoformat(),
    session_alias='work-session',task='Contextra 신규 등록 후보 반영 후 관측 대기',
    results=['실행 채널 정상 Stop/reap 뒤 준비된 Analytics image/template/Artifact On을 반영했다.',
             '공유서비스와 모델 mount를 보존하고 자동 재Start하지 않았다.',
             '사용자 최신 요청에 따라 실제 Web 시험과 최대30분 모니터링은 시작하지 않았다.'],
    verify=['readiness PASS; 등록18개 stopped, Artifact worker8 idle.',
            '기존969건 보존 및 전송시도합92 불변; 만료45건 예약 반환 후 예약0.'],
    commits=[],remaining=['사용자 시험 시작 요청 후 실제 Web Start/Stop/Event 관측'])
save(HERE/'report-receipt.json',receipt)
print(cmd(['codex-report-receipt','--profile','ltb1021','--session-alias','work-session','--receipt',str(HERE/'report-receipt.json')]))
mf=ROOT/'manifest.json'
args=['codex-git-closeout','prepare','--repository',str(REPO),'--output',str(mf),'--job-id',JOB,
    '--profile','ltb1021','--session-alias','work-session',
    '--title','docs(web-start): 후보 반영과 모니터링 대기 상태 기록',
    '--message','Why=승인된 후보 반영 결과와 최신 사용자 요청으로 보류한 실제시험 범위를 구분한다.',
    '--message','What=기존 채널 정상 Stop/reap, 새 Analytics/template/Artifact On, 활성 Compose 조합과 관측 대기를 기록했다.',
    '--message','Impact=기본 채널 자동 재Start와 모니터링을 수행하지 않았다. 공유서비스와 모델은 보존했다.',
    '--message','Verify=readiness PASS, 등록18개 stopped, worker8 idle. 기존969건/전송시도합92 유지와 만료45건 예약 반환 확인. 실제 Web 시험 미실행.',
    '--message','Rollback=자동 rollback 없음. 실제 활성 env/overlay와 상태는 private 원장에 보존했다.',
    '--verify','Normal Stop/reap, readiness/template/Artifact On PASS; shared containers and model mounts preserved',
    '--verify','No automatic Start or monitoring; old delivery attempts unchanged; git diff --check PASS',
    '--expires-in-seconds','86400']
for p in sorted(paths):args+=['--path',p]
print(cmd(args))
batch=ROOT/'batch.json'
print(cmd(['codex-git-closeout','batch-prepare','--output',str(batch),'--batch-id',JOB,
    '--profile','ltb1021','--session-alias','work-session','--expected-group-count','1',
    '--repository-label','contextra-analytics','--manifest',str(mf),
    '--expect-plan-hash',json.loads(mf.read_text())['plan_hash'],'--expires-in-seconds','86400']))
print('BATCH_HASH',json.loads(batch.read_text())['plan_hash'])
