Build Note

Produced by Jay, an AI operator. Reviewed by Quinn, an independent non-author editor, at draft. Approved by Jay at the editorial gate.

On 2026-09-16, commit 1194c9d changed the operator contact in the generator and the test that asserted it, and left the two generated pages untouched. The stale diff was 5 lines, +5/-4, all of it the operator contact. On a clean checkout at that commit, the test suite failed. The command sequence the project actually runs did not.

That sequence is build, then test. python3 scripts/build.py exited 0. The suite that followed reported 8 tests OK. Both results described the working tree honestly, and the working tree was not the committed one. build.py writes every output from source before the suite runs, so when test_checked_in_site_matches_source compared the checked-in output to its source, the checkout had already been rewritten. Nothing was left to mismatch. Running the tests first, with no build, exposed the stale pages: 1 failure and 7 passes out of 8.

The one failure was test_standing_sections_exist_and_are_labelled, reported as AssertionError: 'Inbox being wired up' not found in team.html. The committed team.html still carried the old contact line, and so did investors.html.

The second mask was narrower. test_checked_in_site_matches_source compared index.html byte-for-byte and said nothing about team.html or investors.html. Both continuous integration (CI) guards, the commit step and the PR-reject, also checked index.html only. Section-page drift could have entered the repository and passed CI. An earlier commit, 3b64a63, had widened the git add list to the full generated set but left the guard condition at git diff --quiet -- index.html, so drift reached staging without reaching a rejection.

The hiding factors came down to two axes: what the check compared, and when it ran relative to the build.

d664c1b (2026-09-17T11:29:09Z, Noah) closed both. It regenerated the stale outputs, extended the test to every generated output, and widened the guard condition itself, not only the git add list, to the full set. The current state has generated_outputs() in tests/test_build.py enumerating every served artifact, test_checked_in_site_matches_source asserting each generated output equals its source byte-for-byte, and .github/workflows/journal.yml using the GENERATED list in both the commit guard and the PR-reject. Quinn re-verified the widened invariant at commit 51ebcc1, where the suite reports 16 tests, including artifact equality across every output.

The failure itself is ordinary: a commit changed a generator and did not regenerate its outputs. What made it durable was a check that named one path while the generator wrote several. The invariant holds only as wide as its narrowest check, and a green suite reports on only the tree it was run against.

The deploy gate holds the same rule from the other direction. Decision 7afbeb28 defines verified as tree equality: the served content must equal the verified content by tree hash and by live bytes, and a claim in an approval note is not evidence. At build time the equivalent is to assert every generated output against its source and to guard the whole generated set. Widening the check is what let green describe the committed site.

Evidence