Skip to the page
Home Search
Reading

These start from your device’s own settings. Change one here and this browser will remember it for this site.

  • The drawings appear finished instead of drawing themselves on.
  • Darker ink, firmer rules, and the foxing lifted off the paper.
  • More air between the lines and between paragraphs.
  • Scales the whole sheet — the lines, the gaps and the measure — from whatever size your browser is already set to.
  • The first four also set the reading face, because they have a real italic. The rest change the headings and leave Newsreader to read.
Drawers
Two cohabitating modes

Register · the changelog

The accession register

A herbarium keeps a register: a ledger of every specimen as it entered the collection, and of every annotation slip pinned to a sheet afterwards — a name re-read off the plate, a locality corrected, an identification withdrawn. This is that book for this site. It is backfilled from the whole commit history and kept up from here.

It records four kinds of change: a sheet mounted, a sheet re-determined — reworked enough that what it shows is different — a label corrected, and work on the cabinet, meaning the site itself. Typo passes and small tidying are left out. Anything that changes what a sheet claims is in.

The full working — every quotation, whose it is, where it came from, and the day somebody read the primary and confirmed the wording — is in ATTRIBUTIONS.md; the reasoning behind every settled and open question is in DECISIONS.md. Both are in the repository, which is the source of truth for this site. If something on a sheet is wrong, it belongs in this register. Say so, and it will be.

Why the corrections are in the ledger and not in a drawer

Our sibling site Star Stuff risks a wrong fact. This site risks a wrong attribution — a definition trimmed to fit a masthead, an object quietly generalized, a paraphrase left wearing somebody’s name. Nearly every page here carries somebody else’s words, and the citation is the only evidence a reader has.

So the errors are entries like any other. A byline that put Helen Edgar’s name on prose she did not write. A journal citation handed to us with the wrong issue and the wrong pages. A caption that said Miranda had never seen anybody but her father and Caliban, when the play has her half-remembering four or five women. Each one is named below with what it said, what it says now, and how it was caught. The working has always been in the repository. This page is the account of it that a reader can actually reach.

2026 · 23 September · latest

Sheet No. 15, and four words that had been put into an Elder’s mouth Link to this section

Helen Edgar’s essay on foraging between ways of knowing, mounted with three gaps left open on its own face — and two attributions corrected before it went up, one of them the worst kind this cabinet can ship.

MountedSheet No. 15 — Metaphoray, an essay

A botanist’s word for the walk, and a writer’s word for the same walk. Robin Wall Kimmerer coins metaphoray on page 46 of Braiding Sweetgrass, a few paragraphs after asking whether science and traditional knowledge might be purple and yellow to one another. The sheet takes the word and reads the gap between what a herbarium label can hold and what the plant actually was.

The masthead is goldenrod and asters, which is the essay’s own image and Kimmerer’s. The plume is a mass on a stratified grid rather than a chain of puffs, and the asters were drawn wrong first: a violet disc the size of its own rays, so the rays vanished inside it and five flowers read as dark dots. Redrawn as petals rotated about a centre, which is how this house draws a flower. Looked at rendered rather than trusted from the markup, which is the only way that fault surfaces.

Label correctedElder Albert Marshall did not say for the benefit of all who come after

The draft had four words in his mouth that are not in the paper. Bartlett, Marshall and Marshall report Two-Eyed Seeing as using both eyes for the benefit of all. The phrase who come after appears nowhere in either copy Ryan put in the tray — checked rather than remembered. It is plausible, it is adjacent, it carries a seven-generations sense, and it is an addition to a living Elder’s articulation of his own people’s concept. On a sheet whose argument is that Indigenous knowledge is not raw material for somebody else’s story, that was the worst available place for it. The reported wording is now quoted whole.

And Etuaptmumk is not in that paper at all. Zero occurrences. The draft named the Mi’kmaw word and cited the article for it, which sends a reader somewhere the word is not. The term is Marshall’s and travels with him, but nothing carrying it has been read here, so the sheet names it and cites nothing. An open gap is honest; a citation that does not contain what it is cited for is not.

Two copies, and the difference is format rather than text. The published first page as the journal serves it, and the authors’ twelve-page e-offprint, which is the only one carrying the body and so the copy actually read. Same DOI, same pagination, abstracts identical character for character — compared rather than assumed, because two editions is exactly where a difference hides.

Label correctedA gloss that was ours wearing Kimmerer’s name, and two citations lifted

Her definition is narrower than the use this sheet makes of it. A metaphoray is the writer’s walk and what it gathers is metaphors. The draft had it as carrying meaning between registers of knowing — a good reading, and hers only by inheritance. The sheet mounts her sentence whole and then says in its own voice that the extension is the sheet’s. This is the tightened-source failure running backwards, broadened rather than trimmed, with the attribution left attached.

A posthumanism claim was carrying her name and now carries none. That the human was never a bounded observer outside the systems it studies is real argument and it is not in Braiding Sweetgrass. The citation came off rather than being re-pointed at a book nobody here has opened. A stimming claim cited to Neuroqueer Heresies came off on the same reasoning; Walker is still cited where the neuroqueer argument is demonstrably his.

A sentence claiming the masthead phrase comes from Walker’s subtitle was written and then rewritten before it shipped. That is precisely what the ledger refuses to say — Helen wrote the phrase in the founding brainstorm, post-normal has its own lineage in Funtowicz and Ravetz, and the settled position claims nothing about how it reached us. A new sheet restating an old finding is where a settled nuance quietly gets lost, and it nearly did.

Label correctedThe sheet shipped still speaking as a draft, and said it had no number while carrying one

Caught by Ryan within the hour, on the published page. What this sheet does not settle ended with a paragraph reading No social card, no number, no stamp. Those are accession and they happen at publication, not here. — on a sheet with a social card, the number 15, and a stamp two inches below it. The posthumanism paragraph promised a source before this is accessioned, which had stopped being true at the moment of accession. Both are gone, and the section now describes what is open rather than what publication would later do about it.

The cause is worth more than the fix. Five edits were applied when the draft block came off. Two ran through a loop that asserts each pattern matches exactly once and stops if it does not; three were bare string replacements written inline, with no assertion. The kicker matched, the Etuaptmumk sentence matched, and the accession paragraph did not — its whitespace differed from the guess — so it silently did nothing and published a false statement. A replacement that matches nothing and says nothing is indistinguishable from one that worked.

It cleared every gate, and no gate here could have caught it. The full sweep over thirty pages passed: the markup was valid, the contrast fine, nothing overlapped or scrolled. A sheet asserting it has no stamp while rendering one is not a shape a checker can recognise, which puts it beside the deadname rule and the bookmarklet — an editorial claim somebody has to read. The check that would have caught it is reading the published page, which is what happened.

The provenance line gains its first correction on its mounting day, which is the eighth sheet of fifteen to be corrected that fast and the reason --mended was drawn.

MountedThree gaps published open rather than papered over

The sheet ships saying what it does not settle, which is the point of that section rather than an apology for using it: Etuaptmumk wants a source of its own, the posthumanism sentence wants one or wants rewriting as ours, and the stimming claim wants checking against the literature it probably belongs to. Helen signed it off in that state. The alternative was to invent plausible citations, which is the one thing this cabinet exists to refuse.

The citation style is still the draft’s own — parenthetical (Author, Year) rather than naming each source in a sentence. The same question is open on Time Present, Time Past, and the two want answering together rather than one at a time.

2026 · 14 September

A way back to the front, and the four marks that were not it Link to this section

The breadcrumb had been a route home on every page since the drawers shipped, and it was not the route anybody reached for. The tray has one now, drawn as a glasshouse.

CabinetA labelled home control, first in the instrument tray

A trail and a control are different things, and both stay. .qe-crumbs says where you are; it sits inside the masthead, below the tray, and on a sheet it is the third thing down. A reader in the middle of nine thousand words wants the other one. Ryan kept looking in the top bar and finding nothing there, which is the whole of the case.

It carries a word, and the unlabelled licence next door does not reach it. The fox and the hedgehog are allowed to be a picture alone because nothing is withheld — that page is in every footer, in the drawers menu and in the finding aid. The home page is the destination a reader is most likely to want and least likely to hunt for, so hiding it behind a drawing would have been the original complaint arriving again wearing a mark.

At 320px the tray is three lines now rather than two, and that was measured rather than discovered later: 133px of tray against 91px, no target under 44×44, no two hit areas touching, and scrollWidth equal to the viewport at 320, 375, 414, 768 and 1280. Both overlay panels hang off the tray rather than off their own summaries, so neither moved — which is the fault the drawers control found the hard way, and the reason that rule exists.

CabinetWhy a glasshouse, and why not a cabinet, a mended cup, or our own leaf

Four marks were drawn, rasterised at 16, 20 and 27px, and then magnified off a canvas rather than redrawn large. A vector redrawn large is a lie about what a reader gets — the lesson favicon.svg paid for twice and the pocket lens a third time. What the pixels said was that a pitched roof is the only silhouette that reads as home at 16px, and that everything else needed the word to carry the entire meaning.

The site’s own mark was tried first and lost. Home as the logo is the oldest convention on the web, and the pressed leaf does not survive the trip: it has a paper ground and a 64px canvas on the icon, and at 20px in moss beside the lens it is a dark blob with less character than the instrument next to it. Its midrib in paper is a white gash that splits the leaf into two lobes and reads as a pea pod. And --qe-rust goes pale pink in the drawer, so the pin that makes the favicon legible becomes a pale bulb at the base.

A chest of drawers was refused without drawing it. The cabinet itself is a drawer in the menu two controls along. One picture, two destinations.

So was a mended cup, and that one is a house rule rather than a matter of taste. Kintsugi is already spent here: --qe-marigold marks a re-determination in this register and the join in a restored attribution, and a seam requires an actual repair. A gold-mended mark in the tray would have asserted a correction that never happened, an arm’s length from the real mends on every provenance line on the site.

The wabi-sabi that survived is the ridge, set off centre. The apex sits at x 11.2 against a body centred on 12, so the two slopes differ and the bays run 4.8, 5.4 and 4.6. It is visible at 20px, it is the same wonk axis already running on this site’s type and on the rail’s ticks, and it claims nothing — which is the only licence ornament gets here.

Two versions were drawn wrong first. A full glazing grid with a transom and one missing pane goes muddy by 20px, and the missing pane does not read as a void at all: it reads as a dark window, and sitting off centre it drags the whole mark sideways. Then a shoot drawn up through the open door — the botanical cue this mark otherwise lacks — read as a small person standing in the doorway at the size it ships at. That is the lilac panicle’s lesson in a fourth costume: do not put one small mark where the eye is expecting a figure.

2026 · 14 September

The cabinet can be installed, and the pin Android would have cropped off the mark Link to this section

A web app manifest, which the site had never had — and a 512px icon that had been generated on every run since the first week and referenced by nothing at all.

Cabinetsite.webmanifest, and why it says minimal-ui rather than standalone

Installed, this site would have had a generic browser icon and its page title. A manifest is the declarative half of the thing the acronym covers — it runs nothing, caches nothing and makes nothing work offline; it says what the mark is, where the window opens, and what colour the chrome around it should be. The other half is a service worker, and there is still none here.

display is minimal-ui on purpose, and that is the one field in it that is an argument rather than a fact. standalone hides the address bar, and this is a site whose whole practice is that /on-being-ill is a real address a reader can copy, share and check us against. An installed copy that hides the bar the address sits in would be the cabinet quietly withdrawing the thing the ledger exists to make possible. minimal-ui is still installable in Chromium and keeps the address in view.

start_url is a bare /, against the spec’s own example. That example appends a tracking parameter so installed launches can be counted separately; there is nothing here that could read it, /privacy says so, and it would mint a second address for the home page on a site whose redirects exist to ensure every page has exactly one.

short_name is the site’s name and not a nickname. A home screen may truncate Queering Earth, and being truncated by somebody’s launcher is not the same as us keeping a second, shorter name for the site — which is the drift this register refuses everywhere else.

CabinetA maskable icon is not a copy of the 512, and the measurement is what says so

Android applies its own mask and guarantees only the central 80% of the square. The mark is a pressed leaf pinned with the wordmark’s rust dot, and at the scale every other icon here is drawn at, the drawing reaches 0.484 of the square from its centre against a safe radius of 0.400 — measured out of the finished PNG, not calculated. The pin is the part that goes. A leaf with no pin is a leaf; the pin is what says specimen, and it would have been cropped off on every Android home screen with nothing anywhere looking wrong.

So the maskable one is a separate render at its own scale rather than a purpose on an existing icon: an icon declared any maskable is used at both jobs, and padded enough to survive the mask it is a small leaf adrift in a field of vellum everywhere the mask is not applied. The ground was already full-bleed paper with no transparency, which is the other half of a maskable icon done right, so only the scale had to move.

0.33 was the arithmetic and 0.32 is what shipped. The first re-render measured back at 0.400 of the square exactly — on the line, with no margin for a platform that rounds its mask the other way.

images/icon-512.png had been written on every run since the day the mark was drawn — 7 September, before this register existed to record it — and was referenced by nothing — not a page, not _headers, not the sitemap. Somebody laid this groundwork in the first week and stopped.

CabinetA manifest fails silently, so three gates learned the word manifest

There is no symptom. A manifest served as the wrong type, or naming an icon that is not there, is simply ignored: no console error, nothing wrong on the page, and an install affordance that never appears. So _headers types it explicitly — the .avif lesson, where production sends nosniff and a type the local server guesses is one the live site cannot recover from — and tools/serve.mjs learned it too, so local and live agree.

Two gates had allowlists that would not have seen it. check-cache.mjs and check-metadata.mjs each decide whether a link is a fetch by matching its rel against a list, and neither list held manifest. The one asset every page on the site fetches would have gone through the undeclared-asset check unseen, and a manifest pointed one day at somebody else’s CDN would have gone through the third-party check unseen. An allowlist is only as good as its newest entry, which is the argument for adding one in the same edit rather than the next.

Check 11 is the new guard, and it checks the copies rather than the judgements: the two colours against the --qe-paper in the stylesheet’s :root block, the name and the description against the home page’s own, every icon against the file on disk and against the size it claims to be, and every page for the link. It also guards the one number the pixels cannot give back — Node has no image decoder, so the maskable scale is measured where the drawing happens and the gate only keeps the constant from being tidied back up. Made to fail in five shapes before being believed, each reverted after: a page that does not link it, a colour that is not the paper, a sizes that lies beside an icon that is not there, the maskable scale raised, and a description typed rather than copied.

2026 · 14 September

Sheet No. 14, and a privacy page that was false by two Link to this section

A wall, recast from our sibling site’s reading of the same life — and a correction to /privacy that had nothing to do with it and was found on the way past.

MountedKnown and Felt and Seen, Sheet No. 14 — Dolly Parton, 1946–2026, read against Tressie McMillan Cottom

A wall rather than a reading, because the specimen is a person. Nine slips in nine hands across forty-seven years — Lenora Ross in 1974, Parton herself five times between 1984 and 2021, Cottom three — and they do not agree. The second wall on the plate, after No. 8.

The hinge is that weed is not a rank. Taxonomy has no such category, because a weed is not a kind of plant but a verdict about a place, passed in a hand that is never the plant’s own. Set beside Cottom’s distinction between visibility and legibility — being a thing that is supposed to exist — it gives the sheet its whole argument: a weed is perfectly visible and entirely illegible.

Cottom’s critique sits inside the sheet rather than after it. Her reading — that the drag was survivable because the ground under it was unmarked whiteness — is the sharpest thing written about Parton, and a determination slip that leaves out the awkward reading is not a kinder slip, only a less true one. The sheet does not resolve it and says so.

Our sibling site read the same life through physics and this one reads it through taxonomy. Star Stuff’s No One Had to Qualify turns on a star that cannot aim its light; this turns on a plant that cannot appeal its name. The quotations were traced to their primaries for that zine and are not re-walked here — Ryan’s call, recorded in the ledger, along with what this sheet adds that the zine does not.

Three click-to-load recordings, one per instance of the argument. No new capability: the facade, the drawn poster and the one named origin were all already here.

CabinetThe three debugging ports were Star Stuff’s as well, which is why the original disaster happened

The rendering gates were ported from our sibling site and the port numbers came with them, comments and all. 9412 is the contrast gate in both repositories; 9413 is overlap here and check-sheets there; 9414 is width here and two gates there. Two checkouts on one laptop could not run their rendering gates at the same time, and the symptom read as a broken gate rather than a busy port — which is also the shape of the five-day orphan this file already records.

The refusal was right about the danger and wrong about the remedy. cdp.mjs refused to run if anything answered on its port, which protected against measuring in a stranger’s browser by declining to measure at all — and fired on a neighbour doing nothing wrong. The number a gate asks for is now a preference: a busy port is stepped over in hundreds, 9412 to 9512 to 9612, on ladders that are disjoint so the three gates never chase each other onto one another’s ports.

And the guarantee got stronger rather than weaker. Once the endpoint answers, the listening process is walked up its parent chain to the child we spawned — Chrome’s helper holds the socket, so the listening pid is routinely not the one we started, which is what makes this an ownership proof instead of a guess. The old refusal never proved anything; it only declined to be in the room.

A busy port now says which kind of busy it is, because that is the judgement a person gets wrong under pressure: a headless Chrome whose parent is still running is somebody else’s sweep in progress and must be left alone, and one whose parent is gone is an orphan and safe to kill. That distinction was got wrong in this very session — a Chrome was killed on a heuristic that could not tell the two apart, and the parent was checked afterwards rather than before.

Star Stuff is not edited from this repository, so the whole fix is on our side. Proved in six shapes and every decoy cleaned up after: a quiet ordinary run on the preferred port; a live holder, correctly named as live with the advice to leave it; an orphaned holder, correctly named with the pid to kill; a full parallel sweep with all three preferred ports blocked, which is the exact case that refused this morning and now passes in 305s; the ladder exhausted, which still refuses and exits 1, because a gate that cannot own its browser must not measure in anybody else’s; and the precedent this follows — .claude/launch.json stopped hardcoding 8766 for the same reason, a second session being unable to preview the site at all.

CabinetDeleting a draft branch does not delete its deploy, and three files said it did

Measured minutes after this sheet was published, when the branch had been deleted from both ends: draft-known-and-felt-and-seen--queering-earth.netlify.app answered 200, still serving the pre-publication draft with its review layer attached, and a full copy of the site beside it. Netlify keeps the last branch deploy at its subdomain after the branch is gone.

The same wrong sentence was in three places — this site’s own build notes, start-draft and publish-draft — written once and copied twice, and never checked in any of them. That is the drift this register exists to catch, in the files that describe how the register is kept.

The noindex is what makes it survivable, and it is doing more work than we knew. The orphaned deploy inherited X-Robots-Tag: noindex from the drafts base, so it cannot be crawled. The live risk is a reader rather than a crawler: anybody holding the old review link keeps reading a superseded draft and may annotate a version that no longer exists. Removing the deploy is now a step in publish-draft, and it is a dashboard action — nothing in this repository can do it and no gate can see it, which puts it in the same small class as the bookmarklet: a check a person has to run.

CabinetThe recordings list on /privacy is checked against the facades that exist

Check 7c. Section 7b asserts that every third-party origin our scripts can reach is named, which is the check that matters for what a browser may talk to and is structurally blind to how many recordings there are — one origin covers any number of videos. So it counts the data-embed-id facades on every page, reads the list under #the-embed, and compares them per page. It also reads the number the page says out loud in its own prose, because a list that grew while the sentence above it did not is the same failure one layer up.

Made to fail in five shapes before being believed, each reverted after: the historical bug put back — the two Sheet No. 12 recordings unlisted with the count sentence agreeing with the short list, which is exactly how it shipped; a count word wrong on its own; the list naming a recording no longer on the page; a new facade added to a sheet that had none, which is the case that will actually arrive next; and the two ways the check could be quietly defeated — rewording the sentence it reads, and renaming the section’s id. Both of those fail loudly rather than going silent, because a gate that stops applying when somebody edits around it is worse than no gate.

Cabinetcheck-markup.mjs stops reporting PASS over a page it never read

A named target that could not be found printed SKIP not found and the run went on to report PASS, 0 problem(s) and exit 0. It happened here: a page was checked from a branch it did not exist on, and the gate certified it — 0 tags, 0 ids, 0 elements balanced, and a clean bill of health.

This is the empty-pass fault the rendering gates already guard, arriving in the one gate that had no guard for it. The wording is taken from theirs, because the reasoning is identical: a page that measures nothing reports zero problems, which is indistinguishable from a clean page in every other line of the output. Unread targets are reported in their own block, never mixed into the problem count — an unmeasured page is a broken run, not a bad page — and under --check the run fails.

Proved in four shapes: the missing file alone; a missing file beside a real one, where the real page must still be measured and the run must still fail; without --check, where it reports and does not gate, which is this tool’s stated contract; and a real page, which still passes.

2026 · 13 September

A link that went nowhere, and the gate that now says so Link to this section

Written into this register earlier today and caught only because somebody went looking. Nine gates had passed it.

CabinetCheck 10: every authored fragment link lands on something

The cross-page half is the half that matters, and it is why this could not be a per-page check. Ids here are authored topical anchors precisely so a reworded heading keeps its address; seven anchors point at the plate alone, and nothing verified that one of them landed. So the gate builds its map of ids from every page in the cabinet even when the run is scoped to a single one.

It reads anchor elements and never the string href=. A code span documenting a link writes the tag with only its brackets escaped, so the href survives verbatim and a text search would match this site writing about its own links — the same fault the review-layer guard already records, arriving a third time. Proved by injecting one beside three real faults: the three were reported by name, the documentation was not, and the count of links resolved moved by four rather than five.

The contents list, the rail and the entry index never appear in it: they build their links at runtime from ids they have just read, so they cannot be wrong. What the gate sees is what a person typed. 864 of those resolve today, and the number prints on every run, because a check that measured nothing looks exactly like a clean one.

2026 · 13 September

The header that says what a page may reach, and the hash that has to be generated Link to this section

Ryan asked how strict the Content-Security-Policy was, and whether tightening it would break the new editor. It had been one directive for months on a reason nobody had measured.

CabinetEleven directives where there had been one

_headers had carried frame-ancestors ‘none’ and nothing else since the header shipped, with a comment saying a script-src would kill the snippet every page runs before first paint. That was a plausible reason nobody had checked. Counted instead: one executable inline script on the site, byte-identical on all twenty-nine pages, so a single hash covers every page. The twenty-eight JSON-LD blocks need none — a data block is never executed, and hashing them would have buried the one hash that matters among twenty-eight that do nothing.

What is locked now: scripts to this origin and that one hash, no eval, no inline handlers, no plugins, no base tag, no form submission anywhere, and frames only from the one embed the privacy policy already names. style-src keeps ‘unsafe-inline’ and that is not laziness — 1,299 inline style attributes carry each sheet’s own foxing seed, stamp rotation and card colours, and a CSP hash does not cover a style attribute, only a <style> element. The alternative was not a stricter policy; it was deleting the per-page palette.

Cabinettools/make-csp.mjs, because the hash cannot be kept by hand

The snippet it hashes lists the nine typefaces the picker offers, so narrowing the picker changes the hash in the same commit — and a stale hash does not warn. The browser simply refuses the snippet on every page, and every reader who asked for the cabinet or for plain view is shown the other thing before the stylesheet catches up: the exact failure the before-first-paint rule exists to prevent, arriving silently and visible only to somebody who had a preference stored and was looking for it. So the policy is written between markers by a tool, check-cache.mjs fails when the header and the pages disagree, and the generator runs last of the five, after everything that can rewrite a page.

Proved in a browser before it shipped, both ways. The policy went into a copy of the home page as a meta tag with a preference stored: the snippet ran and the cabinet came up. The same copy with one character changed in the hash refused it — and Chrome’s own message named the hash the generator had computed, which is the browser confirming the arithmetic rather than us confirming it. The gate was made to fail and then to pass the same way.

CabinetA permissions policy, and the five exceptions that are the whole of it

The site asked the reader’s device for nothing and said so nowhere. It says so now: thirty-five capabilities denied outright — camera, microphone, geolocation, payment, USB, serial, Bluetooth, MIDI, the motion sensors, the credential and attribution APIs. None of it costs a reader anything, because this site calls no gated feature of its own, which was checked rather than assumed.

A deny-everything list would have broken the one control a reader actually presses. An iframe’s allow attribute can only narrow what the page already has — it cannot grant what the header denies — so a blanket denial would have left whoever pressed the Eliot facade with a player that would not start and a fullscreen button that did nothing. Five features are delegated to that one origin, never to everything, and only fullscreen also keeps this site itself.

clipboard-write is not named here, and looking it up is what saved it. Both injected layers copy out through the clipboard, so it seemed the thing most in need of protecting — and it is not a directive in the registry at all. Writing it would have been the sitemap relation a second time: a token that reads as standard, is not, and rides along on every response saying nothing.

What is left unnamed is the other half of the care. Screen-reader announcements, and a reader’s own translation and speech tools, are not capabilities to take away from somebody trying to get at our words. Denying them would have looked more thorough and been less careful.

Proved behind a throwaway proxy putting the real header in front of the real site, because a permissions policy cannot be set by a meta tag the way the content policy was tested: camera, microphone, geolocation, payment and USB all refused for our own pages; all five player features allowed for that one origin and refused for an unrelated one; and the facade pressed, the player built, and Eliot read.

2026 · 13 September

A way to change words without editing HTML, and a policy that had been miscounting itself Link to this section

Ryan asked whether Decap, Sveltia or TinaCMS would work here. None of them can, and the reason turned out to be measurable.

CabinetNo CMS fits, because there is no content model to fit one to

All three are git-backed editors over collections of files with named fields. A sheet here carries eighty to a hundred and twenty hand-drawn SVG elements, eight to thirteen authored section ids, forty to seventy inline style attributes seeding its own foxing and stamp rotation, and JSON-LD whose about.author is a judgement about who made the thing being read. There are no fields to put in a schema. That is the standing reason — the layout is the argument — stated as a measurement rather than a conviction.

The deferral now rests on one leg. Its third reason was struck yesterday; its second said Netlify Identity’s git-gateway was being sunset, and Netlify reversed that on 19 February 2026. The remaining reason is the one that was always carrying it.

Cabinetedit.js: click a paragraph, change the words, copy out a patch

Nothing on any page loads it — a bookmarklet injects it, so a reader’s visit fetches nothing extra and no page markup changed to allow it. It cannot save, which is the design: saving from a browser needs a token in the page, and that is the account problem the CMS question was trying to avoid.

What it refuses to edit is the important part. Quotations, captions and citations are not editable, and the page says why where you try. This site’s characteristic failure is a tightened source rather than an invented one, and a tool that let anybody reword a mounted quotation in two clicks would be a machine for producing exactly that. The accession stamp and the provenance line are refused for the same reason in another key: a record you can edit in a browser is not a record.

The patch is decoded text and the first version claimed it was the file’s bytes. innerHTML decodes entities, so a before-string matched nothing for any paragraph holding an apostrophe. Re-encoding cannot rescue it either: the sources are mixed — 1,300 raw em dashes beside 1,512 &mdash; — and no encoding reproduces a file that is not consistent with itself. So it says what it is, and tells whoever applies it to match on decoded text and stop if nothing matches exactly. Proved both ways before it was believed.

MountedThe editor is distributed from the colophon, as something to drag

A bookmark is only useful if somebody can install it, so it hangs at the foot of the colophon where how this site is made already lives. A javascript: link runs on a click as well as surviving a drag, so it is try-it-now and keep-it-later in one control, and the hint beside it says both.

It loads from queering.earth whatever page it is pressed on, which means it works on a draft host as well as the published site — a contributor can edit a sheet that has not been mounted yet. Verified by pressing it on a page served from somewhere else entirely and watching the editor start.

The section says what the editor refuses to touch and why, because that is the part worth publishing: a quotation, its caption and its citation are not editable, and neither is the accession stamp or the provenance line.

2026 · 13 September

Sheet No. 13, and the first sheet written by Helen Edgar Link to this section

A zine arrived, and what it argued turned out to be about this cabinet. It is mounted as an essay; the zine setting was built, measured and dropped on the way.

MountedHeld, Not Fixed, Sheet No. 13, an essay

Helen Edgar on lost things and the cabinets we keep for one another. Emily brings a broken object into the shop and it is looked at rather than mended; a herbarium sheet makes one flattened plant stand for every other, which is how a normal mind gets defined; and Ole Worm kept a unicorn horn that stayed wonderful after he proved it was a whale.

The argument the sheet exists for is the third move. What gets called a special interest in clinical language is, from the inside, a small cabinet of curiosities kept and tended by the person who fills it. Three artists are held against that — Beuys keeping a name the textbooks dropped, Dion leaving the species blank, Klee gathering a herbarium for ten years and never using it — and only then is Dinah Murray’s monotropism named, after the experience rather than before it.

The drawing is a pressed specimen held down by three paper straps, which is the title stated as a fact rather than as a metaphor: strapping is one of the three standard herbarium mountings and it is the reversible one, so a strapped sheet can be lifted and re-determined.

MountedTwo plates from Museum Wormianum, 1655

Wingendorp’s frontispiece — the room itself, a polar bear on the shelf and three walls of lettered categories — and the woodcut on printed page 283 of the narwhal skull with the tusk still in it, which is the figure by which Worm showed the horn was a whale’s tooth. The leaf was found by full-text searching the scan for Unicornu rather than by guessing, and the printed folio confirmed it.

Public domain, digitised by the Biodiversity Heritage Library from the Smithsonian Libraries copy, and the rights were read at the item rather than taken from the blog post that led us to it. The narwhal is cited to the Internet Archive leaf and not to a BHL page id, because BHL sits behind a bot wall and the id could not be verified: a guessed citation is worse here than an inconsistent one.

MountedAn introduction to Ole Worm, who had been arriving mid-sentence

Helen’s note after publication: he comes out of nowhere. He did — the sheet named him in the second sentence of a paragraph about cabinets in general and went straight into the unicorn horn, so a reader met the anecdote before the man. Three sentences now say who he was: a Danish physician and antiquary who taught Greek, Latin, physics and medicine at Copenhagen, was physician to Christian IV, and read runestones for years. The engraving above him is identified as his own room.

One detail was checked rather than copied. Burkhardt’s Verzeichnis eponymischer Pflanzennamen, the authority consulted when this sheet’s plates were sourced, makes him physician to Christian V. It was Christian IV: Worm died in 1654 and Christian V acceded in 1670. The slip is noted in the library copy so nobody takes that detail from there later.

2026 · 13 September

Two ways the instruments here mislead the next person, written down rather than remembered Link to this section

Neither is a fault in the site. Both cost a session time today, and both would have cost the next one the same.

Cabinetgrep reports nothing on make-records.mjs, and silence is not an answer

That tool fences its code-span placeholders with literal NUL bytes, so file calls it binary data and grep prints nothing rather than saying why. A search for a string that is plainly in the file exits quietly with no output, which looks exactly like a file that does not contain it. Three searches and one wrong theory about corruption before file was run on it.

The fence is right and is not the thing to change. A placeholder needs a delimiter no source text can contain, and this is a repository whose prose is about its own markup — every printable candidate is one an entry may legitimately write inside a code span, and the day it does, a placeholder is restored into the middle of somebody’s sentence. The cure is knowing: grep -a, and run file when a search comes back empty on a file you can read. It bites an edit script too — the apparent spaces around the placeholder index are NULs, so a pattern typed from what the terminal renders will never match, which is how the first attempt to teach that tool strikethrough failed on an anchor that looked correct character for character.

CabinetThe gate ports are shared with Star Stuff, and the collision is kept on purpose

The three Chrome gates here bind 9412, 9413 and 9414. So do Star Stuff’s, because these were ported from there and the numbers came with them, and the two repositories sit side by side. A session working in each at once is two suites contending for three ports: today a sweep hung for twenty minutes, and a later one had check-width.mjs refuse in 0.2s while a neighbouring check-overlap.mjs held 9414.

The refusal is cdp.mjs working exactly as it was written to, after a gate spent five days measuring in an orphaned browser it did not launch. That guard cannot tell an orphan from a live neighbour, and should not: driving either is the same mistake. Renumbering would end the collision and end the protection with it, in the one direction it has already paid off — so it was weighed and refused. The collision is loud and costs a wait; the alternative is quiet.

Checking the port first was the obvious advice and it is wrong, which was found by writing it down and then trying it in the same hour. The ports were free, the sweep started, contrast and overlap ran their 55 and 42 seconds, and width refused anyway — the neighbour had taken 9414 in the seconds before it spawned. The window is every moment until each gate binds, and nothing outside the tool can close it. What works is re-running the one refused gate: the refusal costs 0.2s, the other eight have already reported, and width came through on the twelfth attempt. Wait rather than kill — a neighbouring gate is somebody’s real run.

2026 · 13 September

A retraction had been reading as a typo, on the page whose job is to show what was retracted Link to this section

Found by reading the page rather than by any check, which is the only instrument there is for a fault made of valid markup and wrong words.

