import json,os,subprocess
from preflight import R,g,HEAD
os.umask(0o077)
assert g.sh(['git','-C',str(g.REPO),'rev-parse','HEAD']).strip()==HEAD
assert not g.sh(['git','-C',str(g.REPO),'diff','--cached','--name-only']).strip()
source=json.loads((R/'source.json').read_text())
assert all(g.sha(g.REPO/p)==h for p,h in source['hashes'].items())
paths=sorted(g.sh(['git','-C',str(g.REPO),'diff','--name-only']).splitlines()+
             g.sh(['git','-C',str(g.REPO),'ls-files','--others','--exclude-standard']).splitlines())
assert len(paths)==9
job='contextra-pose-nms-20260913-211634'
runner='/root/.local/bin/codex-git-closeout'
cmd=[runner,'prepare','--repository',str(g.REPO),'--output',str(R/'git-manifest.json'),
     '--job-id',job,'--profile','ltb1021','--session-alias','work-session',
     '--title','feat(pose): NMS와 관절 설명 연결 및 실제 Runtime 검증',
     '--message','Why=Pose 중복 후보를 억제하고 SDK fixture import 실패를 구분해 실제 서비스 연결을 완결한다.',
     '--message','What=Pose 전용 class-aware IoU NMS, 원본 대응과 Event 참조 보존, Frame 공통 관절 schema 및 분리 집계를 추가했다.',
     '--message','Impact=새 image와 Pose version2 mount 유지. 기존 카메라 설정과 임시 capture/restart는 복원했고 Medium 및 비대상 서비스는 보존했다.',
     '--message','Verify=source/image 각51 tests 및 SDK copy/release PASS. 실제 결과/Redis9.9798FPS, stale/drop0, 동일Frame3쌍, cleanup2.217초. 사용자 NMS 시각 확인은 대기다.',
     '--message','Rollback=필요 시 이 source 변경을 revert하고 private CAS 기록으로 이전 image와 신규 Pose mount만 복원한다. 모델 파일은 삭제하지 않는다.',
     '--verify','source/image51 tests; SDK and Runtime PASS; 3 same-Frame Redis/JPEG pairs; cleanup2.217s; git diff --check PASS']
for p in paths:cmd+=['--path',p]
result=json.loads(subprocess.check_output(cmd,text=True))
batch=json.loads(subprocess.check_output([runner,'batch-prepare','--output',str(R/'git-batch.json'),
    '--batch-id',job,'--profile','ltb1021','--session-alias','work-session','--expected-group-count','1',
    '--repository-label','contextra-analytics','--manifest',str(R/'git-manifest.json'),
    '--expect-plan-hash',result['plan_hash']],text=True))
print(json.dumps(dict(manifest=result,batch=batch)))
