Evidence

s1421.py

Download source fileOpen in research workspace
from research import *
s=begin(1421,'Freeze the complete reader release inventory','Are all26 intended release files bound before packaging?',{},['model/reader_release_inventory.json','C1413–C1419'])
rows=json.loads((ROOT/'model/reader_release_inventory.json').read_text())['artifacts']
for name in ['490d_Strategy_Progress_C1431.md','490d_Next_Bounded_Question_C1431.md','490d_Contribution_Status_C1431.md','490d_Remaining_Questions_C1431.md']:
 p=ROOT/'deliverables'/name;rows.append({'path':str(p.relative_to(ROOT)),'sha256':hashlib.sha256(p.read_bytes()).hexdigest(),'bytes':p.stat().st_size})
a=artifact('deliverables/490d_Release_Inventory_C1431.json',json.dumps({'artifacts':rows,'reader_entry':'490d_Start_Here_C1431.md','main_print':'490d_Chronological_Families_Explanation_C1431_Print.pdf','technical_print':'490d_Technical_Companion_C1431_Print.pdf'},indent=2)+'\n')
finish(s,{'release_inventory':a,'artifacts':len(rows)},'All26 reader release artifacts are frozen by byte count and hash. The main and technical print editions are explicitly designated.','Create the reproducible reader bundle builder.',{'twenty_six':len(rows)==26,'all_bound':all((ROOT/x['path']).stat().st_size==x['bytes'] and hashlib.sha256((ROOT/x['path']).read_bytes()).hexdigest()==x['sha256'] for x in rows)})
Edition and provenance

s1421.py

SHA-256 5aac58504b8e46129b29a977f297555d9a7463400ee602ef0ce7194ef5a86a4b

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