"""Sequential GPU queue; any failed experiment stops the queue without retry."""
import argparse,json,pathlib,subprocess,time
ROOT=pathlib.Path(__file__).resolve().parent
PYTHON='/mnt/stephen/research_data/math_rlvr/.venv/bin/python'

def main():
 ap=argparse.ArgumentParser();ap.add_argument('--contract',default='notes/stable_contextual_contract.json');a=ap.parse_args();c=json.loads((ROOT/a.contract).read_text());state=ROOT/c['queue_state'];jobs=[]
 for arm in c['arms']:
  for chunk in range(c['chunks'][arm]):jobs.append(('train',arm,chunk))
 for arm in ['W']+c['arms']:
  for chunk in range(2):jobs.append(('eval',arm,chunk))
 history=[];start=time.time()
 for stage,arm,chunk in jobs:
  folder=ROOT/c['output']/(arm if stage=='train' else 'eval_'+arm);summary=folder/f'chunk{chunk}_summary.json'
  if summary.exists():
   report=json.loads(summary.read_text());assert report['status']=='COMPLETE';history.append({'stage':stage,'arm':arm,'chunk':chunk,'status':'already_complete'});continue
  script='code/train_stable_contextual_rl.py' if stage=='train' else 'code/eval_stable_contextual_native.py'
  log=ROOT/'logs'/f'stable_contextual_{stage}_{arm}_{chunk}.log';assert not log.exists(),f'Prior attempted job requires manual inspection: {log}'
  job={'stage':stage,'arm':arm,'chunk':chunk,'started':time.time(),'log':str(log.relative_to(ROOT))}
  state.write_text(json.dumps({'status':'RUNNING','active':job,'completed':history,'started':start},indent=2))
  with log.open('x') as output:
   result=subprocess.run([str(ROOT/'gpu-run'),'--',PYTHON,script,'--contract',a.contract,'--arm',arm,'--chunk',str(chunk)],cwd=ROOT,stdout=output,stderr=subprocess.STDOUT)
  job.update(returncode=result.returncode,ended=time.time(),elapsed_seconds=time.time()-job['started'])
  if result.returncode!=0 or not summary.exists():
   job['status']='FAILED';state.write_text(json.dumps({'status':'FAILED','active':job,'completed':history},indent=2));raise SystemExit(result.returncode or 2)
  report=json.loads(summary.read_text());assert report['status']=='COMPLETE';job['status']='COMPLETE';history.append(job)
  print(json.dumps(job),flush=True)
 state.write_text(json.dumps({'status':'ENDPOINTS_COMPLETE','completed':history,'started':start,'ended':time.time()},indent=2))
 log=ROOT/'logs/stable_contextual_final_analysis.log'
 with log.open('x') as output:result=subprocess.run([PYTHON,'code/analyze_stable_contextual_rl.py','--contract',a.contract],cwd=ROOT,stdout=output,stderr=subprocess.STDOUT)
 state.write_text(json.dumps({'status':'COMPLETE' if result.returncode==0 else 'ANALYSIS_FAILED','completed':history,'analysis_returncode':result.returncode,'started':start,'ended':time.time()},indent=2))
 raise SystemExit(result.returncode)
if __name__=='__main__':main()
