import json, pathlib
from PIL import Image, ImageDraw, ImageFont
root=pathlib.Path(__file__).parent
font='/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf'
f=lambda n:ImageFont.truetype(font,n)
for sha,side in [('5f69cac5c91c85860dd3d2c471bdac6efa70241e','Before'),('16a1464da0c7ac9b70b0b90ed15969a4ec0b3f6f','After')]:
    data=json.loads((root/(sha+'-routing.json')).read_text())
    image=Image.new('RGB',(1280,640),'#f8fafc'); d=ImageDraw.Draw(image)
    d.text((44,30),side+' — observed server routing',font=f(32),fill='#0f172a')
    d.text((44,80),'Commit '+sha[:10]+' · Chromium web · fresh database · Replay (dev)',font=f(21),fill='#475569')
    d.text((44,122),'Read-only capture of the running app’s persisted run records',font=f(21),fill='#475569')
    original=data['originalProviderThread']; schedule=data['runs'][1]['provider_thread_id']
    for i,(run,desc) in enumerate(zip(data['runs'],['User: remember the codeword PELICAN','Scheduled task: fresh session, Run now','User: what codeword did I give you?'])):
        y=185+i*100; p='P1' if run['provider_thread_id']==original else 'P2'
        d.rounded_rectangle((36,y,1244,y+82),radius=10,fill='white',outline='#cbd5e1')
        d.text((55,y+14),f"Run {run['ordinal']}  {desc}",font=f(23),fill='#0f172a')
        d.text((55,y+47),'status: '+run['status']+' · freshContext: '+str(bool(run.get('freshContext'))).lower(),font=f(18),fill='#64748b')
        d.text((1150,y+20),p,font=f(32),fill='#2563eb')
    passed=data['userContinuesOriginal']
    d.text((44,510),'User continues original conversation: '+str(passed).upper(),font=f(28),fill='#15803d' if passed else '#b91c1c')
    d.text((44,561),'P1 = original user conversation · P2 = context-free scheduled conversation',font=f(22),fill='#334155')
    d.text((44,600),'Replay replies are canned; this records session routing, not semantic codeword recall.',font=f(18),fill='#64748b')
    image.save(root/(side.lower()+'-routing.png'))