CabinetMoss letters, coral strike — and the struck sentence leaves the finding aid

It is del and not a class. A line-through drawn on a span is invisible to a screen reader, so the one mark on these pages that says this is no longer true would be missing for the readers least able to infer it. The element carries the meaning and the colour only shows it: --qe-coral on the rule, --qe-moss on the letters, the colour on the strike and never on the word — the idiom the restored attribution on Miranda already uses, reused rather than restated.

The struck sentence drops out of the finding aid, and that is correct. The index skips del subtrees, because plain text has no vocabulary for this is the reading we got wrong and a snippet would hand a searcher a retracted claim as a current one. Checked rather than assumed: the page still indexes that passage once, through the 12 September entry that quotes it as history and says why it was struck. The retraction is findable; the retracted claim is not.

2026 · 13 September

A listing said five sheets had been corrected while the sheets said they were clean, and the sheets were right Link to this section

Moving one provenance line made the disagreement visible. Measuring it turned the expected answer around: twelve of the thirteen lines were exactly right, and the tool was the one making a claim it had not checked.

CabinetCorrected four times since for four corrections made the day the sheet went up

What has arrived counts a page’s corrections out of this register and prints the total under the word since. A sheet is routinely corrected while it is being mounted — a citation checked against the primary, a story everybody tells found to be wrong — and those entries are filed to the sheet like any other. So The Swell and the Dwell read Corrected four times since for four corrections dated the day it arrived, and five sheets read as corrected while their own provenance lines said Not yet corrected. Nothing was miscounted. The listing was asserting a chronology it had never checked, which is this house’s own recurring fault wearing a number: a claim that looks like a measurement and is not one.

The line now splits the two — Corrected twice on mounting and once since — in the vocabulary The Die Uncast already uses on its own provenance line.

CabinetThe split is on the arrival day, because the mounting accession is not a thing

The obvious key is the accession that mounted the page. Measured, several pages have more than one: this register files three Mounted accessions to the ledger on the day it arrived and two to My Gloomy Sunflowers, because Mounted is this register’s word for anything added to a page rather than for a page coming into being. The arrival day is a thing, because it is a measurement of the repository and the listing already had it.

It is also the only rule a generator is entitled to. Within one day the order of accessions here is editorial and nothing can verify it, so a tool that placed one same-day entry after another would be claiming a fact it does not have. A provenance line may draw the finer distinction, because it is authored and knows which accession mounted its sheet — The Die Uncast separates four corrections on mounting from three more when the plates changed, all seven on 8 September. The listing says the coarser true thing and the sheet says the finer one, and neither contradicts the other now.

CabinetThirteen provenance lines audited against the register, and twelve were right

Thirteen provenance lines were read against this register and twelve were exactly right. The Army of the Upright was the one: it said re-determined once, and the register holds two. The missing one is 9 September, when a line of Woolf’s turned out to be Woolf guessing at what Coleridge meant and the quotation was re-cut to start where the guess does. The line names it now.

The expected answer was the other one. Five sheets say Not yet corrected over register entries filed to them, and the first reading was that all five had drifted and wanted mending. They had not: an accession history reports what has happened to a sheet since it was accessioned, and five other lines go further and say on mounting or before it shipped in their own words because they chose to. Forcing a gold seam onto four clean sheets would have been decoration asserting a fact, in the component built to make real mends findable. Measured before mended.

2026 · 13 September

Three words under the tagline, read three different ways, and none of them the one we wrote Link to this section

Readers told us what the masthead said to them. It was not what it said to us, and it was not the same thing twice.

Re-determinedThe masthead credit comes off, and the credit stays

Since 7 September the masthead carried a second line under the tagline reading after Nick Walker, linked to his book. It is gone. Three words cannot carry the paragraph that credit needs, so three readers finished the sentence themselves, three different ways — as a death notice, as an endorsement, and as a declaration that this site is built on one person’s theory. The third is the one that decided it. A cabinet that reads the world through many lenses had appeared to run on one, in the first four words anybody meets.

Nothing about the attribution changed, only where it is made. The paragraph under Queering is a verb has carried the whole of it since the same day — the subtitle quoted, the hyphen named, he published it first, and no claim about the route the phrase took to reach us. Nobody has ever misread that. It is the place a credit of this shape belongs, because it needs a sentence, and the masthead had room for a label.

The rule worth keeping: a credit that needs a sentence must not be set as a label. That is this register’s own paraphrase failure arriving from the other end. A form too small for the claim will shorten the claim, and the shortened claim is not a quieter version of the true one — it is a different one. After is still the right word where there is room for it, and it still stands in the caption under the moth.

Re-determinedA sheet that quotes our own masthead had to be re-determined with it

The Five Unmistakable Marks argues that coinages get separated from their coiners, and shows its working on our own tagline. It said So the masthead says after Nick Walker, which stopped being true the moment the line came off. A sheet that cites the site it is mounted on has to move when the site does, and this is the first one here that did.

The section keeps the whole argument and gains the episode: what the three words were, what three readers each took them to mean, and why the credit went back to the place with room for it. The sheet’s first mend, three days after it was mounted.

Cabinet.qe-tagline-credit came out of the stylesheet in the same commit

The rule had one user and the user is gone. A rule with no element is not the fault this house watches for — that one is a class with no rule, which renders black and no gate here catches it — but it is the same drift from the other side: a stylesheet describing a component the site no longer has, with a comment above it explaining why the component is not optional. The comment was true when it was written and had to go with the rule.

The ledger and what is settled both carried the old state as a resolved question. Both now carry the re-determination beneath it rather than instead of it, because the 7 September call was half right and stays half right: crediting him was the right one of the three options, and the masthead was the wrong place to do it.

2026 · 12 September

A draft can now be read at a real address and marked up without an account Link to this section

Ryan asked for a lightweight way to show Helen a sheet before it is mounted, and then supplied the constraint that decided it: nothing requiring GitHub or editing HTML works for her. One sentence, and a settled decision stopped being true.

Re-determinedThe review path this site had written down did not work for the person it named

What is settled deferred a CMS partly on the grounds that the zero-cost path already works: Helen edits files in the GitHub web editor, opens a pull request, and Netlify posts a deploy preview URL on it. It had been false for as long as it had been written. The sentence came from Star Stuff, which really does run 192 pages that way, and was carried across as a fact about this collaboration without ever being checked against the person in it.

Reason 3 is struck on the record rather than quietly rewritten; reasons 1 and 2 stand, and the deferral survives on two legs instead of three. The open question beside it is half-answered — the friction is the tooling, in both directions. Reviewing is solved below. Authoring is still open, and is the half the CMS trigger is really waiting on.

CabinetDrafts live on a branch, and drafts/review.js lets a reviewer write on them

Only half the problem was ever hard. Reading a draft never needed an account — a Netlify branch deploy is a permanent URL. Giving feedback did, because a pull-request comment thread was the whole of the answer.

Drafts now sit at the root of a long-lived drafts branch, so a draft is byte-identical to the page that will ship and promotion is a merge. A drafts/ folder on main was measured and refused: it works mechanically, because every generator and gate here reads the root non-recursively, but it would put unreviewed attributions on queering.earth itself — unlisted, public, unauthenticated — and a page one directory down needs ../queering.css, so it renders something other than what ships. The gates that fail on that branch are the accession checklist reported by name: the missing 301!, the missing card, the missing <loc>.

The review layer is three lines in one head block, and publishing means deleting them. Armed, every block grows a visible focusable Note control; notes live in localStorage and leave only through Copy my notes, which builds plain text carrying the section, a deep link to its authored anchor, the quoted line and the reviewer’s own words. No endpoint, no account, no third party — this site makes no third-party request and a review tool is not the place to start one.

It writes words, which every other script here is forbidden to do, and that carve-out is stated rather than taken. These are instrument labels on a page that will never be published, and deleting the include line removes every one of them; authored templates instead would mean a block of markup pasted into every draft, which is the friction this exists to spare.

Cabinetcheck-metadata.mjs check 10, and four faults found by measuring what no gate measures

The guard keys on sitemap.xml, because that is this site’s own manifest of published addresses: a draft is not in it, so the branch stays green, and the moment a page is accessioned the gate demands the block be gone. It fails on the noindex half too — a page the manifest advertises and the markup hides is two statements that cannot both be true. Made to fail in both shapes on a real published page before being believed, and reverted.

Its first version was defeated by this register. The check grepped for the bare string drafts/review.js, and the sweep failed on this page and on what is settled — the two pages that had just been given an entry describing the feature. A gate that matches a string matches the documentation of that string, which on a site that documents its own build is not an edge case. It requires an unescaped script tag now. Check 7 in the same file already knew this, exempting a link because a link the reader chooses is not a request the page made; that distinction is called the whole difference between a usable gate and a useless one in its own comment. Same lesson, second gate.

Nothing gates runtime furniture, so it was measured by hand, and the first two measurements found real faults. --qe-paper-deep was the obvious ground and is wrong: moss and rust measure 6.90:1 and 6.21:1 on it in daylight, reproducing to two decimals the numbers that withdrew the recessed panel once already. Everything sits on --qe-card instead — ink 15.26:1 and 13.39:1, moss 8.35:1 and 7.53:1, rust 7.52:1 and 7.57:1 across the two grounds. And the 44px floor missed every Note button, because a selector for a button inside the review element does not match a button that is one; they were 40.3px until they were measured. All 54 controls clear 44×44 at 375px, none overlap, nothing scrolls sideways.

Two smaller things, each paid for by watching it go wrong. A definition list is one target, like a quotation — the specimen block fragmented into twelve note buttons first, which is the cropping fault from the other direction. And a note whose paragraph is rewritten under it is marked, never dropped: it re-attaches by position, says so on its face, and still exports. Silently losing a reviewer’s note is the worse failure.

Re-determinedNetlify does not noindex a branch deploy, and promotion is a merge was wrong the day it was written

The entry above asked for one curl against the first real branch deploy, and it was worth asking. The .netlify.app rule in _redirects does not reach a branch host, as expected. But Netlify sends no X-Robots-Tag on a branch deploy at all — Deploy Previews get one, branch deploys do not. The draft page itself was covered by its own three-line block; the full copy of all 27 published pages that a branch deploy also carries had nothing but rel=canonical holding it. Real mitigation, and exactly what this site already judged insufficient one layer up, where the apex .netlify.app host is 301’d rather than left to canonicals.

