import json, urllib.request, subprocess, sys, pathlib, datetime, os
checkout,home,port,side,sha,output_root=sys.argv[1:]
out=pathlib.Path(output_root)/(side+'-'+datetime.datetime.now(datetime.timezone.utc).strftime('%Y%m%dT%H%M%S'))
out.mkdir()
token=subprocess.check_output(['node','apps/server/src/bin.ts','auth','session','issue','--base-dir',home,'--subject','mcp-client','--token-only'],cwd=checkout,text=True).strip()
workspace=pathlib.Path(home)/'proof-project'
workspace.mkdir(exist_ok=True)
subprocess.run(['git','init','--quiet','--initial-branch=main',str(workspace)],check=True)
(workspace/'README.md').write_text('Synthetic missing-project proof\n')
subprocess.run(['git','-C',str(workspace),'add','README.md'],check=True)
subprocess.run(['git','-C',str(workspace),'-c','user.name=Proof','-c','user.email=proof@example.invalid','commit','--quiet','-m','Synthetic initial commit'],check=True)
subprocess.run(['node','apps/server/src/bin.ts','project','add',str(workspace),'--title','Proof project','--base-dir',home],cwd=checkout,check=True,capture_output=True)
valid_base=subprocess.check_output(['git','-C',str(workspace),'rev-parse','--verify','main'],text=True).strip()
session=None
counter=0
def rpc(method,params):
 global session,counter
 counter+=1
 headers={'Authorization':'Bearer '+token,'Content-Type':'application/json','Accept':'application/json, text/event-stream'}
 if session: headers['Mcp-Session-Id']=session
 payload={'jsonrpc':'2.0','id':counter,'method':method,'params':params}
 req=urllib.request.Request('http://127.0.0.1:'+port+'/mcp',data=json.dumps(payload).encode(),headers=headers)
 with urllib.request.urlopen(req,timeout=120) as r:
  session=r.headers.get('Mcp-Session-Id',session)
  raw=r.read().decode()
  if raw.startswith('event:') or raw.startswith('data:'):
   raw=next(x[6:] for x in raw.splitlines() if x.startswith('data: '))
  return json.loads(raw)
rpc('initialize',{'protocolVersion':'2025-06-18','capabilities':{},'clientInfo':{'name':'launch-proof','version':'1.0'}})
projects=rpc('tools/call',{'name':'t3_project_list','arguments':{}})
results=[]
for label,extra in [('root, supplied model',{'modelSelection':{'instanceId':os.environ['PROOF_INSTANCE'],'model':os.environ['PROOF_MODEL']}}),('root, no model',{}),('worktree, supplied model',{'modelSelection':{'instanceId':os.environ['PROOF_INSTANCE'],'model':os.environ['PROOF_MODEL']},'workspaceStrategy':{'type':'worktree','baseRef':'main','startFromOrigin':False}}),('worktree, no model',{'workspaceStrategy':{'type':'worktree','baseRef':'main','startFromOrigin':False}})]:
 args={'projectId':'current','title':'Missing project proof','message':'Verify missing project diagnosis',**extra}
 result=rpc('tools/call',{'name':'t3_thread_launch','arguments':args})
 results.append({'case':label,'arguments':args,'response':result})
projects=projects['result']['structuredContent']['projects']
assert all(p['id'] != 'current' for p in projects)
for case in results:
 if 'modelSelection' in case['arguments']:
  case['arguments']['modelSelection']={'redacted':'supplied model identifiers omitted'}
record={'validSyntheticMainCommit':valid_base,'currentProjectExists':False,'projectCount':len(projects),'side':side,'commit':sha,'environment':'Real T3 server, loopback HTTP MCP, fresh isolated database, outside-thread MCP client','cases':results}
(out/'transcript.json').write_text(json.dumps(record,indent=2))
print(out)
print(json.dumps(record,indent=2))
