cat > /workspace/scratch/check_integrity.py <<'PY'
import fitz,json,numpy as np,os,re
from PIL import Image
from pypdf import PdfReader
from lxml import etree as E
P='/workspace/output/';plan=json.load(open('/workspace/input/page_plan.json'))['pages'];d=fitz.open(P+'catalogue_press.pdf');n=fitz.open('/workspace/scratch/reopened.pdf')
for i,page in enumerate(plan):
 ii=d[i].get_image_info(xrefs=True);nn=n[i].get_image_info(xrefs=True);assert len(ii)==len(nn)==2
 for j,sku in enumerate(page['skus']):
  a=np.array(Image.open(P+'assets/'+sku+'.png'));x=ii[j]['xref'];rgb=np.frombuffer(d.xref_stream(x),'uint8').reshape(a.shape[0],a.shape[1],3)
  sm=int(re.search(r'/SMask (\d+)',d.xref_object(x))[1]);alpha=np.frombuffer(d.xref_stream(sm),'uint8').reshape(a.shape[:2])
  assert np.array_equal(rgb,a[:,:,:3]),sku+' RGB differs';assert np.array_equal(alpha,a[:,:,3]),sku+' alpha differs'
  sx,sy=ii[j]['transform'][0],ii[j]['transform'][3];assert abs(ii[j]['width']*72/sx-300)<.01;assert abs(ii[j]['height']*72/sy-300)<.01
  nx=nn[j]['xref'];nm=int(re.search(r'/SMask (\d+)',n.xref_object(nx))[1]);assert d.xref_stream(x)==n.xref_stream(nx);assert d.xref_stream(sm)==n.xref_stream(nm)
  assert np.allclose(ii[j]['transform'],nn[j]['transform']),sku
 print('Verified page',i+1,'exact asset pixels, alpha, 300 ppi, native re-export')
 t=PdfReader(P+'catalogue_press.pdf').pages[i].get_contents().get_data().decode('latin1')
 wanted=' '.join(str(c/100) for c in page['background']['cmyk'])
 colors=re.findall(r'([\d.]+ [\d.]+ [\d.]+ [\d.]+) k',t);assert any(np.allclose(np.array(list(map(float,c.split()))),np.array(page['background']['cmyk'])/100) for c in colors),(i,colors)
print('All 12 process brand fills verified')
T=E.parse(P+'catalogue.sla').find('DOCUMENT');assert T.get('HCMS')==T.get('DPuse')=='1';assert T.get('DPbla')=='1'
print('CMS active, relative intent, BPC enabled; native source is portable.')
PY
python /workspace/scratch/check_integrity.py