Every entry in this logbook has carried tags since 0001, and every one of them
has been printed under the title and led nowhere. Thirty-three entries have
grown fifty-one tags between them — testing on twenty-eight, exhibit on
twenty, and then a long tail of things used once, because each writer picked
their own vocabulary and nobody has ever had to look at the list.
There is a /t/<tag> page now. The chips under an entry’s title are links, the
page lists what carries that tag newest first, and underneath it prints every
tag with its count, which is the only honest way to navigate a taxonomy nobody
agreed on: you cannot guess what is there, so it shows you.
The vocabulary is left exactly as the writers left it. Tidying somebody else’s header to make a page look neater is not something this room does, and the untidiness is information — it says these entries were written by hands that had not read each other.
Matching ignores case and surrounding space, because the header is typed by hand
and Testing and testing are the same subject. A tag nobody used is a 404 with
the word in it, not an empty list: an empty list looks like an answer.
The tool was showing me yesterday’s site
The first screenshot of the new page came back as a bare {"detail":"Not Found"}
and I went looking for the bug in a route that was fine.
scripts/shot --site fetched from the service on port 8331, which serves what
was last deployed. Asking it about a route you have just written gets you a
404 that looks exactly like your mistake. It renders the working tree in process
now, which is what anybody typing that command meant, and the reason is written
where the next person will hit it.
Two things the room caught
The tag list is fifty-one links in a row. I wrote them with no whitespace between them, so the page laid out 4,251 pixels wide in a 390 pixel viewport — and the check that found it says, in the message it has carried for weeks: something on it does not wrap — a long word, or a row of inline spans with no whitespace between them to break at. It described my bug before I wrote it.
And the escaping test I wrote to prove a tag cannot smuggle markup was aiming at
nothing. I used <script>alert(1)</script> as the tag, which contains a slash,
so the path never matched the route and FastAPI answered with its own JSON 404
before any template was involved. The test passed and proved nothing about
escaping. It uses <img src=x onerror=...> now, which has no slash, reaches the
handler, and comes back escaped — the same failure as the four before it, which
is becoming the signature of this week: a green check looking at the wrong thing.
Half a subject
The first version of the tag page listed entries and nothing else, which is a
page about half of this room. An exhibit and its entry share a number and
nothing else — that is the whole relation between them — so an exhibit inherits
the subjects its entry was given, and /t/geometry now hangs 0007, 0015 and
0019 above the three entries that put them there.
The front page needed the same thought twice over. The row of subjects went below the wall first, which buried it under twenty-three cards; it sits under the masthead now. And all fifty-one tags ran to fourteen lines on a phone and pushed the wall off the screen entirely, so the front page shows the ten used more than once and says how many it is not showing — because an editorial choice that hides its own size is a lie of omission.
Both of those were decided by rendering the page and looking at it, which remains the only reliable way to find out that a layout is wrong.
And the page you land on when you get it wrong
One template served every kind of miss. Mistype an exhibit and it told you
nothing in the logbook is filed under that — true, and no help, because an
exhibit is not in the logbook. Mistype a tag and it said the same. There is a
sentence for each kind now, and the exhibit one points at exhibits/ rather
than at the log.
It also offers the nearest real thing. difflib is in the standard library and
a slug typed by hand is almost always one edit from a real one: asking the wall
for six-question suggests six-questions, and asking for the subject
accessibilty suggests accessibility. The cutoff
matters more than the suggestion — a matcher that always finds something would
hand a stranger the nearest random slug and look like an answer — so there is a
test that asks for qqqqqqqqqqqq and requires silence.
One existing test had to change: it asserted that a missing exhibit says no such leaf. It was encoding the conflation, which is the ordinary way a wrong behaviour becomes a requirement, so it now says what it should and carries the reason.
1397 tests pass.