What this is for

Steve read the site as a stranger would and said it was all over the place. He was right, and the fault was not in any one page: the site presented a method, a case study and a set of findings at the same volume, with no ordering, and left a visitor to work out for themselves what the point was. We could not state the point either, which was the real answer.

The promise

So we picked one sentence and made everything else answer to it: any ordinary French-Canadian pedigree, followed properly, reaches the founding of New France — and here is the proof, on one couple chosen with dice.

That reordered the site. The dice stop being a charming detail in entry one and become the argument: we did not pick a good family, we picked a random one, and it still arrives at fourteen women who crossed in the 1650s and 1660s. The method is not the pitch. It is the reason to believe the result.

What changed

The front page now opens with the plainest fact we hold about Louis and Rose — neither of them could write their name — and ends on a claim about the reader’s own family. The case page was one page doing four jobs, so it split: /climb/ tells the ascent as four lines, each with how far it has got, and /evidence/ keeps the frontier, the questions and the forty-eight documents. The founding mothers, who until now lived in the third paragraph of one entry, have a page, with each woman’s line traced down the Ahnentafel to St-Constant in 1830.

We built one findings page and stopped. Origins, signatures and the cousin marriage are all sitting there in the records, and a Findings menu would have re-created the sprawl we were treating. A second page waits until a second finding earns it.

What the split nearly broke

Every record id on this site is a link to an anchor, and the linker hard-coded the case page’s path. Moving the sources to /evidence/ would have pointed every generated link on the site at an anchor that no longer existed — and a dangling #href raises nothing, breaks no build and fails no test. The TODO had warned about exactly this. The linker now carries a map of which page owns which id, and an id nobody owns renders as plain text rather than a link.

What checking cost, and bought

Writing the founding-mothers page meant reading the fourteen out of the records rather than out of the journal entry. Anne Seigneur’s origin is recorded as a baptism, not a birth, and the first version of the data contract read birth only — it would have dropped Rouen from her row with no error anywhere. She is the only one of the fourteen affected. Origin now reads baptism where there is no birth. The same trap runs through the records generally, death against burial, and that pairing is not made anywhere yet — it is written down as work to do, not as a rule this site already keeps.

That left one true gap instead of two, with a better line than we had: Marguerite Raisin’s origins are unknown to Gagné himself. Her row says so. A gap in the scholarship is worth printing; an empty cell is not.

The tests were green, and ten of them were wrong

Every page here is checked by a test suite, and the suite passed at each step of the day. That turned out to mean very little.

We reviewed each change by mutation: break the thing a test exists to catch, rebuild, and see whether the suite notices. Ten times it did not.

The worst was the one written to prevent exactly what the split threatened. Record ids on this site are links to anchors, and the check that every #href lands on an id that exists matched only links to another page — 451 of them — while 197 bare same-page fragments went unchecked. A dangling anchor planted on the climb page left the suite green.

Three more assertions were lost when we deleted the old case-page test and failed to carry them over. One compared every pedigree row’s computed grades against the generated data — the direct guard of the rule that this site states nothing it has not derived. Swapping two columns in the template left the suite green.

The rest passed by coincidence, and coincidence is the theme. The count of positions filled on each line — 37, 31, 27, 43 — was matched anywhere on the page, and those same numbers appear as Ahnentafel positions further down it. Each founding mother’s grade badge was matched against the whole page, and since all fourteen read Probable, corrupting one changed nothing a test could see. The front page’s three links were satisfied by the site header, which points at two of the same pages, so deleting a button broke nothing.

The last three were found only at the end, by a review of the whole branch rather than of any one change, and they are the ones that should worry a reader most, because they sit on the two pages most people will open. The tally on the front page — 139 people · 69 families · 48 documents — could have every number typed in by hand and the suite would not object. The sentence that opens the founding mothers, fourteen of the sixty-nine women in this pedigree, could be made to read fourteen of the one hundred and thirty-nine — a plainly false statement about the records — and the suite would not object. And the grade on the starting marriage, the foundation of the whole argument, could be typed as Disproven by hand, and the suite would not object. The footer of every page on this site promises that every grade is computed from the records and never typed. For most of a day, nothing was checking that promise on the three places it matters most.

One guard took five attempts. Three of the fourteen women have no surviving record of whether they could sign their name, and the page must therefore say nothing either way about them. Checking against the other women’s wording missed novel wording. Counting the separators in the line missed a claim inserted without one. Comparing the whole line missed a claim in an image’s alt text, and another in a paragraph beside it. What finally held was rebuilding each woman’s entry from the records and requiring the page to match it exactly — every tag, attribute and character named in advance.

Then we stopped, because the next step is not reachable. No test detects a person typing a false sentence into prose. This page carries three hand-written paragraphs no test can verify, and so does every other page here. The suite can promise that nothing the records fail to support reaches a page by accident. It cannot promise we did not lie on purpose. That is what a journal, and a reader’s scepticism, are for.

A last one, because it is the most instructive. When this entry first named the retired case page in its prose, it tripped the check that no page still links there. The fix narrowed that check to the shapes a link was expected to take — and so it stopped catching single-quoted attributes, unquoted ones, srcset and data- attributes. The second fix was worse: it cut code spans out of the page before checking, which meant one unclosed tag could swallow a real dead link and hide it. A forgotten backtick would have been enough. We went back to the blunt original check and reworded two sentences instead. The lesson is not subtle. A guard against the errors you failed to anticipate must not be narrowed to the ones you did.

Where all this came from is worth saying plainly. The plan and its tests were written by the same hand on the same day, so they shared the same blind spots, and green was the natural result of that — not evidence of anything. The work was not writing the tests. It was breaking them.

All entries