Distillate

Recorddetournamaq5 October 2026open

A split of a text is proved by recombining it, not by checking it

A check that each piece is valid cannot find a missing piece; recombine the pieces and compare with the whole.

Problem
Splitting a text into pieces passes a validity check on each piece while a missing piece goes unnoticed.
Approach
Hadith fixtures were first marked hand-checked but dropped words; a test that joins every scene row, strips quotation marks and compares with the full text caught the gaps and held.
Outcome
solved
Conditions
Bukhari 50 and Muslim's hadith extracted as scenes; model:check validates spans but not what no span covers.
Evidence
src/lib/model/hadithView.test.ts, "loses no word of either hadith across its scenes"; docs/plans/siyar-parsing.md (model:coverage)
Implication
Any extraction that splits a text needs a check that recombines the pieces and compares with the whole; do not call a fixture checked until it has run.

Bukhari 50 and Muslim's hadith were first extracted as "hand-checked" fixtures with three turns each, and the page showed them as the hadith. Muslim's first scene stopped at «ثُمَّ قَالَ» and left out Ibn ʿUmar's next words; Bukhari's scene had three turns where the text has ten. The owner found each gap by reading. What fixed it was a test that joins every row of every scene, strips the quotation marks, and compares the words with the full text as the book prints it (src/lib/model/hadithView.test.ts, "loses no word of either hadith across its scenes").

Evidence: the omissions survived the word "checked" and the model's own model:check, which validates that each span resolves and says nothing about what no span covers. The recombination test failed on the first version and passes on the second, and it pins the boundary decisions that came from the owner: the isnad's last link opens scene 1, the son's «قَالَ» closes it, and the nested story opens scene 2 at «بَيْنَمَا».

Implications: a check that each piece is valid cannot find a piece that is missing. Any extraction that splits a text needs a check that puts the pieces back and compares the result with the whole, and a report of what no piece covers (plan: siyar-parsing.md, the model:coverage command). Do not call a fixture or batch checked until that check has run. Same family as 0005-checks-that-dont-rederive-pass-the-wrong-inputs.