from research import *
s=begin(823,'Verify the rendered family map against its data','Does the final visual preserve every displayed coordinate and its scope?',{},['C822; model finite_birth_configurations and aligned_birth_divergence'])
import xml.etree.ElementTree as ET
svg=(ROOT/'deliverables/490d_Chronological_Families_Map_C831.svg').read_text();root=ET.fromstring(svg)
texts=[x.text for x in root.iter() if x.tag.endswith('text') and x.text]
births=[3838,3336,3236,3101,2971,2841,2707,2577,2445,2315,2236,2166];gaps=[574,574,574,547,547,520,420,320,220,120,60,0]
numeric_rows={}
for x in root.iter():
if x.tag.endswith('text') and x.text and x.text.isdigit():numeric_rows.setdefault(x.attrib.get('y'),[]).append(int(x.text))
p=ROOT/'deliverables/490d_Chronological_Families_Map_C831.png';png=p.read_bytes()
finish(s,{'png':{'path':str(p.relative_to(ROOT)),'sha256':hashlib.sha256(png).hexdigest(),'bytes':len(png)},'visual_QA':'1600×1100 render inspected; labels fit, no clipping or overlapping data; twelve-node rows verified','numeric_rows':numeric_rows},'The final figure preserves the exact full birth and cumulative-gap rows and explicitly labels the comparison frame and source status.','Finalize the synthesis with the two final editorial clarifications.',{'birth_row':births in numeric_rows.values(),'gap_row':gaps in numeric_rows.values(),'png_signature':png.startswith(bytes([137,80,78,71,13,10,26,10]))})
Evidence
s823.py
Edition and provenance
s823.py
SHA-256 e86750a02310ac249ca644d8a0d98841c473b6d36ad8ed5d8721306f10363890
C480–C1634/Research_Cycles/C0732_C0831/evidence/s823.py