import sys,pathlib,json,shutil
R=pathlib.Path(__file__).resolve().parent.parent
sys.path.insert(0,str(R.parent/'2026-10-29_contextra-self-filming-pose-cache_r01/helpers'))
import control as c
c.ROOT=R;c.REMOTE='/storage/contextra/experiments/action-model-eval/2026/'+R.name;c.PREFIX='contextra-user20-pose-1102-'
specs=json.loads((R/'specs.json').read_text());done=[]
c.scp(R/'model_reference.json','si@58.233.207.31:'+c.REMOTE+'/')
try:
 for key,s in specs.items():
  for stage,marker in [('plan','inputs/sampling_plan.json'),('pose','inputs/pose.json'),('verify_cache','reports/cache_validation.json'),('verify_extra','reports/compatibility.json')]:
   if c.run(['test','-f',s['cache']+'/'+marker]).returncode==0:continue
   c.trial(stage,key)
  dest=R/'clips'/key;dest.mkdir(parents=True,exist_ok=True)
  for folder in ('inputs','reports'):c.scp('si@58.233.207.31:'+s['cache']+'/'+folder,dest)
  for rel,h in json.loads((dest/'reports/cache_hashes.json').read_text())['files'].items():assert c.digest(dest/rel)==h,rel
  assert json.loads((dest/'reports/compatibility.json').read_text())['samples']==s['expected_samples']
  src=R.parent/'2026-11-02_contextra-channel-segments-20clips_r01/Contextra_User_Segments_20/Frame_Maps'/f'{key}.csv'
  shutil.copy2(src,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=20,rgb_local=True,tracker_frame_rate=30,observation_fps=10))
  print('COMPLETE_WITH_RGB',len(done),key,flush=True)
finally:
 c.snapshot('after_resume')
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)
