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

REPO=Path('/workspace/contextra-analytics-runtime-lifecycle-refactor')
HERE=Path(__file__).parent
JOB='20260918-contextra-secure-handoff-r01'
ROOT=Path('/tmp/codex/ltb1021/git-closeout')/JOB
os.chmod(HERE,0o700)
ROOT.mkdir(mode=0o700,parents=True,exist_ok=True)

def cmd(args):
    p=subprocess.run(args,text=True,capture_output=True,timeout=90)
    if p.returncode:raise RuntimeError(p.stdout+p.stderr)
    return p.stdout

assert not cmd(['git','-C',str(REPO),'diff','--cached','--name-only']).strip()
paths=cmd(['git','-C',str(REPO),'diff','--name-only']).splitlines()
paths+=cmd(['git','-C',str(REPO),'ls-files','--others','--exclude-standard']).splitlines()
assert len(paths)==4 and all(p.endswith('.md') for p in paths)
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 WSS 최소 연동 합의와 compaction 재개 계약 문서화',
    results=['현재 local을 기준으로 최소 WSS와 인증 책임, 보류 action 및 접수 SUCCESS 합의를 보존했다.',
             '로그인 복구 및 연결 상한 합의와 실제 미반영 상태, 최초 연결 준비물을 구분했다.',
             '과거 PR 재확보와 완료된 내부 시험을 반복하지 않도록 Owner와 인수 문서를 갱신했다.'],
    verify=['Markdown 4개만 변경, 로컬 링크213개와 git diff --check PASS.',
            '읽기 전용 확인에서 두 채널 running 및 Artifact Off/HTTP On 유지. Runtime 변경과 성능 재시험 없음.'],
    commits=[],remaining=['실제 관제 연결 정보/인증서 준비와 최소 WSS 및 자동 로그인 복구 구현 대기.'])
rp=HERE/'report-receipt.json'
with rp.open('x') as f:json.dump(receipt,f,indent=2,ensure_ascii=False)
rp.chmod(0o600)
print(cmd(['codex-report-receipt','--profile','ltb1021','--session-alias','work-session','--receipt',str(rp)]))
print(cmd(['python3','/workspace/users/root/codex-ops-docs/servers/test/users/ltb1021/portfolio_logs/scripts/create_portfolio_candidate.py',
    '--run-dir',str(HERE),'--confidence','MEDIUM','--repo','contextra-analytics',
    '--track-key','contextra-analytics:ops:deployment:reproducible-deployment','--closeout-job',JOB,
    '--evidence-state','design_locked','--confidentiality','internal',
    '--reason','최소 WSS 인증 연동 방향 잠금이며 신규 구현과 외부 연동은 대기',
    '--verify','문서 변경 범위 및 로컬 링크 검사 PASS; Runtime 변경 없음']))
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(secure-bridge): 최소 WSS 합의와 compaction 재개 계약 보존',
    '--message','Why=질답에서 확정한 인증 역할과 구현 대기 상태가 compaction 뒤 혼동되거나 반복 조사되지 않도록 한다.',
    '--message','What=SECUREBRIDGE-03에 얇은 Sidecar, REST 접수 응답, WSS bootstrap, 로그인 복구와 연결 상한 및 최초 접속 준비물을 잠그고 Owner와 인수 문서를 연결했다.',
    '--message','Impact=문서만 변경했다. WSS와 새 복구 정책 및 상한은 구현 대기로 유지하며 현재 두 채널과 Artifact Off 상태를 변경하지 않았다.',
    '--message','Verify=Markdown 4개와 로컬 링크213개 확인 및 git diff --check PASS. 읽기 전용 Runtime 상태 확인만 수행했다.',
    '--message','Rollback=문서 이전 상태는 Git history에서 확인할 수 있다. 자동 복원이나 Runtime 재설정은 수행하지 않았다.',
    '--verify','4 Markdown files only; 213 local links PASS',
    '--verify','git diff --check PASS; current source/runtime unchanged',
    '--expires-in-seconds','86400']
for path in sorted(paths):args+=['--path',path]
print(cmd(args))
manifest=json.loads(mf.read_text())
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',manifest['plan_hash'],'--expires-in-seconds','86400']))
value=json.loads(batch.read_text())
print('Batch keys:',list(value))
