main
John Lauer Corrected Astra ESC routing: native zero-open result, full accounting and voiceover handoff a80479d 23d ago
from bridge import *
import threading
wi=call('kicad_window_info',{});hwnd=next(x['hwnd'] for x in wi['data']['editors'] if pathlib.Path(B).stem in x['title'])
st=call('kicad_routing_state',{'filePath':B});assert st.get('success') and not st['segments'] and not st['vias'];rev=st['revision']
rec=call('desktop_record_start',dict(monitor=0,audio=False,fps=30,reason='Astra routing the ESC G431',maxDurationMs=1800000));assert rec.get('recordingId'),rec
(D/'evidence/final-recording-start.json').write_text(json.dumps(rec,indent=2));print('RECORDING',rec['recordingId'],flush=True)
start=time.monotonic();stop=threading.Event();label='Corrected take | 0 tracks, 0 vias | Shared placement and inner planes'
def clock_caption():
 while not stop.is_set():
  call('desktop_caption',dict(id='astra-esc-routing',text=f'Astra | {time.monotonic()-start:06.1f} s | {label}',size='small',position='bottom',duration=15000,reason='John requested a visible real-time ESC routing recording'))
  stop.wait(.12)
t=threading.Thread(target=clock_caption);t.start();accepted=[];rejected=[]
try:
 time.sleep(8)
 (D/'evidence/final-opening-screenshot.json').write_text(json.dumps(call('desktop_screenshot_screen',{})))
 p=json.load(open('final-plan.json'))
 for i,plan in enumerate(p):
  if not plan['paths']:continue
  label=f'Net {i+1}/{len(p)} | {plan["net"]} | {plan["width"]} mm'
  r=call('kicad_route_net',dict(filePath=B,expectedRevision=rev,viaSize=.8,viaDrill=.4,**plan))
  if r.get('success'):
   rev=r['revision'];accepted.append(dict(plan=plan,result=r));print('OK',plan['net'],plan['width'],len(r.get('itemIds',[])),flush=True)
  else:
   rejected.append(dict(plan=plan,result=r));print('REJECTED',plan['net'],r.get('errorCode'),r.get('error'),flush=True)
   if r.get('errorCode')!='drc_rejected':break
  (D/'evidence/final-accepted.json').write_text(json.dumps(accepted));(D/'evidence/final-rejected.json').write_text(json.dumps(rejected));(D/'evidence/revision.txt').write_text(rev)
  time.sleep(1)
  if i in [8,30,50]:(D/f'evidence/final-progress-{i}.json').write_text(json.dumps(call('desktop_screenshot_screen',{})))
 label='Filling the live inner planes before native validation'
 fill=call('kicad_send_key',{'hwnd':hwnd,'menu':'Fill All Zones'});assert fill.get('success'),fill
 time.sleep(3)
 r=call('kicad_routing_validate',{'filePath':B});(D/'evidence/final-validate.json').write_text(json.dumps(r,indent=2));print('VALIDATE',r.get('errors'),r.get('unconnected'),flush=True)
 s=call('kicad_routing_state',{'filePath':B});(D/'evidence/final-state.json').write_text(json.dumps(s,indent=2))
 label=f'{r.get("errors",0)-13} new DRC errors | {r.get("unconnected")} unconnected | Native validation complete'
 time.sleep(10)
 (D/'evidence/final-screenshot.json').write_text(json.dumps(call('desktop_screenshot_screen',{})))
finally:
 rr=call('desktop_record_stop',{'recordingId':rec['recordingId']});(D/'evidence/final-recording-stop.json').write_text(json.dumps(rr,indent=2));stop.set();t.join();call('desktop_caption',{'id':'astra-esc-routing','action':'hide'});print('STOPPED',rr.get('path'),flush=True)