"""Approved twenty clips; isolated first inference, complete RGB transfer."""
import sys,pathlib,json,csv,shutil,datetime
R=pathlib.Path(__file__).resolve().parent.parent
B=R.parent
OLD=B/'2026-10-29_contextra-self-filming-pose-cache_r01'
sys.path.insert(0,str(OLD/'helpers'))
import control as c
from sampling import make_plan
c.ROOT=R;c.REMOTE='/storage/contextra/experiments/action-model-eval/2026/'+R.name;c.PREFIX='contextra-user20-pose-1102-'
S=B/'2026-11-02_contextra-channel-segments-20clips_r01'
P=S/'Contextra_User_Segments_20'
R.joinpath('reports').mkdir(exist_ok=True)
assert not (R/'specs.json').exists(),'Resume individual stages; never rerun preparation'
c.resources(gpu=True,starting=True);c.exclusive_gpu()
assert shutil.disk_usage('/').free>=15*1024**3 and shutil.disk_usage(R).free>=30*1024**3
for name in ('pose.py','plan.py','sampling.py','verify_cache.py','verify_extra.py'):
 s=(OLD/'helpers'/name).read_text()
 if name=='pose.py':s=s.replace('TrackingSettings(frame_rate=10)','TrackingSettings(frame_rate=30)')
 (R/'helpers'/name).write_text(s)
shutil.copy2(OLD/'model_reference.json',R/'model_reference.json')
ref=json.loads((R/'model_reference.json').read_text())
assert c.checked(['sha256sum',c.ENGINE+'/model.plan'],sudo=True).decode().split()[0]==ref['pose']['engine_sha256']
for name,h in ref['pose']['source_files'].items():assert c.checked(['docker','exec',c.PROD,'sha256sum','/opt/contextra/app/'+name]).decode().split()[0]==h
m=json.loads((S/'manifest.json').read_text());specs={}
for clip in m['clips']:
 key=clip['id'];src=P/'Unmarked_Clips'/f'{key}_original.mp4'
 with (P/'Frame_Maps'/f'{key}.csv').open(encoding='utf-8-sig') as f:rows=list(csv.DictReader(f))
 plan=make_plan([float(x['clip_pts_seconds']) for x in rows],None)
 specs[key]=dict(name=clip['name'],local_source=str(src),remote_source='/storage/contextra/experiments/action-model-eval/2026/'+S.name+'/Contextra_User_Segments_20/Unmarked_Clips/'+src.name,sha256=c.digest(src),display_bounds=None,known_loop_boundaries=[],cache=c.REMOTE+'/clips/'+key,reused=False,expected_samples=len(plan['target_seconds']),source_clip=clip)
assert len(specs)==20
c.save(R/'specs.json',specs)
c.checked(['test','!','-e',c.REMOTE]);c.checked(['mkdir',c.REMOTE],sudo=True);c.checked(['chown','si:si',c.REMOTE],sudo=True)
for key in specs:c.checked(['mkdir','-p']+[c.REMOTE+'/clips/'+key+'/'+d for d in ('inputs','reports','pose_models/RFDETRKeypointPreview/8')])
c.scp(R/'helpers','si@58.233.207.31:'+c.REMOTE+'/')
for n in ('specs.json','model_reference.json'):c.scp(R/n,'si@58.233.207.31:'+c.REMOTE+'/')
c.snapshot('before')
done=[]
try:
 for key,s in specs.items():
  for stage in ('plan','pose','verify_cache','verify_extra'):c.trial(stage,key)
  dest=R/'clips'/key;dest.mkdir(parents=True)
  c.scp('si@58.233.207.31:'+s['cache']+'/inputs',dest)
  c.scp('si@58.233.207.31:'+s['cache']+'/reports',dest)
  hashes=json.loads((dest/'reports/cache_hashes.json').read_text())['files']
  for rel,h in hashes.items():assert c.digest(dest/rel)==h,rel
  assert json.loads((dest/'reports/compatibility.json').read_text())['samples']==s['expected_samples']
  shutil.copy2(P/'Frame_Maps'/f'{key}.csv',dest/'recording_frame_map.csv')
  done.append(key)
  c.save(R/'checkpoint.json',dict(stage='FIRST_GATE_PASS' if len(done)==1 else 'CACHE_TRANSFER',completed=done,expected=len(specs),rgb_local=True,tracker_frame_rate=30,observation_fps=10))
  print('COMPLETE_WITH_RGB',len(done),key,flush=True)
finally:c.snapshot('after')
c.save(R/'catalog.json',dict(clips=specs,completed=done,observations=sum(s['expected_samples'] for s in specs.values()),rgb_local=True,rgb_remote=True,tracker_frame_rate=30,observation_fps=10,engine_evaluation=False))
print('ALL_CACHE_READY',len(done),flush=True)
