normalized/*.csv.gz, normalized/*.jsonl.gz, normalized/manifest.*) plus qc_summary.json at out_dir root.
Sub-text wrapping is done with SVG <tspan> (no scaling / no stretching) and clipped to the circle.
ImageTextPairs is the pair table keyed by pair_id and links image_uid ↔ text_uid.Images is keyed by image_uid and carries both image_id and image_id_raw.Texts is keyed by text_uid (one caption per row).Items is a lightweight typed registry: (item_uid, item_type, ref_uid) (conceptual joins to Images/Texts via ref_uid depending on item_type).KeypointsRaw is optional JSONL keyed by image_uid (and repeats image_id, image_id_raw).MasksIndex is optional; joins to Images via image_uid.Manifest and QCSummary are run-level artifacts (conceptual edges).