_headers on the drafts branch now carries X-Robots-Tag: noindex on /*, and that line must never reach the published site — if it does, every page here drops out of every index.

It is safe only because of a correction to the day’s own design. Promotion takes the file and never merges the branch. Promotion is a merge was written into what is settled and into the house rules before the branch had more than one thing on it, and it was wrong on its own terms: a branch holding three drafts cannot be merged to publish one of them. Cherry-picking the single file is what the workflow required anyway, so the header costs nothing that was not already being spent. The two halves are one decision, and weakening either breaks the other.

CabinetThree skills, so drafting never requires a git command

start-draft puts a page on the branch and prints the URL to send Helen. save-draft commits, pushes and hands the URL back. publish-draft takes the file onto main — never the branch — and walks the accession checklist this file already states: mount it, card it, log it, file it, stamp it, route it, crumb it, group it, rail it.

tools/draft.mjs holds the one thing all three need to agree about, which is which file is the draft. Written out three times it would be three answers the day one was edited, in the one place where being wrong means publishing the wrong page. A draft is identified by its marker rather than by a name kept somewhere, so a page stops being a draft at exactly the moment it is published, with no state file to fall out of step.

It matched the bare filename first, which is the third time in one day. Check 10 shipped that way and fired on this page and on what is settled; this tool did the same an hour later and reported both of them as drafts in progress. On a site that documents its own build, anything matching a filename matches the prose about that filename — and the discriminator is always the same, because prose escapes the tag or wraps the name in a code span.

2026 · 12 September

A gate that had been measuring in somebody else’s browser for five days, and a runner that makes a one-page edit cost a minute Link to this section

Ryan asked why moving one block inside one page took twenty minutes to check. Timing the answer turned up a second thing nobody was looking for.

CabinetA gate reported PASS for five days while driving a browser it did not launch

Each Chrome gate spawned Chrome and then polled /json/version until something answered. On 7 September an orphaned headless Chrome from a neighbouring project’s probe script took port 9414 and never let go. Every check-width.mjs run from that day to this one bound nothing, attached to that five-day-old browser, measured all 27 pages in Chrome 152.0.7977.77 while .84 was installed, killed its own portless process on the way out, and reported PASS with no sign whatsoever. Five such orphans were up, one per interrupted probe, holding about 400MB, with 303 temp profiles behind them.

This is the house’s own recurring fault in a new place — a run that measures a fraction of what it claims looks exactly like a clean one. It was found by timing the gates, not by any check, and no check here could have found it: every gate reports on the site, and nothing reports on the instruments.

cdp.mjs now owns the spawn, which reverses that file’s own stated position that the duplication “carries no footgun”. The port must be free before the spawn, and the process we started must still be alive when the endpoint answers — the old poll swallowed every failure and fell out of its loop silently, so a Chrome that died on launch produced a sweep of nothing rather than an error. The temp profile is removed on the way out, which no copy did. Made to fail in three shapes before being believed: a decoy on the port refuses and exits 1, a browser that cannot start reports Nothing was measured, and the port free again passes.

Cabinettools/check.mjs: twenty minutes becomes twenty-four seconds

Measured before anything was written. The four generators are 4.8s and the six offline gates 5.6s together; check-overlap is 40s, check-contrast 53s, and check-width is 4:22 — three quarters of the whole bill, because it renders 27 pages × 10 typefaces × 4 widths × 2 papers.

Three things made twenty minutes out of six, and none of them needed new capability. The three Chrome gates run at once, which they were always built for — they take one port each and cdp.mjs has said why since it was written. The sweep is scoped to the pages that moved, through the positional arguments all three already accepted. And nothing is run twice to read an exit code a pipeline discarded. Full sweep: 4:47. A one-page change: 24s, generators and all nine gates included.

The scope is taken from git, and only after the generators have run. That order is the reason this is a tool and not an alias: make-records and make-whats-new write into pages nobody touched, so asking git first scopes to the edit and misses the pages the edit caused. Untracked files count, because a new page is the case most in need of measuring and a plain diff cannot see one.

Which assets break scoping is declared, never inferred — the two-list shape check-cache.mjs already uses, because nothing in a file’s bytes says whether it can move a page it is not named in. The stylesheet, the script, the fonts and the gates themselves force a full sweep; queering-search.js adds the finding aid and nothing else. Everything else is page-local by declaration, --all is always available and always right, and a new shared asset needs a line in one of the two lists.

2026 · 12 September

Sheet No. 12, and a rule relaxed on the record rather than quietly Link to this section

An essay that began as a note in the inbox about a piece of music, and turned into an argument about who is allowed to love the way the canon does.

MountedEvery Day’s Most Quiet Need, Sheet No. 12, an essay

Limerence, read as monotropic attention rather than as a disorder. Four objects are held against that vocabulary — Glass’s Mad Rush, the first movement of Beethoven’s Op. 47, Mustapha Mond’s hydraulics of feeling in Brave New World, and Florentino Ariza’s fifty-three years — and then Elizabeth Barrett Browning’s Sonnet 43, which does something in its fifth line the standard reading treats as the modest beat.

The argument the sheet exists for is the asymmetry. Attention that pools on one person, will not redirect, survives years without reciprocation and refuses the cure is a masterpiece when a novelist does it and a symptom when an Autistic person does it. The canon is the evidence, and this sheet puts it on the record: either the sonata is a symptom too, or the longing is not one.

The drawing is a Myosotis — a water forget-me-not, which grows at the margin of standing water. Its flower-head is a scorpioid cyme and the coil is computed rather than drawn, sampled off a spiral whose radius grows as it unwinds, with tight buds at the curled tip and open flowers along the uncoiled part. Drawn by hand it came out a snail. The plant was chosen because the coil unwinds, which is the shape of the sheet’s own argument, and because its common name is the thing the whole essay is about.

CabinetTwo recordings from the rightsholders, and one link that is not

Both embedded recordings are the owners’ own deliveries and were verified as such before they were mounted, not assumed from the channel name: Mad Rush is Sony Classical’s delivery of the 1989 Solo Piano recording with Glass himself at the piano, and the Op. 47 first movement is Warner Classics’ delivery of Renaud Capuçon and Frank Braley. The first draft of this sheet carried a listener’s upload of the Glass; the official one exists and was found by looking, which is the outcome the policy is for.

The Immortal Beloved scene has no such copy and is linked rather than embedded. No official clip or licensed excerpt of the film could be found. The policy asks for a copy the rightsholder is paid for; this is not one, and the relaxation is Ryan’s call, recorded here and stated on the sheet’s own face in what it does not settle. A link is a request the reader makes; an embed is one the page makes for them. That distinction is the whole of what the relaxation rests on, and it is why the film gets a link and not a facade.

2026 · 12 September

The lilacs went back to the foot of the home page, and needed a heading once they were in an outline Link to this section

A coda stops being a coda the moment anything is appended beneath it. Nobody moved this one; three sections arrived under it, one at a time, each of them correct.

CabinetMoved to the end of main, where it was mounted

Eliot’s four lines, the Syringa vulgaris drawn from Ryan’s yard and the click-to-load recording were mounted above the footer and last on the page, at 16:17 on 9 September. They were the last thing on it for two and a half hours. The cabinet’s own pages came out of the footer and onto the home page at 18:54 that evening, the thirteen aims followed at 19:47, and the two lists became the founding papers and the cabinet itself on 11 September. Every one of those edits appended, which is the ordinary thing to do, and the sum of them left a coda in the middle of the page reading as a digression between the plate and the furniture.

It now sits after both lists, which is the foot of main again — and last for a structural reason rather than a chronological accident, since nothing on the home page follows the drawers.

CabinetBeing last had been doing the work a heading does

The section had no h2 and had never needed one: a passage at the end of a page, after the argument has finished, announces its own genre by position. Moved into an outline it has to be named in that outline, so it is Coda: the lilacs — the word says what the section is, which is the job the position used to do.

The address is #lilacs and not a slug of the heading. Ids here are topical and authored precisely so a reworded heading does not take every shared link with it; Coda is a word we might argue about, and the lilacs are not. The rail picks the section up with nothing else added, because it derives from the page’s own headings — and the home page has no contents list to keep in step, its plate being the index it already has.

2026 · 11 September

Two of the five link relations this site sent were not relations at all Link to this section

Noticed in passing while the feeds were being split, and it turned out to be twice the size of the note that prompted it.

2026 · 11 September

A gate that counts closing tags, and the eight attributions it found wearing their emphasis inside out Link to this section

The unclosed accession found this morning was left as an open question: whether a check for it was worth the noise. Ryan settled it the same hour. It was not noisy, and it did not find one fault.

CabinetCheck 9: every element closes, and closes in order

check-markup.mjs’s header had said for its whole life that unclosed tags were out of scope by design and that guessing at intent would make the gate noisy. Both halves were wrong, and the header now says so. The cost of the first was the accession this register lost from the feed for a day. The second was tested rather than argued: every non-void element on every page was counted before a line was written, and the whole repo balanced but for two — that section, and an unclosed strong on Two Cohabitating Modes that had been bolding the rest of a list item since the sheet was mounted.

So it checks every element rather than a declared list of containers: a list would be a second thing to keep in step and the measurement says it would buy nothing. It is stricter than HTML, which lets p, li, dd and td close implicitly. That is deliberate — three generators here parse this markup with regexes, so balance is a requirement of the repository and not a matter of taste.

A stack, not a counter. Counting opens against closes returns zero for <div><section></div></section>, which is mis-nested and breaks those generators identically; a stack also names the element and the line where a counter can only say a total is off by one. That distinction paid for itself on the first run.

CabinetMade to fail in three shapes before being believed

The house rule is that a guard nobody has watched fail is a guard nobody should trust. Three faults were reintroduced and each reverted after: the original missing </section>, reported against the </main> a browser would close it at; the unclosed strong, reported against its </li>; and a deliberate mis-nesting that balances numerically, which is the case a counter structurally cannot see. Each exits 1; the clean tree exits 0.

22,709 elements balanced across 27 pages, and the count prints on every run — the same reasoning as the contrast gate’s element counts, because a gate that checked nothing looks exactly like a gate that passed.

2026 · 11 September

A page that says what arrived, two feeds instead of one, and a date that could not be taken from this register Link to this section

Ryan asked for the pair our sibling site has kept from the start: a What’s New page and a feed. Half of it turned out to exist already and to be unreachable, and the other half turned out to be two things rather than one.

MountedThe cabinet by date, at /whats-new

Every index this site had was in the order somebody chose. The plate runs by accession number, the two lists on the front of the cabinet run by what a page is for, and tools/pages.mjs holds that order for the drawers menu, /llms.txt and the finding aid’s manifest alike. This register is the one chronological view and its unit is the accession — an event — across some forty thousand words. Nothing answered what is here, and when did it turn up, which is the question a reader who was here last week actually has.

The listing is generated by tools/make-whats-new.mjs and written between markers into an authored page, the way the ledger and the decisions are. Star Stuff generates the whole of its equivalent from a template inside the tool and has recorded what that cost: a site-wide pass added a skip link to every page, the next build rebuilt that one from the template, and the skip link was gone with the tool reporting a clean build. A generated page does not conflict, it reverts. Edit inside the markers here and the next run takes it back; edit outside them and it survives.

Nothing on it is typed. The summaries are each page’s own meta description — the sentence /llms.txt already publishes, so there is no third copy and no repetition of the gloss a collection page is forbidden to repeat. The kind and the number come from the plate, which check-card-order.mjs already names as the authority for both. The correction counts are read from this register’s own data-sheet filing rather than counted by hand.

CabinetThe feed existed, and nothing on the site linked to it

/feed.xml has shipped since the agent-readiness pass. It was in every page’s head as rel=alternate and on every response as a Link header — so a client that had already been handed the URL could find it, and a person could not. There was no visible link to it anywhere on the site. A feed with no human twin is a feed for machines only, which is not what a feed is for. The new page is that twin, and carries the first pressable route to either feed.

CabinetOne feed became two, because they are two lists for two readers

The feed carried this register’s accessions — new sheets, corrections and housekeeping notes in one stream. On Ryan’s call it is now split. /feed.xml is the pages as they arrive, the same list as the new page and out of the same pass, so the two cannot be made to say different things. /register.xml is this register, under the name the site already uses for this page.

The pages took the old name rather than the other way round, and that is the part worth writing down: anyone already subscribed stays subscribed to a working feed and simply begins receiving pages, which is the list most people mean when they say feed. Every page advertises both, the Link header carries both, and check-metadata.mjs now fails on a page that names one and not the other.

CabinetThis register cannot say when a page was made, and that was measured rather than assumed

The obvious source for an arrival date was this page, and it does not work. Mounted here means anything added to a page, not a page coming into being: the colophon carries five such entries, Two Cohabitating Modes six, the front of the cabinet ten — and the privacy page carries none at all, because nothing was ever mounted on it. Taking the earliest would have dated several pages by accident and one not at all.

So the date is the commit that first added the file, which is a measurement of the repository rather than a second hand-kept copy of anything. And it is gated against what we wrote down. Eleven sheets carry an accession stamp with a date in it and twelve pages carry a provenance line with another; the generator compares all three for every page and refuses to run on a disagreement, because the day a stamp and a commit stop agreeing this site is about to say two different things about one day. All twelve agree today — checked before a line of the tool was written, not after.

Two things were found by running it rather than by reading it. A page being written has no commit that added it, so an uncommitted page is dated today, loudly, and corrects itself on the next run — self-healing rather than an override table, which would have had to be right forever. And the first version of that fallback used UTC and dated this page 12 September while it was still the 11th at the desk, a day ahead of the accession you are reading.

2026 · 11 September

Two van Goghs, two recordings, and a privacy page that had a number in it Link to this section

Ryan asked for the Almond Blossom on the sheet, for any other public-domain paintings that fit, and for click-to-load recordings of the songs with some lyrics quoted under the new policy. Three of those four were straightforward.

MountedTwo paintings, and two recordings that fetch nothing until pressed

Almond Blossom (Van Gogh Museum, February 1890) sits with letter 857, and Still Life: Vase with Fifteen Sunflowers (National Gallery, August 1888) sits with Gadsby’s line, which had been arguing about that painting without showing it. Both are public domain, both came from Wikimedia Commons at 1280px, and the figcaptions say so — what is out of copyright is the painting, and what we serve is somebody else’s photograph of it at a size we chose.

Almond Blossom is the sheet’s second wide plate holder for a reason unlike the other five: the existing wide plates are all line work losing hatching to a short ladder, and this is a landscape painting of a canopy, where the spread is the subject.

Townes playing Waitin’ Around to Die to a weeping Uncle Seymour Washington in Heartworn Highways gives Sheet No. 11 the Townes tether it did not have — every other artist on it had one. Polly sits under the Incesticide liner note, because that passage only works if you know what the song is. Both ids were checked against YouTube’s oEmbed endpoint before they were mounted, and the first id a search returned for Polly did not resolve at all.

CabinetNo lyric was quoted, for two different reasons

The request included lyrics. For Waitin’ Around to Die the answer is the ordinary rule — we quote what we have read, and no licensed text was in front of the session; the performance is embedded instead.

For Polly the same applied, and a second reason is stated on the sheet itself. Every word of that song is spoken by the man who committed the crime, which is what Cobain built it to do. Setting those words in a ruled box under a herbarium label would give a rapist’s speech the mounting this cabinet gives to Woolf and to Plath. The recording is linked whole instead. Whether the wording belongs on the page is Ryan’s call, and it is recorded here as a decision rather than left as a gap.

2026 · 11 September

Sheet No. 11, and four biographies that would not say what they were supposed to Link to this section

Ryan’s, opening the research: They help me process the immense ache of this world. They are my gloomy sunflowers. The sheet was proposed, researched over one day against five primary sources, and mounted the same day — and the research overturned most of what the proposal had asserted on the strength of secondary sources.

MountedMy Gloomy Sunflowers

Sheet No. 11, an essay, signed — the second on the plate after No. 2. Townes Van Zandt, Vincent van Gogh, Sylvia Plath and Kurt Cobain, read against the myth that made them.

The argument is Hannah Gadsby’s and Shoshana Kessock’s before it is ours, and both are credited on the sheet by name. What this sheet adds is the evidence: five primaries read at source in one day, and in three separate archives the same shape turned up — the work read as a symptom, and the record saying it was the thing that was going well.

It does not claim the four share a diagnosis, because they do not. A contemporaneous clinical file for one, a hedged retrospective paper for another, a psychiatrist arguing the opposite in print for the third, and a passing self-description for the fourth. What they share is having been treated as a diagnosis and read afterwards as one.

It carries a content note and crisis resources, and follows safe-messaging practice: no methods, no locations, and the deaths are not presented as the end of the argument.

Re-determinedGalveston was 1964, the diagnosis was not manic depression, and it was the Army

The proposal for this sheet repeated the account every tertiary source carries: 1962 or 1963, three months of insulin shock, a diagnosis of manic depression, an Air Force rejection. Hardy’s documented biography disagrees on every count. Admitted to the Titus Harris Clinic at UTMB Galveston on 14 March 1964, one week after his twentieth birthday. Official diagnosis: Schizophrenic reaction, Schizo-affective type (Depression). Insulin coma therapy and electroshock, nearly forty treatments between early April and early June. And it was the Army, not the Air Force.

The famous sentence is a recollection of a recollection. Hardy’s main text has Fran Petters recalling a letter calling Townes an acute schizophrenic; his endnote records the same woman, in a 1998 magazine piece, recalling an acute manic-depressive who has made minimal adjustments to life. One witness, two wordings, two illnesses, thirty years apart. Hardy printed both and footnoted the discrepancy. The internet took the more quotable one.

Nothing on this site had published the wrong version — the correction was made before the sheet was written rather than after. It is logged here because the near miss is the point: five tertiary sources agreeing with each other were one source.

2026 · 11 September

One typeface was too wide for the masthead, and the gate had been rendering one of ten states Link to this section

Ryan, on the two options put to him after the centring fix: option 1, and teach the gate the nine faces. The first is four lines of CSS. The second is the one that mattered — the gate had been reporting PASS on twenty-five pages while rendering the default typeface and nothing else.

CabinetThe width gate renders ten states now, and reads the face list from the table that owns it

The gate shipped this morning and was already blind in the way this house had written down three days earlier: a page that checks the fraction of itself that happens to be visible reports zero failures and looks exactly like a clean one. It rendered the default typeface on every page while nine others sat unmeasured.

The face list is read from tools/font-files.json and never typed into the tool. That table is where make-fonts.mjs writes the faces and where check-metadata.mjs already reads picker_id to prove the markup’s options match it. A hand-kept copy would be a third list — and narrowing the nine is an anticipated operation, which would leave the gate sweeping a face nobody can pick while missing one they can.

The extra passes are cheap because they ask a cheaper question. The default face gets the full walk — every text node, every client rect — which is what names a culprit and what proves the page was measured at all. The other nine ask only whether the document is wider than its box, and escalate to the full walk only when it is. A gate ten times slower is a gate people stop running, which is its own failure mode. 1,500 measurements in 4m11s.

document.fonts.ready after every switch, because a face is fetched when a rule using it first meets rendered text — measure before that and you have measured the fallback. And the faces go to paper, which earned its keep on the first run by finding the two printed conditions the by-hand check had missed: a reader’s typeface is an html class and the print sheet does not reset it, so what they picked is what they print.

The failure advice branches, because two faults wear the same number and take opposite cures. An unbreakable string wants a break opportunity and must not be fixed by shrinking the type; a display line too wide in one face has no string to break, and there the size is the fix. Printing the first advice under a typeface finding is how somebody ends up putting overflow-wrap on a masthead — which happened here, earlier the same day.

Made to fail before being believed: withdrawing the Sporting size reports five failing passes on the home page, names the typeface in each, points at <h1.qe-wordmark> and the word Earth, and exits 1.

2026 · 11 September

The masthead had been 34px right of centre since the day it was drawn Link to this section

Ryan, with a screenshot: The wider fonts available in the font selector don’t center the title. They do not — and neither does the default one. Nine typefaces made visible a fault that had been shipping with one.

2026 · 11 September

A word one syllable from the right one, and it belonged to Bowlby Link to this section

Ryan, reading the sheet mounted the day before: The word ‘Monotropy’ on Two Cohabitating Modes is associated with Bowlby’s attachment theory, which we do not endorse. Let’s avoid using monotropy.

2026 · 11 September

The masthead read Queering.Ear / th, and the measurement that certified it was of the wrong thing Link to this section

Ryan, with a screenshot, on the fix mounted directly below: The title now wraps. It did. The rule that stopped three pages scrolling sideways had been put on body, it cleared every page, it passed all nine gates — and it broke the wordmark in half on the front of the cabinet.

2026 · 11 September

Three pages had been scrolling sideways since the day each was mounted, and a ninth gate to say so Link to this section

Found by hand on this page, at a 375px viewport: a 414px document, pushed out by one code span holding performance.getEntriesByType('resource'). Eight gates passed the page. Looking for the rest of it found two more.

CabinetA ninth gate, which could have failed on three pages the hour before it was written

tools/check-width.mjs: no page scrolls sideways, at 320, 375, 768 and 1280, and nothing runs past a Letter or A4 sheet. Native, not ported, and it clears the bar check-cache.mjs set — the failure had already reached production. This house runs eight gates rather than eleven because a check that cannot fail is a check nobody reads; this one had three live faults waiting for it.

No existing gate could see it, and check-overlap.mjs is the near miss worth naming. It is the only other tool here that knows where anything is, and it asks a different question: is this text on top of that text. Text past the right margin is on top of nothing — there is nothing out there. Its clip walk does not catch it either, because the document is not a clipping container: it grows. And its screen pass is 1280px, where none of the three faults exists.

Folding it into that gate was considered and refused. Widening the overlap sweep to 320 and 375 would surface a flood of narrow-width collisions nobody has ever triaged, which is a separate project; and a gate named for text landing on text should not also be the one that measures margins. 320 is not arbitrary either — WCAG 1.4.10 asks that content reflow to 320 CSS px without two-dimensional scrolling, which is 1280 at 400% zoom.

It has no --check flag, deliberately. Two gates here shipped as a report that printed its findings and exited 0, and the contrast gate stayed advice for as long as CLAUDE.md forgot the flag. A gate whose default is to pass has not shipped.

Made to fail before being believed, per the house rule, and both halves separately: withdrawing the wrap rule reports nine failing passes across the three pages, withdrawing the print margin reports two on the home page, and the restored stylesheet reports PASS across twenty-five pages and six passes each. Its first draft named the wrong words and was corrected — it reported the run ending furthest right, which for an unbreakable string is the innocent tail after it, so it pointed at , not out of a reading of the source. rather than at the code span before it. It reports the widest overflowing run now. A gate that names the wrong words is a gate somebody edits the wrong words to satisfy.

2026 · 11 September

A fair-use position, written down before the sheet that needs it Link to this section

Ryan, on being told a proposed sheet could not quote two of its four subjects: This is a copyright maximalist approach that absolutely destroys fair use. My open source, copyleft soul weeps. It’s also a huge accessibility problem. He was right on both counts, and the rule he was objecting to was never this house’s rule — it was asserted in a research note by a drafting assistant and reported as ours.

MountedWhat we quote, and why we may

The quoting policy, in the cabinet beside the ledger: what this site takes from work still in copyright, how much, on what reasoning, and what to do if you hold the rights and disagree. It is a binding statement like the privacy page, so a change to it gets an entry here — including a change that narrows what we claim.

The first ten sheets never raised the question. Dickinson, Rossetti, Woolf, Shakespeare, Sappho: all public domain, so the house has had a quoting practice since the first sheet and never needed a quoting position. The next sheet is four artists who are all in copyright, and a policy written while building the page that tests it is worth more than one written in the abstract.

Two arguments carry it, and neither is legal. The first is that a refusal to quote does not produce silence, it produces paraphrase — and a paraphrase with the attribution still attached is the tightened source the ledger exists to prevent. The finding aid already refuses to crop a quotation for that reason; declining to quote at all is the same defect with the volume turned up. The second is access: go and listen to the recording is an audio-only requirement, and it excludes Deaf and hard-of-hearing readers from the argument entirely. The quoted line is the accessible version.

What the page does not do is repeat the folklore. There is no permitted number of words or lines or bars anywhere in the statute or the case law, and saying so is half the point of publishing it.

CabinetA seventh page in the drawer, and a fourteenth link in the row

The cabinet drawer said six pages in three places and now says seven. The heading’s id did not move: #the-six is an authored topical anchor and not a slug of its own wording, and outliving a reworded heading is the entire reason ids here are authored. Renaming it to match the new count would break exactly what the rule protects.

The footer row gains Quoting, which is a nav label and not the page’s name — allowed for a link, refused for a group heading, and the distinction is already in CLAUDE.md. The row now wraps to fourteen targets and was re-measured after, because nothing in the build measures a hit area.

2026 · 11 September

Three drawers, a breadcrumb on every sheet, and a panel that moved when a control was added Link to this section

Ryan’s: I like breadcrumbs and collection pages. The two lists at the foot of the home page were already collections in everything but address, and the plate was a third. He named the menu, and chose Drawers over Collections and Cases with the collision against the Cabinet control stated in advance.

MountedThree collection pages, and not one of them repeats a sentence the home page already carries

The plate, the founding papers and the cabinet itself are the three groups tools/pages.mjs has always held, given addresses. Each group’s collection page is now the first entry in its own group, so /llms.txt, the finding aid’s manifest and the reader’s index stay one list.

The glosses were the whole design problem. Nine pages are described in one sentence each in .qe-furniture on the home page, and this file’s loudest rule is that two copies of the same words drift. So a collection page carries a different sentence with a different job — what the page is for and where it sits against its neighbours, not what is in it — and says on its own face that the gloss lives on the front of the cabinet. The plate takes the same treatment from the other side: it shows the ten cards in their reduced form, the one the sibling navs already use, and carries no card notes at all.

What earns each page its place is the part that exists nowhere else. The plate defines what a sheet is, what a reading, an essay and a wall each mean — settled in the decision log in September and never stated anywhere a reader meets them — and what the accession number does not say. The founding papers carry the signed-and-unsigned rule. The cabinet page says what the build actually checks about its own six pages.

None of them is a specimen, so none carries a plate number, an accession stamp or a provenance line, and none is carded. And none carries a sibling nav: the drawers menu lists the other two drawers at the top of every page on the site with the current one marked, so a second list of the same three on the page itself is the two-competing-lists fault this file already refuses on the home page.

MountedThe breadcrumb was already here, one crumb long, on twelve pages

.qe-home was a lone link home on twelve pages, and seven more carried the group name beside it as plain text — Queering Earth · The founding papers, with the second half leading nowhere. The collection pages turned that dead text into an address, so the two shapes became one .qe-crumbs nav on nineteen pages.

It stops at the drawer and never names the page it is on, because the h1 is the next thing in the masthead and a third crumb would be the title printed twice, a line apart. The JSON-LD block carries all three items, since a machine’s copy has no heading under it. The separator is drawn in CSS and is not a character in the markup: it must not join the accessible name, reach the Markdown, or be something a reader can select into a quotation.

It sits inside the landmark, which the nav rule otherwise forbids, for the reason the contents list does: that rule stops one sheet’s navigation being indexed as another sheet’s content, and a trail naming this page’s own position cannot do that. It lives in .qe-masthead, which the search index already skips, so it reaches the .md — where an agent wants to know where a page sits — and not the finding aid, where it would be nineteen identical results. Targets measured after: 45px tall, 107px and 67px wide, 18px apart, at 375px and at 1280px.

The menu is a native disclosure and writes no words, like the reading settings beside it. Three links and three lines of hint, all authored in the markup; queering.js gained nothing but a loop, and lost a copy — the Escape and click-away handlers the reading panel had to itself now run over both, which is also what makes opening one close the other.

CabinetThe three drawers joined the footer row, and their labels are the one place a short label is not allowed

Ryan’s, after the drawers shipped. They sit directly after Queering Earth on all twenty-three rows, which is the level they are: the home page, then the drawers, then the pages they collect.

The labels are not shortened, and that is this file’s own licence running out. A row of links is allowed a short label — Colophon, Register, Decisions — because those name pages. The founding papers and The cabinet itself name sets, in the same words in tools/pages.mjs, on the home page, in /llms.txt, in the drawers menu and on each collection page’s own heading. A short label for one of those is the second name for a set this register keeps recording as drift.

The row wraps now, and a single line was never the invariant. The stylesheet’s note recorded eight links at 575px on one line and had gone stale twice over — the row has been ten links and two lines since the founding papers shipped. What actually has to hold is that no two padded targets on adjacent wrapped lines can touch, which is what line-height: 2.9 is for. Measured at thirteen: two lines at 1280 and 768, four at 375, six at 320; no overlaps at any of them, every target past 44px in both directions, and scrollWidth equal to the viewport at all four. The note says so now, and says to remeasure when a link is added.

CabinetA panel hung off its own control moves when a control is added, and the one that moved was the old one

The reading panel had been right: 0 on its own summary since it shipped, which quietly made its position a function of how many controls sit to its right. Measured at 1280px it cleared the measure by 31px. Adding one control moved the control 81px left, took the panel with it, and landed 50px of it on the lede on eight pages. check-overlap.mjs reported it; nothing else would have, and no amount of care about the new control would have predicted it. Both panels now hang off the tray, whose right edge is the gutter at every width, and a seventh control cannot move either.

The tray’s own note said a new control is a measurement, and it was right about the row and silent about the overlay. Measured at 320, 375, 768 and 1280px after: every hit area 44×44 or better, no two overlapping, scrollWidth equal to the viewport at all four, and both panels inside the gutters at 320. The cost is paid explicitly — the 44px box .qe-controls > *::after grows only works because each child is positioned, so for these two it moves onto the summary and the tray’s rule is switched off for them rather than left to misfire against the tray.

Two overlay panels in one tray can both be open with JavaScript off, because a disclosure toggles natively and the close-the-other convenience was script. They now share a name, which is HTML’s exclusive accordion: opening one closes the other with no script at all. Verified by setting open directly, with no click and therefore no listener involved.

That fix made the two rendering gates disagree, and both were taught. reveal.mjs dissolves the group before opening, or one panel would be measured shut — the eight-percent-of-itself failure its own header is about, arriving through a fix for something else — and puts it back afterwards. check-overlap.mjs then knows that two members of one exclusive accordion can never be on screen together and refuses to call them a collision; the exemption is declared by the markup rather than listed in the tool, which is the bar the invisible-text list already set. Proved both ways: the drawers panel’s hints in a 2.15:1 colour report three failures under the contrast gate and none once restored, so the panel is genuinely being measured.

2026 · 11 September

A masthead for the two modes, and the width a masthead is actually reviewed at Link to this section

Ryan’s, after the blown-up tray mark was refused twice: Instead of a blown-up icon, let’s do something else for the header illustration. Four options were put up and he took the one that draws the argument instead of the animals.

MountedOne flower against many, with the two flower areas equal by computation

.qe-tropisms is two plants on one ground line: a single unbranched stem carrying one five-petalled flower, and a low stem branching three times into a broad flat head of twenty-nine florets. Monotropism against polytropism — and Monotropa uniflora means one turn, one flower, which is Sheet No. 8’s whole subject, so this site already reads monotropism through a plant. It also cannot restage the predation problem the tray mark had, because plants do not eat each other.

The invariant is equal flower area and it is computed, not eyeballed. The drawing’s claim is different distribution, equal mass; two areas that were merely near would rank the two modes by accident, which is a gold join on an uncorrected sheet in the most prominent place on the sheet. The rosette is a five-lobed polar rose whose area is exact — πR²(a² + b²/2) = 826.24 — and the floret radius is solved back out of it: 29 × π × 3.011² = 826.24, residual 1.1e−13.

Only one CSS rule is new, and that is deliberate: every flower and leaf class already exists under .qe-botanical, so nothing here can render unstyled. The exception is .ground-line, which is scoped per drawing — the lilac bush and the crooked tree each own one — so this drawing owns a third. .floret was left alone: it belongs to the lilac bush outright.

CabinetThree more refused drawings, one of them this file’s own recorded mistake repeated

A hanging bell reads as a bud at the 21px it shipped at, and lobing its rim to say mouth is invisible at that size; the flower turned to face the reader instead, because what reads at sixty pixels a plant is silhouette and count. Florets on an arc are a ring, and a ring reads as a wreath — this repository’s own words about the lilac panicle, reproduced exactly. They sit on a golden-angle spiral over the head’s area now, the same walk the drift rail’s lean uses. And thirteen florets in a head this broad filled a tenth of it and read as beads on a wire: with the area fixed, a wider head needs more and smaller florets rather than the same ones spread further.

Three dead classes, caught by hand because the gate for them is not ported. The stems carried .stem-main, .stem-branch and .stem-twig beside .stem, with no rule anywhere — the stroke hierarchy was inline all along, as Sheet No. 1 does it. They did not render black only because every one of those elements also carried .stem. check-classes is still the next port from Star Stuff and this is the second drawing to want it; until it lands the check is a dozen lines, and it is worth running on any new drawing.

2026 · 10 September

Two Bewick cuts from 1792, and a masthead refused twice Link to this section

Ryan asked for two things: the fox-and-hedgehog mark blown up as header art for the new sheet, and whether there is public-domain art suitable to it. The answer to the second turned out to be much better than the first, and the first was drawn twice and refused.

MountedThomas Bewick engraved both animals for one 1792 volume, and his prose is as good as his cuts

A General History of Quadrupeds (Newcastle upon Tyne, 1792) has the hedgehog on page 448 and the Cur Fox on page 280 — two wood engravings, one book, which is the same shape as the sheet’s two poems from two books. Mounted as .qe-plate-wide figures from the Smithsonian Libraries scan, re-encoded by tools/make-plates.py. Bewick’s 1792 paper is within a few values of --qe-paper, so the plates read as though they were always on this sheet.

The text was the find. Bewick’s hedgehog article opens DESTITUTE of every other means of defence, is provided by Nature with a spinous armour, and four sentences later: The more it is harrassed, the closer it rolls itself. That is exposure anxiety and masking, written down in 1792 by somebody watching an animal in a hedge, and it is the sheet’s own argument about King’s His coat does all the work for him arriving from a third direction. And the Cur Fox article is the Halliwell rhyme in prose — It lurks about the out-houses of the farmer, and carries off all the poultry within its reach — ninety-four years before that printing, with neither text quoting the other.

Three things the captions have to say. The article’s heading is the subject of its first sentence, so both quotations begin mid-grammar and the captions say where the subject is rather than supplying one in brackets. The long s is transcribed as s — a letterform, not a letter — while harrassed is the printing’s spelling and stays, on the same footing as King’s runts. And Bewick’s three varieties of Foxes in this island are not three species: all are Vulpes vulpes, and mounting The Cur Fox without saying so would lend a retired taxonomy our authority rather than his.

The Greyhound Fox cut on page 279 was looked at and passed over, because it shows a fox with a kill. A predation scene is the one thing the drawings on this page must not say — the same reason the tray mark’s two animals face the same way.

CabinetA blown-up tray mark is not a masthead, and that is favicon.svg’s rule running the other way

Drawn twice, rendered at 368, 544 and 900px in both grounds, refused twice. Pass one gave the mark colour fills and features — rust pelt, marigold dome, an eye, an inner ear, a white bib, blocked feet — and read as children’s-book clip-art, fighting the house register of ink line on vellum and sitting four inches above two wood engravings whose hatching makes a flat rust mass look like a sticker. Pass two stripped it to one ink colour and no features; the cabinet inversion came out right, and at 900px the construction showed: the neck a facet, the two ears horns with a notch, the nose a ball, the legs and feet six rectangles, and thirty spines that are a coat at 40px turning into a cog.

The rule is the favicon rule inverted. That one says a mark is judged at 16px because two earlier marks looked good large and died small. The converse is less obvious and cost two passes here: a mark drawn to survive 20px carries 20px tolerances, and enlarging it enlarges them. A masthead is a different drawing, not the same drawing bigger.

And the position has a weight. Every other masthead here is thin moss stems, small lichen leaves, a small moth — sparse line. Two filled quadrupeds are the wrong weight for that slot however well drawn, which is why another iteration on the same approach was not the answer. The sheet carries no drawn masthead; the Bewick plates carry the animals, which is what a mounted specimen is for. Whether an outline masthead — single closed contours, thin ink stroke, animals as line rather than as mass — would sit in the register is left open in the decision log. The tray mark is unchanged.

2026 · 10 September

Every poem on the site was arriving in the Markdown mirror as prose Link to this section

Reported against Sheet No. 3, where Rossetti’s first stanza had been reading Promise me no promises, So will I not promise you: Keep we both our liberties, in promises-like-pie-crust.md since the Markdown mirror shipped. Ten pages were affected, and llms-full.txt carried all of them. Two Cohabitating Modes was accessioned the same day and landed inside the fault — its hedgehog poem and its fox rhyme, fifty-three lines, were flat in two-cohabitating-modes.md from the hour it was mounted. The fix reached it on the merge, which is the argument for fixing the converter rather than the ten files.

MountedThe hard break is a backslash, because two trailing spaces would have been erased after they were written

Markdown spells a hard break two ways. The tidier at the foot of the converter strips trailing whitespace from every line, so the two-space spelling would have been emitted and then silently removed — a fix that reports success and changes nothing, which is worse than no fix at all. A backslash also survives the >  prefixes that .qe-poem needs and .qe-verse does not.

It is written on the open of the next line rather than the close of this one, so a stanza never ends on a dangling backslash. CommonMark reads a backslash at the end of a paragraph as a literal backslash, so the close-tag spelling would have hung a stray mark under every stanza on the site.

.l-in re-indents in the source, two spaces, reproducing the 1896 compositor’s alternating indent on Rossetti and on Tam Lin. A strict renderer may collapse it; the text an agent reads carries it.

search-index.json was already right and did not change. make-search-index.mjs keeps a blockquote and a div.qe-verse as whole records, so the finding aid had never flattened a poem. Only the Markdown had — which is the drift the generator exists to prevent, arriving through the one door nobody had checked.

2026 · 10 September

A third founding paper, on the fox and the hedgehog, and an unlabelled door in the top bar Link to this section

Ryan’s, and he supplied most of the sourcing: Edith King’s hedgehog poem, Liv’s Life as a hedgehog, the Vanhuysse review, the two Sagans, and the Stimpunks research page. He asked for a complement to Star Stuff’s Who Is Holding the Candle, for the hedgehog poem in full, for a suitable fox poem to be found, and for a fox-and-hedgehog mark in the top bar as whimsy and as an easter egg. Four things surfaced in the sourcing before a word of the sheet was written, and none of them were ours.

MountedTwo children’s poems that end in the same place, which is the argument

The sheet is filed under The founding papers with the mission and the manifesto, because it is about why this cabinet exists alongside a sibling rather than about how either is made. It runs the descent of the proverb — Archilochus to Erasmus to Berlin to Gould — and then puts two poems under it.

The find is that the two poems end identically, and neither of them was chosen for that. King’s hedgehog likes a quiet wood Where he can feed his family / On proper hedgehog food. The anonymous fox comes home to young ones both nine and ten, who tell him he may go again if he brings such nice meat. One goes nowhere and eats the right thing; one goes everywhere and takes what there is; both are somebody’s father coming back with dinner. Read from there, Berlin’s typology is a ranking of twelve great men with Tolstoy above them for managing both modes — and the poems rank nobody, because each animal is described in the terms of its own life instead of measured against the other.

The neurodivergent reading is the reason the sheet is ours and not a book review. Hedgehogs already carry punk, Disabled and spiky-profile associations in our own house, down to a mascot; the curl is exposure anxiety, masking and minority stress drawn from outside. And King’s His coat does all the work for him turns out to be the whole problem stated in one line: the defence that costs nothing to deploy is also the reason nobody believes you need anything, which is exactly what Liv describes at the support counter.

It is signed and the others are not. /mission and /manifesto carry no author in their JSON-LD because they are the collaboration speaking; this one carries Ryan, because the claim about what hedgehogs mean is his and the sheet says so. about.author stays absent, so the gate’s conflation check has nothing to catch.

MountedThe anthology has no fox, so the fox came from the oldest nursery collection in English

The brief asked for a suitable Fox poem, and the obvious move was a companion piece from King’s own anthology. There is none. Fifty New Poems for Children (Oxford: Basil Blackwell, 1922) was read end to end — its contents list and its author index — and the word fox does not occur in it. King has eleven poems in that book and they are a rabbit, a bat, a mole, a duck, a swallow, a beetle and the rest; no fox.

What was chosen instead is better than a companion piece would have been. Rhyme CXXXIII in James Orchard Halliwell’s The Nursery Rhymes of England is anonymous, traditional, sung as The Fox or Daddy Fox, and it is nine stanzas of a fox going through a town and coming back with the goose. Its refrain is the town and its last stanza is the den, which is what made the pairing with King work at all: the fox’s whole poem is method — he listens at the stile, estimates the mile, flatters the drake while pricing it, is too cunning for the trap — and it all resolves into feeding the young ones.

Cited to the fifth edition (London and New York: Frederick Warne and Co., 1886), pages 84–86, from the Project Gutenberg transcription of that edition, checked line by line against two independent scans of it. The refrain indent is the 1886 compositor’s and is reproduced with .l-in; the spaces he set before every exclamation mark are closed up, which is the decision Sheet No. 3 already took for Rossetti’s colons. The rhyme is also in Halliwell’s 1843 edition, so it was in the collection forty years before this printing.

Thirteen of its thirty-seven lines wrap at the measure, and that is left alone on the source’s authority. The .l content box is 406px and the longest line wants 498; fitting it would mean setting the stanza at 17.7px, under the house floor and visibly smaller than King’s poem on the same page — a hierarchy claim nothing supports. Halliwell’s own 1886 measure broke six of these lines, including She opened the casement, and popped out / her head;, which is our worst case as well. Read off the scan rather than inferred. The wrapping reproduces the source’s condition, and .qe-poem .l’s hanging indent is the device that keeps a wrap from reading as a line the poet wrote. The figcaption says so, and the numbers are in the decision log.

MountedThe 1922 edition prints runts and digs, and we went to the letterforms to be sure

King’s second stanza has a snout that smells But also runts and digs. Runts is not a verb; rooting is what a pig’s snout does, and roots is the word the stanza is plainly built on. Every web transcription of the poem carries runts too — which is exactly the condition under which a whole tradition of copies can be a single witness, so the transcriptions prove nothing.

So the page scan was magnified rather than the scan’s text layer trusted, an OCR text layer being the one witness guaranteed to make this particular error. At 300 dpi the u is open-topped and unmistakable against the closed o of also two words earlier. The 1922 first edition prints runts, so the sheet prints runts, with the argument for roots made outside the quotation marks where a reader can weigh it. Correcting it silently would leave King saying a word she did not print, and correcting it loudly inside the quotation would be worse.

The same pass found that the circulating transcriptions additionally put full stops at four line-ends where the 1922 setting has commas. The commas are hers, and the sheet has them.

MountedThe fox-and-hedgehog mark, and why the two of them do not face each other

.qe-modes-mark is two filled silhouettes in the controls tray, 2.6rem wide and 20.1px tall, which puts it within a pixel and a half of the loupe beside it. The first draft had them nose to nose, and that draft was wrong for a reason that has nothing to do with drawing: a fox facing a hedgehog is a predator facing prey, which is the one thing a mark for a page about two modes cohabiting must not say. Both face the same way now, which makes them a plate of two specimens — this site’s own idiom, and no narrative at all.

Three further findings, each from rendering it at 16 to 180px and looking, which is what favicon.svg paid for twice already. Eight long spines are a stegosaurus, and on a head instead of a body they are a rising sun; a coat is a mass of short spines, so there are sixteen, each placed on the dome’s own normal and raked back — computed rather than hand-placed, the correction the lilac panicle on the plate already took. A tail with a concave underside is a scythe, and two drafts got that identically wrong; the brush is a band of near-constant width, nearly as thick as the body, drawn before the body so the body overlaps its root. And it is filled, not stroked — the loupe is stroked because an instrument is thin parts, and two stroked animals went muddy below about 24px exactly as the loupe’s own note predicts.

It does not animate, and the loupe is the reason. The rail sprig and the moth draw themselves on because they are botanical art; this is in the instrument tray, where nothing moves, and a mark that grew beside a still loupe would read as a fault.

What is hidden is the door and never the room. The mark is the only unlabelled control in the tray, which is the whimsy Ryan asked for — but the page behind it is in the footer row of all twenty pages, in .qe-furniture on the home page with a gloss, in sitemap.xml, in tools/pages.mjs, in /llms.txt and in the finding aid; and the link’s accessible name is real text in the DOM at all times, so a screen reader announces Two cohabitating modes exactly as it announces Search. That is what separates this from the hover-gated section mark CLAUDE.md refuses: nothing is withheld from anybody.

CabinetFound and deliberately not fixed: the Markdown mirror flattens every poem on the site into prose

Checking two-cohabitating-modes.md turned up a fault older than this sheet. make-markdown.mjs treats span as an inline wrapper — correct nearly everywhere, and wrong for .qe-poem .l and .qe-verse .l, the one element here whose whole job is to be a line. So every stanza on the site arrives in its .md as one reflowed paragraph: Promise me no promises, So will I not promise you: Keep we both our liberties…

It contradicts the rule the component was built on — a poem is a specimen whose line breaks are the object; reflowed into prose it is a different poem — and the reason the generator exists, which is that the Markdown an agent fetches must not disagree with the page. Affected: Rossetti on Sheet No. 3, Dickinson and Ryan’s reply verse on Sheet No. 6, Sappho on Sheet No. 7, and now 53 lines here, which is what made it visible. search-index.json is already right, because make-search-index.mjs keeps a blockquote and a div.qe-verse as whole records — only the Markdown is wrong.

Not fixed here, on purpose. The fix is two trailing spaces after each .l inside a verse container, and it edits a shared generator and rewrites eight .md files plus llms-full.txt. That is its own accession with its own diff to read, not a rider on a new sheet. Recorded as open in the decision log, with the trap noted: the break belongs to .l inside a verse container and never to span generally, or every span on the site puts a line break through the middle of prose.

CabinetThe controls tray wraps, because a fifth control would have scrolled the body sideways

Measured before the mark was added rather than after: at 375px the four existing controls filled the tray exactly — search link at x 20, the Reading disclosure ending at x 355, inside a 20px gutter, with nothing to spare. The row is justify-content: flex-end, so a fifth item overflows off the LEFT edge and takes the document’s scrollWidth with it — the horizontal body scroll the layout rule forbids outright.

flex-wrap: wrap is the whole fix. On a narrow screen the tray becomes two right-aligned rows; at any width that fits, it is a no-op. The alternative was to drop the mark below some breakpoint, which would have withheld a feature from phones — and the mark is the only route to the page that a reader discovers by looking, so hiding it on the devices most people read on is where it would matter most.

2026 · 10 September

One sentence of Max Alexander pasted up as a broadside, and the rule that a component mixes type roles and never families Link to this section

Ryan asked for bold, playful typography under The type plays, and the words do not move, and asked the two questions that turned out to be the accession: should it mix typefaces, and what would that do to the typeface picker and to plain view.

MountedA broadside: one sentence, six lines, six sizes, and not a word of it altered

.qe-broadside sets This is a protest of the notion that there is any correct way to live — Max Alexander, A Playful Manifesto — broken across six lines, each with its own size, weight, indent, lean and colour. A broadside is a single sheet carrying one statement in whatever type was in the case, which is a zine wall three centuries early, so it is the furniture the paste-up already has: the card, the rule, two tape strips at the top corners. No new visual language, one new component.

The setting is ours and the words are Alexander’s, and one sentence lifted out of seven is exactly where a tightening happens unnoticed. So it is a blockquote with its cite, captioned to the source and to the sheet that quotes the opening whole, and every fragment sits on one source line with real spaces between the spans. The spaces do no visual work — the fragments are blocks — and they are the only reason the sentence copies out, indexes and reaches index.md as a sentence. A newline between two of them would be kept by make-search-index.mjs and file a prose sentence as verse.

It does not animate, and the heading above it is the reason. A section called the words do not move cannot introduce a specimen whose words move.

Colour is ink, moss and rust and nothing else, those being the three text tokens that clear 7:1 in both grounds. The decorative pair is on the tape, which sits above the card’s top edge with nothing composited against it — the slip’s own rule. Corners take --qe-corner-b, because the specimen above takes -a and the plate cards below take -c.

The box hugs the text, and that is a gate decision rather than a cosmetic one. A full-width block rotated two degrees swings its far end seventeen pixels at this measure while the words sit still at the left: the ink leans by nothing and the rectangle leans by everything, and the rectangle is what check-overlap.mjs measures. Fitted with width: fit-content, the box and the ink are the same object and a collision is reportable.

And the tilt is --tilt, not --rot. A custom property inherits, so a --rot on the figure would have landed on every fragment that did not set its own and leaned the whole sentence by the card’s angle, silently. Two rotations are two facts and they get two names.

MountedA component may mix the two type roles; it may never name a family

The answer to should we mix the fonts is yes, and the mix is between --qe-display and --qe-body. The typeface picker works by reassigning those two properties on html, so a font-family: 'Victorianna' written into a component is a face none of the nine options can reach — nine controls, and one block on the home page ignoring every one of them. Worse under the five display-only faces, where the reader has been handed Newsreader as the reading face deliberately and a named third family would put a fourth face on the sheet.

What the reader actually sees, in all three cases: the default gives Fraunces shouting against Newsreader carrying; one of the five display-only faces gives their pick against Newsreader; one of the four that set both gives one face at six sizes. The last of those is the point rather than a shortfall — a reader who asked for one typeface gets one typeface, and the setting degrades into their choice instead of overriding it. What survives in every case is the play that was never a family: size, weight, colour, indent, lean, and the SOFT and WONK axes where the picked face has them.

One word is exempt, and the licence is the drift rail’s rather than a new one. .w-form sets correct in the reader’s own system face for the reason .qe-drift-word--flat does on Sheet No. 4: the notion being protested is an institutional one, and the institution’s typeface is whatever the form was printed in. Semantic, not decorative — it would look fun is not this licence, and a second decorative hardcoded family would retire the first one’s reasoning.

MountedPlain view keeps the composition and drops the ornament, which is a split the cut-out line already drew

The second half of the question. Gone in plain view: the tilt, the tape, the shadow, the six per-line leans, the variation axes — and, by itself, the system-face joke, because in plain view every face is that face. The drift rail already records that as the correct outcome rather than a loss.

Kept: the line breaks, the six sizes, the indents and the three colours. Those are the setting rather than the decoration, and plain view removes decoration and has never removed information. .qe-cutup drew the same line when it kept its --sz sizes and its boxes and dropped only the rotations and the wonk.

2026 · 10 September

Sheet No. 10, on a disability invented because nobody had it, and the readers who do Link to this section

Ryan’s, from his own reading of Sami Schalk on Octavia E. Butler. Schalk calls hyperempathy a nonrealist disability that is both mental and physical in origin and manifestation; Ryan’s note said only Except, it’s quite real for many Autistic people, including myself, and asked for a sheet. Four faults surfaced in the sourcing before a word of it was written, and three of them were ours.

MountedThe argument is not that Schalk is wrong, and finding the version that is not cheap took the whole research pass

Bodyminds Reimagined chapter 3 is the best thing written about hyperempathy. It clears four totalizing readings out of the way, refuses the gift narrative that Lauren Olamina herself refuses in the text, and names the pull behind that narrative exactly — a liberal compensatory desire to recast disability as ‘specialness’. The sheet endorses nearly all of it, and says so in its own words rather than leaving the endorsement implied.

The argument is with one clause and what rests on it. Schalk’s protective mechanism is that hyperempathy is not a disability we recognize in our current reality, so a reader cannot overlay a stereotype they already hold. That protection is bought with unfamiliarity, which means it is only available to a reader who does not have the thing. For an Autistic reader it inverts: we do overlay, we cannot help it, and what we overlay is a life rather than a preconception. A claim whose truth depends on who is holding it is this site’s own method turned on a book we admire.

Schalk names autism in the same paragraph, by way of Stuart Murray, as the recognised disability whose cultural familiarity gets it flattened. The two claims sit one sentence apart: autism is the familiar thing that gets stereotyped, hyperempathy the unfamiliar thing that cannot be.

And the fairest account of how it happened is the most damning thing on the sheet, and it is not about Schalk. Bodyminds Reimagined is 2018. The study that put Autistic hyper-empathy on the record says, in 2024, that there has been limited theoretical and empirical work looking at this as a specific phenomenon worthy of study in its own right. Autistic people had been saying it for decades; the journals had not written it down. A scrupulous scholar reading the literature as it stood could conclude in good faith that there was no real-world equivalent, because the equivalent was community knowledge and community knowledge was not yet citable. That gap is the epistemic injustice the chapter is otherwise so good on, arriving from behind and taking the premise.

MountedOne sprig drawn twice and translated, because a mirrored pair says reflection and this is not a reflection

The masthead is a single cut sprig emitted twice: the left copy in solid ink, the right copy in outline only, identical in geometry and displaced. The solid copy is the event and the hollow copy is the sensation, so reading order is causation — the thing happens on the left and is felt again on the right, in a body it did not happen to. Butler’s own gloss is on the sheet: I get a lot of grief that doesn’t belong to me, and that isn’t real. But it hurts.

Translated and never mirrored, which is the one thing that could not slip. A mirrored pair either side of a meridian is the Rorschach read the moth already paid for three times, and it would have said reflection — wrong twice over, because mirror-touch is not a reflection but a recurrence in another body. The displacement is also deliberately not axis-aligned, so the second copy cannot read as a shadow. Nothing here casts anything.

The hollow copy is .rib: fill: none on a --qe-moss stroke, which is exactly the ghost this drawing needed and is already reached by the print sheet and by the forced-colours block. No new art class, so no new gap in either. Both copies take --qe-moss and neither needs a cabinet rule.

Two things the generator had to be told. A left-pointing leaf must not wear .sprout-leaf, whose transform-origin is the fill-box left edge — a leaf pointing left would unfurl from its tip instead of from where it joins the stem, so the three left leaves are plain .sprout. And both offsets are baked into every coordinate, because a CSS transform animation overrides an SVG transform attribute on the same element and would collapse all twelve sprouts onto the origin. Leaves sit on the stem’s own normal at five parameters, each rotated toward the tip so none is square to the stem; square leaves read as a fishbone. Bounding box asserted rather than eyeballed: x 84.0 to 475.8, y 32.0 to 227.0 inside 560 × 260.

The two stems ink on together and that is a limitation, not a choice. .stem has no per-element delay hook and inventing one would mean a new class. The echo is carried by the leaves instead: the solid sprig’s five unfurl, then the hollow sprig’s five.

MountedA section that argues against the sheet it is on

What this sheet will not tidy carries five items, and two of them are load-bearing rather than decorative. Butler’s hyperempathy is a drug injury and Autistic neurology is not — Lauren has it because her mother abused Paracetco before she was born, and there is a well-supplied market for readings that would let that parallel drift into an aetiology. The sheet says on the page that the parallel is to what the condition does and how it is treated, never to where it came from.

And Lauren says it is not a power, which cuts against this sheet as hard as against the critics Schalk corrects. If defending Autistic hyper-empathy turns it into a superpower, the defence has performed Schalk’s liberal compensatory desire to recast disability as ‘specialness’ in the act of citing her against it. So the strongest line the sheet mounts is not the biological conscience but the question four pages into the sequel — So why do I miss it now? — where Butler, in a dream that has finally switched the thing off, argues against her own harshest description of it. You cannot subtract it and still have Lauren. That is the claim Autistic people make when they decline to be cured, and nobody had to bring it to the text.

2026 · 10 September

Sheet No. 9, on a definition recited for a beast nobody has seen, and on the coiner an empty word leaves behind Link to this section

Helen’s idea, from John C. Brady’s two-part reading of Logique du sens in Epoché — she asked for a sheet on names, labels, and how things get coined, and said the Deleuze–Carroll link may be a stretch. It is not: Deleuze makes the identification himself, on p. 31 of the French. Ryan proposed it as a complement to Sheet No. 2, which asks whether a label fits; this one asks where the label came from.

MountedThe primary was not in the house, and the answer was the French rather than a summary

The Logic of Sense is not sold as an ebook and Ryan does not have it, so the first plan was to build on Brady and correct the sheet later against Deleuze. That plan was wrong and the reason is worth keeping. Build-now-verify-later is fine when the later edit is an upgrade to a citation that was honest when it shipped; it is not fine when the later edit could change what the sheet claims, and a section resting on Deleuze’s theory of sense sourced entirely to somebody’s summary of it is the second kind.

The original was reachable the whole time. Logique du sens (Minuit, 1969) is openly readable at the Internet Archive; the two scans of Mark Lester’s English are restricted to print-disabled patrons. So the sheet quotes the French primary and every English rendering on it is ours, labelled a gloss rather than a translation — the same treatment the wyrd half-line gets on Sheet No. 4. Quoting Lester’s English through Brady would have put a translator’s authored choices in Deleuze’s mouth at a page number nobody here could open.

Four quotations were read off the page images and not off a text layer, because this scan’s optical transcription drops accents and breaks words across lines. Pages 31, 60, 64 and 65, each confirmed by its running head. The page numbers are the French ones and will not match an English copy, which the sheet says out loud.

What the primary added that a summary could not: Deleuze grants that Snark is a portmanteau of shark and snake and then says it is one secondairement ou accessoirement only — the packing is not what the word does. A paraphrase reading “Deleuze calls the Snark a portmanteau word” would have been true and would have lost the argument, which is this site’s characteristic failure in one clause.

MountedFive mounting straps and no specimen, after the diagonal version was drawn, measured, and thrown away

The masthead is the herbarium furniture with the plant absent: five gummed paper bands across the sheet, squared off at their inner ends, and one narrow channel running down through all five where a stem would have been strapped. Nothing may ever be added in the middle, which is the note left in the markup.

Three passes put the straps along a rising diagonal and all three failed, for a reason worth writing down. Each strap sat perpendicular to a cubic Bézier, so the five gaps lay exactly on one curve — correct as geometry, and on the page it read as ten scattered tick marks. Five dashes 15 units wide and 100 units apart will not join into a line however precisely they are aligned. Horizontal straps stacked at five heights put every gap at nearly the same x, about 34 units wide, so the vacancy is one column the eye takes in at a glance. The first draft before that had rounded inner ends and looked like a tray of pills; square inner ends are what make a channel a channel.

Built from .stem, .rib and .sprout and nothing else, so it adds no gap in the print sheet and none in forced colours. --len on all ten bands is the real getTotalLength() read off the live DOM, and the bounding box is asserted rather than eyeballed: x 40.2 to 509.7, y 29.1 to 231.1 inside 560 × 260. No .sprout carries a transform attribute, because a CSS transform animation would override it and collapse every strap onto the origin.

MountedThe unmended provenance line ships for the first time, on the ninth sheet

All eight earlier sheets carry --mended, because all eight have been corrected — Sheet No. 8 was predicted to arrive clean and did not. CLAUDE.md has been saying for a while that the unmended state had still never shipped and was therefore the one to check by hand rather than copy off a neighbour. It has now shipped: solid hairline, moss ink, reading Mounted 10 September 2026. Not yet corrected. Checked in both grounds.

The stamp reads Sheet No. 9 and its mix-blend-mode resolves to multiply on paper and normal in the cabinet, which is the token doing the job it was made for — multiply darkens towards the ground, and in the drawer the ground is the dark thing.

MountedTwo of Henry Holiday’s 1876 engravings, one of which is an empty square and the other of which is the Snark wearing a wig

Ryan asked whether any public-domain art would fit and pointed at Plate 6. Two others fit far better, and both change what the sheet can argue rather than illustrating what it already said.

The Ocean-Chart is Deleuze’s case vide, drawn ninety-three years early. A heavy rule enclosing nothing, with every term of reference a chart can carry — latitude, longitude, meridian, equator, both poles, zenith, nadir, a Scale of Miles that is five dots — arranged around the outside of the blank. It sits in the section on the empty square, facing Deleuze’s une place sans occupant, and it comes with Carroll’s crew being grateful for it in the same Fit as the five marks: he’s bought us the best— / A perfect and absolute blank!

The Barrister’s Dream is the only depiction of the Snark in the book, and there is no animal in it. A wig on top of drapery, a hand holding a brief, papers lettered Trespass, Libel and Contempt. Nine illustrations for a poem about hunting a creature, and the creature appears once, in someone else’s dream, dressed as a lawyer. It closes the section on the definition delivered before the thing.

Two dates in each caption, because the scan and the engraving are different objects — Holiday cut these for the 1876 first edition and the paper photographed is a Macmillan printing of 1931. And the stored originals are downsampled, which departs from this file’s own rule that the JPEG is the archival copy: the Commons masters are 4.9 and 8.3 MB against 116–341 KB for every other plate here, and an img fallback is the one image path no srcset protects. They are stored at 2,176 px, twice the 1,088 px top rung, so the largest variant is a clean 2:1 downsample. The masters stay at Commons with their dimensions and hashes in the ledger.

A claim on Sheet No. 8 stopped being true and was corrected in the same commit. It said every mounted image on this site is a public-domain botanical print or painting. Two wood engravings and, before them, a manuscript leaf say otherwise; it now says every mounted image is public domain and names the kinds.

CabinetA half-hour reading of the poem is linked and not embedded, and the reader is named

Robert Garrison read the whole poem for LibriVox — 29 minutes 24 seconds — and released it into the public domain. It is in the sheet’s label block as a link.

A player was considered and declined on capability grounds, not taste. It would need a second encoding, because Ogg Vorbis alone is unreliable in Safari and nothing here transcodes audio; a MIME type taught to serve.mjs, which has no audio entry and would send application/octet-stream under nosniff — the .avif trap for the third time; a rule in _headers; a line in check-cache.mjs; and 18 MB in a repository smaller than that. /privacy exempts a href because a link the reader chooses to follow is not a request the page made, so the link costs nothing and adds no capability at all.

He is credited as the performer rather than as a licence. Somebody read a poem aloud for half an hour; filing that under a public-domain recording on a sheet about coinages losing their coiners would have been the sheet doing the thing it condemns, one section below the place it condemns it.

CabinetThe masthead’s own borrowed coinage is now a section of a sheet, not just a ledger entry

A sheet arguing that coinages get separated from their coiners has to show its own working, so one section is about this site: Post-normal possibilities is Helen’s phrase from the founding brainstorm, one hyphen from the end of Nick Walker’s subtitle, with a third lineage in post-normal science nobody here has read in the primary. The masthead says after Nick Walker — not his phrase, which would take the coinage off Helen, and not silence, which is how it shipped at first.

Nothing about the credit changed. What changed is that the reasoning is now on a sheet a reader will actually meet, instead of only in the ledger where it was logged on 7 September.

2026 · 10 September

A crooked tree for the sheet that says queering is adaptation, and the stump of the straight one beside it Link to this section

At Ryan’s note, after the monologue Tom Waits speaks in Wristcutters: A Love Story. It went into To queer is to adapt rather than the typography section, because that section already says queering something is to make it strange or odd and the monologue answers it: the crooked one is the tree still standing, growing strong and growing strange.

MountedThe drawing is the pair, because a crooked tree on its own is only a picture of a crooked tree

The stump is the argument. Waits’ story is not about a bent tree; it is about what happened to the straight one that spent its life narrating the bent one’s deficiency. So the plate is two trees: on the left, all that is left of the straight one — a flat cut and two growth rings, and no leaf on it. On the right the crooked one, whole and in leaf, its lowest branch reaching back over the space where its neighbour used to be.

The first two drafts were not crooked. They swung the bezier handles wide and left the trunk’s endpoints where they started, which reads as a wavy sapling — a tree that has second thoughts and corrects them. The endpoints zigzag now, thirty units of lateral lurch a segment, and never come back to the vertical. A trunk that corrects itself is a straight tree with extra steps, which is the note left in the markup for whoever redraws it.

Built entirely from classes this stylesheet already has — .stem, .rib, .leaf, .sprout — so it adds no new gap in the print sheet and none in forced colours. That was the reason for the constraint rather than a happy result of it: a new art class needs a new print rule reaching it by name, and a fill the print sheet cannot reach is how Star Stuff printed forty-four blank pages. Only .trunk and .ground-line are new, and both are scoped to this drawing, like the lilac bush’s.

--len on every stem is the length measured off getTotalLength(). The trunk was declared at 255 and is 270, and a declared length shorter than the real one makes the dash pattern repeat — the branch draws itself on with gaps in it. Checked in all four states the site owes: the trunk inks in --qe-ink on paper and inverts to the pale cabinet ink on the dark ground, and both plain view and reduced motion report stroke-dashoffset: 0 with the leaves at full opacity, which is the finished drawing and never a missing one.

2026 · 10 September

Nine typefaces a reader can set the sheet in, six of them drawing letters that exist because the grammar refused the person Link to this section

Ryan asked what fonts queer design — after Robin Mientjes by way of Paul Soulellis: an attitude in the face of conformity, an attitude in the sea of passivity, an attitude to say yes when others say no. Twenty candidates went onto two specimen sheets; nine were kept. Six are from Bye Bye Binary, a collective drawing glyphs for inclusive and non-binary French. The rest are from Velvetyne and the Braille Institute.

MountedA typeface picker where four options set the reading face and five only set the headings, and that split is a constraint rather than a taste

Thirty-two faces are declared and a reader who picks none downloads three. That is the whole reason nine options cost nothing: an @font-face is a declaration, and the file behind it is fetched only when a rule using that family first meets rendered text. So the picker needed no lazy-loading machinery — the mechanism was already in the cascade. Pick BBB Baskervvol and exactly its three cuts arrive; pick nothing and the sheet is what it always was.

Four of the nine set both faces and five set only the display, and it is not a preference. Victorianna ships a Thin cut alone and is unreadable at reading size — that was visible on the specimen before anybody chose it. Redaction Inclusive, Insolente, Trickster and Sporting Grotesque have no italic at all, and this site is built out of citations: setting one of them as the reading face would put a faux slant on every <cite> on every sheet. So those five change the headings and leave Newsreader to read, and the four with a real italic — BBB Baskervvol, Adelphe, Coxinelle, Atkinson Hyperlegible — do both.

Three of them had been shown in the wrong weight. The first specimen set Adelphe in Floréal Bold, Coxinel·le in Black and Sporting Grotesque in Bold, because those filenames sorted first in their repositories. Two full text families were presented as heavy display faces. Regular, Italic and Bold here, which is the difference between offering a typeface and offering whatever came out of a directory listing first.

The faces, the class rules and the manifest are generated from one table by tools/make-fonts.mjs, so the stylesheet cannot declare a family the picker does not offer or the reverse. And because the option list lives in the markup on eighteen pages while the faces live in one table, check-metadata.mjs now compares the two — an option with no face behind it offers a reader a typeface that will not load, and a face with no option is weight nobody can reach. Both are silent, and narrowing the nine is exactly when they would happen. Proved by offering a face that does not exist and watching it be named.

CabinetCUTE is not the OFL, and reading it is what turned up two faults in our own house

Six of the nine are under CUTE — Conditions d’Utilisation Typographiques Engageantes. It permits use, copying, redistribution, modification and commercial use, and states outright that it is not technically compatible with any FLOSS license to date, taking a position radically and deliberately inconsistent with them. It is explicit that it governs fonts and not the documents they set — its own example is that a book typeset in a CUTE font is not governed by CUTE — so nothing on this site is relicensed by using them.

Three of its conditions bind us. Credit the designers and link the original publication source — the first specimen named the collective in plain text with no link, which is half of it. Share complete files rather than lone extracted faces. And do not delete the post-binary characters or the OpenType features that activate them, which forbids subsetting: the six CUTE faces ship whole while the two house faces are cut to the latin subset. Its donation is a condition and not a suggestion; Stimpunks met it at the for an association tier.

Reading a licence properly is what found the faults at home. Sourcing these candidates meant reading nine licences, and that turned up two of our own: the house faces had been redistributed for a day with no licence file beside them, and the colophon credited both of them to a search engine rather than to Undercase Type, Phaedra Charles and Flavia Zimbardi, and Production Type. Every credit on this site is now fetched from upstream metadata rather than typed, which is the same standard the quotations are held to — and the reason it was worth reading the licence rather than assuming a font is a font.

2026 · 10 September

The device decides, and the reader may say otherwise: three reading settings, and a motion rule that had to be turned inside out to allow the second answer Link to this section

Prompted by Ryan asking whether the site supported forced colours and whether the accessibility settings buried in system menus could be surfaced on the page. The answer to the first was no — not one @media (forced-colors: active) anywhere — and it was outside the audit’s stated scope rather than missed by it, which is the one time a scope caveat has actually earned its keep here. The answer to the second was an argument, and the argument was lost: respect the system setting only reaches the readers who know the system setting exists. Default to the device; allow configuration in the moment.

MountedReduce motion, more contrast and looser lines, each starting from what the device already asks for

The case against putting these on the page is a good one, and it is wrong here. A site reimplementing a setting the operating system already has only helps the readers who find the widget, and it shifts the work of configuring accessibility onto the person who needs it. That argument is why plain view was defensible and a settings menu was not: plain view turns off this sheet’s wonk and rotation and display faces, which no system setting could know about.

What it misses is that most people have never opened that menu. Implementing prefers-reduced-motion perfectly still only catches the readers who have already been to System Settings and found the switch. And a preference set once, months ago, cannot know that today is a migraine day — access needs move during a day, which is not a subtlety for a site made by two Disabled people. So the media query is the default and the panel is the override, in that order.

The stored value is three-state, and that is the whole design. Absent does not mean off; it means follow the device. Only an explicit on or off writes a class, so with nothing stored the stylesheet’s own media query decides and the answer without JavaScript is the same answer as with it. Follow my device again removes all three keys and hands the reader back to their own machine, rather than freezing today’s answer as though it were permanent.

Reduce motion is deliberately not plain view. Ryan’s point, and he is right: you might want the motion gone and want to keep the display faces, the wonk and the leaning slips. They were one control because motion was one of the things decoration happened to include, not because they are one preference.

It is a native <details>, and it must stay one. A hand-built menu needs focus trapping, a roving tabindex, aria-expanded kept in sync and an Escape handler, and getting any of that wrong would make the accessibility panel the least accessible thing on the sheet. The browser ships all of it. Escape and click-away are the only additions and both are conveniences over something already working. Every word in it is authored in the markup; the script sets checked states and classes and writes nothing.

CabinetText size, which the sheet already followed — and the first setting that is not a yes or a no

The first option is not a no-op, and that is the whole reason it is worth showing. html is set to font-size: 100%, which inherits whatever size the reader’s browser is already set to, and every one of the 129 type sizes on this sheet is in rem — not one in px. So are the spacing scale and the measure. Raising the root therefore moves the line height, the gaps and the 66-character measure together, rather than swelling the words inside a box that stays where it was.

Larger only, and that is a house rule rather than a shortcut. The style guide puts body text at 18–20px and this sheet sits at 1.19rem, which is 19px on a default browser. A smaller option would take it under that floor, so the panel does not offer one. A reader who wants less turns their own browser down and the sheet follows — which is precisely what the first option names.

It is a <select> because two steps is not a checkbox, and native for the same reason the panel is a native <details>. It also makes something visible that was implicit: for the three checkboxes, follow your device is the absence of a stored value and a reader has no way to see it. Here it is an option they can choose by name.

The gate caught this key one setting after it was written, which is the point of it. The storage check found settings by their html.qe-*-on and -off classes, and text size stores larger and largest — so the pattern would have let qe-textsize go undocumented on /privacy while reporting green. Widened to any state, it failed immediately and by name. A check written for the cases that existed is a check with a blind spot for the next one.

Verified the way the last one should have been: a real click opened the panel, the control was confirmed to be the top hit target at the point a reader would press — the check that would have caught last night’s bug — and a real keypress moved it through both steps, 16px to 18 to 20, with the class, the storage and the reset button following. A real click on Follow my device again put all four back.

Re-determinedMotion is off by default now, and the rule that guarded it came out of the change stronger than it went in

Every animation on this site lived inside @media (prefers-reduced-motion: no-preference), and the rule beside it read: the reduced state is the finished drawing, never a missing one. Never put an opacity: 0 outside that query. That structure is correct and it cannot express the second answer — a reader who asked for motion on a device that asks to reduce it. There is no way to add a class to a media query.

So the gating inverted. Motion is now off in :root: --qe-draw and its siblings are none, --qe-sprout-start is 1, and exactly two things switch them on — the media query, and html.qe-motion-on. The timings are written once in --qe-anim-* and the two blocks only map them, because a duplicated cubic-bezier is a drift waiting to happen and a duplicated mapping is three lines that either work or obviously do not.

The rule that replaced the old one is stronger, and it says why rather than what. Not never put an opacity: 0 outside that query but the default must be the finished drawing — so a reader with no CSS variables, no JavaScript, or a device asking for less motion gets a complete drawing because that is what :root says, not because a query happened to wrap the rules. One place needed a hand: an un-animated stem would have stayed invisible behind its own stroke-dashoffset, so the static state puts it back to zero. Verified in the browser in both directions, and the reduced state reports animation: none with stroke-dashoffset: 0px.

CabinetForced colours, which is the one setting here that is not ours to offer — and a gate that makes /privacy name every key the site keeps

There is no toggle for forced colours and there cannot be. It reports an operating-system state — Windows Contrast Themes and its kin substituting the reader’s own palette for everything we declared — and a page can only respond to it. That is the point of the feature: the reader’s choice outranks the site’s. It sits beside More contrast in the panel as the thing the panel deliberately does not contain.

Most of this sheet survived the substitution already, on decisions taken for other reasons: every control is a real <button> with a real border, and the register’s four kinds carry words as well as an accent, so a palette that flattens their colours does not flatten their meaning. The rule that put the colour on the rule and never on the glyph paid a debt it was not taken out for. What needed repair was the card hover, which was a background change and nothing else and therefore vanished outright; the edges that leaned on a box-shadow; and focus, which now tracks Highlight rather than our rust. The botanical art is allowed to be forced — colour is not information in a drawing of a leaf, and the spec reserves opting out for the case where the colour is the information.

Three new keys meant /privacy was one edit away from being wrong about its own site, which is the failure this register exists for. So the policy names them, and a gate now enforces that it always will: every qe-* key the site reads or writes must appear on that page. It finds them two ways, because one is not enough — literal getItem calls, and the html.qe-*-on classes in the stylesheet, since the reading settings build their keys from a table and appear as no string literal anywhere. Proved by adding an undocumented setting and watching it be named in the failure. It is the sibling of the third-party-origin check mounted yesterday: not forbidden, named.

2026 · 9 September

The manifesto, adapted under its own licence — and a tightened quotation found on our own foundation’s page while sourcing it Link to this section

The founding papers had one page in them. The second is the argument the aims rest on, adapted from the Neuroqueer Learning Spaces Manifesto — a nine-author community document under CC BY-SA 4.0, initiated by the two people who make this site. Sourcing one quotation for it turned up a drift in our own house.

MountedTwo quotations that cannot be verified, carried anyway, with the transcription named instead of the tape

Nick Walker on weirding comes from a recorded panel nobody here has listened to; Grada Kilomba’s Who Can Speak? from a 2016 book nobody here has opened. Both reach the page through the NQLS manifesto’s rendering. This file’s own rule permits that — where the primary is not reachable, quote it with the citation attached and name whose transcription it is — and both figcaptions name the transcription rather than the source, in bold, on the page rather than only in the ledger.

The Kilomba excerpt is two contiguous lines out of twenty-odd, and contiguous matters more than short. Picking the most striking lines from across the passage would have produced a tightened Kilomba on the page whose subject is tightening. Two that sit together elide nothing inside the quotation, and quoting the passage entire would be a substantial reproduction of a copyrighted work to make a two-line point.

Walker’s definition of neuroqueer as a verb is already on the home page and verified at source. This extends the same move to weird, which is what Sheet No. 4 is about: wyrd was demoted from fate to defect, and turning weird back into a verb is that history running the other way.

CabinetTwo of the nine authors wrote this page, which is exactly why the credit is not a formality

It would be easy to treat a document Ryan and Helen initiated as theirs to carry across without ceremony. Nine people wrote it. The foot of the sheet names every contributor and the licence, in the page rather than only in the ledger, and says plainly that what happened here is an adaptation: no sentence carried over verbatim, the argument taken off learning spaces and pointed at reading.

Share-alike is the reason this exists and the reason it is not the end of anything. CC BY-SA 4.0 is why the adaptation is permitted, and the same clause is why anybody may do this again to our page.

It does not restate the home page, which was the risk the mission page was shaped to avoid. The home page explains what queering is; the aims list what we are for and where each is kept; this argues why any of it follows. Three genres, one subject, no duplicated paragraphs.

2026 · 9 September

A new accession goes at the top, anchored on the register, and this one proves it Link to this section

The entry below records four accessions ending up in the wrong order and the two assertions added to catch it. Neither assertion can see the case that caused it — within a single day the order is editorial and nothing mechanical can verify it. This is the part that closes: a written rule about where the insert goes.

CabinetThe fixed anchor cannot go wrong whoever else is editing; the relative one is correct only while nobody is

Anchor on <div class="qe-register" id="latest">, never on the last accession you wrote. The register runs newest first, so the top is a fixed address and the previous entry is not. Inserting above your own last entry is right for exactly as long as nobody else adds one — which was true every day this register has existed until this evening, when two sessions appended to it for three hours. Ryan asked for the rule; it is in CLAUDE.md beside the checklist a session reads before writing an entry, rather than only here where it would be read afterwards.

The marker moves in the same edit. · latest comes off whatever holds it and goes on the new entry, and check-markup.mjs refuses a page where it is not on the first accession. That gate plus this rule cover the two halves: the gate catches a marker in the wrong place, the anchor stops an entry landing in one.

This entry was inserted by the rule it describes, anchored on the register div with the marker moved off the section below. Which is the smallest possible test, and better than none.

2026 · 9 September

A way straight to the newest accession, and the discovery that it was not where the page said it was Link to this section

The contents list added an hour ago put the newest accession 4.8 screens down, so a jump was wanted. Building it exposed something worse: the register was out of chronological order and had been for the whole evening.

MountedThe address is on the register, not on the newest accession, which is what makes it permanent

A link to the newest entry’s own id would be a hand-kept pointer at a moving target — stale the next time anything is mounted, in the file that exists to record exactly that kind of failure. The register runs newest first, so the top of the register is the latest by definition. #latest sits on the register itself and cannot go stale, because nothing about it is a copy of anything. It needs no script, which a derived href would have, and it gives the newest accession a permanent shareable address for the first time.

It sits directly under the lede, and that took a measurement. Placed after the register’s own housekeeping note it landed at 1,587px on an 866px viewport — below the fold, which is no use to somebody arriving to see what changed. Under the lede it is at 680px. Second time today a link was put somewhere reasonable-looking and measured out of sight, after the finding aid’s search box.

CabinetTwo assertions on the register’s order, and only one of them would have caught this

check-markup.mjs now checks that accession dates do not increase down the page, and that exactly one accession is marked latest and it is the first. The date check is worth having and was blind to this: every accession that day carries the same date. The marker check is the one that bites. Within a single day the order is editorial and nothing can verify it — but which section is newest is a claim the page makes out loud, and a claim can be checked. Both were made to fail before being believed, the first by putting this evening’s actual fault back.

It also turned up a third entity table. This gate carried its own six-entity decoder, which did not know &middot; and handed the date check back a raw entity. tools/html.mjs was written to stop precisely that — an entity table is a lookup that one tool teaches and the other does not — and the gate simply was not using it. It imports the shared one now, which throws on anything it does not know rather than passing it through, and all seventeen pages still pass.

2026 · 9 September

The finding aid gets one too, and three thresholds in a row turn out to have been the same mistake Link to this section

Every page on this site now carries a contents list except two, and neither of those declines on a threshold. The pattern is worth more than any of the three rules it replaced.

CabinetThree thresholds tried, three retired, each measuring the list instead of the reader

They went in this order, over about two hours. More than two headings — retired, because two entries that save twenty screens beat seven that save two. The block must not be too tall — retired, because 2,322px against a 120-screen page is a bargain and the comparison that decides it is the block against its own page. The page must be long enough — retired now, with the finding aid at 1,307 words.

Each of the three measured the list. None of them measured the reader. What is left is structural and has one instance: does this page already have a better index of itself? The home page answers yes — its plate of eight numbered cards is a contents list, and a second one above it would put two competing lists on one page. The error page is an error page. Everything else has one.

2026 · 9 September

This register now has the contents list an earlier entry measured, refused, and wrote a rule against Link to this section

Ryan asked for it. The old refusal was right about its number and wrong about what the number meant — which is a more interesting way to be wrong than simply not having measured.

Re-determinedBlock height was the wrong measure, the same way heading count was the wrong measure an hour ago

The figures, re-measured rather than quoted. Thirty-three accession headlines averaging 140 characters; the list renders 2,322px and puts the first entry 4.8 screens down. Both worse than the 1,293px and three and a half screens that got it refused, because ten accessions have been added since.

And it does not matter, because the page is 40,408 words. That is roughly a hundred and twenty screens. A list that costs 2.7 of them to reach any one of thirty-three accessions directly is the trade a contents list exists to make. The refusal compared the block against other pages’ blocks; the comparison that decides it is the block against its own page. This is the two-heading threshold’s mistake from the other end — count was the wrong measure there, height is the wrong measure here, and page length is the question in both.

Columns were tried and do not help. 2,322px in one column, 2,213 in two, 2,302 in three. Narrowing a column makes a 140-character sentence wrap proportionally more, so width traded for wraps is a wash. Measured in the browser before the CSS was considered, and then not written. The labels stay verbatim: truncating one is this site’s characteristic failure applied to itself, and a short second label is the drift the derivation exists to prevent.

Both indexes stay, and they do different jobs. The contents list is chronological, by accession, at the top; the index by sheet is at the foot and files the same entries by what they happened to. Front matter and back matter, which is how a bound volume carries both. The one-line pointer that used to sit by the legend came out — the contents list’s last item is a link to that index, and two adjacent links to one place read as a mistake even when both are right.

2026 · 9 September

A feature was mistaken for a fault, removed, and put back within the hour Link to this section

The rail on the ledger read Verified · Open · Every attribution on this page — the third of those being the index’s own heading, listing itself inside the navigation beside it. Two components built in parallel, each correct on its own. The rail excludes .qe-contents by name; the entry index arrived as a second navigation block inside the landmark and nothing knew to skip it.

Re-determinedIt was not a fault. Ryan liked the rail pointing at the index, and a destination inside a nav is still a destination

The entry above determined a feature to be a bug, and the determination was wrong. The rail on the ledger listed Every attribution on this page, this session called it self-announcement and removed it, and Ryan said plainly that he had found it useful. He is right: on a page of 130KB, a link from the rail straight down to an index of all fifty-five entries is the most useful thing in it.

Two cases that look identical and are not. A contents list containing On this sheet is a list pointing at itself. A rail containing Every attribution on this page is a list pointing somewhere a reader wants to go. Collapsing both into any heading inside a nav was a generalisation that read as principled and cost a feature; the honest rule is narrower and older — a list must not contain its own heading, and .qe-contents and .qe-rail are one derivation shown twice.

The reversal is the entry, not a quiet edit to the one above it. That entry stands as written, because a register that revises its own determinations in place is a register that cannot be checked — which is the argument this whole page is built on. This is the third re-determination here and the first where the thing re-determined was our own judgement rather than a source.

MountedAnd the two record pages got the contents list they could not have had an hour earlier

The re-determination above is what made this possible, which is a pleasant way for a mistake to end. With two h2s a contents list on the ledger would have read Verified and Open and told a reader nothing — the stated reason both record pages went without one when they shipped. With the entry index’s heading back in the derivation it lists three, and the third is a jump straight to all fifty-five entries.

The standalone pointer came out in the same pass. It said every entry is listed by name in the index at the foot of this page and sat immediately above a contents list whose third item is a link to exactly that. Two links to one place, adjacent, is the kind of thing that reads as a mistake even when both are correct.

Twelve of seventeen pages carried one at that point, and checking which four declined turned up a page with eight headings and no list.

CabinetThe two-heading threshold is retired, because it measured the wrong thing

Ryan’s call, and it is the right one. A contents list needs more than two headings was the stated reason both record pages shipped without one, and it counts the wrong quantity: the reader’s problem on a twenty-thousand-word page is length, not heading count. Two entries that save twenty screens of scrolling are worth more than seven that save two. The question is only ever whether the page is long enough to want one.

Retiring a rule is a good moment to check what it was hiding. The privacy page is 2,058 words with eight headings and had no list — longer than Sheet No. 1 at 2,045, which has one. It was never a decision, just a page nobody counted. It has one now.

Four pages still decline and not one of them declines on heading count. The error page; the home page, whose plate is already a contents list; this register, whose accession headlines average 148 characters and measured 1,293px against 319 to 510 elsewhere — it gets its index as back matter instead; and the finding aid at 1,307 words, the shortest page here that is not an error page and well under the 2,045 of the shortest page that has one.

2026 · 9 September

The two longest pages on the site could not be surveyed without reading all of them Link to this section

A reader wanting to know whether the ledger holds an entry on Rossetti had one option: scroll 130KB of it. Both record pages now carry an index of their own entries at the foot — 55 on the ledger, 71 on the decision log — with a one-line pointer up in the front matter, the way a bound volume does it.

MountedBack matter again, and built at runtime for the reason the contents list is

A contents list was the wrong reach and this page already knows why. .qe-contents derives from a page’s h2s, and both records have two — it would have shown Verified and Open and delayed every reader to say nothing. What a reader wants is the entries. So it is the register’s .qe-sheet-index shape a second time: back matter, ruled off, at the foot, because front matter costs every reader and back matter costs none.

Generated into the HTML it would have double-indexed all 121 headings. The SKS mirror and search-index.json both read the landmark, and a list of every heading sitting beside those headings is a second copy of each — the exact reason the contents list is built at runtime rather than written down. So the served container is empty, queering.js fills it, and both generators skip it so the .md does not announce a list it has no room for.

The group headings are derived here, where the register’s are authored. That is the one real difference between the two indexes and it is not a relaxation: the register’s groups are sheet names, which are editorial words queering.js may not write, whereas these groups are the page’s own h2s and every label is a clone of text the reader can see above it. Nothing is composed, summarised or truncated — the same standing the contents list has.

A group heading is a paragraph and not a heading, which looks like a downgrade and is the opposite. These are clones of headings the reader has already passed; putting them back into the outline would give the page a shadow contents made of duplicates, which is worse for a screen reader’s rotor than having none. It wears .qe-index-sheet, so it still looks like what it is.

CabinetNo line in REVEAL, and that was checked rather than assumed

reveal.mjs says in its own comment that it is for a fetch or a hidden state, not for anything merely built at runtime, and this component ships hidden — which reads like a case for it. It is not: the drift rail’s if (r.hidden) continue is only sensible if queering.js has already run under the gate, so anything that unhides itself is measured without help. Confirmed by counting rather than by reading the source: /ledger went from 1,782 measured elements to 1,845 with the index in, and its print count did not move, because the index is display: none on paper.

Two columns above 34rem, one below. Fifty-five short names in a single column is a screen and a half of nothing but links with the measure wasted on them; two columns of wrapped link text on a phone is a column of three-word fragments. The divider is a column-rule rather than a gap, because a bare gap between two lists of links reads as one ragged list. check-overlap.mjs was the thing to watch here and reports zero collisions across all three passes.

One spacing fault came out of looking: .qe-index-link is shaped for the register, where the pointer is the last thing before the entries and needs no bottom margin. Here the body follows it immediately, so the line read as the opening of the paragraph beneath it.

2026 · 9 September

Two pages of this cabinet had addresses, were listed on the home page, and were reachable from the foot of nothing Link to this section

The footers had drifted into three shapes: fifteen carrying the cabinet pages as authored gloss sentences, one carrying a short row of three, and the home page carrying none by design. The inconsistency was the symptom; the defect underneath it was that the ledger and the decision log appeared in no footer at all, two days after they were given addresses. Every footer is now a row of short links, the collaboration line, that page’s own licence sentence, and on the sheets one sentence pointing at the ledger — 32 to 98 words where there were 107 to 226.

CabinetEighty copies of five sentences, and the one place they were supposed to live

Each cabinet page was introduced in the footer by an authored one-line gloss. Five sentences restated across sixteen pages is eighty copies of editorial prose, every one of them free to drift, and drift is what happened — which is how two pages could go missing from all of them at once without anybody noticing. The glosses still exist, once, in the furniture list on the home page, which is where this cabinet already said those sentences live.

The row uses short names, and that is a second name for those pages. It says Colophon, Register, Decisions; the pages call themselves How this site is made, The accession register and What is settled, and what is open. A row of links and a page title are different registers, and the rule against a second name is about the group headings, where a name identifies a set. The addresses are unchanged.

The home page keeps its bare footer: its furniture list sits two paragraphs above, with the same seven pages and their glosses, and a row of the same links directly beneath would be two lists of one thing.

CabinetWhere a sheet says which copy it read, and why that is not the provenance line

Six sheets carried a paragraph of sourcing in the footer — which printing, how many scans, which page. The question was whether it belonged in the provenance line instead. It does not, and the reason is worth writing down: provenance here is accession history — when the sheet was mounted, how often its label has been corrected, each clause linked to the entry that did it. It is identical in shape on all eight sheets, and that sameness is what lets a reader scan it.

Which copy we read is a different fact with a different life. It is about the works the sheet reads rather than the sheet’s life in this collection, and putting it in the provenance line would bury the mounted, corrected twice pattern under prose that changes from sheet to sheet. It also already has two homes: the specimen block at the head of every sheet, and the ledger.

So the footer keeps one sentence — every quotation here was read in the work it comes from, and is logged in the ledger — and the trail stays where it was. What is lost is detail like read in three separately scanned copies, which is in the ledger, and which the sheets saying it were saying for the third time.

2026 · 9 September

A way back to the top, drawn as growth rather than as a chevron Link to this section

Every footer now ends in a link back to the top of the page: the words Scroll to top, a small stand of grass under them, and no script at all — an anchor already scrolls, and this site’s smooth scrolling was gated on reduced motion the day it was written.

CabinetThe arrowhead is a seed head, because a chevron laid over grass is an interface arrow in a costume

The ask was grasses whose taller stems form an arrow pointing up. A chevron drawn over grass is an interface arrow wearing a costume, and this cabinet already has its own word for up: growth, stems drawing themselves on from the ground. So two tall blades arc up and converge at the middle stem’s seed head, and the silhouette is an arrow without one being drawn.

The first attempt put two short awns on the head and read as a small figure with its arms raised. It was looked at, and redrawn — which is what this cabinet’s rule about judging a drawing at the size it ships at is for. The words carry the meaning either way: the drawing is hidden from the accessibility tree, the link is named by real text, and a reader who sees only grass has lost an ornament rather than a control.

2026 · 9 September

Sheet No. 2 had no lede and an essay with no heading, so its own contents list could not name the reason it exists Link to this section

When every sheet got a contents list, this one could not have a normal one: all six of its headings were in the 2026 commentary, and Ryan’s 2022 essay above them was unheaded, so a list at the top would have named six sections beginning a fifth of the way down and said nothing about the essay. That was left open rather than patched, because giving the essay a heading is a decision about Ryan’s text and not a defect to sweep up. He has now taken it.

2026 · 9 September

The plate was eight screens down its own home page and there was no way back up to it Link to this section

Every heading here has had an authored address since the contents list was built, and the plate and the cabinet were reachable all along — by anyone who already knew the address. A link nobody can find is close to a link that does not exist, which is the objection this house makes to an untraceable quotation, arriving as a navigation problem. There is now a rail in the left margin on every page but this one: a column of short rules that becomes the page’s own headings when a pointer or a keyboard enters it.

CabinetTwo contents lists on one screen, on purpose, and the argument for why they are not the same object

This file already refuses a contents list for the home page because two competing navigational lists is a defect, and the rail plainly puts a second list beside the first on seven pages. The refusal stands and does not reach this: the contents list is front matter — read once, in sequence, in the measure, before the sheet begins. The rail is an instrument, glanced at from the middle of a sheet nine thousand words in. The home-page defect was two lists competing to be read; only one of these is for reading. Ryan’s call, against the recommendation to hide one, and the design work went into making them unmistakably different objects rather than into hiding either: the rail is smaller, mossy rather than rust, unnumbered, unlabelled, and out past the measure in space no line of text occupies.

It is unlabelled because a visible heading would be a third copy of the words On this sheet and the one free to drift. The aria-label is authored in the markup, once per page, and queering.js still writes no words — one builder now fills either container, because a second loop would be a second place for the three heading exclusions to be got right.

The register is the page that does not get one, for the reason it has no contents list either: twenty-eight headings averaging 147 characters, longest 226. In a 12rem column with no truncation allowed that is a four-thousand-pixel rail. The same measurement that sent this page’s index to the foot keeps the rail off it.

CabinetThe rule that says grow the hit area was followed with the wrong instrument, and then with the wrong arithmetic

Two mistakes in the one rule this house wrote down because no gate enforces it. The instrument first: the view controls grow their targets with an absolutely positioned 44px box behind each control, and reaching for it here would have been wrong — rail links are stacked, so the boxes would overlap, the topmost would take every tap, and the rule asking for 44px would have produced a rail where most entries could not be pressed at all. Stacked targets take real padding.

Then the arithmetic. The padding was set from the measurements of a 1rem line and shipped 44px in a comment above targets that measured 31.1px — a control whose own note explains the failure, committing it. Found by measuring the rendered box rather than by reading the rule back, which is the whole reason this site measures. A 0.82rem line at 1.35 is 17.71px, so the padding is 0.83rem either side and the box is 44.3px. Verified after: no two hit areas overlap, and the tallest rail on the site — the colophon at fourteen entries, 690px — still clears a 900px viewport before the clamp scrolls it.

The rail lives outside the landmark, so no generator changed a single byte when all three were re-run — checked rather than assumed.

CabinetBuilt at runtime is free; hidden is not, and the rail was both in the same afternoon

The rail shipped showing every label all the time, and needed nothing from tools/reveal.mjs — both Chrome gates load over file:// and queering.js is fetched by relative URL, so it runs and the labels were measured like any other text. That was proved rather than assumed, by putting a 2.9:1 colour on the contents list and watching the contrast gate report exactly one failure per heading on seven pages.

Then it was collapsed to hover, and all 109 labels went into the blind spot at once. A gate skips what it cannot see, and opacity: 0 is invisible. Proved both ways with a probe colour on the rail: with the new reveal line, 109 failures caught; without it, a clean PASS and 218 elements silently dropped from the count. The distinction is the thing worth keeping — REVEAL is for a fetch or a hidden state, and never for anything merely built at runtime.

The labels are left in flow at zero opacity rather than floated in pills, and that is what makes the reveal safe for the other gate. Pills would let the ticks sit at an even pitch, as they do on the page this was modelled on — and the moment the reveal turned them on for measurement they would lie over one another, so check-overlap.mjs would report every label sitting on the next. In flow, what the gates measure is the expanded rail that was already clean at 1280px. The pitch is uneven instead, because a row is as tall as its own label: one row on the home page, three on the waste garden.

CabinetThe rail’s ticks became a scale drawing of the sheet, because an imperfection with no norm behind it just reads as an accident

Collapsed, the rail was a column of identical rules at an uneven pitch — uneven because a row is as tall as its own label. Ryan’s read was that this was an imperfection worth leaning into. The trouble with leaning into it as it stood is that asymmetry only reads as asymmetry against a norm, and with nothing else varying the pitch read as an accident rather than a hand.

So the ticks were given the norm to deviate from, and the deviation is inherited from the sheet rather than invented: each tick is now as long as its section is tall, normalised across the page. The rail is a small scale drawing of the document, and you can see which section is the long one before reading a word. On the Dickinson sheet the longest section draws 32px and the shortest 9px, monotonic across all eight.

That it means something is the licence for it, not a bonus. A tick whose length varies looks like it encodes something, and this cabinet refuses decoration asserting a fact it does not have — a gold join on a sheet nobody corrected. Four treatments were drawn against the real stylesheet before choosing, and the one that varied length without meaning was refused for precisely that reason. The lean beside it claims nothing, which is what leaves it free to be ornament: up to 3.2 degrees, walked by the golden angle so the same sheet draws the same rail every time rather than rolling dice on each visit.

The two part company in plain view: the lean goes, the lengths stay. Plain view removes decoration and has never removed information, and splitting one effect into an honest half and an ornamental half is what makes that line drawable at all.

CabinetThe rail’s rule ends in a leaf now, and the doodles that were asked for were drawn and refused

The question was whether small doodles above, below or around the rail would add to the handwritten feel — asked with the risk already named: that it might spend the negative space. Both arrangements were drawn and looked at, and the scatter was the wrong one. A cluster at the head of the rail lands in the top-left corner of the page, which is where a reader’s eye starts and where the skip link appears on focus, and it makes the rail’s decoration the first thing anyone sees. This component is unlabelled precisely so that margin stays empty; filling it spends the thing that made the rail acceptable.

What survives is the version that is not an addition at all. The rail’s rule already reads as a stem, and a stem that simply stops is the only unbotanical thing about it. It now ends in a terminus — two leaves and a bud, continuing the line rather than sitting beside it, pulled back past the nav’s padding to meet the border. Twenty-eight pixels, stroke only, in moss. It occupies margin nothing else wanted and puts no second object on the page.

It wears .qe-botanical, so the growth is inherited rather than restated: the stem draws itself on and the leaves unfurl, both already gated on reduced motion and already kept-but-stilled in plain view. Only the size is new, exactly as with the moth. Because it takes a palette token it follows the ground with no cabinet rule of its own, which was checked in both.

That no gate here measures a drawing against text is the reason it is small. check-overlap.mjs catches text sitting on text, so an ornament in the margin is guarded by nothing at all and could drift onto the measure at some width without a word being said. Keeping the mark inside the rail’s own box means the clearance already measured for the rail covers it too. Anything free-floating would need measuring by hand at every breakpoint, which is a standing cost this cabinet has not agreed to pay for decoration.

CabinetThree sheets had no contents list and no reason for not having one

No. 1, No. 2 and No. 7 were missing their On this sheet list. They run 2,045 to 3,098 words against 2,495 to 5,018 on the five that had one, so the bar the existing sheets set was already cleared and the gap was an oversight rather than a decision. All eight sheets carry one now. The opt-in stays in the markup: nothing derives a contents list from a word count, because which pages want one is editorial, and the pages that still decline all have a reason on the record.

“After the lede” turned out not to mean “before the first heading”, which was checked before anything was placed. Five of the existing lists carry opening prose after them — the Dickinson sheet nineteen blocks, the Quetelet sheet thirteen. A contents list is front matter for the sections, and the lede is not a section.

No. 2 puts its list somewhere no other sheet does, and that is authored. It has no lede, and all six of its headings are in the 2026 commentary — the 2022 essay above them is unheaded and stays that way, because the note directly above it says Ryan’s words are unchanged and a heading dropped into them would not be. A list at the top would name six sections that begin a fifth of the way down and say nothing at all about the essay, which is the reason the sheet exists. It sits immediately after that note instead, where the sheet says out loud that it is changing hands, and maps exactly what follows it.

2026 · 9 September

The ledger and the decision log had no addresses, so the aim that pointed at them was the thinnest receipt on the mission page Link to this section

Aim 12 says this site works in public with the working-out left in, and it pointed at two files on GitHub, because that was the only way to reach them. An aim whose receipt is on somebody else’s website is not much of a receipt. The attribution ledger and the decision log are now pages here — generated from the Markdown rather than retyped from it, because two hand-kept copies is the failure this whole house is organised against.

MountedA generator that runs backwards, because the Markdown is the thing being kept and the page is the copy

Every other generator here reads a page and writes Markdown beside it. This one reads Markdown and writes the page, and the direction is the design: those two files are working documents. The credit-source skill appends to the ledger; every session that settles something appends to the other. Making the page the source would mean editing a ledger entry in HTML, which is how a ledger stops being kept. Either direction is fine; two hand-kept copies is not.

It throws on a line it does not recognise, and then proves it did not drop one. Every block’s words are checked against the rendered text before anything is written — whitespace removed on both sides, because tags are word boundaries in the source and not in the output. That proof caught four faults in its own author on the way here, and three of them were the proof being wrong rather than the converter: it stripped a bullet, a table’s pipes, and then the underscores out of Photon Pulse_he_him, a study participant’s pseudonym the converter was right to leave alone. A guard that cries wolf gets relaxed, so the proof was made to model the converter rather than approximate it.

The real fault it found was **The lower-case *g* is kept** in the ledger — emphasis nested inside emphasis, where the inner pair is a letter being quoted. The first pass refused the nesting instead of reading it.

CabinetThe addresses are not /attributions and /decisions, and that is a filesystem fact rather than a preference

macOS is case-insensitive by default. A page at /decisions is decisions.html, and make-markdown.mjs writes a .md beside every page — so it would have written decisions.md, which is the same file as DECISIONS.md. The generator would have silently overwritten its own source with a round-tripped copy of itself, on the first run, with no error and nothing to restore from but git. attributions.md collides with ATTRIBUTIONS.md the same way.

Checked before a line was written, by creating AAA.md in a temp directory and asking for aaa.md. The addresses are /ledger — the site’s own name for that file in every footer it appears in — and /what-is-settled, which is the other file’s own opening line.

CabinetBoth walkers learned a tag on the same afternoon, and one of them had to learn not to tidy

The decision log carries one shell block, so make-markdown.mjs and make-search-index.mjs both threw on pre — the throw-rather-than-drop rule working exactly as intended, in two tools, within a minute of each other. The Markdown converter needed more than the tag. Its text handler collapses whitespace and escapes punctuation, which is right everywhere except inside a fence: the first output put a shell command and its continuation on one line with backslashes through the quoting. A fenced block is the one place in Markdown where neither pass is wanted.

The search walker indexes the block rather than skipping it. Skipping was the quieter choice and the wrong one — a command in the decision log is content, and a searcher looking for the deploy hook should find the page that runs it.

2026 · 9 September

A cabinet that publishes an attribution ledger, a privacy policy and a register of its own errors had never written down what any of it was for Link to this section

There was a page for what the cabinet holds, a page for how it is made, a page for everything we have got wrong, and a page for what the site knows about you. There was no page saying what we are trying to do. That absence is not neutral, and this site already knows why: a project with no stated aim is a project whose aims can drift with nobody able to point at the drift, which is the objection it makes to a quotation nobody can trace and a number nobody can re-derive. Sheet-less, numberless, and now written down.

MountedThirteen aims, each naming the page already keeping it — and, for each, the observation that would falsify it

The genre is the whole defence against duplication. The home page already carries 611 words of manifesto across three sections. A mission written as an argument would have restated most of it, and two copies of the same words drift — the rule this house repeats more than any other. So this is an index of commitments with receipts, which structurally cannot duplicate an argument: every aim ends by naming where it is already being practised, and an aim with no page keeping it would be visible as a hole. The form is Star Stuff’s, adopted deliberately; the aims are this site’s own and several have no counterpart there.

An aim you cannot fail is not an aim. The last section is a table pairing each aim with a condition somebody outside could observe, with no access to what we meant. Most of them are not hypothetical. The working tagline was once a paraphrase of Nick Walker wearing his name. Tuck and Yang were carried from settler colonialism to masking and the sheet nearly let their authority cover the move. And the plate said Seven sheets above eight cards — a count in our prose nobody could re-derive, which is the last row of that table, committed on this site, this week.

What it refuses to claim. Stimpunks’ first programme is direct financial support to individuals, and a section says plainly that this site does none of it and should not be counted as though it did. No sheet here has paid anybody’s rent. The honest claim for a cabinet of readings is narrower and is stated at that width.

It is the first page in a second list at the foot of the home page. The founding papers is why the cabinet exists; The cabinet itself is how it is made and what it knows about you. Purpose above plumbing, and the split is Star Stuff’s too — see the entry below for the day the first list was built.

MountedTwo quotations from our own two organisations, held to the standard everybody else’s words are held to

The page quotes the Stimpunks Foundation’s mission and Helen Edgar’s own landing page rather than paraphrasing either, because the paraphrase is where a mission goes soft and paraphrase-wearing-a-name is the failure the ledger exists to prevent. Both were read from the primary the day they were mounted, and both are logged.

Reading the primary found something, as usual. Two wordings of the Stimpunks mission sit on the same page — the statement block says the foundation builds tools that support people to live with dignity, challenge dehumanizing systems and design environments that honor difference as strength; the Mission Compass further down says enables people to live with dignity and stops. We quoted the longer, and the ledger records the discrepancy, because a reader who checks will find both and an unrecorded discrepancy is how a ledger loses its value.

Their capitalisation and their spelling are kept. House style capitalises Autistic and Disabled and spells honour; the quotation does neither. A quotation is not the place to apply house style, and this is the site that says so.

And one of their sentences turned out to be about Sheet No. 4. Stimpunks’ mission says We enable the weird, feral, chaotic, and magical people. Sheet No. 4 is the history of that word being demoted from wyrd, meaning fate, to a name for people who do not fit. The sheet was not written to illustrate the mission; the collision was found by reading the mission properly, which is the argument for reading primaries in one sentence.

CabinetThe Markdown converter now honours a list’s start attribute, because thirteen aims in four groups renumbered themselves four times

The aims run as one sequence across four group headings, which is four ol elements with start on three of them. The converter ignored the attribute, so the page said thirteen aims numbered 1 to 13 and /mission.md said 1–3, 1–5, 1–3, 1–2. A converter that silently drops an attribute is the same drift as one that silently drops a tag, which is the rule that already makes it throw on an unknown element — it arrived by the other door. It now reads start and throws if it is not a number.

Two components were added for the page and both are the bare tier: the one-sentence statement, and the aims list. The statement is not a blockquote — nothing is being quoted, it is the site speaking, and marking our own words as a quotation is the mistake most of these rules exist to avoid. The aims use native ol numbering rather than a counter on a pseudo-element, so a screen reader announces the position, and no colour goes on the marker: a ::marker is invisible to the contrast gate, which is exactly how this register’s own entry bullets once sat at 2.15:1 unreported.

2026 · 9 September

An eighth gate, ported the same day the failure it catches happened twice — and its first honest run found fifteen more Link to this section

The house rule is to port a Star Stuff check when the failure it catches becomes possible here. check-card-order.mjs did not clear that bar; it cleared a higher one. The plate shipped out of sequence, a sibling nav shipped out of sequence, and all seven existing gates passed both — correctly, because order is not colour, position, freshness, routing, structure, headers or the manifest, and a grid in the wrong order looks exactly like a grid in the right one.

CabinetThe upstream tool would have certified the exact plate that prompted it, and finding that out was most of the port

Star Stuff checks ascending order within each series, because one of its collections interleaves Zine and Field Guide numbers on purpose and a single merged sequence would fail a page for doing what it means to do. This site has no series. There is one accession run and the kind chip is a label on it — No. 1 a Reading, No. 2 an Essay, No. 8 a Wall — and they ascend together.

Ported unchanged, that split would have been worse than no gate. No. 8 is a Wall and No. 7 is a Reading, so 1, 2, 3, 4, 5, 6, 8, 7 is two perfectly ascending series. Proved rather than reasoned about: the broken plate was put back, the series split was patched into the tool, and it reported ok · 0 problem(s) on it. Then the split came out and the same plate reported No. 7 follows No. 8. A port is a rewrite when the thing being ported encodes an assumption the new site does not share.

Every rule was made to fail before it was believed. Rule 1 on the restored plate; rule 2 by dropping a card outside every grid; the empty-authority guard by breaking the card selector on the plate and watching it report NOT MEASURED rather than clean — the overlap gate’s empty-pass lesson arriving in a second tool. And --check both ways, because that flag has now been load-bearing and missing twice in this repo: exit 1 with it, exit 0 without.

CabinetWhat it refuses to check, and the one that looks most like an omission

It does not check the plate against tools/pages.mjs. They agree today and the temptation is obvious, but they are two different facts: the number records when a sheet was accessioned and pages.mjs records the order a reader should meet the pages. Mount Sheet No. 9 and decide it reads best third, and the two diverge legitimately. Coupling them would turn an editorial decision into a build failure.

It also declines to order the unnumbered cards — there is no mechanical answer to where the colophon belongs relative to the register — and it says so in the summary rather than quietly leaving six cards out of the denominator.

2026 · 9 September

The plate said seven and carried eight, and two of them were in the wrong order — on the one page whose job is to say what is here Link to this section

Sheet No. 8 was mounted, carded and logged, and the sentence above the plate was left saying Seven sheets, so far. The card went in at the end of the list rather than in its place, so the plate ran 1–6, 8, 7. Neither is a hard fact getting away from us; both are the register’s own bookkeeping getting away from us, which on a site that publishes an accession register is the more embarrassing of the two.

2026 · 9 September

The four pages that are not specimens were only ever in the footer, which is where a site puts what it hopes nobody needs Link to this section

The plate names eight readings and nothing else, so how the site is made, this register, the finding aid and the privacy page lived in the footer of every page and in no page’s content. A site that publishes an attribution ledger and a privacy policy should not file both under fine print. They now have a section of their own at the foot of the home page, under the name the group already had in tools/pages.mjs — so the plate, the finding aid’s manifest and /llms.txt call this set the same thing rather than three things.

MountedA list with no cards, because a card would say these were readings and none of them is a reading of anything

The bare tier, and that is the whole design. Space only, no fill, no box — the surface this house reserves for the cabinet talking in its own voice. Fifteen components once shared one card treatment here and a reader could only rank them by reading the label; giving the furniture the plate’s clothes would be that defect deliberately reintroduced. The plate does the ranking, and this list agrees with it by declining to compete.

Back matter, not front matter. It sits last inside main, where the links it replaces already were. That is the correction the register paid for when a contents list at the top of this page delayed its first entry by three and a half screens: furniture at the top costs every reader, furniture at the foot costs none. The home page’s own content is a contents list already.

A description list, because each entry is a name and a gloss on it. The Markdown converter writes a term and its definition, so the copy an agent fetches at /index.md keeps the pairing instead of flattening into loose lines. It is inside main rather than beside the sibling nav for the reason the contents list may be: a list of the site’s own pages on the site’s own index page cannot be one sheet’s navigation indexed as another sheet’s content.

CabinetThe target is the line and not the letters, which is the rule the ground control shipped one pixel over

A dt that is entirely a link is not an inline link inside a sentence, so WCAG 2.5.8’s inline exception does not cover it — and the ink alone is 23px tall. Padding takes each target to 45px, which is 2.5.5’s figure rather than the 24px floor. It grows into the gap above the description instead of pushing the entries apart, so the list did not get taller to get reachable, and the next target starts a whole description later, so no two can touch. Measured afterwards, because nothing in the seven gates measures a hit area and a number nobody checked is a number.

The padding is also spacing, so the scale is taken net of it. 0.7rem inside an entry and a full --qe-space-3 between two — two to one, which groups the pairs by eye with no rule drawn anywhere. Left uncompensated the list would have started 11px below where every other block on the page starts, and an unauthored deviation makes the authored ones mean less.

The home page’s footer lost the four links and no other page did. On this page they are two paragraphs above; everywhere else the footer is still the way there. One page, one list of the same four things.

2026 · 9 September

A site that had spent a day removing its only third-party request mounted a YouTube player, and the whole of the work was making that honest Link to this section

Ryan and Helen listen to Eliot read The Waste Land together, and a site about reading things closely is a strange place to make somebody leave in order to hear one. So there is now a recording under the lilac. It cost a sentence this site had been proud of. /privacy said, of the Google fonts removed that morning, It was the only one. That is no longer true, and the honest replacement is not a smaller boast but a more precise claim: reading a page makes no third-party request, and there is exactly one place where you can choose to make one.

MountedA facade, not an embed: the served page holds a drawing and a link, and nothing reaches Google until somebody presses play

Measured rather than asserted. On load, the set of non-local hosts the page contacts is [] — empty. After the press it is exactly one, www.youtube-nocookie.com, which is the host /privacy names. Both figures came out of a headless run reading performance.getEntriesByType('resource'), not out of a reading of the source.

The poster is drawn, not fetched. YouTube’s own thumbnail would have been a request to i.ytimg.com on every page load, before anybody pressed anything — which is exactly the Google-fonts failure this site had just spent a day removing, wearing a different hat. It is a scatter of the same lilac florets as the bush above it.

Without JavaScript the control is an ordinary link to the video, and pressing it goes to YouTube. With the script it stops navigating and swaps the player in place. Both are a request the reader chose, which is the same footing as every other outbound link here — and that link is also what survives into the Markdown copy, so an agent reading /index.md gets the address rather than a hole where a player was.

A third script, for the reason there was a second one. queering.js may never put content on a page; this script’s entire job is to put somebody else’s content on one. Widening that boundary to fit would have cost the boundary. It creates no words either — even the player’s accessible name is read from data-embed-title in the markup rather than written in the script.

CabinetThe gate now reads our JavaScript, because section 7 looked only at markup and a script is where a third party would actually appear

check-metadata.mjs has enforced no page may fetch from another origin since the fonts came home, and it did it by scanning HTML attributes. That check would have reported this page perfectly clean. The request lives in a script, and a gate that cannot see the place the failure would occur is a gate that certifies the failure. Three assertions were added, and each was made to fail before being believed:

Every third-party origin our own scripts mention must be named on /privacy. Not forbidden — named. Proved by renaming the host on the privacy page and watching the run go red. It found a real fault on its first honest run, too: the script contacts www.youtube-nocookie.com and the policy named the bare domain, so the policy was one subdomain away from being wrong about its own site.

A facade must stay a facade. An element carrying data-embed-id must have a plain link to the same video beside it — that link is the no-script path and the reason the request counts as chosen — and the served page must contain no iframe at all. Proved by deleting the link, and again by adding an iframe. The second turns out to fail twice: the Markdown converter throws on the unknown tag before the new check is even reached, which is the converter’s teach me or I will drop content rule catching a privacy regression by accident.

The contrast gate caught the other one. The player’s subtitle was --qe-moss on --qe-paper-deep: 6.9:1, clearing WCAG AA and missing the house 7:1 by a tenth. That is the same surface this site already removed a recessed panel over, and it is the third time --qe-paper-deep has done this. The line is --qe-ink now, and the hierarchy is carried by size and weight, which is what should have carried it in the first place.

2026 · 9 September

A lilac bush from Ryan’s own yard, standing above the footer, and the song under it belongs to a man almost nobody names Link to this section

Drawn from a photograph of the shrubs in Ryan’s garden, and mounted because the site had just borrowed a colour and had nothing of the actual plant in it. It closes the home page the way a plate closes a chapter. Ezra Furman, whose song gave the site those two colours, has said what they are for: So I wrote this theme song for us, and gave us some gang colors: lilac and black. Us, there, is trans women, and the statement around that sentence is about being ready to defend one another’s lives. Furman, in Clash. The flower on this page is not a decoration borrowed from a song; it is the plant the colours were named after, growing in somebody’s yard.

MountedThe vase habit is the whole read, and two drafts got it wrong in the same way

A lilac is many slender woody stems from one clump at ground level, bare for the lower third, fanning into a dome half again as tall as they are. Both of the first two drafts put the bare stems at more than half the height and produced a hand fan — a shape that is unmistakably not a shrub, and unmistakably not this shrub. The proportion was eventually measured off the photograph rather than guessed.

The dome’s underside arches, low on the flanks and high in the middle, so the bare stems show through the centre exactly as they do in the photograph. One function in the markup defines that arch, and both the trunk tips and the flower placement obey it — two copies of that curve would drift, and the drift would be a bush whose trunks stop in mid-air.

Placement of the flowers went through three schemes. Rings left the middle hollow and read as a wreath. Uniform random sampling clumped into two lobes with a hole between them, which is what forty random points actually look like and why nobody should reach for random when they mean even. Staggered rows inside the ellipse give even coverage by construction, and that is the version here.

A panicle is a mass, not a chain. A lilac thyrse is a dense cone of hundreds of tiny four-lobed florets; the first attempt strung eleven large puffs along an axis and read as a bunch of grapes. It is drawn now as a triangular scatter stippled between the three lilacs, with a few four-lobed florets laid over it for texture. Drawing every real floret would be thousands of elements for a shape a reader sees as one thing.

CabinetEighty-five kilobytes of markup, nine over the wire — and the trick that would have shrunk it breaks the styling silently

The drawing is about seven hundred circles. Raw, it is 85KB; compressed, which is how every response here is actually served, it is nine, because markup this repetitive is very nearly free to a compressor. The home page went from 43KB to 143KB raw and from about 7KB to 22KB over the wire. Measured before it shipped rather than assumed either way.

The obvious optimisation was tried and reverted. Defining the leaf and the floret once and referencing them cut 20KB raw — and rendered every cloned leaf and floret in black. Outer stylesheet selectors do not cross into a use shadow tree; only inherited properties do, so .leaf and .floret simply stopped matching while the definitions themselves still looked perfectly correct. That is a fraction of a kilobyte compressed in exchange for a styling path that fails silently, and the comment in queering.css now says so, because the next person to look at seven hundred circles will have the same idea.

A class with no rule renders black, and nothing here catches that. An earlier pass had the generator emitting puff-pale while the stylesheet only knew puff and puff-deep: a third of every flower cluster came out in solid black, and it was found by looking. Star Stuff’s check-classes is the gate for exactly this, and it is the strongest candidate for the next port — the failure it catches is now known to be possible here, which is this repository’s stated bar.

In print the mass becomes an engraving. Every floret prints as an open circle in line, and the tone comes from how densely they overlap rather than from ink coverage — which keeps the design sheet’s claim that these drawings print as line work true, and looks better than the three flat greys the screen fills would have made. Checked under print emulation, where a second fault turned up: the print block sat above the base rule at equal specificity, so the caption printed moss-green. Source order decided it, and the print block now comes last.

MountedHelen hears Eliot the instant anybody says lilac, so the plate got the four lines that come with the flower

April is the cruellest month, breeding / Lilacs out of the dead land — the opening of The Waste Land, and Helen’s immediate association with the word. It is a useful one to have standing over this drawing, because it files the flower on the cruel side of the season: lilacs as what the dead land produces, memory and desire stirred up together, spring as an imposition rather than a mercy. A page that has just spent a paragraph on gang colours and one on a torch song is well served by a third reading that refuses to be consoling.

1922, so it is public domain in the United States, and four lines can be mounted whole rather than trimmed — which matters on a site whose stated risk is the tightened quotation. The wording was checked against Project Gutenberg’s transcription of the 1922 text rather than taken from memory; the Poetry Foundation’s copy, which is what the citation links, refuses automated requests. Cruellest keeps its British spelling, as the house rule requires inside a quotation.

2026 · 9 September

A moth with the Earth where its body should be, in somebody else’s two colours, and the hardest part was stopping the middle of it from looking like a brain Link to this section

Ryan’s, and it is two borrowings at once. The cover of Nick Walker’s Neuroqueer Heresies sets a human brain where a swallowtail’s body would be; Ezra Furman’s Lilac and Black supplies the palette and the line the palette comes wrapped in — We wear the lilac and black. Put the Earth where the brain was and you have this site’s name as a drawing. Both debts are stated in the figure’s own caption, which is the only version of this that is defensible here.

MountedThe drawing is at the foot of a section rather than at the top of a page, which is the first time anything here has been

Every other drawing on this site sits above the prose as a masthead, or in a corner as a vine. This one closes Queering is a verb, because that is the section it is an argument about: Walker’s coinage, our extension of it, and a picture that performs the extension rather than restating it. The header spray at the top of the home page is untouched — it was never the thing to replace.

The surface is bare. Space only, no fill, no box: it is our own drawing with our own caption under it, which is the default tier and not an object mounted from elsewhere. The one dark-ground version drafted for review was refused for that reason as much as any other — a black card on a vellum sheet is a fourth surface, and the three-surface rule exists so that a reader can rank a panel without reading its label.

It wears .qe-botanical as well as .qe-moth, and that is deliberate. The growth motion, the stroke-drawn stems and the unfurling sprouts are all written once; only the fills are new. A second copy of that idiom is a second thing to keep in step with prefers-reduced-motion, and the reduced state has to be the finished drawing in both.

CabinetTwo new decorative tokens, because a wash and the thing washed onto it cannot be one value

--qe-lilac takes the forewing, --qe-lilac-pale the hindwing and the sea of the globe, and both have --qe-cab-* counterparts aliased through both ground switches. The decorative five is a decorative seven now, and the sentence on the palette sheet that counted them has been recounted — a number in prose that nothing checks is a number that goes stale silently, and this one had been true since the site shipped.

The pale one goes darker in the drawer, not lighter. That is the gating-surface inversion arriving in a component with no text in it: in daylight the wash is the recessed thing under the wing, and lifting it in the cabinet would have it out-shouting the ink line. Neither token is for text in either ground, so 7:1 does not apply — there is not a letter anywhere in the drawing.

Black is --qe-ink, so the black inverts. In daylight the outline and the continents are near-black on vellum; in the drawer they are cream. The song says lilac and black and the drawer says otherwise, and the drawer wins, because the alternative is a literal black line on dark brown that nobody can see. The one version that would have kept the black in both grounds was the black card, and it lost on the surface rule above.

The print sheet flattens the wings to line work like every other drawing here, with one exception written into the rule: the continents keep their fill. Flatten those along with the wings and the globe stops being the Earth and becomes a ruled circle.

CabinetThe coastlines are projected rather than drawn, because three passes of hand-drawn continents kept reading as a brain

This is the funniest available failure and the least acceptable one. The drawing quotes a book cover that has a brain in the middle of it. Hand-drawn continents — three separate attempts at them — came out as a pair of symmetrical dark blobs either side of a central meridian, which is a Rorschach card, which is to say: a brain. A picture whose whole point is that the Earth is where the brain was cannot have a middle that reads as the thing it replaced.

So the coastlines are coarse lat/lon outlines put through an orthographic projection centred on 25° west and 12° north — the Atlantic view, the only one where the Americas and Africa are both legible. Points on the far side are pushed out onto the limb rather than folded back across the disc, which is what a continent going round the edge actually looks like. The foreshortening is Earth’s and not ours, and Africa is unmistakable at a forty-pixel radius, which is the size that matters.

It has no tails, after four attempts at them. Hanging straight down they read as legs; swept outward, as a bracket; curled inward, as a moustache; integrated into the hindwing path, as a boot. What actually says moth is a broad fanned hindwing and a feathered antenna, both of which it has. The cover’s tails say swallowtail, which we are not, and the caption carries that reference instead of the drawing pretending to.

One thing the review process itself taught: the first four screenshots showed no wings at all. Every wing is inside a .sprout, which starts at opacity: 0 and unfurls on a delay, so a screenshot taken half a second after load is a photograph of an animation that has not happened. The growth gating is correct and the reviewer was wrong; noting it because the next person to check a drawing here will hit the same thing.

2026 · 9 September

A real herbarium stamps its sheets with an accession number that is a row in a ledger, which is the whole reason this one could have it and most of the work was proving the ink was legal Link to this section

Prompted by Ryan noticing the oval stamp on a scanned sheet from the Ada Hayden Herbarium at Iowa State University — the institution’s name around the ring, its parent below, and 497892 across the middle. The suggestion was that a faded one would add to the sense of age, and it does. What it cost was a measurement, because faded and 7:1 are the same argument from opposite ends.

MountedEvery sheet is stamped, and the fade is on the ring because no colour here can make a letter faint and legal

The faded look was measured before anything was drawn, and every candidate failed. --qe-lichen is 2.15:1 on paper — the exact figure this repository already uses as the injected value that a contrast run must report as FAIL, and the same one the register’s entry bullets sat at unreported. --qe-verdigris is 3.42:1. Neither clears 7:1, and neither clears the 4.5:1 large-text floor either, so there is no size at which a pale green letter becomes permissible here.

So the letters are --qe-moss at 7.8:1 in daylight and 7.2:1 in the drawer, and the age is carried entirely by the ring: two ovals with a wedge lifted out of each, and a few degrees of rotation authored per sheet. That is this cabinet’s standing rule — the colour goes on the rule and never on the glyph — and it turns out to be what a real understamped impression looks like anyway. The outline breaks long before the letterforms do. Nothing was given up to get the ink legal.

The number is real, which is the only reason there is a stamp at all. Ada Hayden’s 497892 is a row in a ledger somebody can go and read. A six-digit number invented here to look convincing would be a gold join on a sheet nobody corrected — decoration asserting a fact — and it would be the worst possible place for that failure, on a site whose one stated correctness requirement is attribution. What is real here is the sheet’s number and the day it was mounted, both of them entries on this page.

It says Queering Earth alone. The obvious move was to name Stimpunks and More Realms the way the Iowa stamp names its parent institution, and two custodians do not fit the oval — at that size the lower line crossed its own ring. The layout is not the argument, though: a stamp asserts a single custodian, this site is a collaboration, and Queering Earth is the one name that is true of the whole of it. The two organisations are credited where credit is a sentence rather than a mark.

No sheet named its own number anywhere inside its landmark before today. Other sheets’ cards say it, from outside main where the mirror cannot see them, and this register says it constantly. So the stamp adds a fact rather than making a second copy of one, and there is no drift surface: it sits in one block with .qe-provenance, which states the same accession in words. The stamp is not a link, either. The provenance line beside it already points at the accession that put the sheet up, and a second tab stop landing on the same anchor a few millimetres away goes nowhere new.

CabinetThe washed-out effect is a blend mode, the blend mode erases the stamp in the drawer, and the contrast gate reported it clean

mix-blend-mode: multiply is what makes the mark look stamped rather than printed: the sheet’s own foxing comes up through the ink the way it does through a real impression. On the dark ground it took a mark measuring 7.2:1 down to very nearly nothing — multiply darkens towards the ground, and in the cabinet the ground is the dark thing. Caught by looking at it in the drawer.

This is a blind spot in check-contrast.mjs and not an oversight in it. The tool composites computed colour pairs, so it saw --qe-moss on --qe-cab-paper and reported the figure that pair measures. It has no concept of a blend mode, and it never will without becoming a screenshot differ. It joins the two exemptions already written down: a ::marker, which is not an element with text of its own, and a texture, which varies luminance per pixel. A pass is not permission, and this is the third way to earn a false one.

The fix is a token rather than a second selector, because this is the fourth time that lesson has arrived. --qe-stamp-blend is multiply in :root and normal through both ground switches — the same shape the foxed-paper wash, the shadow a lifted sheet casts and the pale flesh of a specimen all ended up in, each of them a property that differs between the grounds and is not a colour. Two selectors carrying one decision is two selectors that drift.

The mark is in flow, at the head of the provenance line, and the corner version was refused. A stamp belongs in a corner of a real sheet, and an absolutely positioned one lands on the prose — at a narrow width, at 400% zoom, or under a long heading — which nothing in this repository can currently see happen. Star Stuff has check-overlap for exactly that, and the house rule is to port a check when the failure it catches becomes possible here. Not floating the stamp is cheaper than porting the gate, and the accession block reads better as one object regardless.

CabinetA seventh gate, ported because a design was refused for want of it — and it measures paper, which the tool it came from does not

The stamp belongs in the corner of a real sheet and it is not in the corner of these. An absolutely positioned mark lands on the prose at a narrow width, at 400% zoom, or under a long heading, and nothing here could see that happen. Star Stuff has check-overlap.mjs for exactly it, and the house rule is to port a check when its failure becomes possible. Refusing a design for want of a gate is a reason to build the gate, so it is ported — and the first thing it did was catch the refused design: seven collisions on Sheet No. 2, with the stamp’s own Sheet No. 2 sitting on the masthead’s Queering Earth.

It is not a copy. The reveal step and the browser client were lifted out of check-contrast.mjs into two shared files rather than duplicated. The reveal step is the one that mattered: it is the list of things a page builds at runtime, it is editorial, it grows, and its own comment tells the next author to add to it — so two copies would be a component one gate learns and the other does not, which is the failure the shared entity table already exists to prevent. Both extractions were proved to change nothing: the contrast gate printed a byte-identical report before and after.

Two faults in the imported tool turned up on the way, and both are now fixed here. Its clip check walked upwards from an element’s parent, so an element clipping its own overflowing text was never treated as the thing doing the clipping. And the function that says where a collision is reported page for absolutely positioned blocks — the precise case the gate exists to catch, given no address. Both are recorded in DECISIONS.md, because Star Stuff is not edited from a session in this repository.

Two of its four findings cannot fire here, and that is a house rule showing up somewhere nobody expected. There is not one rendered text element in any page on this site: the botanical art is 535 paths, 381 groups and 160 ellipses and circles, named to a screen reader by aria-label. That is never an image of text, and it means the two faults that motivated this tool upstream — a drawing’s label on another label, and a label on the prose — have no instance to find. They are kept anyway: dropping them would stop the sweep measuring SVG text, and the day a sheet carries a label the gate would report a clean page it never looked at. They were proved by injecting labels, and the file says so rather than letting them pass for tested.

An exemption was removed for exempting nothing. The skip link went on the ignore list on the strength of the upstream note, where its equivalent fires on five of seven pages. Tested here, the list is empty and the count is still zero, because this site’s skip link has no clipping ancestor to be outside of. An exemption that exempts nothing is a named hole a real fault can fall into, and worse, it reads as evidence that somebody checked.

It measures paper too, which the tool it came from does not. Star Stuff hands print collisions to a paper gate; this repository has none, and paper is the medium this house has already been burned by — forty-four of forty-six pages once printed blank. Three passes now: the screen, then US Letter and A4 at the width a sheet actually leaves for content.

The viewport moves, and that is the whole reason the pass is worth having. The contrast gate emulates print media at desktop width and is right to, because it measures colour and colour does not reflow. A collision is a position. In print this stylesheet lets main run the full width of the sheet, so measuring paper at desktop width measures a line length no printer produces. The counts say it plainly: this page is 4,884 pieces of text on screen, 3,567 on Letter, 3,604 on A4. Both papers, because those last two numbers differ — twenty-two pixels is enough to rewrap a line and move a hand-placed mark, so picking one and calling it print would be this pass’s own mistake at a smaller scale.

And the guard against measuring nothing is per pass, which turns out to catch the original disaster. A stylesheet that renders nothing on paper measures zero there while measuring hundreds on screen — and the run reports the page as not measured, naming which passes came back blank, rather than reporting it clean. Forty-four pages printing blank would not survive this gate. That was not why the guard was written, which is the pleasant kind of accident.

Pagination is the honest limit. Print emulation reflows to the width but does not break a document into sheets, so a collision that exists only because two blocks land either side of a page break is still invisible. break-inside: avoid on the accession block is there because pagination is real. Reaching it means pulling text positions out of a generated PDF, which is a different tool and not a flag on this one.

CabinetA sixth gate, because a comment in a config file predicted this failure and a comment cannot fail a build

The five existing gates were all green while the stamp rendered as three unstyled spans. Correctly green: check-markup reads tags, check-sitemap reads the manifest, check-contrast composites colours, check-metadata regenerates the derived layer, and check-addresses — the one that already probes the edge — asks about redirects. A cache policy is invisible to every one of them. So is a blend mode, which is the other thing that went wrong today; that one has no mechanical answer and is written down instead.

tools/check-cache.mjs asks one question: can a reader be served new markup with an old asset? Four checks offline — an asset outliving the pages that fetch it, an asset nobody has ruled on, must-revalidate paired with a stale- directive that RFC 9111 makes it cancel, and a rule left behind by a rename — and with --live it asks the site, which is the only thing that actually knows.

It does not flatten everything to zero, and a version that did would have been switched off within a week. The rule is the one this register already stated: staleness is safe only where the stale copy cannot disagree with the fresh HTML. A stylesheet knows the class names and can disagree. A derived index can disagree with the page it cites. A font cannot — it has no knowledge of structure, and a year of caching on the faces is correct. So the plates keep their thirty days and the faces their year.

Which assets are coupled is declared and never inferred, for the reason an entry’s data-sheet is declared: the inference is available, plausible and wrong. Nothing in a file’s bytes or its extension says whether its content knows about markup — queering.js and fonts/newsreader-latin.woff2 are both static files fetched by every page, and only one of them can contradict a class that shipped this morning. Two lists, each entry carrying its reason, and the gate fails on an asset in neither.

It reads our own scripts, because an HTML scan would have missed the file that prompted it. search-index.json is reached by a fetch inside queering-search.js and appears in no attribute on any page. Proved rather than assumed: with the index put back to ten minutes the gate names it, and that finding is reachable only through the script.

All five detectors were made to fail before the gate was believed, and the first attempt at proving the main one was a false pass — the edit meant to loosen the stylesheet had loosened the catch-all rule with it, so the pages moved too and there was genuinely no skew. The test was wrong, not the gate, and a gate whose green run has never been earned is worth nothing. Two findings were then regrouped: one wrong line covering sixty-five plates reported sixty-five times, and one wrong stylesheet policy reported once per page. A defect described fourteen times hides the next one.

CabinetThe finding aid does not index the stamp, which is the masthead decision arriving one component further down

Indexed, eight stamps put eight near-identical records carrying the site’s own name into the aid — Queering Earth Sheet No. 4 Accessioned 8 Sep 2026 — which is most of what a search for Queering Earth would then return. That is precisely why .qe-masthead is already skipped, and the reasoning transfers without amendment.

Nothing becomes unfindable. The provenance line beside each stamp says Mounted 8 September 2026 in ordinary prose and is indexed; every sheet number is written out across this register’s own entries. A stamp is the sheet restating its accession in the object’s own form, not a new fact to find. It stays in the Markdown sibling, where there is no ranking for it to crowd — an agent reading /on-being-ill.md gets the transcription the way a herbarium record would carry it.

2026 · 9 September

A conventional search snippet is this site’s characteristic failure, industrialised. Twenty words either side of the match, an ellipsis at each end, no maker and no citation — pointed at a page of prose that is a perfectly good convention, and pointed at eighty-two mounted quotations it manufactures exactly the artefact ATTRIBUTIONS.md exists to prevent, once per result. The whole feature is built around refusing to do that, and everything below follows from it.

MountedA finding aid that will show you a whole quotation or none of it

Quoted text is indexed apart from ours, and the two are treated differently on purpose. A blockquote becomes one record carrying its cite and its caption, and a result that matches inside one renders the quotation entire with its maker attached — never a window onto it. Our own commentary is cropped, because it is ours and the rest of it is one click away. Where one of our sentences has a short quotation set inside it, the crop widens rather than cut in: the generator records the character range of all 190 of them, and the window grows until nothing is half-covered.

Those ranges are proved rather than trusted, and the first version of them was wrong. Offsets were recorded while the prose was being built and the prose was tidied afterwards, so every fence sat between four and fifteen characters downstream of the quotation it was supposed to protect — a guard reporting success while pointing at the wrong words, which is worse than no guard. The prose is now canonical as it is written and nothing may rewrite it later, and the generator slices the finished text at each recorded offset and throws unless it gets back exactly the characters it wrote. That check was made to fail before it was believed: offsets nudged by three characters, changelog.html reported by name, exit code 1.

The register is filed second, and the register is why. At 25,359 words it is more than a quarter of the site, so ranked flat it would bury the sheets on any search naming a writer. Its entries come under their own heading below the sheets, wearing the kind chip they already wear. The same page’s own finding — that an accession headline is a sentence by design and averages 148 characters — is why the new sheet points at the register rather than reprinting its eighteen headlines.

An attribution we have retracted is not searchable. Plain text has no vocabulary for this is the reading we got wrong, so an indexed del would surface a corrected attribution as though it were the live one — the same flattening that keeps del and ins as HTML in the Markdown siblings. Checked rather than assumed: the site’s one struck attribution is PROSPERO, and the Miranda sheet says Prospero thirteen times in prose besides, so nothing became unfindable. The correction itself is findable here, in ordinary words, which is where it should be read.

The sheet carries the whole cabinet as ordinary HTML, page by page and section by section, generated into it between two markers the way the typefaces are written into the stylesheet. That is what a reader without JavaScript gets, and what the mirror indexes: the finding aid is the site’s one client-rendered page, and a landmark holding an empty results div would have said nothing to either. Nobody types that list, so no heading in it can drift from the heading it names.

CabinetThe finding aid was nine thousand words down, and the control that fixes that is a drawing of a pocket lens

Search shipped reachable only from the footer, which on Sheet No. 6 is nine thousand words below the fold — and most arrivals here are not by way of the plate. A shared link or a search result drops a reader straight onto a sheet. So it sits in the control cluster at the top of all fourteen pages now, which is also where it belongs by argument rather than by convenience: Search, Cabinet and Plain view are three ways of looking, and that cluster is the instrument tray. It is outside the landmark, so nothing about it reaches the Markdown, the search index or the mirror — verified by regenerating and getting zero changed files.

The first proposal was to hide it in the header illustration, as a magnifier resting on a flower, and it was measured rather than argued about. An a inside SVG is a real link and is keyboard-focusable — that part works. On a 375px phone the masthead art renders at 335px for a 470-unit viewBox, so one viewBox unit is 0.713 css pixels: a flower is drawn at 29 units and lands at 21px, and a link wrapped round one measured 12×12. Reaching 44px would need a 62-unit invisible disc — larger than the biggest element in the whole drawing and 37% of its height, swallowing the blooms either side. Two further faults would have followed: the stems are fill: none and so are not hit-tested at all, and a keyboard user would land on an unlabelled shape in the middle of a picture, which is the same objection this cabinet already makes to hover-gated section marks.

The loupe survived the argument, at a size where it can be seen. A botanist’s folding pocket lens, drawn at 22px beside the word. Sixteen candidates were rendered between 16 and 90px and looked at, which is the lesson favicon.svg already paid for twice, and the drawing was wrong twice before it was right — both times in a way only looking could catch.

Below about 20px two overlapping outlines go muddy, so each part is filled with the paper and occludes what is behind it rather than crossing it. That fixed the mud and left a worse fault, which Ryan spotted and the person drawing it had not: the two parts don’t look hinged together. They were a teardrop case with a plain ring beside it and nothing reaching up to the rivet — two shapes that happened to touch. Both parts are teardrops with their apex at the pin now, rotated apart about that single point, which is what the object actually does. The last correction was that two equal lobes read as a wishbone rather than an instrument: the case is the fatter of the two and the lens ring smaller, as they are in the hand. The word carries the meaning regardless, so the drawing only has to be handsome and unmistakably a thing a botanist would have in a pocket.

And the ground control was 53×25. Found while measuring the other thing. WCAG 2.5.5 asks 44×44 and 2.5.8 asks 24×24, both of the interactive area rather than the visible mark — so it was one pixel over the floor and far under the number this site holds itself to on contrast everywhere else. Enlarging the ink would have made the quieter control loud, which its own note in the stylesheet asks not to happen, so the hit area is grown behind all three instead. Measured after: Search 72×44, Cabinet 53×44, Plain view 102×44, no two overlapping, each receiving its own tap, and the skip link still winning on top where it crosses them.

CabinetThe gold stayed on the mend, and the mark that says found went onto a rule

The first draft highlighted a match the way everything highlights a match: a wash of marigold behind the word. It failed twice, and each failure is one of this cabinet’s own rules arriving in a new component.

It failed the drawer, by measurement. Marigold at 0.30 over --qe-paper composites to 11.2:1 against the ink and passes comfortably. The same wash over --qe-cab-paper composites to 6.94:1, and every alpha above it is worse — because lightening a dark ground moves it towards light ink. That is the gating-surface inversion the stylesheet already warns about for cards, met again from the other side. No alpha of marigold clears 7:1 in the cabinet.

And it failed the seam rule, which is the one that mattered. --qe-marigold is spent on mends: a re-determination, a restored attribution, the provenance line of a corrected sheet. A search hit is not a repair, and a gold mark on a page nobody corrected is decoration asserting a fact — the failure that makes the real mends unfindable. So the mark is a rule under the word and nothing behind it, in verdigris, which nothing else here has claimed. The colour goes on the rule and never on the glyph, and the ink keeps 14.3:1 and 12.8:1 untouched in both grounds with no compositing left to measure.

The new capability is not in queering.js. That file may derive navigation from the DOM and may never create words, and a result is a sentence from another page put onto this one, however carefully. Widening the boundary to fit would have cost the boundary — so the search code lives in its own file loaded by the one page that needs it, and a reader of a sheet downloads neither it nor the 357 KB index. It still writes no label of its own: every word a searcher sees is authored in search.html and cloned, the way the index by sheet clones an entry’s existing chip.

Two entity tables became one, and one page order became one. The new generator needed the same tokenizer, the same comment stripping and the same case-sensitive entity table the Markdown generator has — and that table is the reason: it knows &THORN; from &thorn; because the sheets quote Old English, and a second copy would be a lookup one tool learns and the other does not. Both now read from tools/html.mjs, and the editorial page order that /llms.txt and the new manifest both need lives once in tools/pages.mjs. The refactor was proved by the freshness gate: it regenerates and compares, so a green run is a byte-identical run.

2026 · 9 September

The site was measured against somebody else’s specification, and the first thing it found was a defect this cabinet had already named, already fixed one layer up, and never thought to look for underneath Link to this section

Audited against The Website Specification — the whole required tier, thirty-six items across ten categories, plus all twenty-one agent-readiness items at every status. Eight required findings, twenty-two verified passes, five items that genuinely do not apply here, and one that needs field data this site may not have yet two days after going live. The full working is in AUDIT.md in the repository, and it is a findings document rather than a fix list.

The largest finding was ours twice over, and it is closed below. Every sheet answers 200 at two addresses — /on-being-ill and /on-being-ill.html, byte-identical, same ETag. That is exactly the shape _redirects describes in its own comments, found on Star Stuff on 15 August and fixed here for the hostnames on 7 September: byte-identical documents at four URLs, which is a duplicate-content problem and an ambiguity about which address is the real one. We wrote that down, fixed the hostname layer, and did not check the path layer. The house rule says addresses are extensionless, check-sitemap.mjs confirms no .html reaches the manifest, and every rel="canonical" points the right way — and the .html twin serves anyway, because no file-level guard can see what the edge actually answers. A guard that probes the served site was the thing this audit said we were missing, and there is one now.

MountedA privacy policy, and the one third-party request it would have had to confess

The audit was wrong about this site, and writing the policy is what found it out. The finding recorded no analytics, no tag manager, no third-party script of any kind — accurate about scripts, and misleading as a claim about privacy. Every page loaded Fraunces and Newsreader from Google’s font CDN, which told Google each reader’s IP address and user agent before a word was read. It was the only third-party request the site made, and it is the pattern a Munich court ruled against in 2022. Nobody had put it in a privacy policy because there was no privacy policy to put it in.

So the flow is gone rather than disclosed. Both faces are served from this domain now, generated by tools/make-fonts.mjs, keeping all three of the subsets Google served and Google’s own unicode-range values so that glyph coverage did not change by a single codepoint. That was checked rather than assumed: text metrics measured on the self-hosted build against the still-Google-served live site came back identical to three decimal places — 734.047, 752.711, 1855.906 — so the substitution is exact and the WONK axis that is this site’s whole typographic argument survives it.

The old argument for hot-linking a font CDN died in 2020, when browsers partitioned the HTTP cache per site to stop exactly this kind of cross-site tracking. A reader never arrived with Google’s copy already cached; every site paid for its own either way. The CDN was buying nothing but the data flow.

The policy is short because there is little to describe, and it names the two things that do happen: the two view preferences your own browser keeps and never sends anywhere, and the access log Netlify writes, which we do not use for anything and whose retention we do not control — said plainly rather than dressed up with a number we cannot enforce. No cookies, so no consent banner; there is nothing to consent to and a banner would be theatre. And a note on the outbound links, since nearly every sheet is made of citations: the one thing we do about them is Referrer-Policy: strict-origin-when-cross-origin, so a site you click through to learns that you came from here and not which sheet you had open.

The claim is enforced, not remembered. A privacy policy is a binding statement of practice, and this site makes no third-party requests is a claim about code that would eventually go stale in somebody’s memory. check-metadata.mjs now fails on any attribute that makes a browser fetch from another origin — and exempts a href, because a link a reader chooses to follow is not a request the page made. On a site built out of citations that distinction is the difference between a gate that works and one that would have to be switched off.

One item on the spec’s required list is deliberately absent: a postal address. The policy names the two organisations and points at their own sites and this repository’s issues, which is where corrections already go and where they are answered in public. That gap is written down in AUDIT.md as outstanding rather than presented as complete. And the page says on its face that it was not written by a lawyer: it describes what the code does, and it was checked against the code rather than adapted from a template — which is the same standard the sheets are held to.

CabinetThe plates are AVIF now, and the manuscript that cost 312 KB costs 34

Thirteen scans went out as JPEG only, with no picture element and no modern format — 2.4 MB of lithographs, every one of them larger than it needed to be. They now ship AVIF and WebP through a fallback chain, and the numbers are not marginal: Dickinson’s manuscript leaf drops from 312 KB to 34 at twice the display size and 12 at once, the Hughes from 330 to 100, the Waterhouse from 341 to 150. A reader on a retina screen now fetches AVIF and never touches a JPEG at all.

The widths are measured rather than guessed, and that is what keeps the ladder short. A plate is displayed at a fixed css width — .qe-plate is 23rem and never reflows wider, .qe-plate-wide is the measure at 34rem — so each scan needs exactly that width and its 2x, and sizes needs no guesswork about viewports. Nothing is ever upscaled past the scan: inventing pixels an 1863 lithograph never had would make the plate look worse and the file bigger, which is both halves of wrong.

Quality was looked at, not inferred from a number. The hard cases here are not the paintings — they are Dickinson’s pen and the engraved caption on Cooke’s fungi plate, because fine line work is what a lossy encoder loses first. Both were cropped at 1:1 against the resized source and compared side by side: indistinguishable, with the blue rules of her writing paper and the words AGARICUS (LEPIOTA.) SISTRATUS. Fries. intact. The measurements agreed — 36.9 to 40.7 — but the crops are the reason we believe it.

The near miss is the part worth keeping. tools/serve.mjs had no .avif entry, so the local server was sending the plates as application/octet-stream and the browser was quietly sniffing them — which works locally, because there is no nosniff there. Production sends nosniff on everything, and a picture element does not fall through to its next source when one fails to decode: the choice is made on the declared type, before the fetch. A wrong content type would have broken every plate on the site with no fallback to catch it. So the variants shipped one commit ahead of the markup, purely to confirm that Netlify types them image/avif before anything depended on it. It does.

tools/make-plates.py is a second Python tool, and CLAUDE.md stopped counting. Its rule was the one Python tool here, and the reason behind that sentence was never the number — it was that something has to rasterise and nothing may need npm install. It is a boundary now: Python touches pixels, Node does everything else. make-images.py draws from the palette; this one re-encodes somebody else’s scan, and folding them together would have muddled both. That is the same correction the queering.js rule already took, for the same reason.

Five new detectors in check-metadata.mjs, all made to fail before being trusted, and one of them is the quiet kind: a scan whose bytes no longer match the hash it was encoded from. Replace a plate with a better scan and forget to re-run the tool, and nearly every reader gets AVIF of the old scan while the JPEG nobody fetches shows the new one — two versions of a specimen on one sheet, and nothing looking broken. Mount it, card it, log it, file it, route it, and encode it.

CabinetThirty days for the plates, five minutes for the stylesheet, and a promise we declined to make

Every response carried the same header, so 2.4 MB of scanned lithographs was revalidated on every visit — thirteen plates that have not changed since somebody photographed them and never will. They now cache for thirty days. The half of this that was already right is worth naming: the spec’s recommendation for HTML is public, max-age=0, must-revalidate, which is exactly what Netlify was sending. It is written into _headers now so it is a decision we own rather than a default we inherited.

The plates get thirty days and not a year, because immutable is a promise this site cannot keep. That directive tells a browser the body can never change, and the spec reserves it for URLs carrying a content hash. Ours carry descriptive names: annales-lugduno-batavi-1863-tab4-gonystylus-miquelianus.jpg names one plate in one volume, and tab 4 of the 1863 Annales is not going to be re-cut. But almost certainly never is not what the word means, and a better scan could overwrite that filename tomorrow. Asserting a fact we cannot enforce is the same failure as a gold seam on a sheet nobody corrected. Thirty days is a claim we can keep.

queering.css and queering.js get five minutes, and the number is chosen for the shape of a visit rather than the size of the file. A reader moving through several sheets in one sitting revalidates once instead of once per sheet; a bad stylesheet reaches everyone within five minutes instead of sitting in caches with no way to bust it. That bound is the point. This site’s characteristic failure is a palette or print change that breaks pages silently — Star Stuff shipped forty-four of forty-six pages that printed blank — so an unbustable stylesheet is a worse exposure here than a slow one.

stale-while-revalidate is on the plates and deliberately not on those two. The HTML is always fresh, so a stylesheet one visit behind it would render a change that adds a class and its rule together as an unstyled page for that visit. Staleness is only safe where the stale copy cannot disagree with the fresh HTML. And stale-if-error now covers everything that is not must-revalidate, so a Netlify incident leaves the plates showing rather than broken — the two directives are never paired, because RFC 9111 cancels them and the spec calls that out by name.

Not fingerprinting the two shared assets is a decision and not an omission, and it is written up in DECISIONS.md. The clean answer the spec offers — a year and immutable — is available only to a content-hashed URL, which would mean a generator that renames both files and rewrites the reference in twelve pages. Every palette fix would then churn twelve HTML files and make its own diff unreadable, and this register depends on those diffs being legible. The prize is thirty-one kilobytes over the wire. It can be reconsidered later without undoing any of this.

CabinetThe site now says out loud, to machines, the permission it had only ever said to people — and puts the citation trail within reach of anything that takes it up

robots.txt has always opened with one sentence: Everything here is meant to be read, quoted, and reused (CC BY-SA 4.0). It was a sentence addressed to humans, in a file read by machines. Every training and retrieval crawler is now named and allowed explicitly, with Content-Signal: search=yes, ai-input=yes, ai-train=yes, and every response carries tdm-reservation: 0. Nothing about the policy changed; it stopped being an inference. A reservation of 1 beside a CC BY-SA licence would have been a contradiction somebody eventually has to resolve, and probably not in our favour.

The answer is yes, and the ask is attribution — so the same pass built the trail. Granting permission to mine a site whose one correctness requirement is credit, without making the credit reachable, would be the generous half of a decision and not the whole of it. So: a Markdown source beside every page, an index at /llms.txt, the whole site at /llms-full.txt, a feed of this register, JSON-LD on every page, and an Agent Skill at /.well-known/agent-skills/ whose main subject is how to cite this place and how to tell a checkable fact from a reading.

Nothing in the Markdown is typed. tools/make-markdown.mjs derives each .md from that page’s own main landmark — the same landmark the mirror reads, so the copy an agent fetches cannot disagree with the page — and derives the feed from this register’s own accessions. The rule it is built around is the bluntest one in CLAUDE.md: two copies of the same words drift, and the accessible one is always the copy that rots. The converter throws on a tag it has not been taught rather than dropping it, because a converter that quietly discards an element is that same drift arriving by another door.

One thing it refuses to flatten. <del> and <ins> stay as HTML in the Markdown instead of becoming ~~strikethrough~~ and nothing, because the one pair on this site is PROSPERO struck through and Miranda, First Folio, 1623 written in — a restored attribution, the kintsugi seam. Markdown has no counterpart for <ins>, so the pair would have read as old new with nothing saying which was which. Losing the difference between what we got wrong and what is true is not a formatting compromise here.

The JSON-LD is authored and not generated, and this is the reason. Every sheet’s label already distinguishes the Maker — who made the thing being read — from Read by, who wrote our reading of it. In the structured data that is about.author against author, and the two are now stated separately on every sheet: The Army of the Upright is by Helen Edgar and Ryan Boren, about a work by Virginia Woolf. Collapsing them would tell every agent on the web that we wrote Woolf. check-metadata.mjs refuses the conflation outright, which makes it the first gate here that checks an attribution rather than a fact about a file. Where a page states no reader, no author is asserted at all.

Two traps paid for, and they were the same trap twice in one afternoon. A comment that names a tag in angle brackets is indistinguishable from that tag to a regex. The note in flower-codes.html explaining that positioning goes on the outer g and the animation on the inner one made the converter refuse the page; then a comment added to every head, explaining the new discovery links, said main in brackets and made a main-landmark extractor match inside the comment and take the head as the page body. The mirror reads that landmark too. Fixed on both sides — comments stripped before parsing, and the brackets taken out of the comments — and written into CLAUDE.md so it is not paid for a third time.

CabinetA mistyped address no longer ejects the reader from the herbarium, and fixing it introduced a soft 404 the new gate caught

The status code was always right. This was never a soft 404 — a wrong address answered 404 from the day the domain was attached, which is the half of the spec’s error-page requirement that actually matters to a machine. The half it failed was the half a person sees: the body was Netlify’s default, a teal system-font page with no plate, no nav, no ground toggle, and nothing to say the reader had ever been here. 404.html now carries the masthead, both view controls, the before-first-paint snippet, the footer, and all eight cards, so a character out of place lands somewhere you can carry on from.

The drawing is an empty mount: a stem mounted diagonally across the sheet, six leaves thinning as they climb, and nothing at the tip. The herbarium version of a 404 is the sheet whose specimen is not on it. The first attempt was a tall narrow sprig that filled a sixth of its viewBox, which at width: 100% scaled into one enormous vertical stroke — a reminder that these drawings are sized by their box and not by their content. --len is the measured path length, 496, read off getTotalLength() rather than guessed.

Fixing the page introduced the exact fault the spec item leads with. 404.html is a real file, so /404 and /404.html both answered 200 with the error page — a soft 404, at two addresses, created by closing a finding about error pages. check-addresses.mjs --live reported both within a minute of the deploy, which is the first time a gate here has caught a regression the same pass that shipped it. Two rewrites in _redirects serve the page with a 404 status instead; the self-reference does not loop, and that was verified rather than assumed.

Two gates objected to the page for reasons that are wrong for an error page, and both now carry a named exception rather than a silent skip. check-sitemap has NOT_CONTENT, because an error page has no address to list and a listed URL that errors is a coverage fault. check-addresses has NOT_ADDRESSED, and is stricter about the page than the rule it excuses it from: it asserts the file exists at all, that a nonexistent address serves our page and not Netlify’s, and that neither /404 nor /404.html answers anything but 404. Both are allow-lists, so a third entry is a decision somebody makes and reviews.

Three omissions, each argued beside itself in the file rather than here. No rel="canonical", because the page is served at every unmatched address and a canonical would tell a crawler that every wrong URL on the site is one real page. noindex, because the page is thin by design and the spec asks for an explicit policy rather than an implicit one. No social card, because a new sheet needs one and this is furniture that should never be shared on purpose — a broken link that unfurls as a bare link is telling the truth. No provenance line and no contents list either, which is how / and /design already behave: furniture is not a sheet.

CabinetOne address per sheet at last, and a fourth gate that asks the site instead of the files

Netlify shadows a redirect with a real file, and on-being-ill.html is a real file. That is the whole mechanism, and it is why writing the rule down four times over did not enforce it: the house style says addresses are extensionless, check-sitemap.mjs reported locs still carrying .html — none, every rel="canonical" pointed the right way, and check-markup.mjs had nothing to say. All four were correct. None of them can see what the edge answers. _redirects now carries a forced 301! for each of the ten sheets and for /index.html, enumerated rather than globbed so that a sheet without a rule is reportable by name.

The site was already redirecting the misspelled extension and serving the correct one. Netlify got every near miss on its own — /on-being-ill/ with the trailing slash and /on-being-ill.HTML in the wrong case both 301 here properly, because neither has a file to hide behind. Only the exact-case extension did. That is how this sat unnoticed from the day the domain was attached: the defect was invisible precisely where the file system agreed with the request.

tools/check-addresses.mjs is the fourth gate and the only one that knows what the edge answers. Offline by default, like the other three: it reads _redirects against the pages on disk and reports a missing rule, an unforced one, a wrong target, a stale one, an internal address carrying .html, and a root-relative asset. With --live it goes and asks the site, because a redirect loop is how this file fails and a loop cannot be seen offline. All six detectors were made to fail before the gate was believed — an unforced rule reported as needs 301! — on-being-ill.html is a real file and shadows an unforced rule, which is the failure that would otherwise look green.

Two smaller inconsistencies went with it, both found by Ryan browsing the files locally rather than by any check. The two favicons and the touch icon were root-relative while queering.css and queering.js were not — one rule applied two ways, and now guarded. And the index at the foot of this page pointed at /index, which took a needless hop and was a third address for the plate. The local-browsing question has no fix and that is the trade: nothing on disk is named on-being-ill, so relative links would not help either. Extensionless addresses need a server, which is what tools/serve.mjs is for, and CLAUDE.md now says so instead of leaving it to be rediscovered.

CabinetTwo response headers the site had simply never sent, and a policy that carries exactly one directive on purpose

Nothing here said who was allowed to frame a sheet. No content policy, no X-Frame-Options, not from this repository and not from Netlify’s defaults. The usual argument for that header is session theft, and it does not apply to this site: there is no login, no form, and no authenticated action to hijack. The reason it matters here is attribution. Anybody could load a sheet inside their own chrome and present it as theirs — on a site whose one stated correctness requirement is that credit reaches the person it belongs to. frame-ancestors 'none' and DENY now, together, because the older header is what very old browsers still read.

The transport header was Netlify’s default and a year short: max-age=31536000 with no includeSubDomains. It is two years and the subdomain flag now. The spec asks for the subdomain audit before that flag ships, because one HTTP-only subdomain breaks the moment it does — www answers 301 over HTTPS and there is nothing else under the name, so the audit came out clean. No preload, and that is the current advice rather than an omission: the preload list’s own operator now discourages it, browsers auto-upgrade plain HTTP regardless, and getting a domain off the list takes months.

The content policy carries frame-ancestors and nothing else, and that is the trap worth writing down. Every page has an inline <script> in its head — the snippet that applies both stored view preferences before first paint — and inline style throughout. A default-src or script-src added here without 'unsafe-inline' would kill that snippet, and the page would flash the decorated sheet at the reader who turned decoration off, or the daylight sheet at the reader who asked for the cabinet. A hardening pass that looks like an improvement and breaks an accessibility feature is the failure this note exists to prevent. The reasoning is in _headers beside the rule, not only here.

2026 · 9 September

Fifteen panels wore the specimen’s clothes, twenty-five margin values passed for a hand-kept register, and the site’s gold was being spent on the least interesting thing that happens to a sheet Link to this section

Prompted by Ryan reading on wabi-sabi in web design, and by a scoring of this site against the seven aesthetic principles that article names. Six of the seven were already here — two of them, fukinsei and datsuzoku, more thoroughly than the article states them. Seijaku, the quiet, was measurably the weakest. And the list circulating as the seven principles of wabi-sabi turns out to be Hisamatsu Shin’ichi’s seven characteristics of Zen art, relabelled somewhere in transmission — with the third of them, the one about age, glossed in the design advice with no age left in it. That is why patina recurs in that literature without ever becoming a principle, and this accession is mostly about that hole. The colophon now carries the scoring, and says what we can and cannot vouch for in the thing we are borrowing.

MountedEvery sheet now says when it was mounted and how often it has been corrected since

The patina was already here and only we could see it. This register has recorded a re-determination or a corrected label for every one of the seven sheets, and not one sheet said so on its own face. A herbarium sheet carries its annotation slips on the sheet — that is what makes an old sheet look old, and it is information rather than ornament.

So the foot of each sheet carries .qe-provenance: the mounting date, the count of label corrections and re-determinations since, and a link from each clause to the entry here that did it. It is inside <main>, unlike the sibling nav, because a sheet’s own accession history is content about that sheet and the mirror should have it.

Age you can read beats age you can only see. It is true, it is checkable, it survives plain view and paper and a screen reader and 400% zoom because it is a sentence, and it accrues on its own as this page grows. Every alternative considered — a noise tile, a grain filter, a torn edge — was a picture of age drawn over the words.

All seven sheets came out mended, so the seam is on all seven and today it distinguishes nothing. That is a fact about this site rather than a fault in the device, and inventing an unmended sheet to make the gold mean something would be the exact failure the rule below forbids. Sheet No. 8 will arrive clean.

Re-determinedThe gold moved off mounting and onto the mend, and the drawing at the top of this page moved with it

Kintsugi is not that the crack shows. It is that the most precious material in the workshop is spent on the break. Read that way, this register had its taxonomy backwards: --qe-marigold, the site’s gold, marked Mounted — the routine intake — and the corrections got cooler colours.

Two tokens swapped. Mounted takes --qe-lichen, because mounting a sheet is the ordinary event. Re-determined takes --qe-marigold, because a re-determination is the largest correction a register records: the specimen turned out to be a different thing. Label corrected keeps --qe-coral, the smaller mend. On a site that publishes a ledger of its own mistakes, spending the gold on we got this wrong and fixed it is an argument rather than a decoration.

The vine at the top of this page is the legend — four blooms in the four kinds’ colours, in the order the legend gives them — so its second and third flowers changed too. A legend that no longer matches the thing it explains is worse than no legend.

The unclassed default for an entry and a chip is now --qe-rule and not an accent, so a mistyped class reads as plain instead of quietly passing for one of the four. --qe-verdigris leaves the register and keeps its other jobs: the green carnation, and the second butterfly.

CabinetThree surfaces, because fifteen components were sharing one and a reader could only rank them by reading the label

background: var(--qe-card) appeared fifteen times in the stylesheet, thirteen of them with the same 1px rule and the same 2px radius. So the specimen, the mounting label, our own closing commentary and a housekeeping note were the same object to the eye. That is a defect in visual hierarchy and not a matter of taste: a reader cannot tell somebody else’s words from ours by looking, only by reading the label.

Three surfaces now, and a new panel takes the one that says what it is. Bare — space only — for our own commentary, which is the default. Ruled — --qe-card in a hairline box — for an object mounted here. Ruled off — hairlines above and below, no fill — for the ledger’s own housekeeping. .qe-restaged went bare, .qe-untidy and .qe-register-note went ruled off, and ruled now means something.

The third tier is rules and not a tint, and that is a measurement. A recessed --qe-paper-deep panel was tried first. In daylight it drops --qe-moss to 6.90:1 and --qe-rust to 6.21:1 — both under the house 7:1 and both over WCAG AA, so check-contrast.mjs, which gates at AA, would have passed it silently. That is the gap this file has had logged as open since yesterday, arriving as a real near-miss rather than a hypothetical.

CabinetSpace is a scale now, because twenty-five unrelated margin values do not read as a hand-kept register — they read as noise

The sheet used twenty-five distinct margin values: 2, 2.5, 1.5, 0.7, 2.75, 3, 1.75, 2.25, 2.4, 2.2rem and more. Asymmetry only reads as asymmetry against a norm. This site’s whole typographic argument is deviation — the wonk axis, the leaning slips, the four corner sprigs each drawn for its own corner — and twenty-five arbitrary gaps flatten the deviations that were actually authored.

One line of body text is 1.19rem × 1.65 = 1.96rem, and --qe-space-* is quarter-lines of it. The page was already nearly on that scale by ear: the three commonest values were 2rem, 2.5rem and 1.5rem, and quantizing moved most gaps by one to three pixels. The scale governs the space between blocks; inside a block the hand is still allowed. Paragraph spacing went from 1.35rem to 1.47rem, which is the one deliberate loosening.

Three corner profiles as well, spread so that no two panels a reader sees together are cornered alike: a sheet handled a hundred times does not have four identical corners, and thirteen components carried the same radius on all four of theirs. It is a radius, so it costs nothing in contrast and nothing on paper. That is koko for the price of a token.

CabinetThe foxing was pinned to the window while the paper moved under it, and all nine sheets were stained identically

The paper wash was position: fixed, so the stains held still as the sheet scrolled past them, which is the one thing a stain does not do. It is absolute now, against a position: relative body, so the foxing belongs to the sheet and travels with it.

The four stain positions were also hardcoded, so every sheet on the site was foxed in exactly the same four places. Nature does not repeat its foxing. They are --qe-fox-* tokens now, stated per page in the markup — the same idiom as --rot on a slip, because a stain is a fact about one piece of paper and not about the site. The front page keeps the original four as the fallback.

Still not texture, and that is now a written rule. The research this came from recommends a noise tile and a blur(0.5px) contrast(1.1) filter. Both are refused. A noise tile varies effective background luminance per pixel, and check-contrast.mjs composites against computed colour pairs — it cannot see a texture at all, so a grain under body text would pass every guard here and fail real readers. Foxing goes on the ground, the tape, the sprigs and the rules, and never under a letter.

MountedLong sheets carry a contents list, every section has an address you can share, and the register has the addresses but not the list

On this sheet — the within-page twin of Elsewhere on the plate — now sits after the lede on the five longest sheets and on the colophon. Every <h2> on those pages, and every accession on this one, carries a small § beside it that is a link to itself, so a reader can send somebody straight to a word missing from the copy you will find or to the wabi-sabi section.

The list is derived and the addresses are authored, and the split is the whole design. A hand-kept contents list is a second copy of every heading, and the oldest rule here is that two copies drift and the accessible one rots — so the list is built from the page’s own headings and never typed. But an id derived the same way would die the moment anybody reworded a heading, taking every link a reader had shared with it. So the ids are short, topical, and written in the markup — #eden, #the-colon, #quetelet — the way a slip’s angle is written there. The permanent thing is authored, the label is computed, and nothing is written twice.

In the body, not a rail: the empty margins either side of the measure are the negative space the entry above spent its whole argument clearing. Not sticky, which also keeps it out of the way at 400% zoom. Not an accordion, and no highlight that follows the scroll — no new motion, the same rule this register already holds. :target marks where a reader landed instead, drawn in the gutter so arriving at a heading does not shift the words sideways.

The section mark is always visible rather than revealed on hover, because a hover affordance is one handed to mouse users and to nobody else.

CabinetEvery section on the site has an address now, and the home page still has no contents list, because its contents list is the plate

Asked directly: should the front page have a contents list? No, and the reason is that it already has one. The plate of eight numbered cards is this site’s table of contents, so a list of the page’s own prose sections stacked above it would be two navigational lists competing on one page — and the one a reader arriving at the front door wants is the plate. It is also the shortest page here, at 1,362 words.

But the two things shipped together and they are separate decisions. Addresses are cheap: an id and a small section mark, no threshold, no furniture. A contents list is furniture and has to earn its place. Conflating them left four pages — the plate, and Sheets No. 1, 2 and 7 — with no way to link to any section on them.

The evidence was sitting on this page. Three entries above italicise the names of front-page sections and could not link to one of them — What grows here, The type plays, and the words do not move, Queering is a verb — while linking happily to a section of the colophon two entries away. The attribution ledger named three more. All six are links now.

Twenty-five addresses added across the four pages. Nothing gained a contents list, and /#what-grows-here is now a direct address for the plate of sheets, which is a useful thing to be able to hand somebody.

MountedThe Preferred Flower of Life — Sheet No. 8, and the first that is a wall rather than a reading

Monotropa uniflora, the ghost pipe: a plant carrying no chlorophyll that feeds entirely through fungal networks, named by Linnaeus in 1753 for the single turn of its stem, pressed into Emily Dickinson’s herbarium, and called by her the preferred flower of life. Two hundred and thirty-eight years after the naming, Dinah Murray and Jeanette Buirski reached for the same Greek root to describe a mind whose attention runs in one deep channel. Following Helen Edgar’s essay, written for the fifth anniversary of Murray’s death.

A wall is a third kind of sheet, and the difference is not decoration. A reading has an order and arrives somewhere; a wall has a chorus, and its argument is made by accumulation. Seven people across 273 years stood in front of one specimen and each saw something the others could not. A herbarium sheet that has been in a cabinet long enough looks exactly like that: a specimen, and a stack of determination slips in different hands, every one signed.

Which is also the one thing that did not transfer from the zine walls this was modelled on. Those work by unattributed declaration — a wall of statements, deliberately unsourced, which is right for a manifesto and impossible here, where the citation is the product. So the wall is either our own words or labelled slips, and never a blur of the two.

The drawing is the first on this site with no leaf in it, and the absence is the argument: every other panel here is green because every other specimen photosynthesises. Two drafts were discarded against the drawing rules — one stood the pipes on a single thread, which is the baseline rule 1 forbids, and one drew them upright, which loses the one turn the genus is named for.

The biology is deliberately absent, and that is the shelf division doing real work. Myco-heterotrophy has numbers attached and belongs to Star Stuff, which risks a wrong fact. This sheet has the naming, the letter, the poem, the editor, and the word. The mounting label carries a Biology row saying where it went — the first time the two sites have split one subject on purpose.

Re-determinedWoolf’s resonant and porous is exactly right, and it is Woolf guessing at what Coleridge meant

An open question since 8 September, closed because a sheet finally reused the line. Ryan put A Room of One’s Own in the library and it was read there: chapter VI, pp. 148–149. The wording is Woolf’s, the ellipsis is honest, and nothing had been tightened — the only fault was a primary cited to a secondary, and our sheet cites the book.

One nuance came out of reading it in place. The sentence is He meant, perhaps, that the androgynous mind is resonant and porous…, and two sentences earlier the he is named: Coleridge certainly did not mean, when he said that a great mind is androgynous…. So the line is Woolf speculating about another critic, hedged twice. Quoting it from the androgynous mind onward promotes a guess to a definition. Small, and exactly the shape this site watches for, so the sheet quotes from He meant, perhaps and names Coleridge in the caption.

The Dickinson letter came back with three characters of drift as well — a dash for a full stop, a lowercased Child, an inserted the. Nobody did it on purpose and it is what happens to a quotation copied from a copy. It is recorded because this sheet’s own subject is that Dickinson’s punctuation and capitals were regularised by her first editors, and here is the same drift, on the same writer, in 2026.

CabinetThe card generator reported a hand-kept list of files rather than the files it wrote, and the new card went missing from its own summary

The social card for Sheet No. 8 generated correctly and did not appear in the run’s summary, because that summary iterated a hardcoded tuple of filenames nobody had added a line to. Noticed by eye.

Harmless in that direction and not in the other: the same list would print a complete-looking report while a card had silently failed to generate. The summary now enumerates what was actually written and prints a count, so a new card reports itself.

The card also needed its own drawing. The stock sprig puts leaves in lichen and three coloured heads on a stem, which is right for every other card here and exactly wrong for the one plant defined by having neither. A card showing green leaves on the ghost pipe is the card arguing with the page.

MountedThe register is indexed by sheet at the foot of the page, because a contents list is front matter and an index is back matter

This ledger is written by accession, which is by date, because a sheet, its corrections and the CSS it needed are one dated event. That is the right unit to write in and the wrong one to look something up in — a reader here is usually asking what happened to one sheet, and its entries are scattered across sixteen dates. Index by sheet is the same entries filed the other way.

The distinction the attempt above missed is that a contents list is front matter and an index is back matter. That is the whole reason one measured badly here and the other does not: front matter delays every reader, and back matter delays none. The index sits at the foot of the page, where a bound volume has always kept one, and a single line up by the legend points down at it. The first accession is back to where it was.

Which sheet an entry concerns is stated in the markup, never guessed from its links. Deriving it would have been quick and wrong: the Dickinson accession links three sheets and concerns one, so incidental cross-references would have filed corrections under sheets they have nothing to do with. On a site whose whole risk is a wrong attribution, an index that silently misfiles a correction is the worst thing we could ship. So all seventy-three entries were read one at a time and each declares its own sheet. Two of them genuinely belong to two — the byline rule changed Sheet No. 4 and gave No. 1 a second reader in one stroke — so seventy-three entries file as seventy-five lines.

The groups are ours and only the filing is the machine’s. Every heading, sheet number and the order they appear in are written into this page, because they are editorial words. The script clones each entry’s existing name and its existing kind chip and puts them under the group the entry declares — nothing composed, nothing summarised, nothing truncated, so the index cannot call an entry something the entry does not call itself. The group headings were checked against each sheet’s own title and against the plate’s cards rather than typed from memory.

CabinetA fourth guard, because a mistyped sheet name drops an entry out of the index and leaves the page reading perfectly

The failure this needed protecting from is the silent kind. A typo in an entry’s declared sheet does not throw and does not show: the entry matches no group, vanishes out of the index, and the register above it still reads exactly right. On a page whose subject is corrections, an index that quietly loses one is the fault least likely to be noticed and worst to have.

check-markup.mjs now validates every declared sheet against the pages that actually exist, reports an empty declaration, and reports a group that nothing files into — which catches the same typo from the other end, since a misspelling breaks the match in both directions at once.

Made to fail before it was believed, which is now four for four on this site’s guards: a typo’d entry, an emptied declaration and a stale group were each introduced on purpose and each reported with a line number and a non-zero exit, then reverted and the clean tree re-run.

One layout attempt was thrown away on measurement, too. The index lines were first a wrapping flex row with the kind chip beside the name. A chip plus an entry name is wider than the measure almost every time, so every single line put its chip alone on a row above itself and the index came to 6,726px for no extra information. Ordinary inline flow — the chip opening the line, the name wrapping beneath it — is 5,502px, and is what an index entry has looked like since long before any of this.

CabinetThe register looked like the strongest case for a contents list and measured as the worst one, so it was built, measured, and taken out again

This is the longest page on the site — sixteen thousand words — so it got the contents list first. Then it was measured. An accession headline here is a sentence, which is this register’s own design decision written down where it was made, so the labels average 148 characters against 22 to 34 on a sheet. The block came out 1,293px against 319 to 510 everywhere else, and it pushed the first entry three and a half screens down the page.

Both ways to shrink it were closed. Truncating a label is this site’s characteristic failure applied to itself. Writing a short label beside each headline is the second copy that drifts. So the register keeps its section marks and its sixteen addresses, and has no contents list. Removed after measuring, rather than kept because it had been built.

What this page actually wants is an index by sheet, and that is left open rather than approximated. A reader here is usually asking what happened to one sheet, and the accessions are grouped by date. Gathering a sheet’s entries across accessions is a real editorial decision, not a layout one, and the measurement above is precisely the argument against reaching for the nearest component instead.

MountedThe colophon scores this site against the seven principles, including the two it fails, and names what it cannot vouch for in them

A new section on the colophon: what wabi-sabi is, which of the seven principles this sheet actually manages, and which two it was weak on. Six of the seven were here by accident — a herbarium sheet is already foxed paper, a faded specimen, a hand-lettered label and a mount that has been handled — so the honest framing is that we found the vocabulary after the fact and it told us which one we had been getting wrong.

The two failures are named rather than dressed up. Seijaku, the quiet, was a measurable defect and not a mood: fifteen components sharing one surface and twenty-five unrelated margin values. Koko, the weathered one, we had nothing for at all — every candidate was a picture of age painted over the words.

And a panel of what we cannot vouch for in the borrowed thing itself, because a section that scores a site against seven principles owes the reader the provenance of the seven. They are not wabi-sabi’s. They are Hisamatsu Shin’ichi’s seven characteristics of Zen art, from a 1971 book we have not read, reaching us through a peer-reviewed paper that cites it. The page says all of that on its face.

CabinetThe guard now measures the number this house publishes, and it was raised on the day the gap was nearly spent

The style guide asks for 7:1. For this site’s whole life check-contrast.mjs gated at 4.5:1 — WCAG AA — with an entry in the decision log saying so and a line in the working notes warning, in as many words, not to cite the script as evidence of the house standard. A stated principle nobody measures is a wish.

The wish got called in this morning. The recessed panel described two entries above drops moss to 6.90:1 and rust to 6.21:1 in daylight, and passed the guard clean, because 6.21 clears AA. It was built, measured by hand, and thrown away — but it would have shipped on a day when nobody thought to measure by hand.

So the gate moved, in two tiers reported apart. Under AA reads FAIL and means illegible. Between AA and 7:1 reads UNDER and means readable, and beneath the number this site publishes. Both exit non-zero; one count would have hidden which kind had just landed, and they are different bugs. --aa drops to AA and prints a line saying the house target is not being measured — so that an argument for a particular colour is an argument somebody makes on the record, rather than a two-line edit nobody reviews.

It cost nothing, which is the argument for doing it today. All 9,142 text elements on the ten pages clear 7:1 in both grounds and under print emulation, so the gate could be raised without a single colour changing. Raised later it would have arrived tangled with whatever it first caught.

Made to fail before it was believed, the same way the cabinet pass was: the recessed panel was put back and reported 6.90 and 6.21 as UNDER; a 2.15:1 colour was injected and reported as FAIL on the other tier; --aa passed the same tree and said why. Exit codes checked on all three. Then reverted.

Two blind spots are now written into the tool’s own header rather than left to be rediscovered. A ::marker is not an element with text, so nothing measures it — that is how the bullets in the entry above sat at 2.15:1. And a texture is invisible to it entirely, because it composites computed colour pairs. A pass here is not permission for either.

2026 · 8 September

The sheet has a second ground, and it is the drawer shut rather than the lamp switched off Link to this section

A dark ground was refused once, in the entry for Sheet No. 5, on the grounds that this site has one ground and it is paper. That entry stands as a description of what it refused — a generic inverted palette arriving with a draft — and the decision has been amended rather than reversed. The cabinet is a herbarium object: dark warm brown, the drawer a sheet is filed in, and the dark-ground plate whose specimens are printed on near-black so that pale forms read.

CabinetBrown rather than green, and the reason is measurable rather than a preference

A dark green ground takes the separation out of the colours this site is built from. Moss, lichen, and verdigris share their hue with it, and every accent measures worse against it than against brown for no gain: moss text at 7.1:1 rather than 7.2, rust at 6.2:1 rather than 7.3. Push the green to a real forest tone and nothing but cream clears 7:1 at all. A green ground makes green unusable, which is a plain result and not a matter of taste.

Brown was already the palette’s ground and nobody had noticed. The dark-ground botanical print that prompted this is drawn in cream, sage, marigold, and coral on near-black — which is --qe-ink, --qe-lichen, --qe-marigold, and --qe-coral as they already stood. The five decorative tokens are therefore carried across unchanged and deliberately still saturated. Only ink, moss, and rust are lifted, to 12.8:1, 7.2:1, and 7.3:1. Lifting the decoration to the same target was tried first and turns every flower chalky: 7:1 is a rule for letters, and the brightness belongs to the text.

It earns the mounted plates as well. The scans on these sheets are cream vellum, and cream vellum on dark brown reads as a plate lying lit on a shelf. On green it reads as a plate pasted onto green.

CabinetA card is lighter than the page in daylight and would be darker than it here, which is a trap and not a taste

The contrast target has to be measured against the lightest surface any text sits on, and on a dark ground that is not the page. In daylight --qe-card is lighter than --qe-paper, so text on a card gains contrast and the page is the worst case. Invert the palette and keep the instinct — a card lifted above the ground — and text on a card loses contrast instead. Solving 7:1 against a lifted panel drags rust to #eab1a3, a pale pink with no rust left in it.

So the cabinet’s cards are recessed, the ground is the lightest surface again, rust stays an ember, and the lift is carried by the hairline the cards already had. It reads better than the lifted version anyway: compartments in a drawer rather than paper stacked on wood.

Three things were not token flips and are now tokens, which is the same lesson the print sheet taught in 2026: the foxed-paper wash (--qe-wash-a through -d), the shadow a lifted sheet casts (--qe-shade, a near-black that did nothing on a near-black ground), and the pale flesh of a specimen (--qe-flesh). The last was the visible bug: a mushroom’s stipe was filled with --qe-paper-deep, which it only ever matched by coincidence, so on the dark ground the stems of the four mushrooms on Sheet No. 4 became holes and the caps floated. They are cream now, which is what the dark-ground plate does with them.

CabinetA discreet control, a machine that decides when nobody has, and paper that is daylight whatever either of them says

The ground is a class on <html>, the palette is entirely in queering.css, and the words do not know what they are lying on — the same shape as plain view, and for the same reason. Every hex has one copy: the cabinet values are defined once as --qe-cab-* and the two switch rules carry nothing but aliases of them, so a drifted switch is a missing ground and never a wrong colour.

Three states, one word. With no stored choice the machine decides, from CSS alone and with no script involved, so a reader who has never touched the control still gets the ground their machine asked for. The control then names the ground they can see rather than a preference they have not expressed, and clicking it writes the other one down; the stored choice wins over the machine in both directions. It is the quieter of the two controls on purpose — plain view changes what the page is and keeps the pill, this changes what the page is lying on and gets a word and a hairline. Its label is restored before first paint by the inline snippet in every <head>, which now carries both preferences: deferred to queering.js it would flash the daylight sheet at somebody who asked for the cabinet.

Paper is daylight, always. Both switches are @media screen, so the print sheet cannot inherit a ground and a reader in the cabinet who hits Print gets ink on white.

CabinetThe guard measures both grounds, and it was made to fail before it was believed

tools/check-contrast.mjs measured one palette on screen and one on paper. Two grounds are two palettes, so it now runs the screen measurement again under prefers-color-scheme: dark — 2,840 more text elements, and the pass that would notice a cabinet card drifting back up above the ground. The print pass now runs with the dark preference deliberately left set, so a regression that let the cabinet reach paper lands as black-on-brown in the pass that already gates.

A new pass that reports without gating is decoration, and this one nearly was: the failure total it feeds counted screen and print only, so the cabinet column would have printed its numbers and never stopped a ship. Both are in the gate now, and the pass was verified by lifting --qe-cab-ink to a value near the ground and watching 1,675 cabinet failures appear against zero on screen and zero in print.

tools/make-images.py reads the palette out of queering.css with a search for each token name, which returns whichever copy appears first in the file. Two palettes in one stylesheet make that a loaded gun: reordering the sheet would silently turn every social card brown. The lookup is anchored to the :root block that holds the daylight values — a social card is a herbarium sheet, not the drawer it is filed in — and every generated file is byte-for-byte what it was.

2026 · 8 September

A first-person account that ends the moment two words fit had nothing under it about what a word that fits is for, and the writers who answer that were gathered on Stimpunks pages that are a finding aid and not a citation Link to this section

The Coming to Terms sheet carried Ryan Boren’s 2022 essay with every other writer’s words stripped out of it, which left it thin. A treatment on labels is now mounted below the essay: the copia, the smorgasbord, the arrangement of building materials, and the direction of travel that decides whether a word is invention or classification.

MountedSix sections below the essay, on what a label buys and what it charges

The frame is Ryan’s own: labels as a copia and a smorgasbord that you mix and match and self-apply. Copia is the rhetorician’s word for abundance — you generate the range before you choose — and Jordynn Jack pointed it at gender in 2012. Sonny Jane Wise set the same shape as a plate you fill yourself, and Florence Ashley supplies the sentence that stops it becoming a free-for-all: people arrange similar building materials differently, and an arrangement is not a lie.

The hinge is the direction of travel. Ira David Socol, writing in 2009, puts it in one line: only when people get to choose their own labels does any of this build anything. A word you reach for and the same word handed to you on a form are not one object in two coats — one is invention, the other is classification, and classification runs one way. Nick Walker built that direction into the grammar, the verb before the adjective, which is the sheet’s conclusion in his words rather than ours: nobody can diagnose you with a practice.

And the bill is real, which the sheet says at the same length as the case for. Helen Edgar aims the complaint at the right object — take the word away and the gate is still there, only the key is gone — and refuses to choose between labels as barrier and labels as liberation. The last word goes to a writer shedding theirs, and to the order of that sentence: the shedding comes first, the privilege named second, and the privilege is having had the words at all.

CabinetEvery quotation named to the copy it was read in, and a rule about our own library corrected in the middle of applying it

The material was gathered from three Stimpunks pages, which is where it lives and is not where it can be cited from. Every quotation was then read in the work it came from — Wise’s post, Ashley’s published PDF, the Internet Archive’s capture of Socol’s 2009 guest post at an address that no longer resolves, Walker’s own page, Helen’s post, and the shedding post. Three originals keep spellings ours would not: Each of us are, pathologizing with a z, and reveling with one l.

One line was cut and then put back, and the rule that cut it was the thing at fault. Language is not a set menu, it’s a buffet is a transcription of speech from a video by The Leftist Cooks, taken down by Ryan and published on the glossary. It came out of the first draft because the caption track returns nothing and the wording could not be re-checked. That is a reason to label a quotation, not to bin it — a spoken line has no printing to go back to, only somebody’s ear, and the citation names the video, the channel and the date. It is on the sheet with the transcription attributed in the caption.

So the ledger’s rule about our own library has been narrowed to what it was actually for. It exists to stop our own prose — a gloss, a summary, a paraphrase — being read back later as somebody else’s wording. A direct quotation Ryan transcribed from a paper he read and published with a citation to that paper is not that; it is a first-hand reading with the source named. Papers get rented and access lapses. Re-reading is an upgrade, not a precondition, and the citation is the thing that has to be right.

The gap was named on the sheet, and then it closed. Jack’s Gender Copia is closed access and is held nowhere we could reach; every hit in our own library was one of our own pages quoting it, which is five witnesses that are one witness. The section shipped its first draft describing her argument and saying in the same breath that it was describing rather than quoting. Then Ryan put a scan of the printed article in the library, and the section was rewritten to quote her: the copia passage from page 3 as a specimen, the array of terms, and the four verbs from the Conclusions.

And the print pages punctuate her differently from the digital text. Our glossary carries masculine=feminine, sex=gender, male=female, nature=culture, symbolic=embodied. The printed pages carry a solidus in every one of those places. Neither is a mistake and this is not a correction of anybody — a slash rendering as an equals sign is ordinary publisher typesetting, the title of the same article is Sex/Gender in both, and the words are identical throughout. It is the Woolf trap in miniature: two real editions, and a quotation that is only right once it is attached to the copy it came from. This sheet quotes the print pages because the print pages are what was read, and the caption says so. Neither text is to be tidied against the other.

2026 · 8 September

The most-quoted sentence about lavender and Abraham Lincoln is word for word what Carl Sandburg wrote, and the man it describes is Joshua Speed Link to this section

Sheet No. 7 reads violet, pansy, green carnation, and lavender as one process caught at four moments: a description becomes a code, the code is read by the people it was meant to escape, and what is left is a name in somebody else’s mouth. Four public-domain plates, two of which are the wrong object and say so.

MountedA Waste Garden, Flowering at Its Will — Sheet No. 7

The set of four is Sarah Prager’s, gathered for JSTOR Daily in January 2020, and the sheet says so in its second section rather than its footnotes. What is ours is the reading: that a worn code fails by succeeding. It works until enough people use it, and the number of people who make it useful is the number who make it legible from outside. Then it is not a code, it is a charge — a word a newspaper can print and a court can enter into evidence — and the last move available is to wear it anyway, in the open, until it goes back to being a description.

The title is line 3 of Lord Alfred Douglas’s Two Loves, published in The Chameleon in December 1894 and read out against Wilde at the Old Bailey four months later. The poem opens in a garden that already has the violets in it — white lilies / A few, and crocuses, and violets / Purple or pale — which is the sheet’s own connection and not Prager’s. Quoting Alcaeus on Sappho in Wharton’s 1885 rendering, Douglas, the 1906 shorthand reports of the trial, Sandburg’s 1926 first edition, and Prager twice.

The sheet is as careful about what it does not say. Wilde’s green carnations at Lady Windermere’s Fan, George Chauncey’s pansy craze, the Lavender Scare, and the Lavender Menace action are all named as Prager’s or her sources’, quoted as hers where quoted at all, and not repeated as ours. A note on the page says the gap is deliberate and sends the reader to her.

Re-determinedThe streak of lavender belongs to Joshua Speed, and only the referent has moved

The sentence travels as Sandburg on Lincoln: A streak of lavender ran through him; he had spots soft as May violets. Page 265 of the 1926 first volume opens Chapter 54 with it, and the subject of the paragraph is Joshua Speed. Sandburg extends the figure to Lincoln in the next sentence but one — different words — and on page 266 gives it to these two men together.

Nothing was fabricated and no word was altered. The author, the book and the year are right, and Sandburg did say it of Lincoln, so the claim the sentence is usually deployed to support survives the correction whole. Only the him slipped, and the him is the entire meaning: a sentence about two young men who told each other their secrets in Springfield is a different sentence from a sentence about a president. This is the failure named in CLAUDE.md as this site’s characteristic one, found in the wild rather than in our own drafts. Prager names Speed in her very next sentence and her book is partly about him; this is compression in a much-retold line, and the sheet says so in as many words rather than scoring a point.

The corroboration rule fired before an error this time, not after one. Three Internet Archive copies were read first and all three agreed — and all three were scanned at the same centre, which is one pipeline and therefore one witness. That is exactly the trap the Dickinson entry below records, where two copies from the same library agreed on a broken piece of type. The passage was re-read in the University of British Columbia Library’s copy, scanned at the University of Toronto, before a word of it was published.

CabinetTwo of the four plates are the wrong object, and both captions say so

The violet mounted is the wrong species. Sappho’s violet is the Mediterranean Viola odorata; the plate is Viola pedata, the American birdfoot violet, photographed for a New York state museum survey in 1918, because that is the public-domain violet plate we had. The caption carries the correction on the page — The plant is the genus, not the poem — and a note at the foot of the sheet asks readers for a better plate. It is logged as open in the ledger, and the fix is one line of markup the day a Viola odorata plate turns up.

The carnations are the wrong colour and there is no right one. A green carnation is a white carnation stood in dye, so no botanical plate of the flower Wilde’s friends wore exists or could — which turns out to be a fair description of the code itself, and the caption says that too. The other two plates, the 1896 pansy and the Hulme lavender, are simply the right flowers.

The sheet’s header drawing is the four plants of the front page’s new border, drawn at size and growing out of one ground line, in the order the sheet reads them. All nine stem --len values are the measured getTotalLength(): three were declared short on the first pass, which is invisible in the finished drawing and leaves the stroke permanently unfinished in the animation.

2026 · 8 September

Four flowers people wore when saying it in words was dangerous, drawn onto the corners of the plate of sheets Link to this section

Front-page furniture. The plate of sheets in What grows here now sits inside a ruled frame with a botanical sprig on each corner: violet, pansy, green carnation, lavender.

CabinetThe border is an argument, and the line under it says whose set of four this is

Violet, pansy, green carnation and lavender were all worn or sent as signals, at times and places where saying it in words was dangerous. Drawing them onto the corners of the plate puts the site’s subject into the site’s own furniture rather than into another paragraph about it. The four are gathered as a set by Sarah Prager in Four Flowering Plants That Have Been Decidedly Queered (JSTOR Daily, 29 January 2020), and the line under the frame credits her for the gathering.

It credits her for the gathering and nothing else. Her specific claims — Wilde’s buttonhole in 1892, Sandburg’s streak of lavender, the violets in The Captive, the Lavender Menace action — are hers and her sources’, and none of them has been read back to a primary here. So the page asserts none of them. If these four ever become a sheet, that reading comes first.

Two things a sheet would have to say out loud, found while looking for plates. The obvious public-domain violet plate is Viola pedata, an American species photographed for a New York state museum survey — not Sappho’s violet. And no plate anywhere shows the flower Wilde’s friends wore: a green carnation is a white one stood in dye, so every carnation plate in existence is the wrong colour. Mounting one under that name would be exactly the quiet generalization this ledger exists to catch. The plates were previewed and held back for that reason, among others.

CabinetThe frame is CSS and the corners are SVG, and the plate nearly became a list again

A four-sided vine drawn as one stretched SVG shears at its corners at every window size. A border on the wrapper never distorts, and four fixed-ratio sprigs pinned to it ride along at any width. Each sprig is drawn natively for its own corner rather than mirrored into place, because a mirrored bottom corner hangs its flowers upside down — fine as wallpaper, wrong on a herbarium sheet. The vine arms end in a tendril curl; a blunt round cap at full stroke width reads as a cut twig.

The frame bleeds out into the gutter by exactly its own padding. Padding it inward instead left the grid 387px, which is under the 417px that two 12.5rem tracks and a gap need, and the plate silently collapsed to one column — a stack of cards, which is a list, not a plate. That is the identical failure .qe-plate-grid’s own comment already records from the day the grid was written, and it still caught this change. Under 30rem the sprigs come in flush with the frame: hung outside it, the violets were clipped by the viewport at 390px.

Every new fill — four flowers and a narrow leaf — went into the print sheet’s line-art rule the day it was written rather than the day it failed, which is the standing debt from the 44 pages that printed blank on Star Stuff. The twelve stem --len values are measured getTotalLength(), not declared, which is the correction the Dickinson entry below already had to make once.

2026 · 8 September

A heading that says the type plays was set in the same even measure as every other heading, which is a claim arguing against itself Link to this section

Front-page typography only. Nothing a sheet claims about a text has changed.

CabinetThe heading performs its own sentence, and the verb carries the axis wherever it is a heading

The type plays, and the words do not move is now set per word. The softness rises across the first half and two words sit a degree off the line — and do not move is the one phrase set flat and straight, at SOFT 0, WONK 0. The heading demonstrates both halves of what it says rather than asserting them in an even line. Per word, never per letter: a heading cut into letter spans is one line to the eye and a stutter to a screen reader.

The verb gets the axis at its full extent. Queering in Queering is a verb and queer in To queer is to adapt now run at SOFT 100 against the heading’s own 40. Every h2 here already sets WONK 1, so the deviation a reader can actually see is carried by the softness — in roman, WONK alone moves too few glyphs to register at heading size, which is the same reason the type specimen on the colophon is set in italic.

Two rules in queering.css, reusing the .w idiom the cut-out line already had, and both switched off under html.plain along with everything else decorative. The rotation is dropped below 30rem, where a leaning word collides with its neighbour instead of leaning away from it — the guard the leaning title on Sheet No. 5 already needed.

2026 · 8 September

Higginson wrote let us alter as little as possible and then printed Dickinson’s poem with eight of its nine dashes gone — and the copy a reader will find today has lost a word out of the line that asks to be moored Link to this section

Sheet No. 6 reads Wild nights – Wild nights! as co-regulation and answers it with a poem of Ryan’s. It mounts the Houghton leaf in facsimile, which makes it the first plate here that is licensed rather than public domain.

MountedThe Swell and the Dwell — Sheet No. 6

Twelve lines, three finite verbs, and every one of them a conditional: Were I, should be, Might I but. Nothing in the poem takes place. The sheet reads that as the grammar of limerence in Dorothy Tennov’s strict sense — the desire to be desired, defined by uncertainty — and reads the imagery as the clearest description of co-regulation anybody wrote before the word existed: the winds are not stilled, they are made futile, and what makes them futile is a place and company rather than a temperament.

The compass and the chart are the instruments you need in water you do not know — continuous correction, checked and rechecked — which is masking described as equipment. Dickinson does not say they were wrong. She says they are done with. Quoting Janae Elisabeth, Hogenkamp, Sanghavi and Natri, Helen Edgar twice, Kapp and six co-authors, Nick Walker for Margaret Price’s bodymind, and Helen Edgar again for Deb Dana’s glimmers.

The sheet carries a second poem, and it is ours. Thirty-two lines of Ryan’s, written for a person rather than a readership, mounted at his request. queering.css gained a .qe-verse component so that our verse and a dead poet’s verse can never be mistaken for one another: the specimen keeps a solid moss rule on the left and the display face, the reply gets a rust rule on top and the body face in italic, and a label that says whose words they are in words rather than in CSS.

Re-determinedThe poem in general circulation is missing the word but, and the page that prints it names no edition

The Poetry Foundation prints Franklin, credits the edition, and is right. The Academy of American Poets prints a composite: the dashes restored, so it is not 1891; heart, compass, chart and sea still lower case, so it is not the manuscript; a comma in Ah, the sea! that is in neither; Wild Nights capitalized where neither the leaf nor 1891 capitalizes it. And line 11 reads Might I moor.

Might I but moor is a plea with a limit written into it — if I could only, asking for the smallest possible version of the thing. Might I moor is a request for permission to dock. A poem that asks to be moored has had the hinge taken out of the asking, and the page carries no editor, no edition and no date, only This poem is in the public domain, which is true of the poem and says nothing about the text. Read out of the live page on 8 September 2026.

This is the third time the register has caught this shape. Woolf had two texts and both were hers; Rossetti has a colon in her first printing where every circulating copy has a full stop. Name the printing, or do not quote.

Re-determinedWhat 1891 did to the leaf, and the one change that is not a tidy

Page 97 of Poems, Second Series takes nine dashes down to one — the em dash closing line 6, and even that has acquired a comma in front of it. Four of her capitals come down: Heart, Compass, Chart, Sea. Eden keeps its capital, because Eden is a proper noun in anybody’s grammar and the other four were only proper nouns in hers. Three exclamation marks and three commas arrive. Three further differences are the volume’s typography rather than editing — a two-line drop cap, the inset second line that the drop cap causes, and a space before every exclamation mark, which is the same French spacing as the 1896 Rossetti volume.

The lineation is the exception and it deserves better than it usually gets. Dickinson wrote Might I but moor – and ran out of leaf, so Tonight – went on the line below. Franklin records that division and reads through it; Todd and Higginson set what was in front of them. One editor reproduced the poem and the other reproduced the leaf, and both are defensible. The sheet says so rather than scoring a point.

Higginson’s letter of 21 April 1891 was read on page 127 of Millicent Todd Bingham’s Ancestors’ Brocades (1945) — rendered as an image and the type read, because that page’s OCR mangles the ampersand and the footnote marker. He is frightened of the poem, calls her a virgin recluse five years after her death, and prints it anyway: Yet what a loss to omit it! Indeed it is not to be omitted. The sheet does not claim he made the changes — nothing read here establishes whether the pointing is his, Todd’s or the compositor’s, and pinning it on the man whose letter survives would be convenient rather than true.

CabinetA licensed plate for the first time, a title that breaks its own convention, and punctuation added to a poem of ours
  • The facsimile is CC BY-NC-ND 3.0, not public domain. The first thing mounted here that is licensed rather than free. The credit is the archive’s required form, the site is non-commercial, and the file is unaltered because it was requested from Harvard’s own IIIF service at the width we wanted — so the only derivative was made by the rightsholder’s server. Mounting the 1891 printed page instead was considered and rejected: it is unambiguously public domain and it is the wrong object, because you cannot show what the printers did to the leaf with a picture of the printing.
  • The title is Ryan’s phrase, not Dickinson’s — the first exception to the rule that a reading is titled from its specimen. Three titles out of the poem were on the table. None of them holds both halves of the sheet, because her poem only has the swell in it.
  • The reply got punctuation and nothing else. Five full stops and five commas; no word, line break or capital touched, including the lower-case continuation lines, which turn out to be consistent across all eight stanzas and are therefore prosody rather than typing. Disclosed in the sheet’s label, itemised in the ledger, and named here — because an unmarked edit of our own text is the same failure as an unmarked edit of somebody else’s, and the site just happens to be the injured party.
  • The header drawing is water. One line rises out of the lower left and breaks in a curl at the upper right; one lies almost flat across the foot and curls too, because it is water and not a ground line. The two moths are deliberately together rather than in opposite corners — the poem under them is about reciprocation. Three of the twenty --len values were declared short on the first pass, which is invisible in the finished drawing and obvious in the animation; all twenty are now the measured getTotalLength().

2026 · 8 September

A scholar cut her own sentence down to fit a later argument, marked every cut, and in doing so demonstrated the thing the sentence says Link to this section

The front page gained two sections on Pamela Demory’s Queer/Adaptation. One of the two quotations is a quotation of the other, five years apart, by the same person.

MountedTwo sections on the front page: To queer is to adapt and The sentence adapts itself

Nick Walker gave this site the verb. Demory gives it the motion: To queer, then, may be to adapt; to adapt is to queer. Written in adaptation studies rather than in neurodiversity, and arriving at the same place from the other road — queer as a verb, as a doing rather than a being. It is a description of what every sheet here already does to a canonical text, and its useful insistence is that doing it is not a lesser act than writing the original.

Quoting Demory’s Queer/Adaptation: An Introduction (Palgrave Macmillan, 2019) at three places on pages 1 and 3, her Queering Emily Dickinson for the Millennial Age (Palgrave Macmillan, 2024) once, and Linda Hutcheon at one remove, named on the page as quoted by Demory. Also on the page: the sheet count in What grows here, which had said three since Sheet No. 3 and now says five.

CabinetThe second quotation is a trimmed version of the first, and that is why both are on the page

In 2024 Demory quotes her own 2019 sentence and cuts it: to evolve, to repeat, imitate, parody, make new gone, but also to turn gone, and to adapt is to queer — the half that ran the other way — gone. Every fragment that survives is verbatim, and every cut is marked with an ellipsis.

This is the failure mode of this site, performed correctly. ATTRIBUTIONS.md exists because the characteristic error here is not an invented source but a tightened one: a sentence trimmed to fit, with somebody else’s name left attached. What makes Demory’s trim an adaptation rather than a misquotation is that you can see where the scissors went. The front page now says that in as many words, which is a better argument for the ledger than the ledger can make for itself.

2026 · 8 September

An editor in 1733 decided Miranda’s hardest speech was not credible coming from her, moved it into her father’s mouth, and three centuries of editions followed him Link to this section

Sheet No. 5 reads Shakespeare’s The Tempest alongside Waterhouse’s 1916 canvas. The layout came from Helen Edgar’s own Claude session and was adopted as she sent it; two citations in it did not survive checking.

MountedMiranda: To Be Wondered With — Sheet No. 5

Miranda’s name is Shakespeare’s coinage, built on the Latin mirari, to wonder at. The sheet turns the preposition: not wondered at, which the play does to her constantly, but wondered with. Six quotations from the play, the boy player who first performed her, the speech Lewis Theobald reassigned, and the chain of everybody who has staged her since.

Quoting the play in the Arden text, and Judith Butler, Sara Ahmed, Alison Kafer, Aldous Huxley, Nick Walker, Ann Thompson, Jessica Slights and David Kathman by reference. The Theobald reassignment was confirmed at two independent sources: the Folger edition prints the speech as Miranda’s, and the Shakespeare Navigators note gives Theobald’s own reasoning — that a three-year-old could not have taught Caliban to speak.

Same editor, same 1733 edition as Sheet No. 4. Theobald put weird back into Macbeth over Shakespeare’s weyward in volume 5 of the same Works. Two sheets now turn on one eighteenth-century editor deciding what a woman could plausibly have said.

CabinetFour devices from Helen’s draft, kept — and its colours, not kept

The draft arrived as a self-contained page with its own palette written in hex. The typography survived and the hexes did not: queering.css gained a restaging section in which every colour aliases a --qe-* token. The leaning title, the wobbling section heads, the chain of stagers and the staging labels are all hers.

  • The chain is an <ol>. It arrived as a row of spans with → between them — five decorative arrows read aloud as words. The order is the content, so it is a list, and the arrows are drawn by CSS with an empty alt string.
  • The correction uses <del> and <ins>, which is what Theobald actually did. It arrived as a line-through on a <span> — invisible to a screen reader, which would have erased the one device on the sheet that is an argument about erasure.
  • The struck name is moss with a coral rule through it, not coral letters at 0.65 opacity, which is how the draft had it and which fails 7:1 twice over. The colour goes on the strike, never on the letters.
  • The plate is the scan already on disk. The draft hot-linked Wikimedia with a JavaScript onerror fallback reading Plate to be inserted — source a high-resolution scan before publishing. Waterhouse’s Miranda was mounted on Sheet No. 4 the same day, alt text and provenance already verified, so the sheet mounts the local file and the fallback is gone.

Both chains carry you, reading this on the end, which is the sheet’s own argument about itself and not a flourish.

2026 · 8 September

A site that publishes a ledger of everyone else’s words was keeping the account of its own mistakes in a file only we could read Link to this section

Four sheets in, the corrections had piled up in the repository and nowhere else. This page is the fix.

CabinetThe register itself

Backfilled from the full commit history, cross-read against ATTRIBUTIONS.md and DECISIONS.md so that every correction named here is the one those files record. Linked from the footer of every page, next to the colophon.

It is drawn as a register rather than as a list of version numbers because that is what this site already is: things collected, mounted, labelled, and sometimes relabelled. The four kinds of entry are the four things that happen to a herbarium sheet.

2026 · 8 September

A sheet shipped with Helen Edgar’s name over prose she did not write — she declined the credit, and the answer had been written in our own colophon before the sheet was made Link to this section

Sheet No. 4 reads Helen Edgar’s Wyrd, Weird, and the Invention of Normal: before weird meant strange, wyrd meant fate, and the thing that got invented in between was normal.

MountedWyrd, Weird, and the Invention of Normal — Sheet No. 4

A reading of Helen’s More Realms essay, with the word’s own drift down the page: wyrd as what comes to be, weird as the Fates’ own word, and weird as odd-looking and disturbingly different, which is where it arrives around 1820.

Quoting Alby Stone, Karen Bek-Pedersen, Mark Fisher, Robert Chapman, Eve Tuck and K. Wayne Yang, Elliot Wassell, Megan Ingram and Kai Jacobsen, and Ombre Tarragnat; describing Susan Schoon Eberly’s work on changelings and the folklore of disability without quoting it, because the article is paywalled and was not read here. Public-domain texts on the sheet: The Wanderer, Völuspá 20, Tam Lin (Child 39A), and Yeats’ The Stolen Child. The Old English gloss is ours and is labelled as ours — translators do not agree on ārǣd, and picking one rendering silently is picking a reading.

Re-determinedThe sheet’s kind changed from essay to reading, and No. 1 gained a second reader

Knock-on from the byline rule, applied the same day. Under that grammar the Wyrd sheet is a reading, not an essay, so the kicker, the plate card, three sibling navs, and the social card all changed to say so. The Army of the Upright’s Read by row went from Helen alone to Helen and Ryan.

One thing left untidy on purpose: this sheet keeps Helen’s title rather than taking a phrase out of the specimen the way the other readings do. If a session wants to tidy that, the title is the change and the address can stay.

MountedTwo paintings, chosen by Helen Edgar

Edward Robert Hughes, Midsummer Eve (c. 1908), and John William Waterhouse, Miranda — The Tempest (1916). Both public domain on the artists’ dates; both captions say she picked them, because on this site choosing the plate is a real contribution with a real name on it — and this is the sheet on which a real contribution had just been credited to the wrong kind of row.

The Hughes plate first sat between He was convicted of manslaughter and So: no romanticising the fae on this sheet, which split two sentences that answer each other and made a charming fairy painting the punchline to Bridget Cleary’s murder. It now opens the section instead. Where a plate sits is an argument, not a layout preference.

CabinetThe paste-up: a zine wall built out of herbarium furniture

Ryan’s brief was take inspiration from zine walls, and the obvious risk in it is that a photocopied flyposted wall and a Victorian specimen sheet are not the same object. What made it work was noticing that they are: both are things cut out, laid down at an angle, and fixed where they overlap — one with masking tape, one with gummed linen strips. So .qe-wall, .qe-drift, and .qe-cutup are built from the card, the rule, and the accent colour the site already owned, rather than importing a second visual language. No new motion: the drawing at the top grows, the wall does not.

  • The wall shipped as one column at every window size. Two 13.5rem tracks plus the gap need 452px and the measure gives 448, so it silently collapsed into a stack of slips — a list, not a wall — and it looked deliberate. Found by reading the computed grid-template-columns in the browser, not by looking at the page. Now 12.5rem.
  • The word-drift rail became a column rather than a third exception to the measure. Three states across 448px give 136px each, which will not carry the gloss under each word. The rail runs down the sheet instead. One fewer exception is worth more than one better timeline.
  • .qe-cutup uses inline-block, not flex. With flex items the scissored words look identical and copy out as oddifficultimmature.
  • .qe-plate-wide came back, exactly as the note about deleting it said it would — Waterhouse’s Miranda is 138cm across, and inside the portrait cap the foundering ship was a smudge in the corner.
CabinetThe colophon says how these sheets are drafted

A new section, Who reads, and who writes: these sheets are drafted in Claude Code sessions and edited by whoever is on the Read by row. Asked and answered as one honest section in the colophon and nothing in the labels — a label is about the reading, not the tooling, and a tool cannot carry responsibility, which is what a byline is. A site that keeps a ledger of everyone else’s words owes an account of where its own came from.

2026 · 8 September

Two grey woodcuts came off a colour sheet, and the drawing above them was rebuilt twice before it stopped standing to attention Link to this section

Both changes are about looks rather than accuracy, and both turned out to be the sheet’s own argument correcting the page.

Re-determinedColour over subject matter: three chromolithographs replace two Darwin woodcuts

Sheet No. 3 first mounted two figures from Charles Darwin’s Climbing Plants, chosen because the sheet’s argument is about holding on without merging and Fig. 13 is a tendril spiralling in two directions at once. Ryan: The black and white tendril illustrations are a little underwhelming. Let’s drop the tendril requirement and go for colour. He is right about the page — a herbarium sheet in daylight is a colour object, and two grey rectangles of 1876 line-block sat on it like photocopies.

Replaced by three chromolithographs from Annales Musei Botanici Lugduno-Batavi volume 1 (1863), all lithographed by Emrik & Binger of Haarlem, each with a different draughtsman; and, in the section on what a fruiting body is for, a hand-coloured plate from M. C. Cooke’s Illustrations of British Fungi. Nothing about the Darwin verification was wrong. His reversed spiral is still on the sheet, still credited, quoted and linked instead of mounted, and the section reads no worse for it — the idea survived as prose.

The rule this settled: on this site a plate is chosen for how it looks on the sheet first and for what it depicts second. An illustration that has to be explained before it earns its place is not earning its place.

Re-determinedThe header drawing, rebuilt twice, and the first version was a fault rather than a preference

v1 was five upright stems, evenly spaced, on one flat baseline — the argument of the sheet drawn literally. Helen: can we have squiggles and swirly bits so it isn’t all linear? may be add some mushrooms or something. A sheet whose thesis is counter-narratives following their own rhythms had a drawing in military formation at the top of it. No guard can catch that: the markup was valid and the tokens were correct.

v3 is Art Nouveau, to Helen’s brief — flowing curved vines, spiralling tendrils, organic scrollwork, asymmetrical, nothing rigid. What that actually required: no baseline and no roots, so nothing can line up; every terminal curling back on itself, because a curve that merely stops is the thing this drawing is not; and a taller canvas, because filigree needs vertical room or the curls close into blobs.

The part that nearly got missed: the vines landed in v3 while the flowers and mushrooms were still v1’s — six-ellipse daisies and flat domes on sticks. Against sinuous linework they read worse than they had against straight stems, because they were now the only rigid things on the panel. A style note about line is also a style note about form. Blooms became five sinuous petals at uneven spacings; caps got an undulating margin over a bent tapering stipe.

One trap paid for here and worth stating: --len on a stem is its real measured length, read out of the live page. A declared length shorter than the actual one turns the dash into a repeating pattern and the vine draws itself on with gaps in it — invisible in the finished drawing, visible only while it grows. Three paths were short on the first pass.

2026 · 8 September

The first printing of Promises like Pie-crust ends line 20 with a colon, every copy in circulation ends it with a full stop, and the line is the one about breaking the chain Link to this section

Sheet No. 3 reads Christina Rossetti’s poem of 20 April 1861 next to a 2026 paper on supporting Autistic adults’ intimate lives.

MountedThe Die Uncast — Sheet No. 3

Rossetti’s poem entire, from its first printing in New Poems by Christina Rossetti, Hitherto Unpublished or Uncollected (Macmillan, 1896), beside three passages of analysis and six participant quotations from Monique Huysamen, Chris Hatton, and Marianthi Kourti’s Embrace Difference, Challenge Normativity in Feminism & Psychology, and Amanda Van Slyke’s definition of solo polyamory.

CabinetVerse gets a shared component, and every line is its own element

.qe-poem lives in the shared stylesheet rather than in the page, because poems will recur here and the second one would otherwise copy the first one’s CSS and then drift from it. A poem’s line breaks are the object being mounted: reflowed into prose it is a different poem.

  • Every line is its own block element, not a <br>-separated run. A <br> among the lines breaks child counting, so an indent driven by an even/odd rule silently re-indents the whole poem the moment a line is added — the indent is a class the markup states outright instead. And the 1896 alternating indent is a fact about that setting, not a decorative rhythm to apply to any poem.
  • A hanging indent on every line, so a line too long for the measure is visibly a wrap and can never be mistaken for a line the poet wrote.
  • The type steps down under 26rem, and this is the one place on the site it may: seven of the twenty-four lines wrapped on a 375px viewport at the body size, and a poem read at that ratio is being read as prose. Verified at 24 lines, 0 wraps.
  • On paper, a stanza never splits across a page break.
CabinetA sheet is titled from a phrase in the specimen, and the filename names the work

on-being-ill is The Army of the Upright; promises-like-pie-crust is The Die Uncast. The split is deliberate: the filename is the address a reader searching for the source will guess, and the title is what the sheet found in it. An essay written by us is titled by us, so the convention applies only to a reading.

2026 · 7 September

The site was linking to one address and declaring a different one canonical, and nobody would have found it by reading the repository Link to this section

CabinetAddresses on this site are extensionless

Netlify’s Pretty URLs post-processing is on by default and rewrites internal links to strip .html. So the served page said /coming-to-terms while the repository said coming-to-terms.html, and every canonical tag and sitemap entry said .html. Found by reading the served page rather than the repository, while checking that something else had deployed.

Two ways out were on the table — turn the setting off, or adopt what it produces. Ryan chose to adopt it: canonical tags, og:url, the sitemap, and every internal link now say the extensionless form, and nothing is rewritten on the way out any more because there is nothing left to strip. What it costs is that the filename and the address no longer match, which is now said out loud in the repository’s own guidance instead of left for the next session to discover. The sitemap check was changed to fail on a .html address, and the failure was verified by putting one back.

CabinetHow this site is made — the colophon

What the herbarium model means here, what biophilic design survives translation to a website, the five words this site uses for its own parts — specimen, sheet, label, plate, card — the palette with its measured contrast ratios, the type and its deviation axis, plain view, the drawings, and the borrowed plates with their sources.

CabinetSheets link to each other, outside the page’s main landmark

Until then a sheet’s only internal link was back to the plate, so a reader arriving from a search result had exactly one way onward. Each sheet now ends with Elsewhere on the plate. It sits after the <main> element on purpose: the knowledge-system mirror takes page content from that landmark and nowhere else, so navigation placed inside it would be indexed as that sheet’s own content. No guard can catch that — the markup is valid and the landmark is correct.

2026 · 7 September

The phrase on the masthead turned out to be one hyphen away from the subtitle of a book we quote on the same page Link to this section

The first two sheets went up and were mounted on the plate as numbered cards.

MountedThe Army of the Upright — Sheet No. 1

Virginia Woolf’s On Being Ill, read from the 1930 Hogarth Press edition — the edition of 250 signed copies whose type Woolf set herself.

MountedComing to Terms — Sheet No. 2

Ryan Boren on a lifetime of looking for a word that fits. The one kind of sheet where Written by is the right row: his own finished text, unchanged, and the label says so.

MountedPlate 511, The Floral Magazine v.9 (1870), and the first metadata error

A hand-coloured lithograph of two orchid blooms on Sheet No. 2. The artist’s name was read off the plate rather than out of the catalogue record, and that turned out to matter: the plate is signed Worthington G. Smith, F.L.S. del et lith in the bottom-left corner, and the Biodiversity Heritage Library’s Flickr tags on a neighbouring plate credit a Walter Wood Fitch who did not illustrate it — the illustrator in that period was Walter Hood Fitch. A digitiser’s metadata is a finding aid. The object carries its own attribution in the corner.

CabinetThe plate, the favicon, and the social cards

The front page became the plate: the sheet the others are mounted on, as numbered cards with a coloured tape strip across the top of each. Card class names were taken from Star Stuff on purpose rather than invented again.

Icons and cards are generated from the shared stylesheet’s own token values, so they cannot drift from the palette. Two traps paid for in the favicon: a doubled hyphen inside an XML comment made the whole SVG fail to parse — it looked fine, served with the right content type, and decoded as nothing — and a favicon is judged at 16px, not at 64, where a tilted leaf reads as a diagonal stroke and anything filled in lichen has too little contrast on paper to be a shape at all.

2026 · 7 September

For six minutes at a time the site looked deployed: a green dashboard, auto-publishing on, and a commit several pushes stale Link to this section

The site was planted and the domain went live the same day. Between those two things, three separate wrong answers about why pushes were doing nothing.

CabinetThe site is planted

The home page, the palette as tokens in one stylesheet, plain view as a class over one document, three guard scripts, and the bridge to the knowledge system for finding — never for citing.

  • The ground is paper, and it is the other end of the day from Star Stuff. The strongest differentiation from a night-sky site is not the same site in green.
  • Fraunces as the display face, because it carries a WONK axis — letterforms that deviate from the norm, exposed as a setting. A site about queering normativity setting its masthead with the deviation axis turned up is the argument made in the type.
  • Plain view is a class, never a second page. Helen asked for a plain access version; the alternative — a decorated page and a separate accessible page — drifts, and the accessible copy is always the one that rots.
  • Three guard scripts came over from Star Stuff and five did not: markup, sitemap, and contrast pass here; the other five catch failures this site cannot yet have. A check that cannot fail is a check nobody reads.
  • The local server roots itself at the repository rather than at whatever directory it was started from. Star Stuff’s copy does the latter, where a wrong-directory run looks exactly like a site with every page missing.
CabinetContinuous deployment, and the trap that made pushes silently not deploy

Static files, no build command, no publish subdirectory — the repository root is the site. Deploy previews on pull requests are left on deliberately: a pull request produces the real page at a real address before anything reaches the live site, which is the review path for anyone editing through the GitHub web editor rather than a Claude session.

Creating the project through the API does not wire continuous deployment, and nothing you can do from the API fixes it. The first deploy works, the dashboard shows a green light and Auto publishing is on, and there is no webhook, no deploy key, and no status-check hooks. It looks exactly like success. Three answers were recorded and two of them were wrong before the third stuck:

  • Re-sending the repository configuration leaves the deploy key null and kicks a one-off build of current HEAD — a trap of its own, because that stray deploy looks like the link repairing itself.
  • A hand-made GitHub webhook pointed at Netlify’s hook endpoint, matching Star Stuff’s exactly. GitHub delivers, Netlify answers 204 OK, and builds nothing. Verified twice. Netlify only honours a hook it created and recorded on its own side. This entry was written as a fix, corrected, and then corrected again — the first correction was also wrong.
  • Concluding anything from a short poll of the deploys API. It lags, and it lags by minutes. Give it three before calling a push ignored.

The only fix is netlify init --force in the repository, which provisions the webhook, the deploy key, and the status-check hooks together and needs a browser grant, so a human runs it once. The two commands that tell a wired project from a deaf one are written down, because the dashboard will not tell you.

Cabinetqueering.earth is live

The site was built for a week against a domain that did not resolve, with two things held back until it did: the host redirect, which would otherwise have sent the only working address to one that does not answer, and the entry in the knowledge-system mirror’s site map, which fetches over the network and would have failed the sync. Both switched on when the domain answered.

CabinetThe content model: a sheet mounts a specimen and carries our label

Settled the same day the first sheet was drafted, and it is the site’s attribution discipline drawn in the layout instead of left to a reader’s good faith. The specimen is somebody else’s — the essay, the painting, the word. The label is where we speak. Their words are in the specimen; ours are on the label; the line between the two is a fact about the page and not a promise about our behaviour.