Produce the page a host serves when an address matches nothing [#30] - #156
Merged
Conversation
A static host answers a request that matches nothing with one file at a fixed name, and where the repository provides none the reader is shown the host's own page on this project's domain. That is what a reader gets today: a missing address under the published name answers 404 with a title of "Page not found · GitHub Pages", which says nothing about this project and offers no way back into it. So the build writes 404.html, through the same frame every other page goes through, out of prose in content/. The file carries the address it sends a reader to, in a block the reader refuses a file without, because a not-found page with no way onward is where a reader leaves the site and it renders exactly like a finished one. The new row is about the one thing that makes this page different from every other. It is served in answer to whatever was asked for, at any depth, so a reference a browser resolves against the current document points somewhere different on every request. The row refuses a reference in any produced page that is not absolute from the site root, which is what record 0008 already says every reference is, and nothing in the tree decided it until now: with the row taken out, a not-found page linking to "../" passes the whole gate, the link leg included, because that leg resolves a relative reference and finds the file it lands on. The address of the page and the fact that its name is fixed by the host rather than chosen here are record 0008's, and this change cites it rather than restating the argument. Signed-off-by: Nils Lehnen <[email protected]>
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.
What was wrong
The build produced no not-found document, so nothing in this repository answered
a request for an address the site does not have. What a reader gets instead is
the host's own page, on this project's own name:
Run 2026-08-13. That page names another party, says nothing about this project
and offers no way back into it.
What this does
The build writes
404.htmlat the output root, which is the one place a statichost looks, out of prose in
content/not-found.txtand through the same frameevery other page goes through. So it looks like the rest of the site and gains
the properties the frame carries rather than a copy of them.
The file carries the address it sends a reader to, in a block the reader refuses
a file without. A not-found page with no way onward is where a reader leaves this
site, and it renders exactly like a finished one, so the way onward is a refusable
part of the file rather than a paragraph somebody remembers. The reader also
refuses a block that reads as a link and is not one: brackets left off, empty
brackets, an address with nothing to read, and a keyword one letter off, which is
the mistake that turns the block into a paragraph and loses only the link.
One invariant row is added, and it is about the one thing that makes this page
different from every other one. It is served in answer to whatever was asked
for, at any depth, so a reference a browser resolves against the current document
points somewhere different on every request. The row refuses a reference in any
produced page that is not absolute from the site root, which is what
decisions/0008-the-url-shape.mdalready says every reference in a produced pageis. The address of this page, and the fact that its name is fixed by the host
rather than chosen here, are that record's as well, and this change cites it
rather than arguing it a second time.
The page count in
decisions/0003-generator-or-hand-written.mdalready countsthis page, so there is nothing to correct there:
Closes
Nothing. #30 stays open, and the reason is in the issue: one clause of its
done-when asks that requesting a path that does not exist on the served site
returns this page, and nothing this repository produces is served anywhere yet.
What was run
needs-networkwas not asked for and is named above by the run itself. No testwas skipped, and none of this needs a display or elevation.
What the build writes:
The row refuses the mistake it exists for, against this tree rather than against
a fixture. With the way onward written as
../, which is correct from the pageit was typed on:
And with the row taken back out of the table, the same tree passes everything,
which is what says this row is the thing that decides it:
The link leg is green there on purpose rather than by luck: it resolves a
relative reference against the page it was written on and finds the file it lands
on, so a reference that is broken only for a reader at another depth is invisible
to it.
The reader's own guard, deleted and run:
Both were restored before the commit, and the run at the top of this section is
the tree as it is being pushed.
Against the lines of the budget in
decisions/0005-the-speed-budget.mdthat canbe read off the output:
Every command in this section run 2026-08-13 at
f333efd. 1338 bytes of markupagainst a limit of 20 KB, no inlined stylesheet against a limit of 12 KB, no
script and no web font. The third reference is a link a reader may follow rather
than something the page fetches, which is the distinction the origin row already
draws, and the run above is green on that row.
The means
Go, the template package already in the toolchain, and a plain text file in
content/, which is what every other page here is made of. It adds no language,no dependency and no runtime. The page property it introduces is decided by the
gate that decides the others, from the same population, so the rule is refusable
by a machine rather than described in a document. The guard in the reader is
shown to bite above by deleting it, and the row is shown to bite by writing the
mistake into the tree and then by taking the row out and watching the same tree
pass.
Who read it
Nobody else. This change carries no second reader, and the evidence above stands
in place of one.