from pathlib import Path
import json,re,zipfile,subprocess
root=Path(__file__).parent
runs={'before':'before-20261110T091858Z','after':'after-20261110T091502Z'}
files=[]
with zipfile.ZipFile(root/'proof-data.zip','w',zipfile.ZIP_DEFLATED) as z:
 for side,folder in runs.items():
  run=root/folder
  log=(run/'server.log').read_text()
  log=re.sub(r'pairingUrl: \S+','pairingUrl: [redacted]',log)
  z.writestr(side+'/server-redacted.log',log)
  # RPC results/received frames contain the environment's private model catalog and auth state.
  actions=[]
  for line in (run/'driver.ndjson').read_text().splitlines():
   e=json.loads(line)
   if e['event'] in ['action','error','ready']:
    if e.get('action')=='eval' and 'WebSocket' in e.get('expression',''):continue
    actions.append(line)
  z.writestr(side+'/driver-actions.ndjson','\n'.join(actions)+'\n')
  for name in ['scenario.ndjson','sequence.ndjson','fake-cli.ndjson','sequence-output.log','browser.log','server-pid.json','recording.json']:
   z.write(run/name,side+'/'+name)
  for row in ['r1','r2','r3']:
   meta=run/(row+'-'+side+'-metadata.json');z.write(meta,side+'/'+meta.name)
   attempt=json.loads(meta.read_text())['attempt']
   for suffix in ['a','b']:
    p=run/(row+'-'+side+f'-raw-{attempt}-{suffix}.png');z.write(p,side+'/'+p.name)
  probe=subprocess.check_output(['ffprobe','-v','error','-show_entries','format=duration:stream=width,height,codec_name','-of','json',str(run/'scenario.webm')],text=True)
  z.writestr(side+'/recording-probe.json',probe)
 z.write(root/'diff-metrics.json','diff-metrics.json')
 z.write(root/'before-video-review.png','before-video-review.png');z.write(root/'after-video-review.png','after-video-review.png')
 z.writestr('capture-friction.txt','Browser harness required initial-route readiness and Video.saveAs on remote connection. An initial 30s networkidle wait timed out during telemetry/build load; final driver allows 120s and every published still waits for idle. Early incomplete fixtures were discarded and fresh homes used. All published evidence uses synthetic data. No native mobile, desktop shell, or Windows runtime was exercised.\n')
for side,folder in runs.items():
 for row in ['r1','r2','r3']:files.append(str(root/folder/(row+'-'+side+'.png')))
for row in ['r1','r2','r3']:
 for suffix in ['diff0','diffT']:files.append(str(root/(row+'-'+suffix+'.png')))
for side,folder in runs.items():
 # Different filenames make upload provenance unambiguous.
 target=root/(side+'-recording.webm');target.write_bytes((root/folder/'scenario.webm').read_bytes());files.append(str(target))
for name in ['claude','browser-driver.cjs','scenario.py','control.py','launch.py','capture.py','run-sequence.py','diff-driver.py','extract-logs.py','continuation-evidence.test.ts','stopping-evidence.test.ts','package-evidence.py','continuation-harness-output.log','stopping-harness-output.log','control-tests-transcript.log','before-log-excerpt.txt','after-log-excerpt.txt','proof-data.zip']:
 files.append(str(root/name))
(root/'upload-files.json').write_text(json.dumps(files,indent=2))
result=subprocess.run(['ghdrop','upload','-m',*files],capture_output=True,text=True,check=True)
(root/'ghdrop-output.md').write_text(result.stdout)
print(result.stdout,end='')
