Judge the files the build reads values out of, which no row did - #221
Merged
iderex merged 1 commit intoAug 31, 2026
Merged
Conversation
Three rows are declared over "every tracked file the build reads to render a page", and the population behind that sentence held nineteen files, every one of them under templates/ or content/. Not one file under data/ was in it, although the build reads the roster for every plugin row and every plugin page, the token copy for the design system page, the clients file for the sentence about the clients, and the security contact, the catalogue, the publisher and the recorded releases for the pages that state their values. The absence was control flow rather than a decision. Four of those files are sorted into a population that asks whether the file is present at all, and each sorter returned from the walk, so the file never reached the test that would have counted it as a build input. The remaining three were never named by any test. What that cost is a guard that could not bite. A server generation typed into data/roster.json passed the whole gate: build-input-carries-no-server-generation reported ok over nineteen files, none of which was the roster. That is the last condition of #91 - no server version in a template, in content/ or in the roster, refused with the offending file named - reading as met on a tree where two thirds of it were unreachable. The same population decides where a token value and a client limit may be written, so a colour or a millisecond typed into the roster was equally unreadable. Each row now reads every tracked file the build reads except the one file that row is the authority for. That exception is why widening the single shared population is not the repair: the token row would refuse the file that declares the token values, and the budget row the file that declares the limits, each for carrying the value it exists to carry. The roster and the security contact are the authority for none of the three and were excluded from all three. It was found while re-reading the price #75 puts on making the roster sentence the published repository description, which rests on that generation being refused. Putting one into the roster and running the verb returned ok. The proof is the part that was missing rather than the decider, which was always right: every existing case hands bytes straight to a decide function, so nothing judged the selection that chooses which files a decider ever meets. Two cases now do, over the fixture tree and over a run, and both go red on the narrowed population and green on this one. Signed-off-by: Nils Lehnen <30603423+iderex@users.noreply.github.com>
iderex
deleted the
tests/the-build-input-population-leaves-out-the-files-the-build-reads
branch
August 31, 2026 02:24
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #219.
What was wrong
Three rows of the invariant gate are declared over "every tracked file the build
reads to render a page". The population behind that sentence held nineteen files
and every one of them was under
templates/orcontent/. Nothing underdata/was in it, although that is where the build reads the values a page states.
Both run 2026-08-31 at
a0da593, which is the base of this branch.The absence was control flow rather than a decision. Four of those files are
sorted into a population that asks whether the file is present at all, and each
sorter returned from the walk, so the file never reached the test that would have
counted it as a build input as well.
What it cost
A server generation typed into the roster passed the whole gate. Taken at
a0da593, with the value put intodata/roster.jsonand taken out again:That is the last condition of #91 - no server version in a template, in
content/or in the roster, refused with the offending file named - reading asmet on a tree where the roster half could not be reached. The reading on #91 of
2026-08-17 and the comment on the deciding function both say the roster becomes a
subject of the row on the day a copy lands. The copy landed on 2026-08-25 and
#91 closed on 2026-08-26.
The same population decides where a token value and a client limit may be
written, so a colour or a millisecond typed into the roster was equally
unreadable.
What this changes
Each of the three rows reads every tracked file the build reads except the one
file that row is the authority for. That exception is why widening the single
shared population is not the repair: the token row would refuse the file that
declares the token values, and the budget row the file that declares the limits,
each for carrying the value it exists to carry. The roster and the security
contact are the authority for none of the three and were excluded from all three.
At this head the same experiment refuses, and names the file, the line and the
number:
Run 2026-08-31 at
8619199, with the value put in and taken out again; the treecarries no such value.
The proof, and why the suite had none
Every existing case for these three rows hands bytes straight to a decide
function, so the decider is judged and the selection that chooses which files it
ever meets is judged by nothing. Two cases now reach the selection:
TestEachBuildInputRowSeesEveryFileTheBuildReadsExceptItsOwnSourceover thefixture tree, and
TestRunRefusesAServerGenerationTypedIntoTheRosterover a run.Both were run against a head carrying this branch's rows and subjects with the
population narrowed back to
templates/andcontent/, and both go red there:Run 2026-08-31.
TestRunAcceptsARosterThatStatesNoGenerationis the neighbourleg and stays green in both states, so the refusing case is not passing over a
run that refuses every roster.
The means
Go, in
internal/invariant, where the population is assembled and the rows aredeclared, plus one directory constant in
internal/sitebeside the two it sitswith. The change is a selection over tracked files and the package already
carries the row shape, the fixture convention and the suite that proves a row
bites, so it needs no program the toolchain does not have.
The gate
Run 2026-08-31 at
8619199.What this does not do
It does not read
data/catalogue.jsonordata/publisher.jsondifferently fromthe rest: they are in the population because they are under
data/and the buildreads them, and nothing here measures what a row would find in them beyond the
run above, which found nothing.
It does not touch the two rows that are owed and not decided, and it does not
move the count of rules the gate decides.
This change has had no second reader. Nothing here was reviewed by anybody
else, and the evidence above stands in place of one: the experiment that produced
the failure, the two cases that go red without the change, and the gate at this
head.