Evidence

s1422.py

Download source fileOpen in research workspace
from research import *
s=begin(1422,"Create the reader bundle builder","Can the reading release be packaged without changing frozen artifacts?",{},["C1420–C1421"])
t=json.loads("\"#!/usr/bin/env python3\\n\\\"\\\"\\\"Create a portable reading release; original artifacts remain unchanged.\\\"\\\"\\\"\\nfrom pathlib import Path\\nimport hashlib,json,zipfile\\nROOT=Path(__file__).resolve().parent.parent\\ninventory=json.loads((ROOT/'deliverables/490d_Release_Inventory_C1431.json').read_text())\\npayloads={};bindings=[]\\nprefix='sandbox:/workspace/scratch/1b40da62dcbd/c1132_c1431/deliverables/'\\nfor item in inventory['artifacts']:\\n    original=(ROOT/item['path']).read_bytes()\\n    assert hashlib.sha256(original).hexdigest()==item['sha256']\\n    name=Path(item['path']).name;data=original\\n    if name.endswith('.md'):data=original.decode().replace(prefix,'').encode()\\n    assert name not in payloads;payloads[name]=data\\n    bindings.append({'name':name,'original_path':item['path'],'original_sha256':item['sha256'],'packaged_sha256':hashlib.sha256(data).hexdigest(),'bytes':len(data),'link_projection':data!=original})\\npayloads['README.md']=(\\\"\\\"\\\"# Chronological families — reader release\\n\\nStart with 490d_Chronological_Families_Explanation_C1431_Print.pdf (14 pages).\\nThe technical companion is 490d_Technical_Companion_C1431_Print.pdf (7 pages).\\n490d_Start_Here_C1431.md links to the editable readers, map and supporting references.\\n\\nMarkdown links have been made local to this folder. The PDFs, images and JSON files are unchanged.\\nSOURCE_TO_PACKAGE.json records original and packaged hashes.\\nThe separate full evidence archive contains the frozen source texts, proof scripts, sequential journal and verifier.\\nThe reader bundle is a convenient presentation package; detailed indexes refer to that full evidence archive.\\n\\nLatest File52c governs the Rounded/inverse branch. The inverse of the inverse is deferred.\\n\\\"\\\"\\\").encode()\\npayloads['SOURCE_TO_PACKAGE.json']=(json.dumps(bindings,indent=2)+'\\\\n').encode()\\npayloads['MANIFEST.sha256']=''.join(hashlib.sha256(data).hexdigest()+'  '+name+'\\\\n' for name,data in sorted(payloads.items())).encode()\\nout=ROOT/'deliverables/490d_Chronological_Families_Reader_Package_C1431.zip'\\nassert not out.exists(),'Reader package is immutable; create a new version rather than overwrite.'\\nwith zipfile.ZipFile(out,'w',zipfile.ZIP_DEFLATED) as z:\\n    for name,data in sorted(payloads.items()):\\n        info=zipfile.ZipInfo(name,date_time=(2026,9,28,0,0,0));info.compress_type=zipfile.ZIP_DEFLATED\\n        z.writestr(info,data)\\nprint(json.dumps({'path':str(out),'sha256':hashlib.sha256(out.read_bytes()).hexdigest(),'bytes':out.stat().st_size,'entries':len(payloads)}))\\n\"")
a=artifact("evidence/package_readers.py",t)
finish(s,{'artifact':a,'words':len(t.split())},"The bundle builder checks every source hash, projects only Markdown links, records both representations and uses deterministic ZIP entry times.","Build and bind the portable reader bundle.",{'nonempty':len(t)>100,'immutable_output':'assert not out.exists()' in t,'dual_hashes':'original_sha256' in t and 'packaged_sha256' in t})

Linked sources and evidence

Edition and provenance

s1422.py

SHA-256 a34bd163ca89bb1a53e70e60f49e0aee14676cea44398a098597e88519e846ff

C480–C1634/Research_Cycles/C1132_C1431_Recovered/evidence/s1422.py