from research import *
family="covenant"
p=ROOT/'prep/manuscript_covenant.json'
packet=json.loads(p.read_text());modules=packet if isinstance(packet,list) else packet['modules'];m=modules[4]
textbody=m.get('text',m.get('body',''))
for old,new in []:textbody=textbody.replace(old,new)
s=begin(1094,'Manuscript: '+m['title'],'Does this section accurately connect its complete source family to the shared explanation?',{'draft_sha256':hashlib.sha256(p.read_bytes()).hexdigest(),'module_index':4},['C1071','prep/manuscript_covenant.json'])
sources=m.get('sources',m.get('source_sections',m.get('citations',[])));source_notes=[]
for x in sources:
 if isinstance(x,str):source_notes.append(x)
 else:source_notes.append(x.get('file','')+' '+(', '.join(x.get('sections',[])) if 'sections' in x else x.get('section','')))
steps=m.get('steps',m.get('C_steps',[x for x in m.get('citations',[]) if x.startswith('C')]))
if not steps and family=='round':steps=['C932–C952','C1058–C1068']
content='### '+m['title']+'\n\n'+textbody+'\n\n*Sources:* '+'; '.join(source_notes)+'.\n\n*Research record:* '+', '.join('C'+str(x) if isinstance(x,int) else str(x) for x in steps)+'.\n'
rel='deliverables/sections/23_covenant_5.md'
a=artifact(rel,content)
checks={'dependent_source_values':21*175==25*147,'rank_scope':'treated as variable' in textbody,'no_probability':'rather than probability or historical independence' in textbody}
finish(s,{'section':a,'body_words':len(textbody.split()),'source_references':len(source_notes)},"The constraints section explains why independence depends on held source values and why algebraic rank measures information requirements rather than probability.",'Reassess the next explanatory section against its source roles and the sealed calculations.',checks)

