from research import *
s=begin(1267,'Verify the complete NT comparison recurrence','How do sourceintervals andNT intervalcounts generate thewholecomparisonfield?',{},['C1266','prep/nt_source_transfer.json'])
rows=json.loads((ROOT/'model/NT_complete_shared_birth_comparison.json').read_text())['rows'];out=[]
for a,b in zip(rows,rows[1:]):
 nt=a['NT_opening_BC']-b['NT_opening_BC'];gaps={t:a['source_births_BC'][t]-b['source_births_BC'][t] for t in ['MT','SP','LXX']};change={t:b['NT_minus_source_birth'][t]-a['NT_minus_source_birth'][t] for t in gaps};out.append({'from':a['name'],'to':b['name'],'NT_gap':nt,'source_gaps':gaps,'comparison_changes':change})
a=artifact('model/NT_complete_comparison_recurrence.json',json.dumps({'edges':out,'law':'G_next−G_current=source_birth_gap−NT_gap','scope':'In thesharedname domainArphaxad→Shelah skipsCainan’sNT row anduses140,not70.'},indent=2)+'\n')
finish(s,{'recurrence':a,'edges':len(out)},'Thecomplete21-edge comparison follows theexistinglocal recurrence. Arphaxad-to-Shelah covers twoNT cells because thecomparison’sshared-name list omitsCainan; retaining140 prevents a falseone-cell identification.','Examine theentireSP/LXX suffixwherebirthcomparisons coincide.',{'all_edges':all(x['comparison_changes'][t]==x['source_gaps'][t]-x['NT_gap'] for x in out for t in ['MT','SP','LXX']),'Cainan_edge':next(x for x in out if x['from']=='Arphaxad')['NT_gap']==140,'edges21':len(out)==21})
