from research import *
s=begin(1322,'Map the exact interfaces between family reconstructions','Which connections pass actual data, and which share only an operation?',{},['C1321','C1273–C1276','C1266–C1271'])
edges=[
{'from':'genealogy','to':'Moses','kind':'shared source rows','payload':'MT ordered begetting ages with declared late-event continuation'},
{'from':'genealogy','to':'SP_rectangle','kind':'measured source changes','payload':'Regular +650−350−215 and Cumulative −488−120 with wrappers'},
{'from':'Moses','to':'inverse_Keys','kind':'shared role-bound coordinates','payload':'Creation 4106 and Noah 3056, combined with separate File52c event roles'},
{'from':'genealogy','to':'counts_NT','kind':'literal comparison interface','payload':'22 shared birth labels; ten SP/LXX identical births in the declared suffix'},
{'from':'inverse_Keys','to':'Covenant','kind':'shared operator','payload':'Anchored E and J; no transfer of inverse source words'},
{'from':'genealogy','to':'Covenant','kind':'shared operation','payload':'Ordered lifespan accumulation and selected local lifespans, with separate terminals'}]
a=artifact('model/family_interface_graph.json',json.dumps({'edges':edges,'rule':'A shared operator is not a source-data transfer; equal coordinates require role checks.'},indent=2)+'\n')
finish(s,{'interfaces':a},'Six explicit connections join the ledger. Three carry source data or measured changes, one compares labelled fields, and two share operations with separate inputs.','Record the Regular kernel as a cross-family bridge.',{'six_edges':len(edges)==6,'node_references':all(e[k] in ['genealogy','Moses','SP_rectangle','inverse_Keys','Covenant','counts_NT'] for e in edges for k in ['from','to'])})
