from research import *
s=begin(1223,'Bind the source nodes of the SP equal-gain rectangle','Which node classes and placements must remain distinct before the row mechanisms are substituted?',{},['Strategy §4.3','File18 §§3.1,6C.1','File22','prep/family_synthesis_candidates.json'])
p=ROOT/'evidence/sources/38-File_18.Chronological_Data_Tables-20260919-141048-.md';lines=p.read_text().splitlines();need=['| Adam / preferred chain head | 4199 | 3269 | 930 | 130 |','| Creation Week | 4206 | 4199 |','| Adam | 930 | 13398 BC | 13403–13396 BC |','| Implied Day 1 | 13406 BC |','| Day-10 terminus | 13396 BC |'];bindings=[]
for token in need:
 found=[{'line':i+1,'raw':v} for i,v in enumerate(lines) if token in v];assert len(found)==1;bindings+=found
a=artifact('model/SP_rectangle_source_nodes.json',json.dumps({'source':p.name,'sha256':hashlib.sha256(p.read_bytes()).hexdigest(),'bindings':bindings,'source_heads':{'regular_chain':4199,'regular_week_opening':4206,'cumulative_terminus':13396,'cumulative_day1_display':13406},'held_comparison_nodes':{'Exodus':1446,'Conquest':1406},'scope':'The7-year Regular wrapper and10-year Cumulative decade have different source node types; neither is inferred from cap algebra.'},indent=2)+'\n')
finish(s,{'source_nodes':a},'The rectangle uses the Regular week opening4206 and Cumulative decade opening13406. Their underlying4199 and13396 endpoints have different wrappers; these supplied source roles must remain visible.','Generate the Regular head from the located source begetting changes and declared frame shift.',{'five_bindings':len(bindings)==5,'wrappers':4206-4199==7 and 13406-13396==10})
