from PIL import Image,ImageDraw,ImageFont
import pathlib,json,datetime,numpy as np
R=pathlib.Path('/tmp/lead-27909-r1/capture');P=json.load(open(R/'pairs.json'));O=pathlib.Path((R/'diff-path.txt').read_text());font=ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf',20)
for part in ['prose','code']:
 k=f'D-{part}-1440x1000-light';sheet=Image.new('RGB',(1472,640),'#e7e7eb');d=ImageDraw.Draw(sheet)
 for i,(kind,label)in enumerate([('before','Before be5a887'),('after','After ab17d3b'),('diff0','Diff0: >0, amplified'),('diffT16','DiffT: >16/255')]):
  im=Image.open(P[k][kind]).crop((234,714,970,980));x=(i%2)*736;y=(i//2)*320;d.text((x+10,y+12),f'D {part} • {label}',font=font,fill='black');sheet.paste(im,(x,y+48))
 sheet.save(O/f'D-{part}-readable-crops.png')
metadata={};quality={};source_files=[]
for key,pair in P.items():
 metadata[key]={}
 for side in ['before','after']:
  source=pathlib.Path(pair[side]);f=source.parent/(f'metadata-{side}.json' if key.startswith('E-') else f'{side}-metadata.json')
  if f.exists():
   data=json.load(open(f));captures=data if isinstance(data,list) else data['captures'];item=next((c for c in captures if c['key']==key),None)
   metadata[key][side]={'capture':item,'browser':None if isinstance(data,list) else data.get('browser'),'clock':'2026-11-03T04:00:00Z'}
  if key.startswith('A-rec'):
   data=json.load(open(source.parent/f'timing-{side}.json'));metadata[key][side]={k:v for k,v in data.items() if k!='frames'}
 a=np.array(Image.open(pair['before']).convert('RGB'));b=np.array(Image.open(pair['after']).convert('RGB'));diff=np.any(a!=b,axis=2)
 if key.startswith('A3') or key.startswith('A4'):region=(12,709,378,829)
 elif key.startswith('D-'):region=(234,714,970,980)
 elif key.startswith('P-'):region=(433,492,1247,556)
 elif key.startswith('Q-preview'):region=(433,257,1247,320)
 else:region=(234,869,970,981)
 x1,y1,x2,y2=region;outside=diff.copy();outside[y1:y2,x1:x2]=False
 quality[key]={'changedPixels':int(diff.sum()),'pixelsChangedOutsideComposerOrPreview':int(outside.sum()),'allowedRect':region,'sourceModes':[Image.open(pair[s]).mode for s in ['before','after']]}
 assert not outside.any(),(key,'Unrelated changed pixels')
(R/'environment-metadata.json').write_text(json.dumps(metadata,indent=2));(O/'quality.json').write_text(json.dumps(quality,indent=2));print(json.dumps(quality,indent=2))
