import pathlib,json,csv,sys
from types import SimpleNamespace as N
sys.path.insert(0,'/opt/contextra')
from app.byte_tracking import ByteTracker,TrackingSettings
from app.pose_nms import pose_nms_indices
R=pathlib.Path('/work');C=R/'derived';old=pathlib.Path('/archive/2026-11-02_contextra-user20-pose-cache_r01')
plans=json.loads((R/'phase_preflight.json').read_text());specs={};checks=[]
reference=json.loads((R/'model_reference.json').read_text())['pose']
for key,p in plans.items():
 summary=json.loads((R/'clips'/key/'reports/pose_summary.json').read_text())
 assert summary['engine_sha256']==reference['engine_sha256'] and summary['source_files']==reference['source_files']
 lookup={}
 for base in [old/'clips'/key,R/'clips'/key]:
  raw=base/'inputs/pose_candidates_prefilter.jsonl'
  if not raw.exists():continue
  for line in raw.open():
   x=json.loads(line);f=x['source_frame'];assert f not in lookup
   lookup[f]=(x,str(base/'inputs/frames'/f"{x['sample']:04d}.png"))
 for phase,selected in p['sets'].items():
  k=key+'__'+phase;d=C/'clips'/k/'inputs';d.mkdir(parents=True,exist_ok=True)
  assert not (d/'pose.json').exists()
  tracker=ByteTracker(TrackingSettings(frame_rate=30));rows=[];mapping=[];match=True
  for sample,select in enumerate(selected):
   x,rgb=lookup[select['source_frame']];w,h=x['width'],x['height'];cs=x['candidates']
   assert abs(x['seconds']-select['pts'])<1e-8
   obs=[N(class_id=0,score=z['score'],bbox_xyxy=tuple(v/q for v,q in zip(z['bbox'],[w,h,w,h])),model_key='RFDETRKeypointPreview',frame=N(frame_width=w,frame_height=h),query=z['query']) for z in cs if z['parse_keep']]
   obs=[obs[i] for i in pose_nms_indices(obs,.85)];ids=tracker.update(obs)
   assert {o.query for o in obs}=={z['query'] for z in cs if z['nms_keep']}
   people=[]
   for o,tid in zip(obs,ids):
    z=cs[o.query]
    if phase=='A' and (old/'clips'/key).exists():match=match and tid==z['track_id']
    if z['score']>=.15:people.append({'query':o.query,'score':z['score'],'bbox':z['bbox'],'keypoints':z['keypoints'],'track_id':tid})
   rows.append(dict(sample=sample,source_frame=x['source_frame'],seconds=x['seconds'],width=w,height=h,persons=people,rgb_path=rgb))
   mapping.append(dict(sample=sample,recording_frame=x['source_frame']+p['source'].get('source_clip',{}).get('first',1)-1,pts=x['seconds']))
  assert match,'A Tracking replay mismatch'
  (d/'pose.json').write_text(json.dumps(rows));m=C/'metadata/observation_maps'/f'{k}.csv';m.parent.mkdir(parents=True,exist_ok=True)
  with m.open('w',newline='') as f:wr=csv.DictWriter(f,fieldnames=list(mapping[0]));wr.writeheader();wr.writerows(mapping)
  specs[k]={'input':key,'phase':phase,'observations':len(rows)};checks.append(dict(input=k,samples=len(rows),nms_match=True,baseline_tracking_match=match if phase=='A' and (old/'clips'/key).exists() else None))
(C/'specs.json').write_text(json.dumps(specs));(R/'tracking_validation.json').write_text(json.dumps(checks,indent=2))
print('DERIVED',len(specs),sum(x['observations'] for x in specs.values()),flush=True)
