from ops import *
import datetime,re
job='20260926-contextra-provider-freshness-r01'
assert cmd(['git','-C',str(REPO),'rev-parse','HEAD']).strip()=='15a96ad066b5ed17e7cdfad6d0663897862201ec'
assert not cmd(['git','-C',str(REPO),'diff','--cached','--name-only']).strip()
paths=sorted(set(cmd(['git','-C',str(REPO),'diff','--name-only']).splitlines()+cmd(['git','-C',str(REPO),'ls-files','--others','--exclude-standard']).splitlines()))
assert len(paths)==13
cmd(['git','-C',str(REPO),'diff','--check'])
for p in paths:
    if not p.endswith('.md'):continue
    for target in re.findall(r'\]\(([^)]+)\)',(REPO/p).read_text()):
        if '://' not in target and not target.startswith('#'):assert ((REPO/p).parent/target.split('#')[0]).exists(),target
image=json.loads((HERE/'image-01df389ca6.json').read_text())
for p,h in image['hashes'].items():assert hashlib.sha256((REPO/p).read_bytes()).hexdigest()==h
final=json.loads((HERE/'final-state.json').read_text())
assert final['stopped']==36 and not final['provider_pids'] and final['gateway']=='stopped'
for mode,levels in [('on-r2',[4]),('off',[1,2,4])]:
    trial=json.loads((HERE/mode/'trial-result.json').read_text())
    assert trial['cleanup']['reaped']
    assert [s['level'] for s in trial['stages'] if s['status']=='PASS']==levels
    for lane in json.loads((HERE/mode/'lanes-v2.json').read_text()):
        assert lane['completed']-lane['late']==lane['accepted']
        for d in lane['durations'].values():assert d['count']==sum(d['histogram']) and min(d['histogram'])>=0
artifacts=json.loads((HERE/'artifact-evidence.json').read_text())
save('verification.json',dict(cpu_tests=83,python='3.12',baseline_failure='test_pose_path.PoseTest.test_plan_and_noop also fails in previous image',
    first_runtime_error='gate.complete scope fixed; final-image regression and ON4/OFF1,2,4 validated',
    completed=dict(on=[4],off=[1,2,4]),unmeasured=[8,16,17],
    blocker='steady stall then startup cancellation worker_join/forced cleanup',
    artifacts={s:sum(a['state']==s for a in artifacts) for s in ('READY','FAILED','EXPIRED')},
    final=final,files=paths,portfolio='MEDIUM; runtime expansion and browser acceptance pending'))
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='Provider capture 크기와 freshness ON/OFF 비교 및 구간 계측',
 results=['캡처 크기 정합과 bounded freshness Off/초기10초 grace/전송 및 전처리 구간 계측 구현',
 '최종83PASS;ON4/OFF1,2,4 측정;OFF는응답폐기0이나4채널완료량감소',
 'OFF8 확장 중 steady stall 및 기동취소 회수 실패;8 steady/16/17 미실행',
 '자연Artifact226중READY166/FAILED19/EXPIRED41;decoder 변경 없음'],
 verify=['source/image hash, numeric histogram/counter, docs links and diff checks',
 '전체provider회수/36stopped/모델READY/Artifact HTTP On;시험설정복귀/freshnessOn,Gateway안전보류'],
 commits=[],remaining=['기동 중 Stop 회수 및 steady stall 안전 재개 경계','고부하 처리량/Artifact 병렬 실패와 Web 수용 미완료'])
save('report-receipt.json',receipt)
print(cmd(['codex-report-receipt','--profile','ltb1021','--session-alias','work-session','--receipt',str(HERE/'report-receipt.json')]))
out=Path('/tmp/codex/ltb1021/git-closeout')/job;out.mkdir(mode=0o700);mf=out/'manifest.json'
args=['codex-git-closeout','prepare','--repository',str(REPO),'--output',str(mf),'--job-id',job,
 '--profile','ltb1021','--session-alias','work-session',
 '--title','feat(runtime): 캡처 크기 정합과 freshness 비교 경로 추가',
 '--message','Why=provider-process 처리량과100ms폐기의 영향을 분리하고 불필요한 중간 영상 비용을 줄일 필요가 있었다.',
 '--message','What=전처리설정 기반capture크기,단일provider Off의claimed Frame보호,초기grace10초,전처리/송신 계측을 추가했다.',
 '--message','Impact=운영freshnessOn/100ms,steady2초,JPEGOff.모델/instance/batch/FPS/decoder/외부스키마/공통writer는보존한다.시험Off는명시적옵션이며무제한backlog가아니다.',
 '--message','Verify=최종Python3.12표적83PASS.ON4와OFF1/2/4측정.첫callback gate메서드배치오류는수정후재검증.기존Pose planner기대값1건은이전image에서도실패.8확장steady stall/기동중Stop회수실패로16/17미실행.',
 '--message','Rollback=이전image/config와실패증거를보존한다.자동rollback없음.최종동일수정image/36stopped/모델READY/ArtifactOn,GatewayWSS안전보류.재개전기동취소회수검토필요.',
 '--verify','83 targeted PASS; source/image, diff/link and histogram sanity; ON4/OFF1,2,4 measured',
 '--verify','OFF8 warmup failed,16/17 NOT RUN;all provider PIDs reaped,settings restored,Gateway safety hold',
 '--expires-in-seconds','86400']
for p in paths:args+=['--path',p]
print(cmd(args));batch=out/'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']))
h=json.loads(batch.read_text())['plan_hash']
print(cmd(['codex-git-closeout','batch-plan','--batch-manifest',str(batch),'--expect-batch-plan-hash',h]))
print(cmd(['codex-git-closeout','batch-present','--batch-manifest',str(batch),'--expect-batch-plan-hash',h]))
