The log — catches and learnings

The project logs its own errors and publishes the log. A catch is one error found, with its severity and its resolution. A catch that suggests a standing rule is escalated to a learning. The log takes in the project's structural errors about itself; that is the point of keeping it public. The log also names roles: the chair, the panel, the masters. These are the project's constructed advisory lenses, described at the advisors page. Code and Cowork are the names of the project's build sessions.

Ulysses — Catches

Errors found, with severity (1 cosmetic … 5 blocker) and resolution. Log every catch regardless of severity. A catch that suggests a standing rule is escalated to learnings.md.

# Date Sev Catch Resolution Escalated
C-01 07-18 2 Character map used three circles; omitted the dead and absent, who do more work here than most of the living Fourth circle added L-01
C-02 07-18 3 Place/time documents mapped two male routes only; Molly appears as an arm Acknowledged as a fact about the book, not a flaw in the map; became dimension 2 L-02
C-03 07-18 3 No tenement on the city map, because the protagonists never enter one Noted; became part of dimension 3 L-02
C-04 07-18 2 Naive markdown regex produced crossed <b>/<i> on **bold and *italic***; crashed the PDF build Replaced with a tag-stack walker guaranteeing well-formed output L-03
C-05 07-18 1 Page-range extraction read page counts ("120 pages") as page numbers Explicit anchors plus monotonicity enforcement
C-06 07-18 2 Four "nobody has done this" dimension candidates turned out to have dedicated literatures source-research.md now precedes any novelty claim L-04
C-07 07-18 4 Ten of twelve dimensions were the same operation — inventory. The masters flagged it in round two and it was logged without being acted on Typology of seven operations introduced; three new types added; Type-I capped at three (A11) L-05
C-08 07-18 3 A python re.sub intended to dedupe a heading swallowed an entire new section of the skill file; caught only by a structural grep Section rebuilt by splitting on the heading instead of regex-replacing across it; structural verification now runs after every scripted edit L-06
C-09 07-18 4 Sequencing error: dimension 15 (an instrument) was scheduled to ship second, before dimension 11 (the analysis that defines its questions). Collection defects cannot be repaired retroactively Anchor A15 — 15 is second in the queue, last in the shipping order L-07
C-10 07-18 2 Chair issued "make it provisional and ugly on purpose" to Code as though it were a specification. It is a wish; every style reads as a choice Replaced with structural constraint — one page, no nav, system fonts (A16) L-08
C-11 07-18 3 The Cowork handoff prompt named ulysses-bundle-2026-07-18-v2.zip by exact filename; the bundle had since become v3, so the prompt pointed at a file that no longer existed Version-agnostic reference; found by a bundle consistency audit, not by reading L-09
C-12 07-18 2 No rights note in a bundle destined for a public site quoting a public-domain novel alongside in-copyright apparatus and four in-copyright translations RIGHTS.md added at bundle root
C-13 07-18 2 Chair reported the missing second-model answer set as "the single largest missing input to the project." It was a deliberate exclusion to keep two builds independent — asserted as a defect without checking whether it was a decision Reclassified; anchor A17 records the decision L-10
C-14 07-18 4 Anchor A16 (no navigation, no sections, one flat page) was wrong. It treated "we don't know which dimensions survive" as "we don't know what the project contains" — but the categories (reading, reference, dimensions, registers, presentation, method) are settled. The chair also quoted Shneiderman's overview-first mantra and then specified a flat directory listing, which is the failure state that mantra exists to prevent A16 withdrawn by the author; 05-site-architecture.md written; A18 separates architecture from visual design L-11
C-15 07-18 3 Git's line-ending auto-detection classified two of the three reading PDFs as text at the repo's first commit. The stored blobs were verified byte-identical to the bundle originals (the files happen to contain no CR bytes), but any fresh Windows checkout would have rewritten their line endings — corrupting the byte-offset xref tables of the files the public site serves .gitattributes disables conversion repo-wide (* -text); the first commit amended before anything was pushed or mirrored; blob-vs-original hash comparison recorded as the check
C-16 07-18 2 A scripted batch edit during the design build (Windows PowerShell reading BOM-less UTF-8 as ANSI) wrote mojibake em-dashes into two templates. Same family as C-08: the write reported success Caught by the post-edit structural grep L-06 requires; both files rewritten; scripted edits on this repo now go through the editor tools or read/write UTF-8 explicitly
C-17 07-18 2 The reading's dates were recorded as 8–17 July 2026, ten days, throughout the bundle. The author corrected the record: 7–17 July 2026, eleven days, sixteen logged sessions on Claude, with a parallel session in ChatGPT Corrected by the author's instruction in base document 00, the site data and pages, and both READMEs. The archival handoff copies under docs/bundle/ and the masters-session's "ten days in July" keep the old figure as a frozen record; this row supersedes them
C-18 07-18 1 Third instance of the C-08/C-16 encoding fault family: the design swarm's stylesheet arrived with 53 double-encoded characters in its comments (em-dashes and section signs), introduced by the same ANSI-misread on write. Found by two playtest evaluators independently Re-encoded by codepoint with an explicit UTF-8 write; the two prior rows are the standing rule — file writes on this repo go through the editor tools or state their encoding
C-19 07-18 Not an error — a register change, logged for the record per base document 00's own update rule. The author redefined the presentation register's public form: the site publishes decks of image cards without explanations; the format's former name and its two-deck duality leave every public surface; the working layer behind each deck stays in the private repository and folders Base documents 00, 04 and 05, the advisor skill, the site templates and data updated; the withdrawn working spec preserved unrendered in docs/presentation-working-notes.md; frozen records (docs/bundle/, session records, playtest 01) keep the old name as history
C-20 07-18 Not an error — two author ratifications, logged. (1) The permanent address is the GitHub base, hulkiokantabak.github.io/ulysses/. (2) A13's mirror clause revised: the private repository is memory enough — no off-account mirror, no desktop mirror git rev-parse parity between local main and the private repo verified, then the desktop mirror deleted and tools/mirror.ps1 retired; docs/mirroring.md rewritten; the replacing discipline is push-at-session-end
C-21 07-18 Not an error — a structural decision, logged. The author struck dimension 12, the translation comparison, from the project entirely: out of the plan, the working documents, the rights note, the coverage research, the advisor ownerships and the routing Status dropped in the data model; the section in base document 04 replaced by a strike record; RIGHTS.md section removed; the coverage-research section replaced by a strike note (its consulted-sources list kept as a record of the survey); the published address serves the dropped record per the URL contract and anchor A4; the dimension number is not reused; frozen archives under docs/bundle/ keep the original as history
C-22 07-18 Not an error — a structural decision, logged. The author redefined dimension 15: the site is static, zero-dependence, zero-maintenance, therefore no feedback and no collection of any kind. The reading log becomes entirely self-contained — it runs in the reader's browser, keeps its entries on the reader's device only, and nothing returns to the project Base document 04's section 15, the Type VII definition, the register budget (PDF results register lapses), the routing (study-discipline row removed), open question 3 (answered: not a study), and the data model all revised; A15's sequence still holds — the log's prompts come from dimension 11's categories; frozen archives keep the study framing as history
C-24 07-19 3 The chair treated later commentary as corroboration when it shared the earlier source base. On importing the admitted commentary, the chair wrote that the July 2026 reporting was "fuller" than the day-one reviews — implying an upgrade in confidence. Ginzburg's pass showed both rest on the same journalism (Vanity Fair, GQ, TODAY.com): agreement between them is one ancestor counted twice, the classic false pattern. Three further defects found in the same pass: the commentary's bibliography is a block list, so no individual claim is traceable; it relays nine departures where its own cited source names ten; and its most load-bearing claim (that Wilson confirmed she was not consulted) cannot be supported from its own citations, whose only Wilson interview predates the film by nine years Dimension 16's confidence field rewritten to state the common-ancestor problem, the traceability gap, the selective transmission, and the citation gap; nothing promoted on the grounds that two documents agree. What IS strong — the Wilson facts checkable against her own book — is marked High and separated out. Escalated to L-13, and the test is now carried in the advisors skill and the new external-input-provenance skill L-13
C-25 07-19 3 The README published a growth rule the build did not honour. "A new artifact = one entry in data/artifacts.json + its file … nothing is hand-maintained" was false: an artifact also had to be added by hand to the passthrough map in eleventy.config.js, to contractedAssets in check.mjs, and to that file's byte-pair list — four edits across three files, and every artifact in the history did all four. Only one of the three was mechanically enforced; omitting the other two left a fully green build with the artifact outside the contracted inventory and outside byte protection. Found while scoping the PDF register, which would have multiplied the tax by five. Note the classification: this is not the data-model failure the README's own clause defines (that clause is scoped to adding a dimension and counts data files) — it is a published-accuracy defect, the same class as the stale note fields in this batch Artifact entries now carry asset: { source, path }; the passthrough map, the contracted inventory and the byte-pair list are all derived from that one field, and an artifact declaring no asset — or naming a source that does not exist — now fails the check. Negative-tested both branches before commit. The README's claim rewritten to describe what the build actually does, and dated L-14
C-26 07-19 Not an error — an author ruling, logged. Dimension 16 was marked built on a register it does not meet. Its PDF register was closed by Four_Odysseys_Handoff.pdf, a linear document produced outside this project; byte inspection shows zero link annotations, zero outbound URLs, zero destinations and no bookmark outline, against base document 00's definition of the register as hyperlinked and cross-linked. The written standard had never been relaxed — one status field had been applied inconsistently with it, which left "built" meaning two different things on two pages and left the PDF pipeline with no acceptance bar Author ruled 16 is not built. Status returned to building, owed: pdf; the dimension note states why. The project now has no built dimension, and says so honestly. The ruling defines the acceptance bar the pipeline must clear
C-27 07-19 Not an error — an anchor discharged on its own reasoning, logged. A15 had outlived both of its legs. Ginzburg's binding veto (panel session 01) rested on two claims: that an instrument's questions must come from the analysis, and that collection defects cannot be repaired retroactively. Leg one is satisfied — dimension 11's nine-kind taxonomy of difficulty is built and published, and those kinds are exactly dimension 15's prompts. Leg two was dissolved by the author's own later ruling: C-22 abolished collection entirely, so there are no respondents to fail to return to. The anchor was being read through its four downstream restatements ("complete", "done", "analysed") rather than through the veto's stated reason — the failure mode L-13 names A15 rewritten as discharged, not withdrawn: it was right, it bound, and it has now been satisfied. Dimension 15 is unblocked and enters the build queue. The distinction is kept in the anchor text so no future session reads this as the panel having been overruled L-15
C-110 08-05 Not an error — the author's six closing choices, and the last of them was the one the project had been unable to make for itself. Presented with everything still open after the eight-pass audit, he ruled the board item and commissioned four things; nothing was reopened. (1) THE TOMBSTONE. A contracted image address whose clearance is later withdrawn keeps answering, serving a page that names the withdrawal and its date, while the licensed file leaves the tree. The URL contract and RIGHTS clause 7 stop colliding without either yielding: what a published address promises is that it answers, not that it answers with the same bytes forever. Scoped to a rights fact arriving from outside about a published file; nothing is built under it, because no clearance has failed. (2) A SHORT TITLE FORM. shortTitle in data/site.json — "Ulysses: a first reading", the ruled title's own opening clause — closing the chair's exception recorded that morning: twenty-seven nav labels across sixteen artifacts, three generators, the log's kicker, the stylesheet header and the print register's site link all derive from it, and the retired name is gone from every surface the project generates. (3) THE PENELOPE FINDING PLACED. C-69 was homeless from 26 July; it now sits beside dimension 11's curve as a note, not a dimension — the book counts its own questions and this study counts one reader's, and the shapes are opposite. Every figure was re-derived from the held text rather than carried from C-69's row (a number quoted from a catch is a number recalled, L-40), which confirmed all three and corrected the implication: the 2,233 marks, Ithaca's 303 and Penelope's none stand, and Ithaca is the second-densest episode, not the first — Circe prints 358. New §11ak recomputes all of it at every build. (4) THE PROPORTION STATED. The final audit's hostile reader observed that the site's largest single thing is the log of its own errors; the answer is to say so first, derived — /method/ now carries the log's size against the reading record's, computed by state.mjs into data/proportions.json so it cannot go stale. (5) THE SCRIPT SELF-HOSTED. The one permitted script was unpinned third-party code on 46 pages; it is now vendored with its ISC licence, its fetch date and its SHA-384 in design/vendor/PROVENANCE.md, served same-origin at an additive contracted address, and pinned by new §11al — which also fails if any page ever loads it off-origin again. C-37's Reading Log exclusion is untouched: provenance and admissibility are different questions. (6) THE ACCESSIBILITY REVISION, which is the one that mattered. See the resolution (1)–(5) applied as described, each with its gate and its record. (6) THE TWO PRIOR-WORK ARTIFACTS ARE REVISED, on the author's explicit commission — the first and only time the byte-verbatim rule of docs/06-design.md has been lifted, and it is recorded there rather than treated as an exception nobody wrote down. playtest-01's author-queue item 1 had stood open for eighteen days: on a 375px screen the character ring's labels rendered at about 4px against a 980-unit viewBox, the map's place labels at under 3px against 1750 units, the nodes and markers were 10–11px slivers, and choosing anything updated a detail panel a thousand pixels below the fold. The remedy is the project's own ratified pattern, taken from the five decks: below 760px each drawing becomes a keyboard-reachable, labelled, sideways-scrolling region at a fixed width — 1250px for the ring, 2100px for the map, 1224px for the time rail — so the SCALE stops crushing the type instead of bumping declared sizes and reflowing a tuned layout. Measured in the browser at 375px: ring labels 4.1px → 16.6px, map labels 2.6px → 20.4px, node targets 10px → 51px, place markers 11px → 46px, both clearing the 44px floor, and no page overflows horizontally because the scroll is inside the region. The panel is brought into view on selection — instantly, never smoothly, because panel session 02 refused animation, and not deferred to a frame, because requestAnimationFrame does not fire in a backgrounded tab and a reveal that cannot be tested at call time is a reveal that will not be. Desktop is untouched and it was verified rather than assumed: at 1280px both files keep their original geometry, no scroll region engages, the markers keep their original radius, and the reveal does not fire. aria-live was already on both panels — the defect was never that a screen reader heard nothing, it was that everyone else saw nothing
C-109 08-05 4 THE FINAL AUDIT ASKED WHETHER A STRANGER COULD TRUST THIS, AND FOUND THE PROJECT'S LARGEST PROVENANCE UNMARKED. The closing act's eighth and last pass judged the finished project by four criteria that are not rules — the stranger's read, the inheritor's read, the chair's read of whether the act did what it was asked, and a hostile reader told to find the most damaging TRUE thing it could say. The finding that matters, and all four judges reached it independently: the primary record is an accompanied read, the accompaniment was a large language model, and no page a reader reaches says so. The record is 117 pages of question and answer; the reader's own words are roughly a third of it and the answers — Claude's, across sixteen sessions — are the rest. The site discloses the CONFOUND with unusual care (curve.html: "This is the curve of an accompanied read; an unaided curve would differ in unknowable ways"; /episodes/ refuses the answers as evidence because they are also this project's) and never names WHAT accompanied. One clause on /about/ — "sixteen logged sessions on Claude" — is the only reader-facing mention on the whole site, in a 4,171-word page whose section about the reading is 56 words. The adversary put it exactly: a work built on marking every provenance leaves its own largest provenance unmarked, and against a site that names the licence version of every photograph and discloses a library's accession stamp, the silence is the one thing that reads as managed. Three more, each true and each found by reading bytes rather than the record: (a) the Atlas's first sentence — its most-looked-at surface — read "State 1 · 27 July 2026 · Of 54 slots, 43 hold an image…", a hand-typed date beside four derived numbers, and on the day it named the Atlas held 28 images and one document; it was wrong through four builds and seven audits, and it is this project's single most-logged defect standing in the first line of its most visual artifact; (b) the title fix of C-102/C-108 existed in the generators and had never been RUN against the files — six register PDFs still carried /Creator (Ulysses Project) and all eighteen episode reports printed the retired title on page one, which is C-38's shape (a resolution recorded as performed that was not) inside the audit whose own lesson is that a correction is a change like any other; (c) the closing audit raised a genuine new question for the author — what a contracted image address serves if its clearance is ever withdrawn, where the URL contract's never-withdraw rule meets clause 7's removal remedy — and left it in prose, so the board's derivation could not see it and STATE said "Nothing is waiting on the author" while something was. Two the chair records and does not act on, because they are the author's: /about/ is 93% internal rights memo (the reader's page opening onto the back office), and the log at ~50,000 words is by volume the largest thing the site publishes — 2.9× everything the reader said in eleven days The accompaniment is named where it is load-bearing: a paragraph on /reading/ and a Who answered paragraph on /reading/companion/, each saying plainly that the questions went to Claude, that the answers in the record are the model's, that no pass has verified their factual claims, and that what the project takes from the document is the reader's half — with the reason it matters twice (what gets asked, and by whom it was answered) rather than a bare admission. The Atlas's census date is derived from the newest verification its own provenance carries, and the generator refuses to build if none can be derived — the date now reads 4 August 2026 beside the numbers it belongs to. Every PDF pipeline takes /Creator from data/site.json, the episode kicker with it, the six print sources' titles and descriptions carry the ruled title, all twenty-four generated PDFs were regenerated, and new §11aj reads the delivered bytes of every published PDF and fails on a /Creator that is not the ruled title or on any surviving user-agent — the gate that turns "written" into "shipped". The new author question is on the board as contracted-image-whose-licence-later-fails, unruled, with the collision stated and the tombstone answer named and explicitly NOT adopted (inventing a rule to close a gap is what this project hands up, L-34) — so STATE now derives one open item where it derived none. And two disclosures the byte-verbatim rule permits: both interactive wrapper pages now say, on the page, that the artifact is hard to use on a narrow screen and why, pointing at the written document that is not; and /episodes/ now carries, where the passages are actually read, the concession that an exchange title is this project's own summary and that sixteen of the seventeen warrants rest on titles it wrote — a sentence that previously existed only inside the 50,000-word log
C-108 08-05 4 THE AUDIT AUDITED ITSELF AND FOUND TWENTY DEFECTS IN ITS OWN CORRECTIONS — including a live-verification leg that could never have passed, and the learning about citations broken in the act of applying it. Self audit #1, commissioned as the closing act's seventh pass, put the session's own uncommitted diff to five refuters, one per rule cluster (URL contract, anchors, derived counts, the four-document loop, gate discipline), each with its default set to REFUTED and each reading the bytes rather than the session's account of them. The severity-5: verify-live.mjs's new "the live index shows the same built count as the repo" leg counted >built< across the whole page — 32 grid cells, one per built register — against a data model that says 9 dimensions. It could not have passed on any deploy, and the stopping-state sentence that leaned on it ("an instrument that can tell a failed deploy from a passing one") was never true. The severity-4: the session inserted ~35 lines into log.html and regenerated atlas.html, invalidating published line-offset citations in data/dimensions.json that were accurate at HEAD — L-40 broken by the act of applying L-40, rendered on the public dimension pages beside the L-40 note itself. Four new gates were weaker than their own comments claimed: the stored-tally comparison was disarmed by deleting the tally block (C-44a's resurrection path, closed in §11a that same hour and left open here); §11f traded a false-red for a structural false-green by accepting any claim whose 60-character opening occurred anywhere in the claimed episode; §11ab(d)'s ruled-phrase test matched a sentence-shape the ruling never contained, so the requirement was vacuous the day it was written; rowsOf's global underscore strip was wider than the paired-marker fold it declared, blinding §10 to a stray underscore from the session's own 45-run conversion. Three promises outran the bytes: the URL contract gained an images family no check could see (delete one passthrough line and ~71 contracted addresses 404 on a green build); C-102's Creator fix was held by machinery and gated by nothing, and stamped the author-RETIRED title into eighteen public downloads on the day the editorial pass was scrubbing that title everywhere else; and C-105 claimed each converted artifact declared its italics practice when women.html did not. Plus the record's own arithmetic: C-107's mutation ledger said "Nine" over a ten-label range enumerating eight reasons while HANDOFF said seventeen — an uncertifiable tally inside the row that demotes uncertifiable tallies All twenty closed the same day, each by the pattern the project already owns. verify-live reads the index's own derived status line and is verified to parse 9 against a data model of 9; every offset citation in data/dimensions.json is gone — sixty-five of them, stripped to their region names as a class rather than repaired one by one, because repairing them individually is what produced them; the tally gate requires its fields (an omission may not look like a decision, C-86); §11f decides on the FULL passage with a named-and-reported fallback; §11ab(d) derives the ruled term from whatItDecides's own decision word with an L-31 floor beneath it — and that floor fired red on its first run, which is how the vacuity was proven rather than argued; rowsOf folds paired markers only; new §11ai asserts every contracted Atlas image answers byte-identical to its source; the episode pipeline refuses to write a PDF that still carries a user-agent, and both PDF pipelines take /Creator from data/site.json rather than typing a name; women.html carries its declaration; owner.kind is validated against a closed set so §9/§10 cannot classify by accident; §11e checks the reverse inclusion so an individual frozen address cannot retire either; the mutation ledger is enumerated mutation by mutation with its untested gates named. And the title decision that was only in a session's working notes is now on the recorddata/author-items.json → the title ruling's whatIsNotYetApplied: twenty-seven artifact nav strips keep the short label, recorded as the CHAIR's reading, dated, reversible, never promoted (A10b, C-51), with the panel route named for whoever reopens it. The lesson is the row: a correction is a change like any other, and nothing in this project has ever caught a defect except somebody adversarial reading the bytes afterwards L-41
C-107 08-05 3 The closing audit's QA pass, run against the verification machinery itself, found the checker keeping fourteen of its own promises imperfectly — none live today, every one a door. The commissioned eight-audit closing act's sixth audit read tools/check.mjs and tools/verify-live.mjs with the project's own L-14/L-32/L-36/L-37 lenses, every finding adversarially re-verified before action. What survived refutation: (a) section() had no try/catch, so one thrown exception aborted every later section AND the final verdict; (b) §11a's cap enforcement could be disarmed by deleting one data field while the reader-facing cap sentence kept rendering — C-44a's exact resurrection path; (c) the delegations array was the board's unchecked loose half (L-39's second-order rule found the next instance of itself); (d) §11aa's citation sweep was non-recursive, so every citation under docs/bundle/ went unchecked while the ok line said "across the documents"; (e) §11e's anchor registry was a ruler nothing measured — emptying it, or dropping one file's key, passed green; (f) §9/§10 classified pipeline PDFs by file PRESENCE, so deleting a .print.html silently demoted a register PDF to exempt prior work; (g) §11w implemented three of the four freeze directions its header promised, and derived the sheet set from a prose regex a comma could shrink (C-90's class); (h) §11ab(d) tracked the museum-of-kinds declaration by one wording of one sentence; (i) §11m's named exceptions were prefix-matched and never counted against use; (j) §11ad's held-image test resolved against a regex over the ENTIRE serialized survey, so an image mentioned in a rejection counted as held; (k) the stored positions tally had drifted AGAIN the same day its own _note said it was recomputed (L-40's second-order half, in the block L-40 cites as its applied fix); (l) §5 and §6 asserted universal positives with neither floor nor count; (m) two section labels (6c, 6d) each named two different sections; (n) verify-live.mjs computed the live built count and never asserted it, and could not distinguish a failed deploy from a passing one — every expectation was satisfiable by the PREVIOUS deploy All fourteen closed the same day: section() contains a throw as a named failure and the sections after it still run; §11a gained the floor and the capNote-without-buildCap inversion; quotedAs joined the delegations' required keys; §11aa walks docs/ recursively and cross-checks the two logs against each other; §11e pins a REQUIRED_KEYS list in the checker and refuses an empty registry; §9/§10 classify by the owner declaration and a dimension PDF without a print source fails; §11w gained the fourth direction and a structured sheets field on every sheet-naming survey finding, the prose regex kept as a cross-check that must agree; §11ab(d) reads the generator-stamped data-form-ruling attribute and a phrase drawn from the ruling's own recorded words; §11m matches exceptions on the full quote (bounded tail) and fails any exception that excuses other than exactly one pair; §11ad joins held images structurally from licence-read sheets through the manifest's own region records, the mention-sweep kept as the no-invention cross-check; the positions tally is compared to its own set on every check — the comparison its _note promised; §5/§6 count and floor; the duplicate-id gate relabelled 6e and colour-pairings 6f so every on-record citation keeps its referent; verify-live asserts the live built count and byte-compares two contracted assets against their repo sources, reporting "live is behind the repository" as the distinct state it is. THE MUTATION LEDGER, enumerated so it can be recomputed from this cell rather than trusted — the first version of this sentence said "Nine" over a range of ten labels enumerating eight reasons, and HANDOFF said seventeen: an uncertifiable tally in the row that demotes uncertifiable tallies, caught by this session's own self audit (C-108). Batch one, nine mutations, each red for the reason named before it ran: M1 stale record-coverage.html → §11ah; M2 stale objects-day.html → §11ah via build-diagrams --check; M3 duplicate element id on a walked page → §6e; M4 a passage claiming the wrong episode → §11f; M5 emptied registers.json → §3's floor; M6 emptied dimensions.json → §4's floor; M7 emptied artifacts.json → §6b's floor; M8 an unimported shared-licence symbol → §11ae; M9 an emptied museum harvest → build-diagrams' parse floor. Batch two, seven: M10 a capNote whose type declares no buildCap → §11a's inversion; M12 a delegation without quotedAs → §11ac; M13 a registry key dropped → §11e's REQUIRED_KEYS; M14 a pipeline PDF's print source deleted → §9's declaration rule; M15 the structured sheets field set against its own prose → §11w's cross-check; M16 a stale positions tally → the comparison the file's _note promises; M17 the Atlas's data-form-ruling stamp removed → §11ab(d); M19 sheet 19's licence reading superseded → §11ad's structural join. (M11 and M18 were drafted and merged into their neighbours before running; the labels are left unused rather than renumbered, so no ledger entry silently changes what it names.) Sixteen mutations, sixteen red. What was NOT negative-tested is named rather than implied: §11m's used-exactly-once clause (its red path needs the checker's own EXCEPT map or a quoted-reader surface mutated, and the session declined to mutate the reader's words for a test); §5's and §6's zero-floors and section()'s throw-containment (both require breaking the walk or the filesystem under the checker, and both were verified by reading rather than by running); and the Creator gate in build-episode-reports.mjs (its red path needs a browser that stops emitting a /Creator, which cannot be staged). Batch three, four mutations, all red — the gates the self audit itself added: M20 a contracted Atlas image unpublished → §11ai; M21 the positions tally block deleted outright → the required-field branch; M22 an artifact's owner.kind set outside the closed set → the inventory's classification guard; M23 a single frozen address dropped from a registry array → §11e's reverse inclusion. Twenty mutations across three batches, twenty red, plus §11ab(d)'s L-31 floor firing red on its own first run — a stronger demonstration than a mutation, because nobody staged it
C-106 08-05 3 The closing audit's UX pass: the site's newest surfaces had rebuilt C-34's stranded-arrival shape, and its oldest room was unreachable. Verified findings: (a) the eighteen episode-report PDFs carried dozens of clickable links OUT and their way back only as bare text — zero clickable return in any of the eighteen (C-34's class on the newest generated family); (b) /episodes/ — a contracted front-door room — was reachable from exactly one page on the whole site and absent from every other route; (c) the episodes index offered no way into its own eighteen contracted fragments: a reader met eighteen sections with no route but scrolling; (d) the register sub-pages had no route back to /registers/, and the second entrance's first item (HTML) was the one register that was not a door; (e) the per-section return links in three artifacts promised "the cases / the women / the instruments" and targeted the head strip labelled "Where this sits" — the actual contents navs had no id at all; (f) the dropped dimension's page told its reader the registers were "budgeted, not yet built" — a future the strike forecloses — five lines under "Build status: dropped"; (g) three generated diagram plates and the Atlas's panel idents and empty-slot keylines printed near-blank or vanished on paper (no print rules at all); (h) the URL contract's C-48 block promised the concordance deep-links zero-padded (ep01…ep18) while the PDF, the episodes page's actual links and the checker all carry ep1…ep18 All applied within the rules — additive links and ids only, no new chrome family, no URL changed: the episode-report generator emits its foot line as real links (18 PDFs rebuilt; two clickable back-links verified per file); /dimensions/, /registers/ and every dimension page's footer now name /episodes/ as the day's-side entrance; the episodes index gained a contents nav of eighteen links into its own contracted fragments; the three register sub-pages name their parent and the HTML register's line now opens the dimension index; the three artifacts' contents navs gained ids (the-cases, the-women, the-instruments) and all 65 list-labelled return links retarget to them, #contents left resolving on the head strip; dimension.njk conditions every empty-state sentence on dropped so a struck dimension forecloses rather than promises; all four generators gained print rules (the three diagram plates flip their palette variables to ink-on-paper in one @media print rule; the Atlas keeps its idents and empty-slot keylines in deep ink); and the contract's padded family is corrected in place with the dated note — the padded form appeared in that document alone, so no published link changes
C-105 08-05 3 The closing audit's editorial pass: the record told its reader, in five different places, that finished work was still owed — including the two documents a next session reads first, for the fourth time in the project's history. Verified: (a) HANDOFF's newest section still told the author he owed the board the six rulings he had given that morning; (b) CODE-PROMPT-NEXT sent the next session at the finished plan as "your work" — C-93's class recurring in the file C-93 corrected; (c) the ratified plan document still ORDERED the lifted NLS freeze — the third copy C-93 never reached, in the one file a working session would obey; (d) HANDOFF's phase plan held nine questions "waiting on the author" that were discharged in July, and named dimension 14 building in the present tense; (e) RIGHTS.md clause 7 still declared the institutional-marks question "unruled" ten days after C-76 ruled it, rendered live on /about/; (f) the front door said "It grows, most of it is not built yet", /dimensions/ said "Most of the project is not built yet" beside derived counts reading otherwise, /method/ announced "How this is being made" with "the shape of the presentation still to come", and the former title "Ulysses Project" stood on the front-door h1, the 404 title, the webmanifest name, the public README's masthead, two generated diagram tab-titles and the Reading Log's colophon — all after the author ruled the title; (g) STATE's generator joined "Every warrant is an exchange title" to a count that ranges over two warrant regions (L-39's shape, found in the derived file the handoff says to trust); (h) dimension 16's published inclusion-rule citation ended ".." and cited line offsets into files the same run had shifted (L-40, the practice the run's own learning forbade — and the closing session's own edits had invalidated the reading-log record's offsets the same way); (i) two inventories printed the transcription's underscore italics raw in verbatim 1922 quotation cells, undisclosed; (j) the joint-session index re-labelled seventeen agents as "seventeen voices"; (k) /reading/four-odysseys/ carried a paragraph mangled by the re-founding splice; (l) catches C-29 and C-39 still carried debts as open that were paid the same week they were logged; (m) the anchor ranges "A1–A18" and "A1–A19" stood in three documents, two behind the record Every one corrected the project's way — struck with the correction dated beside it where the surface is a record (A4), rewritten where it is chrome, derived where it could be: the three orientation documents carry their fourth dated corrections; RIGHTS.md's gate paragraph is struck with C-76's ruling quoted; the title now flows from site.title into the h1, 404 and manifest (one ruled string, one source); the generators emit their own tab-titles without the former name; the log's colophon and export string name the ruled title; the state generator quantifies per warrant region; every offset citation in data/dimensions.json cites by region instead — sixty-five of them, stripped as a class by the session's own self audit after it found the session's insertions had invalidated three that were accurate at HEAD (C-108); 45 underscore runs across three inventories set as the italics they mean (<em>, foreign runs language-tagged), each of the three artifacts declaring the practice and its date — women.html's declaration added by the self audit, which found this cell claiming three where the bytes held two (C-108); the substrate's verifier taught the same unrender §11f already used — its first run after the conversion failed eight TRUE quotes on a space the tag-strip inserted, which is why the unrender exists; anchor ranges made range-free so they cannot go stale again. The C-42 lesson underneath, stated once for the class: a status sentence in a hand-written document is a future falsehood however carefully it is written, and the audit found the class ALIVE in five files after four rounds of corrections — prose holds no status this project cannot derive
C-104 08-05 2 The closing audit's compatibility pass: the ratified design was silently degraded or absent on every pre-2021 engine, and one of its own affordances had never worked anywhere it was aimed. Verified, each against MDN/caniuse browser-compat data by an adversarial refuter (three findings corrected in their qualifiers before action — L-17): (a) every logical-property declaration (margin-inline, padding-block, …) is dropped by Safari ≤14.0 / Chrome ≤86, costing the folio its centering, horizontal padding and vertical rhythm; (b) the primary nav relied on flexbox gap, fusing the links into one unbroken string on the same engines; (c) user-select: all — the session-02 copyable-address affordance — has never functioned in ANY Safari, current versions included, because Safari honours only the prefixed form; (d) overflow-wrap: anywhere alone let 76-character addresses force whole-page horizontal scroll in Safari <15.4; (e) inset: 0 in two decks' slide overlays shrink-wraps the plates on pre-14.1/87 engines; (f) all 12 artifact iframes were eager-loaded while the atlas's images lazy-load; (g) the atlas's 43 images carried no intrinsic dimensions, so pre-aspect-ratio engines reserved no space and the lazy-load distance calculation fetched nearly everything at once Applied with the ratified design untouched in every modern engine: one @supports not (margin-inline: auto) block at the stylesheet's foot restores every value in physical terms — a legacy engine reads it, a modern engine never does, and no value in it is a new decision; the nav-gap fallback rides in the same block; -webkit-user-select: all beside both address rules (restoring the affordance in Safari/iOS 16+, honestly scoped — 15 and earlier lack the value even prefixed); overflow-wrap: break-word preceding anywhere; the two decks' inset unpacked to longhands (identical rendering everywhere); loading="lazy" on all twelve iframes in the three generating templates; and the atlas generator emits width/height with the slots' own 3:2 ratio, CSS still governing wherever it is understood
C-103 08-05 4 The closing audit's bug pass: the Atlas's diagram register had been publishing last week's coverage for a week — its own staleness gate existed and NOTHING ran it — and the Reading Log could be permanently bricked by one malformed import. The two severity-4s: (a) record-coverage.html served 28 of 54 slots filled beside an atlas declaring 43 — the artifact's --check mode existed, unwired (L-37's unreachable-gate shape wearing machinery's clothes), and its generator hardcoded episodes 12 and 15 as refused-by-rule after the data had moved to permitted, while missing episode 17, the one slot the rights note actually refuses; (b) the Reading Log's import handler persisted a malformed entry BEFORE rendering it, so render threw on every later visit before the wiring ran — every button dead, the Erase button included, permanently, from one bad file. Also verified: the womens-dublin deck carried three duplicate element ids, so getElementById had its day-plane toggles operating on <desc> elements instead of the marks; four decks' advertised arrow keys went dead the moment focus reached their own Prev/Next/dot controls, while the four-odysseys deck had the inverse defect — a document-wide capture fighting screen readers, the exact pattern its four siblings' comments had corrected; §11f's episode test anchored on the FIRST occurrence of a passage's 60-character opening, able to fail a true claim or pass a false one when an opening recurs; the substrate verifier's header claimed every elision fragment checked while a 12-character floor stood in the code (L-17 in a header); and the two dimension diagrams had no staleness protection of any kind All fixed and gated: refusal in the coverage diagram is derived from the record (decision outcome or the target's own photograph: "refused"), the artifact regenerated to 43 of 54 with episode 17 drawn as the refusal it is; new §11ah runs all three diagram generators' --check on every build, and build-diagrams.mjs gained the check mode plus parse floors that refuse to draw from an empty harvest; the log normalises every entry on both paths in and out of storage, renders before saving, and an already-corrupt store heals on next load (old path proven to throw TypeError on planted corruption in-browser, new path proven to survive with every id-bearing entry); the deck ids renamed apart (dm-*) and every CARDS reference updated, with new §6e failing any served page or HTML artifact carrying a duplicate id; all five decks bind their keys to stage AND control bar (each verified by dispatched keydown in the pane); §11f consults every occurrence and names every episode hit; the substrate's header states the floor and every run reports the skipped-fragment count; §11ae's dead guard deleted; §3/§4/§6b gained zero-floors with counted ok lines. No new learning: every shape here is an instance of L-14, L-17 or L-37, already on the record — the lesson of this row is that the shapes recur, not that they were unnamed
C-102 08-05 3 The closing audit's security pass: the project's most carefully written promise had a side-channel, and the deploy pipeline trusted a mutable tag with the public repo's write key. The author commissioned a full eight-audit closing act ("audit and correct: security, bugs, compatibility, editorial, UX, QA, two self audits") under his recorded 5 August delegations; two swarms of expert finders ran over the repo, the GitHub configuration and the live site, and every finding faced an adversarial refuter whose default was REFUTED before anything was acted on. Security's verified findings: (a) one click out of the Reading Log delivered "the fact that you opened this page" — the exact datum the log's promise forbids — to the destination page's analytics as document.referrer; the promise was worded absolutely and was not true as built (C-37's remedy had contained the tag, not the referrer); (b) deploy.yml ran the ambient GITHUB_TOKEN at repository default through npm ci's 130 dev dependencies and pinned three third-party actions by mutable tag while one of them held the public repo's write-capable deploy key; (c) the eighteen episode PDFs published Edge's full user-agent — the build machine's OS fingerprint — as /Creator metadata, the one pipeline that never normalised it; (d) fetch-atlas.mjs's host guard checked the pre-redirect URL only, so a 30x from the permitted host would have been followed unseen — to maps.nls.uk included, the host the guard exists to refuse; (e) one high-severity build-time-only npm advisory (brace-expansion ≤1.1.17) Fixed within the rules, none of it touching a published URL: <meta name="referrer" content="no-referrer"> in the log artifact and on its dimension page (the promise is now true as built); permissions: contents: read and full-SHA action pins in deploy.yml, tags kept as comments; the episode pipeline normalises /Creator with an escaped-paren-aware walker and all eighteen PDFs are rebuilt clean; the NLS fetch passes redirect: "error" so a redirect dies instead of escaping the guard; the lockfile moved to brace-expansion 1.1.18 (npm audit: zero). Recorded rather than changed, each with its remedy named: the GoatCounter script is third-party and unpinned with same-origin reach (self-hosting at an additive URL is the remedy, but the analytics exception is the author's and its implementation is not the chair's to rewrite); GitHub Pages serves no security headers, so framing cannot be prevented (platform limit, weighed); data/atlas-document-survey.json embeds local Windows account paths in its three method fields (repo private; redact if the audience ever widens)
C-101 08-05 3 The delivery run's own verification swarm refuted six of its surfaces before they shipped, and five of the six were the same defect: a hand-typed line number pointing at bytes the run itself had moved. Five adversarial verifiers ran over everything the autonomous delivery built. What they caught: (a) docs/04-dimensions.md was only partially re-founded — the heading still counted the reported film among the measured works, the carrying sentence still de-mystified a hero nobody here has seen, and the ADD/REMOVE contrast stood as a live finding, all publicly delivered, while a correction inserted earlier had split the four-works markdown table in half (the dated correction was placed between Nolan's row and Joyce's row, so Joyce's row fell out of the table); (b) the Book 22 row's register tally — transaction 5, song 6, martyrology 5, physiology 3, joke or parody 3could not be recomputed from the twenty printed cells (the cells' own recount differs on four of five numbers), an uncertifiable count in the very document whose coding sheet had just demoted one; (c) the print chart's prose still said the film "was plotted at about seventy per cent fidelity" outside any corrected clause; (d) dimension 14's inclusionRuleStatedIn field was truncated mid-sentence with an unclosed parenthesis and a wrong anchor, shipped verbatim on the delivered page; (e) the positions file's summary tally still described the 27 July state (10 positions, 7 documented) beside sixteen records — C-99's shape, a summary lagging the set it summarises, in the same session that corrected the neighbouring field; and (f) a family of citations in data/dimensions.json pointed at line numbers the run's own insertions had shifted — dim 2's anchors named the line the register now opens on, dim 9's named a closing brace, dim 16's claimClassWhy quoted the old four-work claim against a field that now says three. Two verifiers also confirmed the whole build the other way: the register of the unnamed passed with zero findings, and the Book 22 row's twenty passages verified byte-exact with the git sequence proven All six fixed before the commit: the table healed with the correction moved below it and the missing third and fourth corrections added; the tally replaced by the cells' own record with the reason stated (no tally is asserted apart from them, because a count that cannot be recomputed from the printed cells is the class of number the coding sheet above just demoted); the plotted-position wording moved out of standing prose; the truncated field completed; the positions tally recomputed from the positions themselves with the correction noted; and every stale line-number citation replaced with a region name — the section, the field, the box — because a region name survives an insertion and a line number is a coordinate recalled (escalated to L-40). The session-09 transcript, which speaks of nine-of-eighteen as a count, gains a dated editorial headnote on its page wrapper pointing at the demotion, the body untouched — a record that quietly fixes its participants is not a record L-40
C-100 08-04 3 "Butt Bridge is never printed" was false of the sheet, and "not established" at Kildare Street ended on the sixth frame — two bounded negatives had been read as properties of the source. The second looking session, run on the sheets' own IIIF scans for the document layer's acquisition, found the sheet prints "Butt Br." with "(Swivel)" beneath it, on the river between EDEN QUAY and GEORGE'S QUAY beside the loop-line viaduct — episode 16's position record had said the bridge "is never printed" and held the slot not-established on a surveyor's-hedge caution that was right in itself and attached to the wrong bridge: the first frame read this session landed on GEORGE'S DOCK, whose entrance basin has a Swivel Br. of its own, which is likely what the earlier search's frame showed. And a sixth frame at Kildare Street carried KILDARE STREET, KILDARE PL. and SCIENCE & ART INSTITUTIONS — the earlier five-frame search's bounded negative closed exactly as the corroboration ruling's scope predicted: "the search has not got there yet" is not "the source does not do this." Both are L-17's shape — the claim (five frames read, nothing found) true, the qualifier (never printed) wrong — in the file whose whole discipline is that a position is read, never recalled Both positions flipped to documented by NAMING with the old evidence kept and the correction dated beside it (A4), each carrying a refetchable IIIF region of the sheet's own scan as its evidence form — §11ad extended to accept that form beside the z17 tile, because the acquisition frame and the evidence frame being the same bytes is the stronger property. Six further positions established the same way (eps 4, 5, 6, 7, 8, 14 — all on licence-read Sheet 18, the sheet's own lettering quoted for each), the sheet naming Glasnevin's cemetery by its formal name PROSPECT CEMETERY disclosed on the record with the held text's own warrant quoted ("The high railings of Prospect rippled past their gaze.", source line 4724, L-27), and fourteen document regions acquired under the map-region ruling with the C-96(ii) colophon disclosure. Episode 2 stays open on a NEW board item, document-for-an-invented-place, raised from C-95's own note — the school is Joyce's invention, and every answer to what a document slot does about that would invent a rule, so the chair does not resolve it under delegation. The document layer stands at 15 of 18 held, 3 honestly open
C-99 07-28 3 docs/STATE.md told a reader that five items were waiting from the session in which every item is ruled — and the cross-reference written to prevent exactly this was reading only half the board. The What is waiting on a person section opened "5 item(s) only the author can rule, from docs/panel-session-08.md (2026-07-27)". The count was derived and right; the attribution was wrong in both halves. All five of session 08's items were ruled on 27 July, and all five OPEN items were raised at joint session 09 on 28 July. tools/state.mjs printed the board's top-level raisedBy and raisedOn — which describe the items array alone — beside a count taken from items and alsoOnTheBoard. One sentence, two clauses, two different sets, and being derived did not save it: L-22 stops a number going stale and says nothing about a number and a name computed from different denominators. That is L-17 in the file the handoff tells every new session to trust over any prose document, in the section C-89 built for this exact failure, and the cost is specific — a session doing precisely as it is told opens session 08's numbered list and finds every item struck through. Found on a first read of the handoff, by following it. AND UNDERNEATH IT, THE WORSE HALF. §11ac is a cross-reference by design, because a set measured against itself cannot see that it is short (L-36) — and it cross-referenced items one-for-one against raisedBy while alsoOnTheBoard got field-presence checks and an existence test on its raisedIn file. Nothing counted it against anything. That scoping was correct while the loose half held only things raised in a code comment, a learning or a catch, where no list exists to count against; joint session 09 then raised five items in a numbered list of its own and they landed there. So everything actually waiting on the author sat in the unchecked half of the board, and deleting one would have printed greenL-33, the remedy scoped to the array the defect was noticed in rather than to its class, landing on the very section written for L-36 The provenance is computed from the same set as the count. state.mjs derives it from each open item's own source, deduplicated, so the sentence cannot name a session with nothing open, and the zero-open branch says so in words instead of printing an empty list. And the cross-reference is applied to its class. Every alsoOnTheBoard entry whose source document carries a What the author must rule list now records its position in that list (listedN); the positions recorded against a document must be exactly 1..K on the list's own length; and each entry's keyPhrase must appear inside its own numbered item, not anywhere in the file — which matters here, because item 3's phrase also occurs in Atwood's opening three hundred lines below. listedN: null is a recorded decision that an entry is not one of that list's items — the title string followed from item 5's ruling and was never item 6 — and the field is required, so that an omission cannot look like a decision (C-86's shape). §11ac now also fails if STATE does not name every document an open item was raised in. The list parse was bounded to its own section while it was being reused, and that was not cosmetic: the original sliced to end-of-file, harmless only because session 08's list is the last thing in its document, and joint session 09 carries three more numbered lines under What was done the same night — so the unbounded parse reads eight items where the author left five, and a count wrong in the safe direction today is a gate that fails for the wrong reason tomorrow. What this does NOT reach is stated rather than implied: an open entry raised where no such list exists is still checked only for that file existing. 6 of 6 mutations red for the named reason — deleting the board's last session-09 entry, renumbering a position, corrupting a key phrase, removing listedN from an entry whose source carries a list, pointing state.mjs back at the top-level raisedBy, and unbounding the list parse L-39
C-98 07-28 3 Dimension 9's whole argument ends on a quotation, and the dimension showed it nowhere. The concordance closes with "Where Homer settles with an act, Ulysses settles with an account. The book's formula for refusing Homer is We're square." That sentence is the culmination of the project's only Type II dimension and the one dimension that makes an attackable claim rather than reporting a distribution — and neither the artifact nor the dimension record carried the words, the speaker, the episode or the surround. Anchor A19 has two clauses and the second one bites: Joyce's words appear as printed or not at all, AND no dimension may characterise a passage it does not also show. Raised at joint session 09 by SENN, who suspected worse — that the project was quoting ITSELF and had dressed its own gloss in quotation marks, which is the exact failure C-53 and C-57 were about. He was wrong about the project and right about the rule, and the check settled both in one query. The phrase occurs exactly once in the held 1922 text, and it is Bloom's, in episode 15: he lays a half sovereign on the table between Bella and Florry, takes up the poundnote, and says Three times ten. We're square. So the quotation marks were earned — the book's formula for refusing Homer is spoken by an advertisement canvasser paying a brothel bill, which is a better fact than the dimension knew it had. And the passage carries something the dimension had not reckoned with: four lines later Bloom crosses the room and gives the money back — This is yours — so the book's clearest act of squaring an account is undone almost as soon as it is made. The transaction closes the Homeric occasion; it does not close the obligation The passage is shown — in concordance.print.html and in the dimension record — with its speaker, its episode, its stage directions and its surround, and the un-settling four lines later is shown beside it rather than smoothed away (A4: contradictions shown, not resolved). concordance.pdf rebuilt: 38 links, 19 destinations, outline intact. AND THE CHAIR BROKE A19 WHILE FIXING A19. The first version of the inserted passage was typed with a straight apostrophe where the held transcription prints a curly one — We're against We’re — so the quotation restored to satisfy as printed was not, itself, as printed. Caught by verifying the insertion against sources/ulysses-1922-pg4300.txt before commit, which is the C-58 family exactly: three of the reader's sentences once shipped with a comma where the record had a full stop, because careful sentence-writing does that to a quotation. A one-character deviation from Joyce, produced by the act of correcting a deviation from Joyce. Both occurrences now carry the printed character. Worth stating as a limit rather than leaving implied: the substrate's mechanical verification covers the three inventory artifacts' 714 quoted units and does NOT reach the concordance, so this passage is verified by hand and by this catch, not by a gate. A gate over it is real work and is named here rather than claimed
C-97 07-27 3 Two answers to one question, in one repository, and the author's ruling had just made them matter. tools/fetch-atlas.mjs kept its own ACCEPTED and REFUSED licence lists, and they diverged from tools/atlas-licence.mjs's. Every accepted pattern in the fetcher was start-anchored to Commons' terse vocabulary/^cc[ -]?by/, /^public domain$/ — so the National Library of Scotland's per-image tag, Re-use: CC-BY (NLS), was NOT on the accepted list and would have stopped the image; the same string is parsed to family cc-by without complaint by compareLicence, in the same repository, on the same build. That tag is the exact string RIGHTS.md records and the author has now read by hand on three separate sheets. Both lists failed CLOSED, so neither was ever a live risk, and the repository had already written down what they were: "both bite the moment a non-Commons source is added." The author's ruling of 27 July on may-a-map-sheet-be-cropped added one. So this is the rare case of a recorded latent defect reached on schedule rather than discovered in the wreckage — and it was closed before the first NLS fetch rather than during it, which is the only difference that matters One parser, one vocabulary, in the module that already owned it. atlas-licence.mjs gains ACCEPTED_FAMILIES and admissibleLicence(), and the fetcher imports them; its private lists are deleted, not reconciled, because two implementations kept in agreement by care is what this catch is. It is deliberately not a looser regex — anchoring was what made the old list safe, and what replaces it is stronger, since a token set is a condition on what a string CONTAINS and cannot be defeated by a prefix. Refusal still wins over acceptance in every case (C-74). Ten admissibility fixtures run on every build beside the comparison's twenty-three — the NLS tag with and without its trailing stop, Commons' terse form, an NC and an ND wearing the same institutional prefix (the way a bad one would actually arrive), and UVic's "No Known Copyright" and "no known copyright restrictions", which must both be refused because a rights statement is not a licence and clause 7 names that trap. 33 fixtures, 16 of them negative. This is L-33: the defect stated with no filename in it is two implementations of one rule, and the remedy belongs to the class. AND THE FOURTH MUTATION WOULD NOT GO RED, WHICH FOUND SOMETHING WORSE. Deleting admissibleLicence from the fetcher's import list left the self-test AND the full check green — because the call sites live in the fetch path and nothing in this repository executes the fetch path: --self-test returns before it, and npm run check never fetches. A ReferenceError in the one tool that handles other people's licensed material would have surfaced at the next real acquisition, which is the worst possible moment. New section §11ae closes that class structurally: every symbol a tool calls out of the shared module must appear in that tool's own import from it, comments stripped first so the header's own prose cannot satisfy it (L-32). 4 of 4 mutations red for the named reason, the fourth only after the harness's expectation was corrected — it was looking for a ReferenceError and the gate had already turned the build red for a better reason
C-96 07-27 Not an error — the author's last two rulings, and the board closed at nine of nine. "1 — C. 2 — A, scoped." (1) A REGION OF A MAP SHEET IS SELECTING THE DOCUMENT, NOT CROPPING TO FIT THE GRID. RIGHTS.md clause 7's no-crop bullet was written for photographs and still binds every one of them — a share-alike photograph is padded uncropped, which is catch C-77 and stays it. A map sheet is a different object: it covers eight kilometres, a slot renders at a hundred pixels, and the whole sheet was never the document the slot names, any more than the whole of Thom's is the document when the slot names one address on page 1482. Two conditions and both are part of the ruling: the frame is positioned by the map's own content — it must contain the sheet's own lettering naming the place, never be trimmed to make a composition — and the colophon discloses every map frame as a region of a named sheet, because CC BY 4.0 §3(a)(1)(B) requires a modification to be indicated and a caption-free panel cannot indicate anything. (2) CORROBORATION IS ADMISSIBLE WHERE THE SOURCE STRUCTURALLY DOES NOT NAME, scoped. The six-inch sheet renders sand as stipple and letters no strand — a beach is not a street and the convention has no label for one — and Thom's cannot rescue it either, since the survey already records that there is no street-directory entry for the Strand itself. The scope IS the ruling: it does not reach a subject the source does name and a search has not yet found, so episode 9's Kildare Street stays not established after five frames. "The search has not got there yet" is not "the source does not do this" Both written into RIGHTS.md clause 7, which is binding, each with what it does not decide. data/atlas-place-positions.json gains a basis field on every position — naming or corroboration, marked apart because they are different claims (A5) — and episodes 3 and 13 are established by corroboration with three quoted facts: BEACH ROAD printed immediately landward of the stipple at z17/63274/42494, the stipple running unbroken across two further frames read, and the sheet being County Dublin 19, which the document survey held for those episodes before any of this. Seven of ten positions documented: five by naming, two by corroboration. §11ad gates the narrow door and keeps it narrow — corroboration requires the structural-silence statement, at least two recorded facts, and refuses to coexist with lettering that names the place, because if the sheet names it the basis is naming. And a floor over the whole set: if corroboration ever carried as much as naming does, the exception would have become the method, and every individual entry could stay impeccable while established quietly changed meaning. THE NEGATIVE TESTS FOUND A NEAR-VACUOUS CHECK IN THE GATE WRITTEN AN HOUR EARLIER. §11ad's naming test accepted any shared word over three letters, so "TOWNSEND STREET" matched "7 Eccles Street"on the word STREET, which nearly every place in this atlas ends in. The gate was weakest for exactly the class of subject it exists to check, it printed green, and only a mutation caught it. Generic geography is now stripped from both sides before matching, partial readings still match because a label can span a tile boundary, and lettering that is nothing but the word STREET fails outright. 6 of 6 mutations red for the named reason
C-95 07-27 3 The project held a georeference for the SHEETS and none at all for the PLACES, and the gap was invisible because nobody had tried to put a frame anywhere. data/atlas-document-survey.json carries corner coordinates for every County Dublin sheet, straight out of NLS's own WFS index — thirty-five decimal-degree pairs, all of them sheet corners. Every place record in data/substrate.json carries exactly four fields: key, name, src, approximate. No coordinate, anywhere, for any of the eighteen places the Atlas is built around; base document 03 gives a distance from the centre ("~1.5 km from the centre") rather than a position. Both acquisition routes into the document layer — the IIIF region and the S3 mosaic — need a position before a frame can be placed, so the layer was unsourceable and nothing said so, because the tiling plan C-94 struck had never got as far as asking where to point. And the session found it by being wrong in public. It supplied 7 Eccles Street from its own recall, fetched the tile, and looked: Berkeley Road and the Mater Misericordiae — one tile north and one west of the street, wrong by about 180 metres, which is the exact scale at which a caption-free panel asserts this is Bloom's door. A coordinate is the easiest value in this project to produce from nothing and the hardest to notice is wrong, because a wrong one looks precisely like a right one A held table, read off the sheets: data/atlas-place-positions.json, eight places, thirteen tiles looked at. A position is documented only when the SHEET'S OWN LETTERING naming the place was read in that frame and the words are quoted — rule 4(i) applied to a coordinate, and the standard the Thom's page numbers already met. Five documented and three honestly not: Martello Tower (ep 1, first tile), ORMOND QUAY (ep 11, first tile), E BRITAIN ST. (ep 12, second tile), MABBOT STREET (ep 15, second tile), ECCLES STREET (ep 17, third tile). Not established: episode 9, where [F]EDERICK and LEIN[STER] are legible and Kildare Street is not; episode 16, where CUSTOM HOUSE, QUAY and Swivel Br. are legible and Butt Bridge is never printed — the 1879 bridge was a swivel bridge, so the frame is consistent, and a surveyor's hedge is not a clearance; and episode 3, which is the interesting one and became L-38. New section §11ad gates it: a documented position must quote lettering that shares a substantive word with the place it claims, the stored bounds are recomputed from the tile rather than trusted (L-22), a third confidence state is refused (A5), and the tile must be an integer z17 reference so any claim here can be re-fetched and re-checked by anyone. Six of six mutations red for the named reason. Two operational findings worth carrying. A street label can span a tile boundary — LITT[LE] sits in one tile and [LITTL]E BRITAIN ST. in the next, so no single z17 tile holds the whole name, and a published frame must be positioned to contain the LABEL rather than centred on a tile. And none of this is published or cropped: establishing where a place sits is research, and taking a region for a panel is the open board item may-a-map-sheet-be-cropped. The table is built first deliberately, so that ruling is made against a real plan instead of an estimate L-38
C-94 07-27 3 The document layer's acquisition plan was wrong by two orders of magnitude, and the two things that actually block it are not in it. The plan of record — in docs/HANDOFF.md, in data/atlas-document-survey.json and in the session report written an hour earlier — costs a sheet at 759 tiles, about 14 MB and roughly nine minutes, because the NLS IIIF server caps a request at 270,000 output pixels and a whole sheet is 16,664 × 11,708. That cost is real and it is for the wrong thing. A six-inch sheet covers about eight kilometres; a panel slot renders at roughly a hundred CSS pixels. Nobody wants the sheet. What a document slot names is a period document for 7 Eccles Street, and what answers it is the PART of the sheet that place is on — which the IIIF API returns in one request: /x,y,w,h/600,450/0/default.jpg, HTTP 200, 114 KB, tested against Sheet 18. Tiling is needed only for whole-sheet acquisition, which no panel slot wants and no ledger asks for. Then the test disproved the thing it was meant to confirm, twice, which is why it was worth running rather than reasoning about. (a) THE CAP IS A TRADE BETWEEN COVERAGE AND LEGIBILITY. The same 270,000-pixel budget spent on 2,400 × 1,800 of ground returns a frame in which not one street name is readable; spent at 1:1 on 600 × 450 it returns GLENGARIFF PARADE, KEARNEY PARADE, MOUNTJOY PRISON sharp enough to read. Rule 4(i) requires the held record to establish that the frame shows the thing the slot names, and an illegible map names nothing — so the wide frame cannot satisfy the admissibility test at all, and the legible frame shows about two hundred metres of ground. (b) LINEAR LAT/LON INTERPOLATION DOES NOT GEOREFERENCE A SHEET. Aiming at 7 Eccles Street from the WFS feature's own bounding box put the frame on Mountjoy Prison, several hundred metres out. The sheets are drawn on the Irish grid and NLS reproject the index to EPSG:27700; interpolating across a lat/lon bbox of a projected sheet is wrong by construction, and the survey's own route note already records that a CQL point-in-polygon test in lat/lon returns zero features for the same reason. A crop positioned this way would assert this is 7 Eccles Street from arithmetic that demonstrably missed — which is rule 4(i) failed, in the layer where no caption can correct it The plan is corrected before a byte was acquired, and both blockers are named rather than routed around. The tiling cost is struck: a document slot is one request. What replaces it as the real work is a georeference — the sheet's own corner coordinates in the projection it was drawn in, not a bbox interpolation — without which no frame can be placed and rule 4(i) cannot be met. And the rights question goes to the author, as may-a-map-sheet-be-cropped on the board: RIGHTS.md clause 7 says do not crop share-alike images to fit the grid, the NLS sheets are CC-BY rather than CC-BY-SA so the share-alike prominence condition does not bite, and the clause's second half carries no licence qualifier. There is a real argument that taking the part of a map showing the place is selecting the document rather than cropping to fit a grid — the whole sheet was never the document the slot names — and that argument may well be right. It is not a session's to make. Catch C-77 is precisely what happened when a chair reasoned about this clause alone and shipped a live breach for an hour, and L-34's instruction when a rule's words and its purpose diverge is to fail closed and hand it up. Nothing is fetched from NLS until that is ruled. Recorded plainly: the session that wrote the 759-tile figure into a report is the session that disproved it forty minutes later, by running one request instead of quoting the number again
C-93 07-27 3 The two documents a new session is told to read FIRST were both sending it at work that is finished — one of them for the third time in its own history. docs/CODE-PROMPT-NEXT.md step 5 read "NLS is frozen: its site now returns HTTP 405 to any tool, so the per-image licence tag cannot be re-read, and nothing is sourced from it until a person opens the sheet's view page and reads the box." The author read that box on 26 July (C-75) and read the two remaining sheets on 27 July, so the freeze had been lifted for a day and the instruction still stood. The same file's steps 1 to 4 describe the episodes plan as work, and it shipped on 25 July. And this file carries, on its own first page, the sentence "was pointing the next session at finished work — catch C-42's exact shape, in the document" — a note about the last time it did this, sitting eleven lines above the paragraph doing it again. docs/HANDOFF.md had the smaller half: "the one that blocks the remaining build work is item 4", written in the same session in which the author then ruled item 4. This is C-42's family and its most exact instance yet, because the freeze is precisely the kind of claim the project already decided prose cannot hold: §11w derives it into every document slot's outstanding list and fails the build in both directions, and the derived surfaces were all correct throughout. Only the two hand-written documents lied, and they are the two a session reads before it reads anything derived Both corrected with the correction shown beside the struck sentence and dated (A4), never swapped out. CODE-PROMPT-NEXT now says what it is for in terms — nothing here should be read as a status; npm run check derives every position into docs/STATE.md and fails if it drifts; this file describes the SHAPE of the work — which is the only durable answer, because a status sentence in a hand-written document is a future falsehood however carefully it is written today (L-22). HANDOFF's paragraph is replaced by what the rulings actually did to the work, one line each, plus the thing a next session genuinely needs and could not get from a derived file: the six episodes — 5, 6, 7, 10, 14, 18 — that hold no document address at all, and the ungated acquisition route with its real cost (759 tiles, ~14 MB, ~9 minutes a sheet). Worth stating plainly: no gate could have caught either sentence. §11aa cross-checks catch citations, §11n gates the dimension records' prose, §11w gates the freeze in the derived data — and none of them reads the two documents whose whole job is to orient a human being. That is the residue C-42 has never fully closed, and naming it is the only honest thing to do with it
C-92 07-27 Not an error — the author's ruling on the Atlas's form, applied; and the fix is that seventeen sentences changed and no picture did. Catch C-84 had found that the object layer holds class exemplars — a United States National Archives letter in the slot named Mr Deasy's foot-and-mouth letter, an 1890 St Louis advertisement for the Agendath Netaim flyer, Manet's Basket of Fruit for Boylan's — and disclosed it on all seventeen while explicitly not acting, because rule 4(i) run backwards refuses every one of them and acting would empty the Atlas from twenty-eight pictures to eleven. The question underneath was never a rules question: is this a museum of the day's OBJECTS or of their KINDS? The author ruled KINDS. What that changes is the DESCRIPTION, not the collection: the seventeen slots are keyed to the thing the book names and show a member of its kind, which is what they always did — and rule 4(i) is now satisfied on its own terms rather than suspended, because the slot names a kind and the frame shows a member of it. The test did not yield; what the slots name changed, and only the author could change it. The alternative was destroying twenty-eight pictures to correct seventeen sentences The seventeen fitCaveat strings are rewritten from an apology for a defect into the description of the form, uniformly — which is what keeps them a colophon rather than a caption that has moved house (build panel session 07, Q5). Rewritten by exact string replacement against the strings taken FROM the file, never retyped and never by round-tripping the JSON, because that is the C-08/C-16/C-18 family. objectLayerStanding carries the ruling with what it does not decide — it reaches the object layer alone, and the place layer's rule 4(i) is untouched and has already refused frames under it. Dimension 14's unit and claim say it in the language a first reader gets, and the artifact declares it above the panels. New in §11ab(d), asserted in BOTH directions: with a ruling on record no cleared object slot may still call itself a defect, and without one the page may not declare a form nobody decided (C-51). Two things the negative tests caught in the gate itself. The structural check that dimension 14's unit must name the manifest's own layer keys fired on the reworded sentence — correctly, because the layer is still keyed object, so the field now names the key and what it holds. And the first draft of the declaration test searched the whole page and passed on the seventeen caveats, so deleting the lede's declaration left the build green: the disclosure satisfying the test for the declaration, which is L-32's shape in new clothes. The test now reads only the bytes above the panels, because a form stated only in a colophon is a form the reader meets after the pictures have already claimed otherwise. 4 of 4 mutations red for the named reason, two of them rewritten after the first attempts changed bytes without removing the property
C-91 07-27 Not an error — the author's six rulings, logged, and the board that carried them doing its job on the day it was built. He read the two remaining Ordnance Survey sheets by hand and ruled every open item with one sentence: "For othersT you're recommendations are accepted." Quoted as sent, slip included — the discipline anchor A6 sets for the reader's words, applied to the author's rulings — and recorded as an ACCEPTANCE, so each entry carries the recommendation that supplies the substance, which is the C-64 pattern: he ratified sentences, not artifacts. (1) UVic's "No Known Copyright" — a rights statement is not a licence and cannot clear a file on its own, and it does not block a file whose underlying work is public domain on its own established grounds. That separates the INSTITUTION'S STATEMENT (clears nothing) from the UNDERLYING WORK'S STATUS (what a clearance rests on), keeps the NLI Flickr refusal standing for the right reason — those images had no public-domain tag of any kind — and lifts the last gate on the document layer. (2) The Atlas is a museum of KINDS, declared rather than assumed; rule 4(i) then passes on its own terms over seventeen object slots instead of being suspended over them, and C-84's disclosure becomes the statement of the form. (3) Anchor A10 is SPLIT into A10a (the reading's n = 1, in the document's own voice) and A10b (a made object names whoever arranged it; a chair's selection is recorded as the chair's, dated and reversible, never promoted). (4) Episode 8's place slot stands — the fixed reach of rule 3 refused the Duke Street frame and the panel carries half its named subject, recorded rather than smoothed. (5) The document route is RULED — the Ordnance Survey sheet by default, Thom's only where the panel's point is an address rather than a location (episode 17, where 7 Eccles Street is demolished and "7 Vacant, 28l." is the honest element). That one was on no session's board at all: it had been waiting inside a comment in derive-atlas-targets.mjs reading "this one is genuinely unruled and is the author's", which is precisely the place a board item goes to die, and it surfaced only because C-89's record forced the question of what else was waiting. (6) The project names its apparatus in its title — the FORM is ruled; the string is not, and is held with three drafts and the chair's preference marked as the chair's All six recorded in data/author-items.json with status derived — five session items and, kept deliberately apart, two entries no session raised, because a set that can absorb new members is a set that can quietly lose one (L-36). Applied where they bite: RIGHTS.md clause 7 gains the rights-statement bullet as binding; docs/04-dimensions.md carries A10a and A10b with the original struck rather than deleted (A4) and A10b's reach set to extend-as-touched, as A19's was; derive-atlas-targets.mjs allocates a route per slot instead of reporting an open question, derived from the ruling's own sentence so a slot that changes its subject changes its route with it. And one field was written false and corrected before it shipped: author item 1's appliedIn named three files the ruling had not reached, because the ruling was recorded in the same minute as the intention to apply it. It now says RULED AND NOT YET APPLIED and lists what remains. C-38 recorded its own fix in a commit that touched neither file it named, and C-42 is what that cost the next session; a resolution field is a claim like any other
C-90 07-27 3 "The Atlas would draw on ten sheets ... nothing here clears the other nine" — and it draws on three. The limit travelled with the NLS licence reading, in data/atlas-document-survey.json and rendered into docs/STATE.md and every document slot's outstanding list, and its whole job was to say exactly how far one reading reaches. It counted the ten episode-slots an Ordnance Survey sheet is held for and called them sheets. The survey's own findings resolve those ten slots to three distinct sheets — County Dublin 18, 19 and 23 — and the count is derivable from the file the sentence sits in, so it should never have been typed (L-22). The error overstated the remaining work by a factor of four and a half, and it did it in the one place a reader looks to find out how much is left; on the strength of it the author was about to be asked for nine readings when two would do. It is L-17 in the sentence written to prevent L-17 — the claim true (the tag IS per image, one reading DOES clear one sheet) and the qualifier wrong. Found by deriving the sheet set in order to hand the author his links, rather than by reading the limit. Two structural faults sat underneath it. (a) The licence readings carried no sheet field at all, so nothing could have checked the claim: a reading floating free of its sheet is what let "ten sheets, nine unread" be written about three. (b) §11w required at most one reading current, which was right only while the project believed there was such a thing as "the" NLS licence line. There is not — the tag is per image, as the record said in its own limits — so the moment the author read Sheets 19 and 23 the correct state would have failed the build. The rule was wrong, not the data Every reading now names its sheet, and it is required: a reading without one fails. Currency is per sheet — at most one current reading for a given sheet, so "the current tag" means something. §11w now derives the set of sheets the Atlas draws on from the survey's own findings and fails if any lacks a current reading, so the count can never again be typed or drift; it reports "3 sheet(s), 18, 19, 23" rather than a number somebody wrote down. derive-atlas-targets.mjs gives each slot its own sheet's reading instead of the last one in the file — harmless while there was one, wrong the moment there were three — and a slot spanning two sheets cites both. The false limit is corrected in place with its date and the arithmetic that was wrong rather than swapped out (A4). And the fix broke a detector that was tracking a phrase: §11w found slots carrying a reading by matching "licence tag was re-read by hand", and naming each slot's own sheet put four words in the middle of it — 0 of 10 slots, on a build where every slot carried one. It now matches the FACT, a reading named by ISO date, rather than the sentence's wording
C-89 07-27 3 docs/STATE.md answered "what is waiting on a person" with zero, and five things were waiting. The handoff tells every new session to trust STATE.md over any prose document, including the author's own. Its What is waiting on a person section opened with "0 question(s) recorded in the manifest and unruled" — literally true and honestly scoped, because it counts the Atlas manifest's own slot-level questions. Meanwhile five items only the author can rule — the form of the Atlas (objects or kinds), anchor A10, episode 8's place slot, UVic's "No Known Copyright", and what the project calls itself — existed in exactly one place: the numbered list at the end of docs/panel-session-08.md. Two true sentences, and between them a reader of the file this project says to trust learned that nothing waited. It is not the C-82 shape (a false sentence) but its quieter neighbour: a scoped answer standing where an unscoped question was asked. And the material was in prose, which is the one form this project has ruled it cannot keep true (C-42, L-22) — the board was a paragraph in a session record, findable only by a session that read the right panel document in the right order. The fourth of the five is the blocking item for the only substantial build work left, and nothing derived said so The board is a record: data/author-items.json, with status DERIVED. An item is open while it carries no ruling, and a ruling must carry a date, the author's own words, and where it is applied — three things prose cannot fake into existence, which is C-71(c)'s remedy applied to the project's own board instead of to the Atlas's. tools/state.mjs renders the open items as a table naming what each one blocks, and the manifest's slot-level count keeps its place with the scope it always had, now stated: that count is not the board. New checker section §11ac is a CROSS-REFERENCE, and that is the design rather than a detail: the record is checked against docs/panel-session-08.md, the document that raised the items, each by a key phrase it must contain, and the session document's own numbered list may not be longer than the board. An integrity check that measures a set against itself cannot see that the set is short (L-36) — counting the items, validating their schema, or round-tripping them all pass a board missing its last two. Five of five mutations red for the named reason, including the one that matters, deleting the board's last item; and the fifth had to be rewritten because the first attempt flipped a ternary whose else-branch printed the same question, changing bytes and removing nothing
C-88 07-27 3 The Atlas credited its own arrangement to the reader, and the reader did not make it. Anchor A10 requires n = 1 to be stated in the document's own voice rather than in a footnote, and the artifact did carry an n = 1 caveat — which read "this atlas is built from one reader's first cover-to-cover reading of the book … and the arrangement is that reader's." It is not that reader's. The author read the book and picked six place SUBJECTS; the chair of the build chose the FRAMES, and data/atlas-place-image-choices.json records that five of the ten place frames on the page were chosen by the chair with no ratified rule reaching them at all, two more by the chair applying a rule the author ratified, and only three admitted by the author's own ratified rules. So the one caveat written to keep the project honest about its singularity was promoting the chair's preference to the author's — catch C-51's defect, in the sentence least likely to be re-read, and on the surface where a reader meets it. Both bodies at the joint session of 27 July had agreed the Atlas must name the chair; the session recorded the agreement and nothing on the page changed. Found by grepping the built artifact for the word chair: it appeared once in the whole file, inside episode 7's refusal text, and nowhere in the caveats The caveat is rewritten and derived: it states how many place frames were the chair's own, how many the chair decided by applying a ratified rule, and how many the author's ratified rules admitted, every figure computed from the choice record rather than typed (L-22). The withdrawn sentence is disclosed with its date beside the correction rather than swapped out (A4). The generator refuses to publish the sentence at all unless its arithmetic closes — a place frame reached a panel either through the image-choice record or through the author's ratified rules, and a negative or unbalanced term means a third route exists that the caveat does not describe, which may not be rounded away. New checker section §11ab(c) reads the DELIVERED bytes and fails if the caveat stops naming the hand, or if its numbers drift from the decisions they describe, in both directions. What is NOT decided here: whether A10 should be amended or split — that is build panel session 08's author item 2 and stays the author's. Applying an anchor as written is not amending it, and withholding compliance until an amendment is settled would be the wrong way round
C-87 07-27 3 Catch C-85's gate could not fail, because two string fallbacks stood in front of it — and one row of twenty-six was still a placeholder. C-85 had found twenty-one rows of the Atlas's "What is missing, and why" table reading "this slot is not yet sourced" under a lede promising every absence has a reason, wired the generator to the reasons that already existed in the derived data, and gated it: if no reason can be derived for an empty slot, the build fails. That gate was unreachable. Two terminal string literals sat at the end of the same expression, and between them they could not both be skipped — so why was never null, the gate never fired, and episode 17's place row shipped "the place is settled by base document 03 and no photograph of it has been surveyed yet." True in its words and wrong in its qualifier (L-17): nothing was surveyed, but "yet" tells a reader the slot is awaiting work, when data/atlas-targets.json carries photograph: "refused" for it with the reason — 7 Eccles Street was demolished in 1967, and RIGHTS.md clause 7 rules the slot to a document instead. tools/build-atlas.mjs mentioned photographRefusedBecause zero times and carriesInstead zero times, though apply-place-choices.mjs reads the first of them. So the one row of twenty-six that miscategorised a finding as a to-do was the one whose refusal is written into the project's own binding rights note — and in a table whose lede says "an empty slot is a fact about the record, not a gap in the work", that row said the opposite of the lede. It had also propagated out of the repository: the author's own handoff prompt describes the place layer as "complete except one unexamined slot", which is this row inherited (C-71(d)'s shape). With it read correctly the place layer has no unexamined slot — ten filled, and eight disposed of by ratified rule, by the author's rulings of absence, or by exhausted search The reason chain now reads the refusal, and both fallbacks are deleted rather than improved, so C-85's gate is reachable and fires: negative-tested by removing photographRefusedBecause from the derivation, regenerating, and watching the build refuse to write the artifact, naming episode 17 and the layer. New checker section §11ab(b) is the delivery-side backstop (L-35), reading the bytes served rather than the data they came from, and refusing the placeholder FAMILY by shape — including by name the two strings this artifact actually shipped. And the first draft of that gate was wrong in the opposite direction and is worth recording: written as a POSITIVE test — every reason must cite a rule, a catch, a date or base document 03 — it failed nine sound rows on its first run, among them the document layer's own derived openBecause, "the document follows the place, and this episode's place is not settled", which C-85 had ratified as the true thing the placeholders were hiding. A gate that refuses the project's honest prose is the same defect as one that passes on its confession (L-32), and it took one run to produce. Escalated to L-37 L-37
C-86 07-27 4 The published Atlas told a reader, nine times, that a question the author had ruled the day before "is unruled" — and the same page disclosed the marks UNDER that ruling twenty lines away. data/atlas-document-survey.json's current NLS licence reading carried a stored field, whatItDoesNotUnfreeze, asserting "The document layer is still gated by the institutional-marks question (catch C-72, learning L-34), which is unruled and which reaches every institutional scan." The author ruled that question on 26 July 2026 (C-76) — "We have to accept limitations and mention them where needed and continue" — one day before, and the ruling is recorded in the manifest as institutionalMarksRuling, quoted in RIGHTS.md, and derived into docs/STATE.md as RULED. The stored sentence travelled through derive-atlas-targets.mjs into every document slot's outstanding list and onto nine document rows of atlas.html, byte-identical in _site, live. So two published surfaces of the same project contradicted each other and the artifact was the one a reader meets — while the artifact's own colophon printed the ruling's date and the author's words in the section disclosing the Wellcome stamp. This is catch C-82(a) exactly, one file over. C-82 found the identical defect — a sentence about whether a question is open, hardcoded inside the generator built to stop prose going stale — in tools/state.mjs, fixed it there, and the class was never swept; derive-atlas-targets.mjs carried a second, armed copy of the same false sentence as a ?? fallback, so deleting the data field alone would have kept printing it. That is learning L-33, and the sweep it asks for is what found this: a sentence about whether a question is open is being stored rather than computed — answered mechanically across tools/, where this was the last instance The clause is COMPUTED from the manifest's own ruling record and the field is ABOLISHED, not corrected. institutionalMarksClause() builds the sentence out of the ruling's date and the author's words, or out of their absence — so no prose can satisfy it, which is L-32's structural test rather than a lexical one. Whether the marks question is open was never a fact about a licence reading in the first place, and a field that can hold a claim about an open question will hold a stale one again, so there is no field: the reading now carries a dated correction disclosing what it used to assert (A4). New checker section §11ab(a) refuses the whole class by shape — any *Unfreeze field on a licence reading fails the build — and asserts the delivered clause against the ruling record in both directions: with a ruling on record the clause must carry its date and quote the author verbatim and may not call the question unruled; with none, it must announce the gate. Floors on both, because a clause the parser never finds would print green. Three of the eight mutations run for this session target this section and all three went red for the named reason, including the one that matters — restoring the stored field — and the one that regenerates from a re-poisoned generator L-33
C-85 07-27 3 Twenty-one of twenty-six rows in a table titled "What is missing, and why" gave no why, under a lede promising in terms that "every absence has a reason and every reason is in the colophon." They read this slot is not yet sourcedthe absence restated in the past tense, wearing the costume of an explanation. Five rows carried real reasons and were good: they cited the ratified rule, the catch and the author's ruling by date. The other twenty-one were a placeholder, and a placeholder that fills the shape of an answer is worse than a blank, because a blank cannot be mistaken for one. Found by the joint session of 27 July, by an advisor who grepped the artifact instead of trusting its own sentence — the same move, by the other body, that caught the stale brief in session 07 and the raw markdown an hour earlier. The root cause was named by a master before the build proved it: tools/build-atlas.mjs reads data/atlas-place-choices.json — the record of which SUBJECT the author picked — and never opened data/atlas-place-image-choices.json, the record of which photograph carries a subject and why one was refused. So every refusal's reasoning sat in a file the artifact could not see, and the artifact printed a placeholder over it. It never opened the 25 July survey's own rulings either, which hold the only statement of why episodes 12 and 15 are empty The reasons were in the derived data the whole time and the generator was not reading them. It now reads all three sources: the image-choice decisions with their rule tokens (refused by rule 4(i), refused by rule 4(ii)), the 25 July survey's ratified-rule rulings for episodes 12 and 15, and — for the document layer — atlas-targets.json's own openBecause, which says the true thing a placeholder was hiding: "the document follows the place, and this episode's place is not settled." 21 placeholders to 0, every row now carrying the reason that already existed. And the fix is gated by construction rather than by a section: if no reason can be derived for an empty slot the BUILD FAILS, naming the episode and the layer, so the artifact cannot print an unexplained hole in a table that promises explanations. It fired four times on its first run and each firing was a real gap — which is how the missing wiring was found
C-84 07-27 4 The object layer shows CLASS EXEMPLARS, and seventeen panels never said so. Found at the joint session of 27 July by an advisor who opened artifacts/atlas-of-one-day/atlas.html and read all 580 lines rather than the data model. Verified against the manifest before anything was touched. Episode 2's slot names "Mr Deasy's foot-and-mouth letter" and holds a United States National Archives letter about grazing Santa Clara cattle on the Jemez Forest Reserve. Episode 4's names "the Agendath Netaim flyer" and holds an 1890 St Louis advertisement for farms in Arkansas, Illinois and Arizona. Episode 5's "the Freeman's Journal, Bloom's copy" holds the Irish Independent, first issue, 1905. Episode 10's "Boylan's fruit basket" holds Manet's painting Basket of Fruit. Episode 14's "Stephen's wages, three pounds twelve" holds an Edward VII sovereign. A letter for a letter, an advertisement for an advertisement, a painting of fruit for a basket of it. Seventeen object slots cleared and NOT ONE carried a caveat, while all ten place slots do. In a caption-free panel whose fixed order tells a reader that the first slot is the object, POSITION ASSERTS IDENTITY — the panel says "this is Mr Deasy's letter" without writing it, which is the 7 Eccles Street failure the place layer refuses by ratified rule four times over, applied to seventeen slots nobody examined. AND IT EXPLAINS THE NUMBER THE PROJECT HAD BEEN READING WRONG. Objects 17 of 18, places 10, documents 1 — published six hours earlier in the Atlas's own shows field as a finding about who keeps what. The seventeen measures how easy a stand-in is to find, not an object. The three layers were never admitted on the same terms DISCLOSED, NOT DECIDED, and the distinction is the whole of it. All seventeen cleared object slots now carry the caveat, and it appears seventeen times on the page: a class exemplar, not the object itself. The shows field is corrected with the correction shown (A4). A standing record at objectLayerStanding in the manifest states the finding, what it explains, and what it raises. Rule 4(i) — identification, adopted the same morning — run backwards over the object layer as build panel session 07 required for the place layer, REFUSES ALL SEVENTEEN: a National Archives letter is not Mr Deasy's letter. That is recorded and not acted on, because acting on it empties the Atlas from twenty-eight pictures to eleven, and because the question underneath is not a rules question. Is this a museum of the day's OBJECTS or of their KINDS? The second is defensible and arguably Warburgian — Mnemosyne juxtaposed types, not relics — but it is a different work from the one the slot names describe, and it has never been declared. The chair does not settle the form of a made object by fiat at the end of a long night. It is the author's, and it is the first item of docs/panel-session-08.md's author list
C-83 07-27 3 The Atlas could say which ratified rule refused which photograph, and could not say what it was for. Every dimension record carries claim and shows — two plain sentences, in the language of someone who has read the book once, telling an ordinary reader what the thing argues and what it found. They are the only two fields on a dimension page written for a reader rather than for the record. The Atlas, the project's ninth built dimension, shipped with both null — the only built dimension of nine with neither — while eighty catches, thirty-four learnings and forty-odd checker sections had been written about it. The project could state, per slot and per rule, why episode 12's frame was refused and episode 9's admitted, and had no sentence saying why a reader should look at any of it. That is Kiberd's standing objection — the drift toward the academy — evidenced in one data row rather than asserted, and he named it at the joint session of 27 July before the tree confirmed it Both written, in the register the other eight built dimensions already use. The shows field took Saramago's reading from round one, because it was the best thing said in the session — "a day can be reassembled from its objects by anyone, and from its documents only by an institution" — and that sentence had to be corrected the same night by catch C-84, which found the object layer's seventeen measures how easy a STAND-IN is to find rather than an object. The correction is shown, not swapped (A4): the beautiful reading rested on a false premise, and the premise is the more interesting fact. The artifact also publishes its own DEPTH now, derived: "0 of 18 panels hold all three layers; 10 hold two, 8 hold one." Twenty-eight of fifty-four slots is a true number that hides what a reader of an atlas most needs — this form works by juxtaposition, and a panel with one picture juxtaposes nothing. New section §11z fails the build when a built or building dimension leaves claim or shows empty, or fills either with a label under eighty characters. There is no way to satisfy it by machinery, which is the point: it can only be answered by writing two sentences a stranger could use. Negative-tested by emptying the field and watching the build go red
C-82 07-27 4 Three claims about the Atlas were false on the day they were written, and one of them was in docs/STATE.md — the file the handoff tells every new session to trust over any other document, including the author's own. All three found by the joint session of 27 July, all three verified against the working tree before being touched. (a) THE DERIVED STATE PUBLISHED A RULING AS UNRULED. docs/STATE.md read "The document layer is still gated… The institutional-marks question is unruled" — and the author had ruled it on 26 July (C-76), a ruling this same session recorded, quoted and applied to episode 17. The sentence was hardcoded inside tools/state.mjs, in the branch that fires whenever an NLS reading exists, so no amount of correct data could dislodge it. That is C-42's exact shape inside the tool built to prevent C-42, and it is worse than C-42 was: C-38's stale sentences lived in prose documents, and this one lived in the generator whose whole purpose is that prose cannot go stale. (b) THE ATLAS's LEDE CONTRADICTED ITSELF IN ONE BREATH: "each holding up to three slots, always three." Build panel session 07 ruled the phrase "up to three" out and the chair reported it deleted; the replacement had been inserted beside it rather than over it, so the page carried both halves for a day — L-29's shape, a fix scoped to the string the grep found rather than to the claim. (c) THE unit FIELD CLAIMED AN OPERATION NO PANEL PERFORMS. It read "each juxtaposing three layers", present tense, on the dimension's own published page — and zero of eighteen panels juxtapose three. Ten carry two, eight carry one. This is the field catch C-59 already corrected once for undercounting by a layer; it then overclaimed in the other direction, which is L-17 read twice from opposite sides — the claim right, the qualifier wrong, then the qualifier right and the claim wrong (a) The gate line is derived from institutionalMarksRuling in the manifest: when a ruling exists STATE prints it with its date and the author's own words; when none exists it prints the freeze. A sentence about whether a question is open is a sentence a build can compute, so it computes it. (b) The lede now reads "each carrying three slots in one fixed order… whether or not a picture has been found for them"a slot is not a picture, and saying so is the whole distinction the drawn keylines exist to make. (c) The unit is corrected with both corrections shown (A4): it describes the FORM, which is fixed at three slots, and the coverage is derived onto the artifact and into STATE rather than asserted in a field that changes with every acquisition. AND THE GATE ADDED AN HOUR EARLIER CAUGHT THE FIX ITSELF. Correcting the unit put four new asterisks on /dimensions/index.html, because §11y had been written the same session and the index template renders unit too — the chair had fixed dimension.njk and not index.njk. The build went red on its author within one command. That is the difference between a gate and a good intention, and it is the argument for adding the gate in the same session as the defect rather than the session after
C-81 07-27 3 Nine dimension pages were shipping literal asterisks at the reader, and had been for as long as the fields existed. The dimension records' prose fields — note, confidence, unit, sources — have always been written in markdown, because they are read and edited as prose, and site/dimensions/dimension.njk printed them raw. Fifty-two literal asterisks across nine published pages, verified on the live site with a cache-busted read before anything was touched. The worst was four-odysseys' confidence field with twenty-six of them — which is the most careful rights-and-verification prose in the project, the field that separates High from Partial claim by claim after catch C-30 withdrew two figures, rendering as asterisk soup. Twelve of the fifty-two were written the same night, by the session that added dimension 14's note — a note about honesty, printed unfinished. It survived because nothing looked. The checker verified that rendered DOCUMENT text matches its source, that 1131 internal links resolve, that every declared colour pairing meets its floor, that no page carries a stray styling vector — and never that the bytes a reader actually receives are finished prose. That is L-14's shape one level out: not a check passing vacuously, but a property nobody thought to assert at all. Found by the joint session of 27 July, by a master who read the BUILT TREE rather than the data model — the same move that caught the stale brief in session 07, made by the other body A prose filter, INLINE ONLY, and a gate over the whole site. eleventy.config.js gains prose, which runs a field through markdown-it's renderInline — so bold, italic, code and links render, and a data field cannot grow headings, lists or paragraphs and quietly become a document. The four fields in dimension.njk now pass through it. A field that wants a heading wants to be a document, and documents go through renderdoc. New section §11y fails the build on ** anywhere in a walked page outside <code> and <pre>, where a literal asterisk is legitimate content. It was run across every page BEFORE being added and came back zero, so it enforces a state the site actually holds rather than an ambition — which is the difference between a gate and a wish. Negative-tested: reverting one field to raw turned the build red naming three pages, and restoring it turned it green. 52 to 0, verified in the built tree and then live L-35
C-80 07-27 2 The Atlas shipped weighing 23 MB, on a site whose whole claim is that it is static, zero-dependence and light — and three place slots were still standing on a preference rather than a rule. (a) tools/fetch-atlas.mjs asked Commons for 1600px thumbnails. A panel slot renders at roughly a hundred CSS pixels, so that was about sixteen times oversampled at 1x and five times at 3x — and on a PNG source Commons renders a PNG thumbnail, which for a photograph is enormous: one object plate alone was 9.7 MB of a 23 MB page. Named in the artifact's own caveats when it shipped and not fixed, which is C-29's pattern — a debt made visible rather than paid. (b) Episodes 1, 2 and 3+13 had cleared photographs and a chair's preference from the 25 July survey that was never promoted, because no ratified rule reached them (C-64). A preference is not a decision, and three slots sitting on one is three slots nobody can check (a) The width is a named constant at 800 with its reasoning beside it, and the reasoning is the rights-neutral half: scaling is not cropping. RIGHTS.md clause 7 forbids CROPPING share-alike images to fit the grid — a crop discards frame — and says nothing against a smaller derivative, because a scale keeps the whole of it. The 600px floor tests the ORIGINAL's width and not the thumbnail, so asking for less does not weaken the quality gate. Every image re-fetched: 23.0 MB across 25 files became 8.5 MB across 28, a 63% cut while adding three pictures. Commons rate-limited the bulk re-fetch repeatedly and the tool's own backoff carried it across paced rounds — that is the fetcher being a good citizen of someone else's server, which is what it was written to be, not a defect. (b) Rule 4 exists now, so the three are decided by rule instead of by eye. Episode 1: the whole-tower frame is the better picture and is REFUSED, because its lower third carries the museum's plaque, which supplies the book's own identification — the partial view ships instead, every visible surface 1804 fabric. The 25 July preference and the rule reached the same answer, which is said plainly rather than left to look like confirmation: same answer, different authority, and it is the authority that is now on the record. Episode 2: REFUSED at rule 4(i) and it cannot be filled by searching harder — Mr Deasy's school is Joyce's invention and the survey proved by text search and an 800-metre geosearch that nothing depicting it exists. That is the honest kind of empty: not unfinished sourcing, but a place that does not exist to be photographed. Episodes 3 and 13 share a strand and take different frames so the atlas does not repeat an image — Proteus the view looking NORTH, the direction Stephen walks, across the exposed sand that is his whole ground (recorded against it: the weaker picture, and container gantries on the horizon); Nausicaa the strongest of the four, carrying a declared anachronism, the Poolbeg chimneys of 1971 and 1978 standing roughly where the Pigeon House stood — admitted under rule 4(iii) rather than despite it, because two banded chimneys two hundred metres high cannot be taken for anything on 16 June 1904. The chooser now reads both surveys and normalises their differing candidate shapes rather than merging them, which is §11q's fix applied a second time: two regions, both named (L-28). 28 of 54 slots filled, and §11x's floor still holds — four slots refused by rule and one where nothing admissible exists. AND THE LIVE VERIFICATION NEARLY REPORTED A FALSEHOOD: the first cache-busted sum of the served images read 17 MB against 8.5 MB on disk, which looked like a failed deploy. It was a mid-swap read of GitHub Pages. Checking one named file rather than trusting the aggregate settled it in a second — live and local byte-identical — and a re-run then agreed to the byte across all 28. A stale live read looks exactly like a passing verification, and it looks exactly like a failing one too
C-79 07-27 Not an error — dimension 14 is BUILT, and the eight questions build panel session 07 left for the author were resolved by the chair on his instruction: "You need to resolve the goals yourself. Decide and move on and complete." Every decision below is recorded as the chair's, dated, reasoned and reversible by a sentence; not one is written up as the author's, because a session offering its own preference back as the record's is catch C-51 and a delegation to decide is not a delegation to be him. (1) RULE 4, ORDERED, ADOPTED into RIGHTS.md clause 7 as the standing admissibility test for all fifty-four slots: identification, then structural survival, then first-reader misdating, first failure disposing. Self-dating and most-legible-object are killed as standalone grounds, on Kiberd's inversion — a monochrome 1946 street is more dangerous than a 2010 one, because bicycles and long coats read as period and invite the misdating while a Burger King fascia cannot be mistaken for anything. (2) RULE 3's REACH FIXED PERMANENTLY: a nameplate does a caption's work when it supplies the book's identification — Dlugacz, Davy Byrne's, the Freeman's Journal; lettering supplying only a date does not engage the rule; and lettering cast into a building's own fabric stays allowed even when it names the institution the episode happens in, because the alternative is an atlas that can never show a named building. (3) EPISODE 9 STANDS on that last limb — the gilt LIBRARY is cast into the 1890 ironwork, which is the fabric being itself, and the author had already admitted it on exactly that ground (C-64); the chair does not reopen a ratified decision under a delegation to close open ones. (4) EPISODE 7 REFUSED at rule 4(ii) — bombardment fails structural survival absolutely, so the slot stays empty carrying the token refused by rule 4(ii). Nelson dissented alone and his dissent is kept: the anachronism is in the pixels rather than in a sentence, which is what a caption-free atlas needs. (5) EPISODE 8 RESOLVED, AND THE RULE WAS APPLIED AGAINST THE PROJECT'S OWN PREFERENCE — which is the only evidence that a rule is a rule. The panel's minority wanted the CC0 Duke Street frame, the one cleared frame showing the street the book names; Davy Byrne's fascia sits legible in it, and Davy Byrne's is where Bloom eats in that episode, so the fixed reach refuses it. Its companion is admitted instead: Grafton Street, CC0, whose only legible lettering is a Woolworth's fascia that names nothing Joyce named. Episode 8's panel therefore carries half its named subject, and that is recorded rather than smoothed over. (6) THREE LAYERS, not two, against Kenner's 3–1 dissent, kept in the session record. (7) EPISODE 5's camping tent stays — it fails no limb of rule 4, and a white nylon tent cannot be mistaken for 1904, which is (iii) satisfied rather than escaped. (8) IN-FRAME LETTERING DOES NOT ENTER THE ALT STRING: alt describes forms, never transcribes signage, which is describe, do not read applied to the one string a screen-reader reader gets THE REGISTER BUDGET IS MET AND §11n DERIVED IT RATHER THAN BEING TOLD. The diagram register is filled by record-coverage.html — the fifty-four slots drawn as a grid, and it is not a progress bar: read down the place column and base document 03's own unevenness appears, settling ten episodes by itself, offering an unranked choice at six, supplying nothing at two. The A5 split is DRAWN, as it is in the constraint graph: a plain square is a place the record settles, a gold ring marks one a person chose from several it does not rank. Sourced and chosen are different claims and the figure refuses to merge them. The presentation register is CLOSED AS NOT-OWED under anchor A8, and the reason is the register system working rather than a gap: C-19 defines a public deck as image cards without explanations, and the eighteen panels already are exactly that — a deck would be the same artifact twice, same images, same absence of captions, same colophon, differing only in that a reader met them one at a time. The precedent is dimension 9, whose presentation slot the author closed as not-owed because textual refusals cannot survive as captionless cards (C-46.4); this is the mirror of it — the artifact is already the thing the register would make. Dimension 14 is therefore BUILT: nine built dimensions, and nothing was constructed to make that true. One defect caught in the doing, and it is C-64's shape a third time: choose-place-images.mjs rebuilds the place layer from scratch, so anything it does not carry it destroys — and it silently wiped the frameDescription of episodes 4, 5 and 6 the first time it ran after C-78 split that field from the subject. §11x caught it on the next build. A description now travels with the choice, in the same entry, because you choose a frame and therefore describe that frame, and two things written in one place cannot drift apart
C-78 07-27 4 Three panels told a screen-reader reader that a thing was in the picture which the project's own record says is not — and told only that reader. The Atlas generator composed every alt string from the slot's what, which is the subject the slot STANDS FOR, not what is visible in the photograph. On three acquired place slots the survey's own caveat refutes the string on the same page it sits on. Episode 11 shipped alt="the Ormond Hotel, Upper Ormond Quay" against a caveat reading "this is not a photograph of the Ormond Hotel and does not claim to be. It is a photograph of the quay the hotel stood on." Episode 16 shipped alt="the cabman's shelter, Butt Bridge" against "the cabman's shelter is NOT in this photograph, and no photograph of it exists on Commons. The shelter is gone" — and its foreground bridge is not the 1904 bridge either. Episode 9 named Kildare Street against "not the National Museum, and not Kildare Street. It is a close view of the forecourt gate." A sighted reader sees a quay and draws their own conclusion; the screen-reader reader is handed the conclusion as fact, in the one string the form gives them. That asymmetry is the whole defect: a caption-free atlas refuses to tell anyone what a picture means, and this told exactly one reader, wrongly. Found by build panel session 07 in the artifact it was convened on, by running the identification test BACKWARDS over what was already acquired rather than only forwards over new candidates The two fields are split, and there is no fallback between them. slotSubject is what the slot stands for and is never rendered; frameDescription is an inventory of what is visibly in the frame and is the only source of alt. The generator does not fall back to the subject — a missing frameDescription fails the build, because the fallback IS the defect and a convenience that reintroduces it is not a convenience. All twenty-four strings rewritten; the three false identifications corrected with the caveat that refutes each quoted beside them (A4). New in §11x: an acquired slot with no frameDescription fails; a frameDescription equal to its own slotSubject fails; a rendered alt equal to the slot's subject fails; alt="" and a missing alt fail; every empty slot must carry an accessible name, because a drawn keyline is invisible to a screen reader and without one that reader alone sees a complete panel — the closing-grid failure, for one reader; no <a>, href, aria-describedby, longdesc or <figcaption> inside a panel, on two argued binding vetoes; every panel must render exactly three slots; the credit test now reads aria-label as well as alt, which it could not before (C-66's unlegislated-vector shape); and the page's derived coverage line must agree with the manifest. Seven of seven mutations red for the named reason, each run through the generator with the harness asserting the artifact actually changed before reading the verdict — the discipline C-77 had to learn an hour earlier. And the generator's own credit test caught the fix: the first frame description for episode 17 said "an inked oval library stamp", and §11b refuses the word. It is right to: the institution belongs in the colophon's marks table, not in the string that describes the frame. Rewritten as "an inked oval ownership stamp"
C-77 07-26 4 The Atlas shipped cropping its share-alike images, and RIGHTS.md forbids that in one sentence written for exactly this case. Clause 7: "Do not crop share-alike images to fit the grid — pad them uncropped, which keeps the panels clear of the adaptation boundary." The first build of atlas.html styled every slot aspect-ratio:1/1; overflow:hidden with object-fit:cover, which crops each image to a square — and it went live that way over CC BY-SA files for about an hour. Cropping to fit is an ADAPTATION, and an adaptation is a different act from a reproduction; a share-alike licence permits the second freely and puts conditions on the first. Nothing in the build could see it: §11b inspects panel MARKUP for text, credits and captions, and a crop is neither — it lives in the stylesheet. Found by build panel session 07, in the artifact the session was convened on, as a binding argued veto: "Delete .slot { aspect-ratio:1/1 } and object-fit:cover." The chair had written the CSS an hour earlier while quoting clause 7's colophon rule accurately in the same file's own comments — the licence bullet three lines below the one being obeyed Fixed and gated. object-fit:contain with a 3:2 slot, so the whole licensed frame shows and the plate colour pads what is left; one ratio for all fifty-four slots, chosen once, so no slot's shape is an editorial act either. The colophon now states what clause 7 requires it to state: the panels are licensed CC BY-SA 4.0, and no image on the page is cropped. New in §11x: the emitted .slot img rule is read out of the artifact and object-fit:cover fails the build, object-fit:contain must be present rather than left to a default a later edit can change, and the same breach through the .slot selector fails too. The negative test caught itself before it caught the gate, and that is the part worth keeping. The first mutation replaced object-fit:contain with cover in the tool and the build stayed green — which read as a failing gate. It was not: .replace() had hit the word contain in the COMMENT explaining the rule, several lines above the rule, so the generated artifact never changed. Byte-changed is not mutation-tested (L-32's companion), and the harness had not asserted that its own mutation reached the output. It does now: the second run asserts the artifact CHANGED before reading the verdict, and the build went red for the named reason. A gate reported as broken by a no-op is as bad as a gate reported as passing by one
C-76 07-26 Not an error — the author's ruling on institutional marks, and the Atlas's HTML register built under it. He ruled, in his own words: "We have to accept limitations and mention them where needed and continue." That answers C-72's open question. An institutional mark on a scan of a period document — an ownership stamp, an accession number, a barcode, a shelfmark — is ADMITTED, and disclosed wherever it bites. The reasoning it rests on is recorded with it: RIGHTS.md clause 7's no-credit rule was written for an authorship credit, which is what CC BY-SA 2.0's "at least as prominent as any other authorship credit" condition is about, and a library's ownership mark is not one — the institution is neither author nor licensor, and on a public-domain scan no share-alike prominence condition is engaged by anything in the frame. What the ruling does NOT admit is a photographer's watermark or signature, which IS an authorship credit and is what clause 7's watermark bullet was written for; the distinction the ruling draws is between a mark of OWNERSHIP and a mark of AUTHORSHIP. Its reach is the whole document layer — Thom's 1904 and the Ordnance Survey sheets are institutional scans too — and without it that layer was arguably not buildable at all. The cost is accepted and named: a caption-free panel cannot tell a reader that the Wellcome stamp is a modern library's and not part of the 1896 printing. "Mention them where needed" is what is done about it, and the colophon is the only surface the form leaves available DIMENSION 14's HTML REGISTER IS BUILT, and the no-caption gate is EXERCISED for the first time. §11b had been armed since 25 July and had inspected zero of fifty-four slots, because no panel existed; it now inspects eighteen panels and passes on them. tools/build-atlas.mjs (npm run atlasbuild) derives the artifact from the manifest, the fetched provenance and the author's choices — nothing hand-written, because every panel is an assertion about a licence, and the colophon that makes this dimension lawful has to come from the same bytes the fetcher recorded rather than from what somebody remembered. The form holds: no text inside any panel, verified in the browser as well as by the gate; the episode identity sits OUTSIDE the panel as scaffolding declared as scaffolding (A2); and every image carries alt text, because a panel of pictures is silence to a screen reader and panel session 06 committed this project to serving that reader properly. The generator applies §11b's own credit test to its own alt text before writing bytes, and refuses rather than mangles — it fired immediately and correctly on episode 9, whose subject is the National Library and whose name no regex can tell from a credit; an explicit alt was declared instead, with the reason recorded beside it. COVERAGE IS PARTIAL AND SHOWN AS PARTIAL: 24 of 54 slots carry an image and 30 are hatched rather than closed up, each with its reason in the colophon — a grid that tidies itself reads as complete when it is not. The chair chose three images and HELD three, under the author's "you make the calls when necessary and consult the experts when not": episodes 4, 5 and 6 chosen with their reasons and every one marked as the chair's, never promoted to his (C-51); episodes 7, 8 and 14 held — 7 because its only cleared frame is Prince's Street in May 1916, twelve years late and after the building's destruction; 8 because all seven cleared frames put rule 3 as clutter rather than as one nameplate, which the ruling does not reach; 14 because nothing cleared at all. New section §11x byte-compares both generators and carries the floor that matters: if no slot is held, the build fails — a chair that has chosen everything has stopped declining, which is exactly what C-64's ruling 2 was written against. Dimension 14 is building, not built: presentation and diagram remain owed, and §11n would refuse the claim anyway
C-75 07-26 Not an error — the NLS licence tag was re-read by hand, and catch C-63's freeze is lifted by a record rather than by a sentence. C-63 froze the whole map component of the Atlas's document layer on a fact about a person: maps.nls.uk sits behind an AWS WAF that returns HTTP 405 to every non-browser client and serves a real browser a human-verification interstitial, so the per-image Re-use: CC-BY (NLS) tag the layer rests on could not be re-read by machine. It had been read once, on 19 July 2026. The author opened the item page in his own browser on 26 July, cleared the challenge, and read the box — and it sits exactly where data/atlas-document-survey.json predicted, directly beneath the page's "Search: [Type a keyword…]" box, which corroborates the page class independently of the report. It reads Re-use: CC-BY (NLS). — unchanged, with CC-BY rendered as a hyperlink and NLS's own "Order this map" bar beneath it. The limit was re-tested the same day rather than assumed: a real browser engine was pointed at both maps.nls.uk and map-view.nls.uk and both served the interstitial, so "no tool can read this" is measured and not declared (L-31), and completing a bot-detection challenge is not something a session does — which is precisely why the ruling named a person THE FREEZE IS DERIVED, NOT EDITED. The reading lives in data/atlas-document-survey.json under osSheets.licenceReadings, with the 19 July reading kept and superseded rather than overwritten; derive-atlas-targets.mjs emits the freeze only when no reading is current, so every document slot's outstanding list tracks the record; docs/STATE.md derives its "waiting on a person" line from the same field; and the tool's own console summary was derived too, because it had gone on announcing the freeze from a hardcoded string after the data said otherwise — the same defect this session spent its day on, found in the act of fixing it. New section §11w holds the record honest and the derivation to it: a reading must carry an ISO date, a named reader and the tag verbatim (a licence line reported without its own words is an assurance, L-27); a tag as read carrying NC or ND stops the layer rather than being recorded and passed over; at most one reading may be current; and the derivation must agree with the record in BOTH directions — a current reading with any slot still announcing the freeze fails, and a slot announcing a reading no record supports fails. Ten of ten mutations red for the named reason, the two bidirectional ones run through the generator and regenerated, because a gate behind a byte comparison can only be tested that way. One harness defect caught and fixed in passing: the mutation runner printed the FIRST failing line rather than the line carrying the named reason, and since check.mjs collects failures instead of exiting at the first, eight of ten mutations displayed §11o's staleness message under a §11w verdict — a harness showing a verdict its own evidence did not support, which is the shape of the capped fan-out that printed its summary like a total. THREE LIMITS TRAVEL WITH THE READING AND ARE PART OF IT (A5, L-17): the screenshot crop carries no URL bar and no sheet number, so it does not itself establish which sheet — the author's report that he opened Sheet 18 is the source for that and is marked as his report; CC-BY is a link whose target is not in the crop, so the reading confirms the tag and not that it still resolves to 4.0; and the tag is per image while the Atlas would draw on ten sheets, so one reading clears one sheet and none is asserted for the other nine. And the layer is still gated on something other than its licence: the institutional-marks question (C-72, L-34) is unruled and reaches every institutional scan, and a sheet photographed by a library is one
C-74 07-26 3 The licences were sound and the pictures were not: an adversarial pass broke 18 of 45 clearances and almost none of them on the licence. With the author's six subjects picked (C-70), the place layer's licence work could begin. One agent per place surveyed Wikimedia Commons by text and by geosearch, read each candidate's licence from the raw wikitext where the template actually sits, quoted it verbatim, confirmed the parse independently against the API's extmetadata, inspected the pixels for a burned-in watermark, and applied RIGHTS.md clause 7 in full. Then every clearance went to an independent refuter whose default was REFUTED, which re-fetched each file's wikitext itself rather than trusting the quoted block, diffed it character by character, looked for a second licence template and for watermark, trademark and personality-rights tags, tested whether a public-domain claim rested on a country-of-origin basis or only on US expiry, cut the pixels at 1:1, and re-read every frame against the survey's own description of it. 143 searches recorded, 45 clearances, 41 outright rejections with their grounds — and 18 of the 45 broken. The recurring verdict is one sentence and it is worth quoting: "LICENCE HOLDS, QUALIFIER BREAKS." The licence re-fetched identical, the tag sound, the pixels clean — and the survey's account of what the frame shows wrong: the wrong segment of Dorset Street (the uploader's own description says Lower, and the slot is Upper); the wrong object named as the most modern thing in a Glasnevin frame; a Grafton Street file categorised as Grafton Street whose own description names College Green; a public house photographed square-on with its fascia centred, which the survey called a street view; a frame of Corporation flats that replaced the terrace, which the vanished-place ruling refuses outright. The trap RIGHTS.md predicts was hit and refused: the finest period image of Dorset Street on Commons is an Eason Collection street view of c.1913, dense with trams and legible shopfronts — carrying {{Flickr-no known copyright restrictions}} and nothing else, transferred from the National Library of Ireland's Flickr stream. Refused on both grounds, and the surveyor recorded that the temptation was real Recorded as evidence, and NOTHING IS CHOSEN. data/atlas-place-survey-chosen.json holds every cleared candidate with its verbatim licence block, its pixel dimensions, the inspection of its pixels, a fit caveat saying what the frame does not show, and which of the author's three ratified image rules reaches it — plus every refuted candidate with the finding that broke it, because a rejection nobody records is a search the next session runs again. Episode 14 cleared nothing at all and its slot stays open with the reason: the subject stands, no admissible photograph of it was found. New section §11v gates it, and the load-bearing property is the fifth of six: every candidate's chosen must be null. Clearing a licence is this project's work; choosing which cleared image a panel carries is the author's, and the moment a session writes a choice into that file the distinction A5 exists to hold is gone (C-51). Fourteen of fourteen mutations red for the named reason. And the gate's own first draft reproduced L-32 inside the hour it was written. It matched /NonCommercial/, /NoDerivat/ and /no known copyright restrictions/ across the record's PROSE, and failed five sound clearances immediately — because a survey that refuses an NC file says "NonCommercial" in order to refuse it, and a refuter confirming there is no NC term says so too. A disclosure read as an assertion, which is C-59's shape and which L-32 had just been restated about. The test now reads tokens out of the licence's own wikitext, parameters included — {{self|cc-by-sa-3.0}} carries its licence as a parameter, which the first draft would also have missed. Two further firings then corrected the gate rather than the data, and both are recorded because they are the gate implementing something narrower than the clause says: {{PD-US}} is not a bare US-only tag when a country-of-origin tag accompanies it — episode 7's candidate carries {{PD-anon-70-EU}} and {{PD-US}}, which is the shape clause 7 wants — so the rule is now a condition on the SET of tokens rather than on one token; and a licence may legitimately live outside the wikitext, in Structured Data or behind an institution's wrapper template, which episode 4's and episode 8's candidates respectively do. Those enter only by declaration: the record must name the licence property P275 and a resolving entity id, which are identifiers rather than prose
C-73 07-26 Not an error — the Penelope finding re-counted independently, every figure confirmed to the digit, and one thing about it worth knowing. C-69's finding was recorded as "verified independently against the held 1922 text", and the same analysis that produced it also produced the defect its own refuter caught: 2,904 words of Project Gutenberg licence boilerplate counted as Molly's monologue, because the last episode's slice runs to the END OF THE FILE. The headline survived that; the arithmetic beside it did not. So it was re-counted from the held text by a second route, computing every figure both ways — to end-of-file and to Gutenberg's own *** END OF *** line — so the difference would be visible rather than assumed away. All of it reproduces exactly. The book prints 2,233 question marks across its eighteen episodes; Ithaca prints 303 and Penelope prints none at all; the last question mark in the book is Ithaca's "Where?", answered by "•", with Penelope's Yes the next word on the page — read verbatim out of the source, "…Darkinbad the Brightdayler. Where? • [ 18 ] Yes because he never did a thing like that before…". The word counts appeared to differ by 467 and 119 until the qualifier was established rather than reported: counted by whitespace tokens with the episode's own [ N ] marker excluded — three tokens — Ithaca is 22,457 and Penelope 24,184, both exact, and the boilerplate is 2,904, also exact. Every episode was off by precisely three, which is what a systematic offset looks like and why it was chased instead of published as a discrepancy (L-17) AND THE THING WORTH KNOWING: the headline survived the slicing error by luck, not by construction. Penelope counted to end-of-file is also zero, because the Project Gutenberg tail happens to carry no question mark at all — 2,904 words, zero ?, verified. Had that licence text contained a single one, the most striking claim this project has made about the book — Penelope prints none — would have been false, and false by the very defect the refuter caught in the number standing next to it. The finding is sound and it is now sound for a reason rather than by accident, which is the difference between a verification and a coincidence (L-25: "fixed" is a claim, and so is "verified"). The finding stays a note and stays unbuilt: where it goes — beside dimension 11's question curve or in dimension 9's column — was offered to the author on 26 July and not taken up, so it remains his (C-69)
C-72 07-26 3 The licence passed and the pixels did not — and the only scan that exists carries a modern institution's marks on every page. Episode 17's object never cleared, and the author ruled on 26 July that Dr G. S. Buchanan's 1896 H.M.S.O. report on an outbreak of illness at Mansfield caused by eating potted meat moves into the document layer, with the object slot left empty and saying so. The licence was read twice by two paths before anything was fetched — the file page's RAW WIKITEXT carries exactly one licensing template, {{PD-old-100-expired}}, and the API's extmetadata independently reports License pd, UsageTerms "Public domain", Copyrighted false, no NonCommercial term, no NoDerivatives term, no {{watermark}} tag and no second template. It fetched, it cleared the clearance-comparison, it sniffed clean, it sized clean. Then it was looked at, which is the rule RIGHTS.md clause 7 added on 25 July 2026 after a correctly licensed photograph turned out to carry a photographer's name burned into the pixels — "Commons flags these with {{watermark}} in the wikitext … but the flag is applied by volunteers and its absence proves nothing — look at the pixels." Page 1 carries an inked WELLCOME LIBRARY / General Collections ownership stamp in the lower right with a handwritten accession number beside it; page 2 carries a printed Wellcome barcode, 22502708362, in the lower left. Both are modern institutional marks on the physical artefact and neither is part of the 1896 printing. A Commons search returns exactly one file for this report, so there is no second scan to prefer. And the tag's own stated ground is false of this author, while the clearance holds anyway: PD-old-100-expired asserts a life-plus-100 basis, and Buchanan died on 11 October 1936 — verified against two sources that did not write the Commons page, The National Archives' authority record and Nature's obituary of 14 November 1936. Ninety years, not a hundred. The work is public domain on two independent country-of-origin grounds either of which alone satisfies clause 7 — an 1896 H.M.S.O. publication whose UK Crown copyright ran fifty years from publication and expired in 1946, and life-plus-70 for an author who died in 1936, expired 1 January 2007. L-17 twice in one day: the claim right, the qualifier wrong FAILED CLOSED, and the question is the author's. The image is refused, the file removed, the provenance record dropped and episode 17's document slot returned to to-source with the whole finding on the record rather than a bare status. The reason it is not a session's call: clause 7's no-credit rule was written for an authorship credit, which is what CC BY-SA 2.0's "at least as prominent as any other authorship credit" clause is about — and a library's ownership stamp is not one, since Wellcome is not the author, not the licensor, and the file is public domain. But the clause as written says "no panel carries any credit at all" and "a credit in the image is still a credit, whoever put it there", and read literally it refuses this scan. Reading a rule's purpose against its own words is the one-notch-too-strong move this repository has logged more than any other, so the session did not. And the question is structural, not local: it reaches the whole document layer, all eighteen panels. That layer is specified as Thom's 1904 (University of Victoria scans) and the Ordnance Survey six-inch sheets (National Library of Scotland) — and library and archive scans of period documents routinely carry stamps, accession numbers and barcodes, because that is how institutions mark physical holdings. If the literal reading stands, the document layer may not be buildable from institutional scans at all. Recorded in the manifest as an open question with its reach stated, and put to the author
C-71 07-26 3 Four documents were telling the next session that finished work was open, and one of them was telling the author to answer a question he had already answered. All four verified against the repository before being touched, and they are one class: prose that outlived the build. (a) docs/panel-session-06.md — fourth in the list the handoff tells a new session to read first — closed with "the structural floor found three pages without exactly one h1, one with a skipped heading level, and eleven with a <th> lacking scopereal, small, and not yet fixed." They were fixed as C-68, in commit a90937c, and §11t has enforced all three since; today's build prints "structural floor holds on 47 pages". The same commit rewrote the two sentences immediately above that clause and left the clause standing — L-29 one turn worse than its own statement, because here the editing pass that fixed the defect framed its own scope by the paragraph it happened to be rewriting. (b) docs/handback.md recorded a [DEFAULT] decision that standalone document pages "render their documents' heading structure exactly as written, even where a source document uses several h1s — verbatim wins over the single-h1 accessibility convention there, deliberately." C-68 reversed exactly that for the three pages where the two rules collided. (c) data/atlas-place-candidates.json carried a hand-written key literally named openQuestionForTheAuthor, ending in the word "Unruled." — about the TEXT INSIDE THE PICTURE question the author answered on 25 July, by the building-yes-nameplate-no ruling recorded eleven lines below it in the same file, which admitted episode 9 and refused episode 12. Nothing owned the key, so npm run rulings rebuilt everything around it; and tools/check.mjs contained the string openQuestionForTheAuthor zero times, so nothing read it either. C-59's shape exactly: the file contradicted itself and the stale half was the half shaped like an instruction. (d) docs/HANDOFF.md — and the author's own handoff prompt after it — said the eight open place slots' candidates were "surveyed, licence-cleared and quoted verbatim in data/atlas-place-candidates.json". That file surveys a disjoint set of eight. It covers episodes 1, 2, 3+13, 9, 11, 12, 15 and 16 — every one a place base document 03 settles — while the eight slots that need his choices are episodes 4, 5, 6, 7, 8, 10, 14 and 18, and not one of them appears in it. An author opening the named file to make the eight choices would have found eight different places (a) and (b) corrected with the correction shown beside the struck sentence and dated rather than swapped in (A4), and (b) replaced by the rule as it actually stands, which is structural rather than a category: a document shifts one rank exactly when its page supplies its own <h1> — five do, eight do not, and all eight of those source documents carry exactly one #, so verbatim did not lose, the two rules simply had nothing to disagree about anywhere but the three pages C-68 corrected. (c) fixed structurally, not by rewording, which is the fix C-64 already taught in that very tool: tools/apply-atlas-rulings.mjs now owns the key, deletes it before every rebuild, and regenerates a questionsForTheAuthor record whose status is derived from whether its answeredBy names a rule the tool actually applies — so a question cannot be marked answered by prose, and an answered question cannot survive a run that removes its rule. The structural evidence goes further than the link: this question named two frames and expected them to part, so the gate asserts that the answering rule produced at least one admission and at least one refusal, which no sentence can satisfy (L-32). Three of three mutations red for the named reason — the question naming a rule the tool does not apply; the rule ceasing to part the two frames; and the L-31 floor, an emptied questions record. (d) corrected in HANDOFF with the two sets named apart and the file that actually holds the open slots' shortlists — data/atlas-targets.json — named instead
C-70 07-26 Not an error — the author's four answers, logged, and the first of them is the only PICK in this project's history. (1) THE SIX PLACE SLOTS ARE CHOSEN. Base document 03 documents several places for six episodes and nothing ranks them; he chose the set that shows the interior, where the episode's work is done — episode 4 Dlugacz's in Upper Dorset Street, 5 the Westland Row quarter, 6 Glasnevin Cemetery, 7 the Freeman's Journal in Prince's Street, 8 Grafton–Duke Street, 14 Holles Street hospital. Every place distinct, Kildare Street left to episode 9 which was already cleared and acquired. (2) EPISODES 10 AND 18 CARRY NO PLACE AND THE PANEL SAYS SO — 03 documents none for 10 and nothing whatever for 18, so there was nothing to pick between and he ruled the absence instead. (3) A11 STANDS AGAIN, re-affirmed a second day running: no seventeenth dimension, no fourth inventory, and the run's scope is the Atlas and the site. (4) EPISODE 17's Buchanan report moves to the DOCUMENT layer and its object slot stays empty and says so — "cleanest bookkeeping: a document recorded as a document" — over the alternative of leaving it in the object slot as a declared substitute, which would have had the manifest calling a document an object THE PICKS ARE PICKS, AND THAT IS ENFORCED RATHER THAN DESCRIBED. C-64 is the precedent and it is a precedent about the opposite case: there the author ratified four SENTENCES and tools/apply-atlas-rulings.mjs applies them so every outcome names the rule that produced it. Here he gave six choices, which are not derivable and must never be dressed as derivations (A5; C-51 is what that looks like). So tools/apply-place-choices.mjs (npm run choices) records keys only — every other field, the place's name, its basis in 03, whether RIGHTS.md permits a photograph of it, is looked up from the derived shortlist rather than typed (L-22) — and new section §11u holds four properties: a pick must name a key data/atlas-targets.json actually produced, which is a structural test no prose can satisfy (L-32); a pick may not be made where 03 settles the slot by itself, and a ruling-of-absence may not be filed where 03 offers candidates, so the two kinds of decision cannot be filed as each other; the arithmetic closes in both directions, every open slot decided exactly once and nothing decided that is not open; and the slot stays OPEN in the derivation, because choosing which of the record's places this atlas shows is not making the record rank them — which keeps §11o's clean-sweep floor armed and stops a pick being read later as base document 03's own. Nine of nine mutations red for the named reason, and the last two matter most: the leak was tested by mutating the GENERATOR and regenerating, because a gate behind a byte comparison can only be tested that way; and when the first leak mutation went red on an upstream guard rather than on §11u, §11u was re-tested with every upstream guard disabled and caught it alone — a gate that never runs because something else always fires first is not a passing gate, it is an untested one
C-69 07-25 Not an error — a masters session with a null result, logged because the reasons are the value. The author asked to move on to new dimensions. All sixteen are allocated and anchor A11 caps Type I at three, re-affirmed by him the same day (C-64), so a new dimension had to be number seventeen onward, of an uncapped type, built from held sources (C-31), with novelty checked rather than assumed (A12). Six constructed critical lenses proposed one each; each went to an independent refuter with the repository open. All six were refuted (docs/masters-session-new-dimensions.md). The pattern is the finding: four of the six declared Type IV, and every one of them quoted the type's OUTPUT — "a parallel text" — while ignoring its OPERATION, which data/types.json states as "the book against other versions of itself". A reading record is not a version of Ulysses; neither is a dictation transcript nor the accompanist's half of a dialogue. Quote the output, skip the operation, and any two-column artifact becomes Type IV — the type is not the shape of the artifact, it is the shape of the work. Two more died on things already in the repository, which is its own lesson about proposing before reading: one proposed as its unit the exact material data/passages.json refuses by name (the answer's words, C-57 — refused in writing precisely so a future session under pressure would find it), and one proposed a pairing already drawn, page-anchored and shipped inside a built dimension's deck. This is C-07's fix working, not a session failing Recorded rather than retried. No seventeenth dimension: building one would mean either reopening A11 — the fix for the project's worst structural catch — or accepting a Type IV that is a Type I with a second column. One fact survives the wreck and is verified, independently against the held 1922 text: the book prints 2,233 question marks; Ithaca prints 303 of them and Penelope, immediately after, prints none at all in 24,184 words; and the last question mark in the book is Ithaca's "Where?", answered by "•", with Penelope's Yes the next word on the page. That is a note, not a dimension — it belongs beside dimension 11's question curve or in dimension 9's column, and it is held in the session record rather than built, because the author has not ruled where it goes. And the refutation caught the defect that justifies running refutations at all: the proposal's central correlation normalised by episode length, and its Penelope word count ran to the end of the file rather than to Project Gutenberg's own end line — so 2,904 words of licence boilerplate were counted as Molly's monologue, eleven per cent of the episode, inside the denominator of the finding. The arithmetic was otherwise exact and reproducible. L-17 exactly: the claim almost right, the qualifier wrong, and it would have shipped as a number in a table
C-68 07-25 3 The structural floor the reader's own voice needs was failing on fourteen pages, and it is the reason the panel refused a speech button rather than an argument against one. Panel session 06's Tier 1, completed. Measured on the built site: three pages carried no single h1/method/panel/masters-session/, /reference/characters/ and /reference/day/ each rendered a base document whose own # headings became the page's headings, so a voice had several places to be told it was; one page skipped from h2 to h4, because docs/01-character-map.md set its sections as # and the people inside them as ###, with nothing at ## at all; and 79 table header cells across eleven pages carried no scope, so a reader moving through the catch log or the dimensions table by keyboard heard values with no headings attached to them. None of this is a missing feature. It is the page failing to say what it already contains — and a speech control laid on top of it would have sat over a page the voice could not navigate, which is the displacement the panel named The three pages pass renderdoc(1), the shift the filter already supported and they were not using, and each gained its own <h1>; the character map's sections are promoted from # to ## so the outline runs h1 → h2 → h3 with no gap, its text untouched and its ids unchanged; and markdown-it's th_open rule now emits scope="col" — one renderer rule, all eleven pages, because markdown's own table syntax puts headers in a thead row and every <th> here heads a column. A row-header table would need scope="row" and this project's markdown cannot express one; if that changes the rule changes with it. New section §11t holds all three, with floors under the walk so a run that inspects no page or no header cell fails rather than printing green
C-67 07-25 Not an error — an author ruling that removes a door, logged. Panel session 06 refused a synthetic read-aloud and offered, in its place, one recorded human voice — a short spoken preface, no words of the 1922 text, one surface, never the Reading Log, <audio controls preload="none"> as a declared artifact with a named speaker and a date. The panel said plainly that a recommendation requiring a person to perform is a commission and not a design, and that it was the author's to accept or decline. He declined it the same day: "There will not be a recorded human voice. Strike that out from the project. Restructure without it." The tier is struck through in docs/panel-session-06.md with the ruling quoted beside it (A4), and — the part that matters — the narrow <audio> exemption is removed from docs/06-design.md and from tools/check.mjs rather than left standing unused. Media of every kind is now refused outright: <audio>, <video>, <embed>, <object>, <source>, <track>, with no declared-class escape. An unused exemption is a door, and the next session tidying up for consistency finds a door and no argument against walking through it — which is L-23's shape (the honesty marker undone by a later decision nobody re-read against it). The replacing rule is simpler and stronger: this site has no sound. Negative-tested: the exemption's own former form, <audio controls preload="none" class="declared-media">, now turns the build red
C-66 07-25 4 Three enforcement holes found by panel session 06, all verified against the bytes before being touched, and one of them was a severity-4 remedy with no test behind it. (a) C-37's fix was held by a template guard and nothing else. Section 6 strips the GoatCounter tag from every page unconditionally before running its stray-vector list, so deleting the {% if 'reading-log' not in page.url %} in site/_includes/base.njk left the build green. The Reading Log's promise — "not the entries, not a count of them, not the fact that you opened this page" — rested on one Nunjucks condition and a comment. That is L-23's own lesson recurring: the honesty marker undermined by a global template decision nobody re-read against it. (b) Inline event handlers were unguarded. An onclick= is script without a script tag and passed the vector list untouched; the strings onclick and on[a-z] appeared in tools/check.mjs zero times. (c) Media was entirely unlegislated: <audio, <video, <source, <track, srcset, preload and http-equiv appeared in the checker zero times, so a media element with an off-origin src deployed green — on a site whose whole claim is that it makes exactly one external request (a) New section §6c asserts the promise as a property in both directions: exactly one analytics tag on every page that should carry it, exactly zero on the Reading Log, with /404.html declared as a standalone template that never carried it, and floors so that a tag vanishing site-wide cannot pass as compliance. (b) and (c) added to the vector list, media with one narrow declared-class exemption handled exactly as <iframe> was after C-25 — media may enter only by a declaration, never by a template edit. All negative-tested
C-65 07-25 3 The site was publishing the transcription's underscores raw, so a screen reader read the word "underscore" into the middle of Joyce — and the French was being pronounced as English. The author asked for "a read aloud with a warm natural voice to each part". The build panel refused a synthetic voice (session 06, six vetoes to one second, docs/panel-session-06.md) and found, in the refusing, that the read-aloud which already happens was being served badly by the page. Verified on the built site: _site/episodes/index.html published _Un coche ensablé_ and _limbo patrum_ with literal underscores, inside a document declared lang="en". Nine italic runs in all. Three of them are not English — French, Latin, and Hebrew in Latin script — and every reader using a screen reader, an operating-system voice, or a browser's own read-aloud was getting the underscores announced and the foreign phrases mispronounced. Neither was a missing feature. Both were the page failing to say what it already contained. The panel's grounds for the refusal are worth keeping with the fix: the warm voices are overwhelmingly the ones where localService is false, which post the page's text to a vendor — and on /dimensions/reading-log/ that text is the reader's own entries, from the page that promises they never leave the device. C-37 was severity 4 for a tag that merely could read that store data/passage-languages.json declares every italic run with its BCP 47 language or an explicit null for English, each with its reason (A5 — a language is a decision). eleventy.config.js renders the transcription's marker as <em>, carrying lang only where one is declared, and never guessing one. §11r checks both directions — an undeclared run fails, and a declaration matching no run fails, because a declaration citing a phrase the text no longer contains is the L-28 defect. §11f gained exactly one declared transformation, the narrowest possible: <em>x</em> is unrendered back to _x_ before the verbatim comparison, so every other character of Joyce's text is still asserted unchanged and A19's only mechanical guarantee keeps its reach. The gate immediately found three runs the survey that wrote the file had missed — Circe's stage directions begin with a bracket and the first scan required a letter. Verified in the browser: zero raw underscore runs reach a reader, three language tags render. §11s refuses the Web Speech API by name over source and output alike, excluding by path the five files that must quote it in order to refuse it, and negative-tested by placing the refused module in design/ and watching the build go red. The reader is told, at /about/, that the site has no read-aloud button and why
C-64 07-25 Not an error — four author rulings, logged, and the reason the instruction "build the dimensions not already built" resolves mostly to an anchor. Nine dimensions were unbuilt. Six of them — 4 Ledger, 5 Body's Accounts, 6 The Dead, 7 Songbook, 8 Eighteen Styles, 10 Apparatus — are all Type I, and Type I sits at its declared cap of three, enforced in check.mjs §11a and negative-tested; a fourth turns the build red. That cap is the fix for C-07, the project's worst structural catch (ten of twelve dimensions being one operation). So building them is not a build task at all, it is a request to reopen C-07's fix. Of the remaining three, two were already built and the record said otherwise (C-60) and the third is the Atlas, which the author had already reopened. (1) A11 STANDS — the chair recommended keeping the cap and the author accepted; the six inventories stay planned by design, and each dimension's note now says so with the date rather than leaving "late or never" to be read as neglect. (2) The eight open place slots STAY OPEN — six episodes where base document 03 documents several places and two where it documents none; choosing among them is editorial and §11o already fails the build if a session ever reports them all settled. (3) THE VANISHED-PLACE RULE: where the place is gone, take the wide view and never the framed doorway — a wide view of a terrace claims the terrace, whereas a framed door in a caption-free panel silently becomes Bloom's door — and where what stands there is the thing that REPLACED it, show nothing rather than show that. (4) TEXT INSIDE THE PICTURE: a building being itself is allowed, a nameplate that does a caption's work is refused The rulings are RULES, not picks, and that distinction is enforced rather than described. The author ratified four sentences; he did not choose eight photographs. tools/apply-atlas-rulings.mjs (npm run rulings) applies them and every outcome names the rule that produced it and quotes the survey sentence that rule bites on — a decision citing a phrase the survey no longer contains fails the build, because a citation to a vanished sentence is the L-28 defect. Outcomes: 3 admitted (episode 9 by the text ruling — LIBRARY is gilt lettering cast into the gate, the building being itself; episodes 11 and 16 by the vanished-place ruling, both wide views), 2 refused and their slots left OPEN with the reason on the record (episode 12, whose only usable candidate is a photograph of the street nameplate — a street sign photographed as a street sign is a caption by another route; episode 15, whose candidates show the Corporation flats that replaced Nighttown after the 1925 closure, which is the erasure of the thing the panel is for), and 3 where no ratified rule reaches the slot (episodes 1, 2, 3+13) — for those the survey's preference stands as the CHAIR's and is marked as one, never promoted to the author's, because a session offering its own preference back as the record's is C-51. The three admitted slots were promoted in the manifest and acquired: 20 cleared slots, 20 files, every one carrying the clearance-comparison's verdict. Two defects caught while doing it, both by machinery rather than by reading. (a) The promoting script recomputed the manifest's own cleared field with a regex that did not match the file's spacing and wrote 0; the field is now checked against a walk of the slots themselves, which is L-22 applied to a file counting itself. (b) apply-atlas-rulings.mjs accumulated rather than regenerated — it reads the file it writes, so it only ever ADDED keys, and an earlier run's output survived every later one untouched. The negative test found it and nothing else could have: suppressing the ruling in the source left the ruling standing in the data, so the gate asking "is there an authorRuling?" answered yes about a ruling nothing was producing any more, and reported itself as passing while being unreachable. That is C-42's shape inside a generator — a change that has to be remembered in a second place. The tool now deletes every key it owns before rebuilding them, so removing a decision removes it from the data. Thirty of thirty mutations red for the right reason, and this gate was one of them only after the fix
C-63 07-25 3 RIGHTS.md's Ordnance Survey build constraint was wrong by nearly half, and the licence it rests on turns out to be unverifiable by any tool. Clause 7 recorded, from catch C-33: "the NLS IIIF server caps a request at roughly half a megapixel, so there is no whole-sheet download — the Atlas must tile at 512×512 or smaller." Tested rather than repeated, per L-31. The server declares "maxArea": 270000 in its own info.json and enforces it to the pixel — 600×450 returns 200, 601×450 returns 403. So the cap is 0.27 megapixels, not 0.5, and a 512×512 tile is 97.1% of it rather than half. The conclusion survives; the margin was overstated by a factor of two, and a session trusting the written number would have sized its tiles near 700×700 and collected 403s from a national library. The same probe confirmed what the clause got right — the whole-sheet claim (the only pre-rendered sizes are three thumbnails, largest 521px), the 1906–09 revision (all 32 County Dublin features carry EDITION "2nd revision", REV_STA/PUB_STA 1906–1909 / 1909–1912, read from NLS's own machine-readable index), and 512 as the server's own declared tile size. The graver finding is about the licence. maps.nls.uk now sits behind an AWS WAF: every non-browser request returns HTTP 405 "Human Verification", and a browser gets a security-check interstitial. The per-image Re-use: CC-BY (NLS) tag on which this entire layer's clearance rests could not be re-read, the Wayback Machine holds no capture of any Irish six-inch sheet's view page, and the archived copyright page of 3 December 2025 agrees with the clause but is not the per-image tag. So the licence line was read once, on 19 July 2026, and nothing since has confirmed it The constraint is struck through and corrected in place with its measured numbers (A4), and the corrected figures carry how they were obtained. The limit is declared rather than left implied (L-18): this clause's licence line is currently unverifiable by tool, someone must open the sheet's view page by hand and read the box, and nothing is sourced from NLS until that is done — which is now a standing entry in every document slot's outstanding list, so a future session meets it before it fetches rather than after. The acquisition route that does NOT need the front door is recorded in data/atlas-document-survey.json (geoserver.nls.uk WFS → the sheet's IMAGE id → map-view.nls.uk IIIF, both ungated), with the real per-sheet cost measured: 759 tiles of 512×512, ~14 MB, ~9 minutes at a polite rate
C-62 07-25 Not an error — the document layer's addresses located, logged. data/atlas-targets.json declared, eighteen times over, that "the Thom's page number for this address is not held in this repository" and "the OS sheet number covering this location is not held in this repository", each to be read off the source at acquisition. Both are now held, in data/atlas-document-survey.json, and neither needed an editorial choice — which sheet covers a location and which page an address falls on are facts. Ten OS sheet numbers, all documented from the sheets' own printed margins ("DUBLIN. SHEET 23.") and corroborated against NLS's machine-readable index; Sandymount Strand is recorded as spanning Sheets 18 AND 19, cut by the neatline, rather than being assigned to one. Nine Thom's 1904 pages, seven documented with the printed line quoted verbatim — including three the Atlas exists to show: 7 Eccles Street at p. 1482, where the 1904 directory prints "7 Vacant, 28l."; 8–10 Little Britain Street at p. 1434, "8, 9, & 10 Kiernan, Bernard, & Co. wholesale tea and spirit merchts."; and Upper Ormond Quay at p. 1563, "8 De Massey, Mrs.—Ormond hotel—wine and spirit merchant, 52l." Recorded with each finding's confidence — documented, inferred, or not established — and its evidence. Two are honestly not established and are left so: Thom's 1904 carries no Butt Bridge heading at all (verified by reading the alphabet either side of where it would fall, Burgh-quay to Burlington-road to Byrne's-hill), and the Martello tower is not named — Thom's prints only an unnumbered "Sandycove battery" at p. 1729, which is marked inferred rather than promoted. §11q requires every documented finding to carry evidence long enough to be a quotation rather than an assurance, requires a confidence value to be one of the three declared, and tolerates not established, because a gate that could not would push the next session to invent a page number. Nothing here is an acquisition: no sheet is tiled and no directory page is fetched
C-61 07-25 4 The dimension record's prose was read by no tool, and the no-caption gate had three defects waiting for the first panel. tools/check.mjs opened five fields of a dimension record — slug, status, type, registerBudget.html, readingAnchors — and none of the four that carry prose. sources, confidence, note and unit render verbatim onto every dimension page through site/dimensions/dimension.njk, and all four were replaced with fabricated text in a mutation run that left the build green. That is the enabling defect beneath C-59 and C-60: not that the Atlas record went stale, but that nothing could notice. It is C-44a's exact shape — a rule the reader sees and the build does not — one turn further out, because here there was no rule at all. And §11b, the no-caption rule, carried three defects, all found while zero panels exist, which is the only time a gate is cheap to fix. (a) The panel interior was captured non-greedily and closed on the first nested </figure>, </section> or </div>, so a credit paragraph or a <figcaption> sitting after any inner wrapper fell outside the capture and past all four sub-checks — in the one gate whose failure breaches every share-alike licence on a panel at once (L-19). (b) Its 54-slot denominator was derived from the very file it guards, with no floor: deleting six manifest slots printed "0 of 48" and stayed green. (c) Its coverage assertion compared panel ELEMENTS against SLOTS, so a correctly built Atlas — eighteen panels, fifty-four slots — would have failed for ever, because 18 is always less than 54 New section §11n gates the record itself: status against the register budget in both directions (C-26's bar); no forbidden sourcing route, where naming a ruled-out repository stays legal and routing to it does not; no present-tense assertion that a closed gate is open, with dated corrections and struck passages exempt per A4 and §11f's precedent; and the Atlas unit must name every layer the manifest carries. Floors beneath all of it (L-31): zero records inspected, or zero forbidden-repository mentions adjudicated, fails rather than printing green. §11b now closes on the balancing tag, asserts the ratified shape (eighteen panels, one layer keyset, slots = panels × layers) before trusting its own denominator, and compares panels against panels. Ten of ten mutations turn the build red for the right reason, and two of them only after the harness caught itself — see L-32 for the first, and for the second: the initial unit mutation changed bytes while leaving the tested property standing, which is the subtler face of the recorded no-op trap. Byte-changed is not mutation-tested L-32
C-60 07-25 3 Two dimensions were built and the record said they were not. Dimension 1 (Object Museum) and dimension 13 (Constraint Model) each had every register their budget marks build filled by a real, contracted, byte-verified artifact — the two diagrams shipped on 25 July under C-47 — while data/dimensions.json held both at status: "building" and both note fields still said the diagram register remained. Their pages therefore published "This dimension is being built now" over a completed dimension, and a sentence naming an outstanding register that was not outstanding. docs/STATE.md had derived "Register slots the budget marks build with no artifact filling them: 0" on the same build, so the derived surface and the hand-written one disagreed and only the hand-written one was read by a reader. This is C-42's family — prose asserting what a build can compute (L-22) — with the status field itself as the prose Both promoted to built, both notes corrected with their dates and the correction shown rather than swapped in (A4). The promotion is not an assertion: §11n now derives it. A dimension whose budget is met cannot sit at building, and one with an unfilled build slot cannot claim built — the bar the author set in C-26, now enforced instead of remembered. Negative-tested in both directions. Eight built dimensions, and nothing was constructed to make that true; the record caught up with the artifacts
C-59 07-25 4 The Atlas's own page was sending the next session through the one repository its rights clause forbids. data/dimensions.json dimension 14 sources[2] read: "To be sourced from the National Library of Scotland's series via the Digital Repository of Ireland… The governing licence line is UNREAD and is the dimension's first gate." Both halves false since catch C-33, six days earlier: DRI applies its own CC BY-NC-ND reuse licence — the exact bar RIGHTS.md clause 7 exists to hold — and links back to NLS anyway; and the licence line was read, resolving to CC BY 4.0 with a named credit. The confidence field five lines below on the same rendered page recorded both facts correctly, so the page contradicted itself, and the wrong half was the half shaped like an instruction. Found by an adversarial sweep of every Atlas surface — 81 findings raised, 24 surviving refutation — run before any sourcing began, which is the only reason it was found before it was followed. It was a family, not a sentence, and the difference is L-29: the grep that finds a defect also frames it. Searching for the CLAIM rather than the string found six more live forms. (a) /method/dimensions/ published an unstruck paragraph asserting both rights gates still open, plus a panel-contents list still naming the newspaper page, the tram map and the handwriting — all three dropped as uncleanable. (b) docs/04-dimensions.md defined the panel as "place + period document"two layers, where the manifest has always carried three; written on 19 July while the object layer was unsurveyed, and never revisited after C-33 cleared 17 of 18 objects later the same day. (c) The unit field carried that same undercount, and it is the only definitional field the Atlas page publishes. (d) The note still said "the panels themselves are the next session's work", superseded by C-48. (e) The note asserted "the Evening Telegraph masthead on Commons substitutes" for the dropped newspaper page — no such file appears in the manifest, in the fetched provenance, or anywhere in this repository. An asserted substitute nobody recorded. (f) Three surfaces stated episode 17's substitution in the present indicative"carries a period document in that slot" — for a file never fetched All seven corrected across data/dimensions.json, docs/04-dimensions.md and RIGHTS.md, each shown with its date rather than swapped in quietly (A4), and the 04-dimensions paragraphs struck through rather than deleted. The sourcing route now names NLS directly and rules out DRI, Tailte Éireann and nli.ie in the same breath. Clearance and acquisition are separated wherever they were conflated: episode 17's document is ruled, not acquired, and RIGHTS.md now records that seven of the seventeen cleared object slots (episodes 4, 7, 8, 10, 13, 15, 16) hold a licence and no file. The class is closed structurally by §11n (see C-61), which refuses a forbidden sourcing route and a closed gate re-asserted as open — negative-tested in four forms, including the via phrasing L-32
C-58 07-25 3 C-57's declared limit is closed, and the check it made possible found the study tidying the reader in three places. C-57 named a boundary rather than fixing it: a warrant drawn from the reader's own words was verified against curve.html, the file that also prints it, because the reading record is a PDF and nothing in tools/ opened it. Closing that needed a verified text of the 117 pages, which the project was said not to hold. It holds one now. The record's page content streams sit under a two-stage filter, [ /ASCII85Decode /FlateDecode ] — which is why a first attempt read 12 of 129 streams, produced zero characters, and would have justified leaving the limit in place. Decoded in the right order, all 129 streams read and all 117 pages come out. The check that C-57 said could not be run then found five misses out of twenty-one quoted reader sentences, and three were real: at record pages 6, 17 and 111 the record ends the reader's sentence with a full stop and the study printed a comma — inserted because the quotation sits mid-sentence inside the study's own prose and a comma made that sentence flow. That is the editorial habit anchor A6 exists to forbid (the reader's words stay as spoken, dictation slips included) and it is catch C-45's class: a quotation tidied to fit its surroundings. Worse in one respect than C-45: curve.html and its own print source already disagreed with each other about the reader's punctuation in two of the three places, and section 10's table comparison never saw it because these quotes live in prose The extraction ships as tools/extract-record.mjs (npm run record), node built-ins only, source-only — the record is already published as a PDF, a second plain-text copy would be a second thing to keep true, and section 2b now fails if it reaches the built site. New section §11m verifies every quoted reader sentence in the study against that page of the record, and npm run check regenerates the extraction and byte-compares it, so it cannot go stale. The three tidied quotations are restored to the reader's own full stops in curve.html and in the print source, and curve.pdf was rebuilt. Two misses remain and are named exceptions with their dates and reasons rather than a tolerance: the p.69 sentence contains an em dash the extractor drops (the study is right, the extraction is lossy, and a fold wide enough to absorb it would also absorb a real alteration), and the p.54 quotation is a declared elision joining two of the reader's sentences across a long quotation from Joyce. The section also carries a parse-count floor: its first run used the checker's existing decode, which handles &#39; and not the &#x27; this study is written with, parsed one pair out of twenty-one, and would have printed a green line. The floor caught it. That is the whole of L-14 in one afternoon L-31
C-57 07-25 4 The region admitted for the record's voice let the project's own voice through it, and two of the sentences it published were false — one of them written by the same session, an hour after it corrected a different falsehood. The reader-words region shipped located the reader by FORM: a string followed by its page marker. A verifier replicated the gate and ran the project's own analytic prose through it. Two sentences passed as the reader speaking"the what-is-a-nation passage was asked about twice across two days" admitted as p.40, "the single retrospective question covering episodes 2–3" as p.6. Reproduced here before acting. That is catch C-53 exactly, reached through the door opened to fix it: the project's prose has the same shape as the reader's, because the project writes both. The same binding, study.indexOf, inspected only the FIRST copy of a quote, so three of the reader's strongest sentences were silently refused for appearing first in a cite line. Three published falsehoods came with it. (a) curve.html's intro claimed "the checker verifies … every warrant against the record, on every build"written by this session while correcting C-54. It does not: warrants are verified against curve.html, which for a reader-words warrant is circular, since the surface that publishes the claim certifies it. (b) Episode 5's refusal said the reader's recorded words "name neither it nor anything in it" — true of the study, false of the record: the verifier extracted all 117 pages and found two of the reader's questions at p.10 are about episode 5's own text, including its closing image. An unscoped claim of silence at the one episode where the project is most exposed. (c) Episode 2's warrant published "his numbering is the book's own", and the record contradicts it on the very page cited: at p.6 the reader says his edition names Parts rather than episodes and that he "thought I was reading Chapter 1" when he was not, and elsewhere writes "book 2 (or chapter 2)" for what is episode 4. One coincidence at p.4 does not establish a scheme The region is located by an explicit MARKER, not by shape. The study now wraps the reader's warranting words as <q class="reader" data-record-page="N"> — inside its own quote marks, so the rendered text is unchanged and neither the print source nor the PDF needed touching — and §11f reads only those. A marker cannot be produced by writing a sentence. Verified by replication: what the old gate admitted, the marker refuses, 2 to 0. Episode 2's passage is WITHDRAWN, not re-labelled: without the ordinal claim it has no warrant at all, so it returns to the honest-empty form. Episode 5's sentence is scoped to "the reader's own recorded words THAT THIS STUDY MARKS", §11i requires that scope, and both empty episodes now carry "The record is not silent here" with the study's own question count — because a missing warrant is not a missing reading, and §11i requires that sentence too. curve.html's intro now states the limit instead of overclaiming it: the checker verifies passages against the held 1922 source and warrants against that page, not against the reading record, which this project holds as a PDF no tool here opens. The answer's words are refused BY NAME in data/passages.json, because the record is a dialogue and the answer names episodes outright ("episode 5's is the Lotus-Eaters", p.11) — a future session under pressure to fill episode 5 would find them. And the honest boundary is declared rather than left implied: a marker records that the PROJECT attributes those words to the reader at that page; making the region verifiable against the record needs a verified extraction of the 117-page record, which this project does not hold. Declared, not pending (L-18.) Escalated to L-30 L-30
C-56 07-25 3 Three passages claimed a PLACE as their episode's name, and the last of the layer's judgement calls is gone with them. The verifiers on the reader-words region arrived after the layer had shipped, and both refuted episode 3 on the same ground: namesEpisodeAs: "The beach scene" asserts the reader named this episode, and the beach scene is not one episode. Sandymount strand is the setting of Proteus and of Nausicaa — and the record itself puts the reader at p.48 calling Nausicaa "the scene by the sea", on the same strand, in the same voice. So the phrase could name either, and the entry picked one. Auditing the whole table against that test found the defect was not episode 3's alone: "the tower" (episode 1) is a place, and "The Bloom household" (episode 4) is 7 Eccles Street — which is Calypso and Ithaca and Penelope. Three entries out of eighteen. The field's whole job is to say which words name the episode, and a place does not name an episode The judgement is replaced by a string equality. namesEpisodeAs must now be the episode's own scaffolding title, verbatim — or the warrant must name the episode by ordinal and carry the record's evidence for that numbering (the p.4 sentence, C-55). Anything else is a locus and belongs in namesInside, with the episode placed by the held 1922 text's own section markers, which the checker already verifies for every passage. So episodes 1, 3 and 4 keep their phrases as loci, lose the episode claim, and the page says how they are placed instead: "The warrant does not name this episode — a place can sit in more than one, so naming one is not the same as naming the other. These lines are placed by the held 1922 text's own section markers, verified at every build, and not by any list of this project's (A2)." Enforced in §11f and negative-tested by re-asserting "the tower" as episode 1's name. Two smaller findings from the same verdicts, both fixed: episode 3's id promised its terminus wrongly (in the X-to-Y form Y is the end, and "live dog across the sand" is the first line of its second paragraph), and the reader-words sentence ended on a quotation that already carried its own punctuation, so the citation now closes the sentence and the reader's words stay exactly as spoken (A6). Recorded plainly: this correction arrived after the commit it belongs to. The verifiers were still running when the layer shipped, and reading them afterwards is what caught it
C-55 07-25 Not an error — the passage layer completed, logged. Three episodes had no passage because no exchange TITLE names them, and that turned out to be a fact about the record rather than a limit on the project. The reading record's first three exchanges are titled by subject, not by episode — exchange 2 is literally "The edition, the eighteen episodes, and the numbering" — because the reader had not yet learned the episode scheme. So a rule admitting only exchange titles could never reach Nestor, Proteus or Lotus Eaters. A second region is therefore admitted: the reader's own words, which the study prints verbatim beside the page of the record he said them on. Those are the record's own voice, and stronger evidence than an exchange title, which is the project's summary of it. The region is defined by form, not by place — a quoted run followed by its own page marker — and that distinction is the whole point: the reader is quoted inside the project's analytic prose, so a location rule would either re-admit that prose (the C-53 defect) or throw away the record's own words. The page travelling beside the sentence gives this region the same unmisfilable tie the exchange table gives the other. Episode 3's warrant is the reader at p.6: "The beach scene is awesome." Episode 2's is the same page: "…I would like to hear more about chapters 2 and 3 as well," — which names the episode by NUMBER, and a number could only be mapped through this project's own scheme, which is exactly what L-26 forbids. So the mapping is evidenced instead: at p.4 the reader says he will "read gently until bloom appears in chapter four," and Bloom does appear in the fourth section the held text marks. His numbering is the book's, on the record's own evidence — an argument converted into a citation (L-27) Seventeen of the eighteen episodes now show the book's own words. Episode 5 alone shows none, and it says so specifically rather than under a blanket sentence: no exchange title names Lotus Eaters, and the reader's own recorded words name neither it nor anything in it — the only thing the study has about it is its own analytic row, which is the refused region. That section carries the study's sentence about the episode instead of a silence. Enforced: check.mjs §11f validates each region by its own rule, refuses an unknown region, requires an ordinal warrant to carry its record evidence, and refuses ordinal evidence carried without one; §11i requires the refusal to name BOTH regions, or it understates what was searched. One consequence caught in passing: the study's undercount caveat rendered only in the no-passage branch, so when episodes 2 and 3 gained passages it would have left the site silently while remaining entirely true. It now renders wherever it is true — an in-range episode with a zero count — and §11i checks that placement over every episode, in both directions
C-54 07-25 3 C-51's correction was applied to the five cites and not to the two sentences above them, so the withdrawn claim stayed published in its most prominent form. The debt C-51 named was curve.html publishing all five pilot passages under "the scene is the exchange's." Those five cites were rewritten from the data. But the same claim was made twice more on the same page, and both survived: the passage section's own intro read "The record names the scene; which lines to show is the project's choice," and the caveats list read "the scene each passage answers is sourced from the record." The intro is the sentence a reader meets first. Found by an adversarial verifier that had been asked about something else entirely and reported it as collateral. This is learning L-24 committed inside a single session — a pass that re-reads the pictures inherits the words — and the mechanism is exact: the fix was scoped to "the cites", the grep that found the debt matched the cite string, and the two prose sentences said the same thing in different words. A second, smaller misjudgement is recorded with it: C-51 estimated the cost of correcting the artifact as "rebuilding its PDF and its deck," which is why the debt was deferred rather than paid. That was wrong. curve.print.html and deck.html carry no passages at all, so neither the PDF nor the deck was ever affected; the correction cost five lines. An overstated cost deferred a real fix — the wrong-qualifier failure (L-17) applied to effort rather than to evidence Both sentences corrected, and the correction is disclosed on the page rather than swapped in quietly: the caveats entry now states that an earlier version said the record named the scene, that it did not, and that the correction is catch C-51 (anchor A4). The gate that made this a fix is broadened accordingly — §11f no longer looks for the one string that was found first but for a pattern set covering every form the claim took, applied to every surface a passage declares. It deliberately does not match the past tense, because disclosing a withdrawn claim is not asserting it. Verified by mutation: reintroducing the claim as a cite and as the section intro each turns the build red
C-53 07-25 3 C-51's own fix was refuted, on a better ground, by the next adversarial pass — and the grading it introduced is withdrawn. C-51's remedy was to declare each passage's sourcing strength as a tier: scene where the study named a locus narrower than the episode, chapter where it named only the episode, motif where it named a recurring thing. Three lenses took that apart and two findings held. (1) The tiers drew evidence from three different regions of curve.html and treated them as one region. Only the sixteen-exchanges table summarises the reading record and carries a page a reader can open; the episode-by-episode rows and the peak-quote cite lines are this project's own prose. So "the record names Nausicaa's fireworks scene" was pointing a reader at record p.48, where that phrase does not appear — the phrase is the project's, in its own cite line. Same for "The Sirens overture" (p.31) and "closing the Cyclops day" (p.40, and the study's own gloss says that reading day spanned the end of Sirens and all of Cyclops — broader than the episode, not narrower). Meanwhile the identical evidence class was demoted elsewhere in the same pass: episode 16's "the M'Intosh thread paid off" is also a sentence from the project's episode table, and it was pushed down to motif while episode 11's overture, from the very same table region, sat at the top tier. (2) The grading was applied unevenly, and in the project's own favour. Every demotion landed on a newly-adjudicated entry; not one of the four already-published pilot passages was re-examined. And episodes 6 and 8 were decided by different rules in the same pass — "the funeral carriage" kept as a locus while "the lunch" was demoted, though the carriage runs about half of Hades and the lunch about a quarter of Lestrygonians. One further defect: episode 11's second passage was labelled with the first passage's evidence, and the p.30 cite it actually carries names two episodes and no locus — the same string on which the episode 10 candidate had just been rejected The grade is withdrawn, and with it the thing that could be leaned on. Nothing now rates how strongly the record sources a passage. Each entry publishes the evidence instead: the exchange whose title is its warrant, that title verbatim, its date, and its page of the reading record — so a reader sees how much the title names rather than taking the project's word for it. Two facts about the title are recorded separately and neither is inferred: namesEpisode (the title contains the episode's scaffolding title) and namesInside (a phrase of the title naming something in the episode, or null). Where namesEpisode is false — episodes 1 and 4, whose exchanges are titled by subject rather than by episode — the placement rests on the held 1922 text alone, which the checker already verifies against the source's own episode markers, and the page says so. check.mjs §11f now enforces the region: an exchange title must be verbatim in the sixteen-exchanges table, must match that exchange's own row for page and URL, and must not appear in the episode rows or in any cite line. All sixteen passages were re-anchored under one rule, the ratified pilot's five included — which is what the second finding required. The wider lesson: an evidence region is part of a citation, and a project with several audited surfaces of its own will quote itself unless the admissible region is named and enforced L-28
C-52 07-25 2 The constraint model's departure minutes were one render away from being published as arrival times. Step 3's first derivation labelled every entry of the model's CANON array as "Bloom · canonical stop · PLACE at HH:MM". CANON's own comment one line above it reads "departure minute -> destination": the minute is when the canonical day SETS OUT for the place, not when it is there — so [645,"newbridge"] would have told a reader Bloom was at Newbridge Avenue at 10:45 when 10:45 is when he leaves for it. The same pass marked every Boylan window as sourced, while the model's own comment says "fix = the stated hour; window = fix +/-30 min (assumption 8)" — the hour is 03's, the window is the model's, and the window is an approximation in every row whether or not its src line carries a marker. Both are L-17 exactly: the claim was right, the qualifier was wrong. Found by reading the derived output against the arrays' own comments; nothing reached a published surface Each track now carries the array's own comment as a basis field and a verb that comment supports — is documented at, is sighted at, sets out for — and Boylan's windows are marked approximate by construction rather than by regex. tools/build-substrate.mjs throws if any of the three arrays parses to nothing or loses its basis comment, so the model's times can never be published without the model's terms. The join to the day is on 03's own section numbers, never on the clock: episodes 1–3 and 4–6 share their hours, so a clock join would be ambiguous by construction
C-51 07-25 3 Nine of eleven passage selections claimed the reading record "names a scene" when what it named was the episode. Step 1's first draft went to two adversarial verifiers per episode — twenty-two verdicts — and every one of the eleven was refuted, on one uniform pattern: the passage was well chosen, both anchors resolved byte-exact and unique, the evidence string was character-for-character verbatim — and the attribution was one notch too strong. "the tower" is the setting of all of episode 1; "the newspaper office", "the lunch" and "the Shakespeare debate" are likewise coextensive with their episodes; "the M'Intosh thread paid off" names a motif; and "the hour Boylan goes to Eccles Street" names a movement that does not happen in the episode it was attached to — the chosen id even promised a fruit basket that sat outside its own anchors. Two further defects, each its own class. (a) The project's own alias list was cited back as the record speaking: to find which episode an exchange belonged to, the brief supplied aliases ("the tower" for Telemachus, "The Bloom household" for Calypso) and recorded the match; a selection then offered that match as corroboration that the record named the scene. (b) Two selections filed evidence taken from the study's episode table under an exchange's page of the record — the episode table carries no page, so the citation would have sent a reader to a page that does not hold the sentence being quoted (L-20). The vocabulary needed to say this honestly already existed and was used exactly once: the pilot's Oxen entry reads "the exchange names the chapter, not a line" FIXED by making the strength of the sourcing a declared, checked field rather than an argument. Every passage now carries evidence.tierscene where the study names a locus narrower than the episode, chapter where it names only the episode or its setting or occasion, motif where it names a recurring thing — and check.mjs §11f enforces it: a scene tier must name the locus, that phrase must be verbatim inside its own evidence quote, and the quote must be verbatim in the study; chapter and motif must carry no locus at all; evidence drawn from the episode table may cite no page of the record; and every evidence URL must resolve. Episode 10 was re-selected under the honest frame and its id now names only what its anchors hold. The tier split is published on /episodes/ and in all eighteen reports, and the per-tier counts are derived into docs/STATE.md. Escalated to L-26 and L-27. Named and NOT fixed: curve.html's rendered cite reads "the scene is the exchange's" for all five pilot passages, Oxen included, whose own data says the exchange names the chapter — correcting the artifact means rebuilding its PDF and its deck, so it is queued and named here rather than done silently (the C-29 pattern) L-26, L-27
C-50 07-25 3 One stray NUL byte made the checker invisible to grep — inside the file whose own comment records that lesson. tools/check.mjs carried a single literal NUL at offset 35405, as the fallback in a sentinel: WORDS[t.buildCap] ?? "\0", in anchor A11's cap-note comparison. Functionally harmless. But ripgrep classifies any file containing a NUL as binary, so every grep over the checker returned nothing at all, silently — and grepping tools/ for rule names is precisely how catch C-44 found its worst defects ("grep readingAnchor tools/* returns nothing", "check.mjs contained the string atlas zero times"). A zero result from a binary file and a zero result from a genuine absence are indistinguishable, so the audit method this project most relies on had quietly stopped working on its most important file. Fourth instance of the C-08/C-16/C-18 stray-byte family — and it survived inside the very function-neighbour whose comment reads "the first version used NUL bytes, and this repository has three catches about stray bytes in source files": the sentinel was removed from plain() and left standing twenty lines away The sentinel is removed rather than re-encoded, which is the fix plain() had already learned: const word = WORDS[t.buildCap] and a word && … guard, so nothing needs a stand-in value. A11's two gates were then negative-tested — the cap itself by promoting a fourth Type-I dimension to building, the cap-note by moving buildCap under the note the site prints — and both went red, so the fix did not cost the coverage. The class is closed structurally by new section §11l: every text source under tools/, site/, data/, docs/, design/ and public-repo/ is scanned for a NUL byte on every build, because three catches taught the encoding lesson and not one of them could catch the next instance
C-49 07-25 3 Dimension 9 was kept off the episode index for a day on a reason its own document contradicts in its second sentence. /episodes/ listed the Concordance of Failures among the dimensions that "do not key to episodes", with the reason "keyed to Homeric episodes, not to the day's eighteen". The artifact opens: "Not the Homeric correspondences … the eighteen places where Joyce refuses Homer. One row per episode, each anchored in the 1922 text." Its rows carry id="ep1"id="ep18" with the day's own scaffolding titles; its distribution table counts the day's episode numbers ("the register is lowered · 8 · 1, 4, 5, 7, 9, 11, 13, 15"); and its unit field in the data model reads "one column, eighteen rows". The dimension is keyed to the day's eighteen episodes, each compared against a Homeric moment — the reason had the relation backwards. It was not a slip in one place: the ratified plan's step 4 inherited the same sentence ("Dimension 9 is keyed to Homer's episodes, not the day's — the index says so honestly"), so the falsehood was carried into the document the author ratified. L-17 on the qualifier, L-15 on a claim repeated being still one claim. Found by step 4's own investigation, which the plan had scheduled as "first an investigation, then only what the rows support" The reason is retired and dimension 9 joins the episode index: every section carries its refusal — the kind, the A3 state, the row's own confidence, whether it is transacted in money — and a deep link that opens the concordance at that episode's row, all parsed from the artifact's own bytes. Dimension 13's exclusion goes with it on the same pass: "keyed to hours and routes from base document 03, not to episodes" was true of the model and beside the point, because 03 maps its hours to episodes by section and every src field in the model already cites the section. Two dimensions leave notEpisodeKeyed, which now holds only the two that genuinely do not key to the day. Two new guards: build-substrate.mjs cross-checks the eighteen parsed rows against the artifact's own distribution table and throws rather than publishing a disagreement, and check.mjs §11j reads the concordance PDF's destination table so that none of the eighteen published deep-links can name a destination the file does not carry (L-20)
C-48 07-25 Not an error — an author ratification, logged. The episodes plan is ratified in full, steps 1 through 5 (docs/episodes-plan-proposal.md, now the ratified plan): the passage layer grows episode by episode; the exchanges are placed; the model's hours join the day; the concordance is investigated for day-links its own rows carry; and step 5 — the Atlas — is REOPENED by the author. The panel's two argued vetoes were against starting the Atlas on the assumption it was nearly ready (C-42's lesson); the author's ratification is the deliberate reopening those vetoes waited on, and it carries the plan's own sequencing: the sourcing programme first, batch by layer, and the fetch tool's deferred clearance-comparison ships before any panel is assembled. The chair proposes; the author ratifies; the author has Recorded here and in the plan document; the work itself is the next session's, by the author's instruction — the session that ratified it was at the end of its context window, and a handoff was prepared instead of a start
C-47 07-25 Not an error — author rulings and a commission, logged. (1) The decks are approved on the card-sheet renders ("Approved. Go on.") — C-41's standing verdict that the decks are visually poor, open since 20 July and held as "answerable only by a person," is answered by the person: the five card-sheets pass. The presentation register is closed at every built dimension. (2) The author commissions the remaining build: the two owed diagrams (object-museum, constraint-model — the last owed register slots); a voice pass over every site page in the Vera register — natural and warm, the voice of the author's novel — with every honesty marker, every fact and the no-counts-in-prose rule (L-22) preserved; a downloadable PDF report for every episode section of /episodes/; and a forward plan for the episodes/topics/sections, to be shared for ratification, not executed Executed the same session: see the commit trail. The voice pass touches SITE TEMPLATES only — the base documents render verbatim as always, artifacts keep their audited content, and quoted matter is untouchable (Senn). The episode reports are derived documents of the episodes index, not register artifacts of any dimension — they do not enter the register indexes
C-46 07-24 Not an error — four author rulings on the open gates, logged. (1) Anchor A19 is ratified: Joyce's words appear as printed or not at all; no dimension may characterise a passage it does not also show. Reach set at ratification: existing surfaces already comply; the obligation binds new artifacts and artifacts as they are touched — no bulk retrofit. (2) The deck path is sample-first: the card-sheet render is built for ONE deck (Four Odysseys) and delivered to the author, who judges both the layout and the visual quality (the C-41/L-24 verdict) on the sample before the other four proceed. The panel's sight-unseen +14 is thereby narrowed, not overruled. (3) four-and-nine.html is deleted — verified before the ruling as a superseded draft of model.html (same title, same four sections, 212 of 236 substantive lines shared); git history preserves it; the orphan check's exceptions list returns to empty. (4) Dimension 9's presentation slot is closed as not-owed under A8, dated, with the reason on the dimension page: eighteen refusals are textual arguments and cannot survive as captionless image cards (C-19). Dimension 9 is thereby the sixth built dimension A19 written into docs/04-dimensions.md with its enforcement named (the checker already verifies every declared passage and fails on unverified quotes); the register budget table revised deliberately with the dated note; the draft removed with git rm; the sample render commissioned the same session
C-45 07-24 2 The substrate's first full verification pass found a tidied quotation in a published artifact — C-29's class, caught mechanically this time. women.html's Mrs Breen row quoted "(She fades from his side.)" — but the 1922 page's stage direction does not close there; it continues "Followed by the whining dog he walks on toward hellsgates…". The artifact truncated the direction mid-sentence and silently completed Joyce's parenthesis, which is the lure of grammatical rectification working at the level of punctuation. Found by tools/build-substrate.mjs, which now verifies every quoted unit in the three inventory artifacts — 714 of 714 — against its claimed episode's slice of the held 1922 text on every build. The same pass established that two apparent failures out of 81 initial ones were real; the other 79 were the verifier's own normalization gaps (curly-vs-straight apostrophes; the transcription's _italic_ markers, which C-29 had already noted the artifacts vary in keeping) The elision is now marked with the artifact's own [...] convention in both women.html and women.print.html, and women.pdf was rebuilt. The wider fix is structural: npm run substrate derives data/substrate.json from the artifacts' bytes with row-level verification, npm run check fails on drift and on any unverified row, so a tidied quotation now turns the build red instead of waiting four days for a panel to read it. The claim the museum deck was stripped of in session 05 step 1 — "read from the 301 stations" — is now true of the substrate in the exact sense the deck falsely asserted: a tool opens the files and checks
C-44 07-20 3 The advisors panel sat for eleven sessions and found eight defects in already-published work, three of them the same defect wearing different clothes. Full record in docs/panel-session-04-interim-report.md; every claim below re-verified against the repository by the chair before it was written down, and two panel claims that did not survive that check are recorded there as well. The systemic one: a rule the project publishes and no code enforces. (a) Anchor A11's Type-I cap is rendered to the readersite/dimensions/index.njk:84 prints "No more than three Type-I dimensions are built (anchor A11)" — while buildCap, A11 and Type-I appear in no file in tools/. The count sits at three because the fourth has not shipped, not because anything refuses it, and state.mjs never reads the type field at all. Twelve lines below it, a hand-asserted "six of the Type-I dimensions may be dropped" is accurate by coincidence. (b) readingAnchors — the field connecting every dimension's claims to the reading record — is opened by no tool; grep readingAnchor tools/* returns nothing. (c) check.mjs contained the string atlas zero times, so the one file carrying legal consequence was the one file no check touched. The rest: (d) artifacts/constraint-model/four-and-nine.html is a total orphan — 22 ids, zero hrefs, in no data file, no build output and no document — because the orphan check runs one direction only: it catches output that source does not derive, and nothing catches source the ledger does not claim. (e) All 301 quoted stations are wrapped in curly quotation marks the 1922 text does not print, unmarked as the project's, though A2 marks episode titles as the project's on identical grounds. (f) 126 of 181 women.html rows are recalled or hallucinated and every one carries a clock value under a column headed "Hour" — Ann Hathaway, dead 1623, carries timestamps on 16 June 1904; the column records position in the text, and nothing says so. (g) "Sixteen women" is sixteen table sections, one of which is "Miss Lydia Douce and Miss Mina Kennedy" — seventeen named women minimum, and the caveats say the selection is a selection while the number that travels does not. (h) The URL contract calls /dimensions/ a "faceted index"; the built page carries zero filter controls. And the counting pattern Eames named, which is the reason to log these together: A11 counts declarations not deliveries, the deck tools count inputs not outputs, state.mjs counts artifacts that exist not artifacts that work — three floors, one error of kind FIXED in full, 24 July 2026 (panel session 05, step 1), each item verified per L-25. (a) A11 is enforced: check.mjs §11a fails the build when a type's built-plus-building count exceeds its declared buildCap, and when the reader-facing capNote diverges from the enforced number — negative-tested by promoting a fourth Type-I to building and watching it go red; state.mjs now derives the per-type tally into STATE.md; the hand-asserted "six of the Type-I dimensions may be dropped" sentence is deleted from site/dimensions/index.njk. (b) §11c requires every built/building dimension to carry at least one substantive, resolving readingAnchor — negative-tested by emptying one. (c) fixed 20 Jul as recorded. (d) §11d walks artifacts/ in the missing direction: every file must be claimed by the ledger, a print pair, the Atlas layer, or a dated exception — four-and-nine.html sits in the exceptions list pending the author's ruling, and a planted stray file turns the build red. (e) the museum's caveat block now declares the curly quotation marks as the project's setting. (f) the Hour column is relabelled "Hour in the text" in web and print, with the position-not-clock rule stated in both (Ann Hathaway named as the example), and women.pdf rebuilt. (g) every "sixteen women" surface now states the basis — sixteen census entries, seventeen women named, Misses Douce and Kennedy sharing one — including the deck's title card and foot. (h) the contract line reads "typed index". The counting pattern Eames named is answered structurally by the same session's substrate: npm run substrate verifies all 714 quoted units against the 1922 text at every build (see C-45)
C-43 07-20 3 Three more vacuous checks, one of them total, inside the checker written to prevent them. Found by an adversarial audit of check.mjs that mutation-tested every section rather than reading it. (a) The document-text sampler was structurally blind to every markdown table. Its regex rejects any line containing a pipe, and catches.md is 43 table rows out of 50 — so the two lines it sampled were the preamble sentences. Stripping every <table> from all fourteen rendered document pages left the section green: the entire catch log could have vanished from /method/log/ and the build would not have noticed. (b) The canonical check's regex matched rel before href only, and swallowed the null when the order was reversed, so an off-base canonical passed both halves. (c) A latent trapdoor: walk() returns only files named index.html or 404.html, so any HTML emitted at another permalink escaped the orphan, canonical, styling and internal-link sections at once — armed, not fired, since no current template hits it FIXED, and negative-tested before commit. The sampler now also samples table cells (29 of them across the fourteen pages, where it sampled none); the canonical check finds the tag first and then reads its href, and fails a canonical with no readable href rather than passing it; a new section asserts that every HTML file in the output is either a walked page or a contracted artifact. C-39's §10 defect is fixed in the same pass: skips are counted, named in the ok line, and a missing sibling now fails unless the dimension's own register budget explains it. Each of the four was verified by breaking it and watching the check go red
C-42 07-20 4 C-38's resolution was never performed, and the falsehood it logged went on to misdirect the next session. C-38 records its fix as "00-method rewritten … HANDOFF and README corrected." The commit that logged it, 9cc12c5, touched neither file — its eleven paths include 00-method.md and not the other two. Both still carried, verbatim, the sentences C-38 quotes as false: HANDOFF.md said "PDFnot one has been built by this project … the project's largest open gap" and recommended "Build the hyperlinked-PDF pipeline. Start here." when six hyperlinked PDFs were already on disk; README.md said "0 of 16 dimensions built, and the site says so honestly" when the site said five. The next session read HANDOFF.md first, as instructed, and was told to rebuild a pipeline that already existed. The same staleness reached the author's own handoff prompt, which stated "thirty-six catches and twenty-one learnings" against an actual 41 and 24 — a figure last true two commits before the document containing it was written, so it was never true on any commit where it appeared. Every count was wrong and not one claim was false in substance: L-17 exactly FIXED, structurally rather than by rewriting. Rewriting is what C-38 tried; it is a fix that has to be remembered in a second place, and it was not. tools/state.mjs now derives the state — dimension statuses, artifact and register counts, which PDFs are genuinely hyperlinked (by inspecting their bytes for link annotations and an outline), C-34 coverage, and the catch and learning counts with their gaps — into docs/STATE.md. npm run check regenerates and byte-compares, so a stale state file fails the build the way a stale artifact does. HANDOFF.md, README.md and CODE-PROMPT-NEXT.md now point at it and state no counts of their own. Escalated to L-25 L-25
C-41 07-20 4 A deck card published the one sentence its own presenter notes twice forbid putting on a card. The Object Museum's deck foot read "every object converges on 7 Eccles Street in the small hours" — and presenter-decks/object-museum.md names that exact claim twice as "the quiet thesis, kept off the cards" and "the through-line, spoken once and never printed on a card." It was also spoken to screen-reader users as the final card's aria-live tag, so the argument reached the one audience with no way to look away from it. Three more on the same deck: a plate carried the argument three times over (register line, drawn note, foot), and two further foot lines stated the museum's method rather than naming its content. The sentence was byte-identical to the previous build — it survived a redesign because nobody re-read the foot. Found by the design pass's own adversarial audit, not by me Six strings replaced with identity labels: names, hours, counts, and drawn solid; drawn dashed. The wider finding is worse and is recorded rather than fixed: the audit's verdict on the redesign was that it "improved, but not along the axis the author's verdict named" — thirteen plates gained role=img + title + desc where the old file had none, which is a real accessibility floor raised, and inline font-size/stroke-width went from 23/36 to 0/0 — but the drawing inventory moved by one path and one ellipse. It is the same plates rescaled with the typography regularised: a systematisation pass, not the design upgrade that was asked for. The author's verdict that the decks are poor therefore still stands L-24
C-40 07-20 4 The deck PDFs are still wrong, at the third attempt, and this time the audit found it rather than me. 90 cards across the five decks produce 56 pages, so 34 cards are silently absent — most cards are class-toggles over a SHARED figure, and a print rule that reveals elements cannot reveal states. Worse: all 56 pages carry an empty caption bar, because the captions are filled by JavaScript at render time and the page is printed at card zero. The identity labels that C-19 and C-36 define as the deck's ENTIRE public content appear in none of the five PDFs. The tool reported success for all five FIXED, 25 July 2026 (author's unlock, C-46.2), at the fourth attempt — and the fourth attempt failed three times first, each failure caught by its own checks rather than shipped. tools/build-deck-sheet.mjs does both things this row prescribed: it drives each deck's own render() card by card (a wrapper loads the deck in an iframe and walks it through the keyboard events the deck already listens for) and emits a static print DOM (each card's rendered stage and caption cloned into its own page section, the identity label as real text). Root cause, found building the author's sample: each deck's own @media print block WAS the failed fix — it forces every plate visible with a page break each, which is why 92 cards kept becoming 65 pages. The sheet strips the block outright; state comes from the walk. The tool derives the card count from each deck's own CARDS array, deletes the target before rendering, embeds a per-card self-audit (state-class count, caption length, laid-out stage height) into the PDF's own /Title, and exits non-zero unless every gate holds. The three failures that audit caught during the build, recorded because each would have shipped as a green run under the old tool: (1) four of five decks bind their keydown to the stage, not the document — the first full run produced 92 "pages" of which 73 were copies of card one; (2) a non-greedy print-block strip beheaded the block and leaked its height:auto !important rules to screen scope, collapsing every stage to a 119-unit sliver — states correct, captions present, nothing painted; (3) the decks style body as a single-viewport flex app, so the sheet's sections flex-shrank to ~26px each. Final state, verified against the author-approved sample byte-density and page geometry: 5 decks · 92 cards in · 92 pages out, delivered to the author's Downloads and verified through an independent path. The old build-deck-pdf.mjs and its five broken -audience.pdf outputs are retired (git rm; history keeps them); npm run deckpdf now runs the sheet tool. The stale-render acceptance is dead in the new tool; build-pdf.mjs and build-presenter-pdf.mjs still carry it and are named in the remaining-debts list rather than silently absolved
C-39 07-20 3 A vacuous check, reported as 488 passing rows. check.mjs section 10 compares table rows between a print source and its artifact — and silently compares ZERO rows for three of the six pipeline PDFs: constraint-model (all eight tables are data-derived, so the loop body never executes) and four-odysseys and concordance-of-failures (their sibling artifact does not follow the filename convention the lookup assumes). The audit ran the skipped comparison for four-odysseys: 10 of its 15 rows have no match in two-axes.html, so the skip was hiding live divergence. This is L-14's failure mode — a green check that would go green whatever happened — committed inside a checker written to prevent it NOT FIXED. The count must report rows-compared AND files-skipped, and a skip must name itself. Also unfixed from the same pass: build-pdf.mjs's same-length guard on the xref patch can never fire. Corrected 5 August 2026 by the closing audit: the §10 half WAS fixed on 20 July 2026 (commit 8148f32; C-43 records it — skips are counted and named in the ok line, and an unbudgeted missing sibling fails), and this cell went on saying NOT FIXED for sixteen days. What genuinely remained open was the second clause alone — build-pdf.mjs's same-length guard, which today's bytes confirm still cannot fire because replaceStringValue pads every replacement to its original length; recorded as the surviving residue rather than fixed, since the guard's unreachability is harmless while padding is the method.
C-38 07-20 3 Base document 00 published "no PDF has been built" for hours after seven were. The correction note for the identical staleness sat one paragraph above it. HANDOFF.md — the first document the next session is told to read — was wrong on six of eleven dimension rows and still called the PDF the largest open gap. The README still said "0 of 16 dimensions built, and the site says so honestly" while the site said five. The generated surfaces were correct throughout: the dimension index, the register indexes and every dimension page are derived from data/ and told the truth. Only the prose lied 00-method rewritten keeping both revisions, because the pattern is the point; HANDOFF and README corrected. The structural lesson is L-22: derive it or it will drift. Every count in prose that a build could compute is a future falsehood L-22
C-37 07-20 4 The Reading Log's privacy claim was false in the one way that matters. The instrument states in bold that the project receives nothing — "not the entries, not a count of them, not the fact that you opened this page." Its dimension page at /dimensions/reading-log/ carried the site's GoatCounter tag, which runs same-origin with the log and can therefore read the very localStorage the page promises never leaves the device. Found by the security audit, which called it the top finding and was right. Nothing suggests it was ever exploited; the defect is that the promise was not true as built The tag is removed from that one page by an explicit condition in base.njk, with the reason written beside it so nobody restores it for consistency. The rest of the site keeps it. Note what this cost: the project's most carefully written honesty marker was undermined by a global template decision nobody re-read against it L-23
C-36 07-19 Not an error — an author ruling that amends a register's public form, logged. The presentation register gains a presenter deck. Catch C-19 had ruled the presenter's material private: the site publishes image cards without explanations, and the facts and questions a presenter speaks from stay in presenter-decks/, source-only. The author now wants that material built and delivered — as PDFs, alongside the audience decks. C-19's substance survives and is not reversed: the public deck still carries no argument, and the presenter deck remains OUT of the public site unless the author says otherwise. What changes is that the presenter's layer becomes a produced artifact rather than a working note, and the checker's rule that presenter-decks/ must never reach the built site still stands and still passes Presenter decks rendered to PDF from the existing markdown notes through the project's own hyperlinked-PDF pipeline; audience decks rendered to PDF alongside them. Delivered to the author's Downloads folder and committed to the private repository. Not published: the public site is unchanged in what it says, and npm run check still fails if presenter material reaches it. If the author wants them public that is a one-line reversal of C-19 and it should be logged as one
C-35 07-19 Not an error — an author ruling reversing a panel ratification, logged. The design's refusal of photography and imagery is rejected. Images are allowed. The refusal came from panel session 02 and was in force from the day the design was applied. The author overruled it. Recorded honestly: the refusal was made when the project had no images and no rights position, and a design that forbids what you do not have costs nothing while looking principled — but it was also protecting something real, which is that a site of twenty-minute documents does not want decorative photography. That protection is now carried by a rule about purpose instead of a ban on a medium. It had also produced a live contradiction the session had already flagged: dimension 14 is a made object of images, proceeding under a design that formally refused its medium The refusal is struck through rather than deleted in 06-design.md (anchor A4), and the replacing rule written beneath it: an image must be evidence, an object of study, or a signature device — never atmosphere; every image carries a named licence at a named URL; nothing is fetched at read time, so no hotlinking and no leak of the reader's visit; the accessibility floor does not move; and the site's own chrome stays imageless, because this reverses a rule about the WORK and not about the furniture. Dimension 14 is now consistent with the design it is built under. The audience decks are freed to be what the register calls them — image cards. Catch C-19 is untouched: a deck may look richer without saying more L-21
C-34 07-19 4 Every published artifact is a dead end, and the project has been building more of them all day. Found by the author, who followed a deep link — /assets/object-museum/museum.html#potato-talisman — and could not get back. It is not one artifact: not one of the fifteen published HTML artifacts contains a single link back to the site, across roughly 190 addressable ids. A reader arriving from a search engine, a citation, or a shared fragment is stranded with no route to the dimension the artifact belongs to, to the method, or to the home page. Two things sharpen it. The artifacts are the crown jewels — playtest-01 records all three cohorts naming them as the reason to stay — and they are the one surface with no way onward. And the hyperlinked PDF register built earlier the same session links into these artifacts by design, so the project has been manufacturing arrivals into a trap it had not noticed. The site links out; the artifacts link nowhere; the loop was never closed Referred to the advisors panel rather than patched, because 06-design.md rules that new chrome beyond the ratified system needs the panel again, and because the question genuinely collides with four standing rules: the two reference interactives are prior work published byte-verbatim, the decks are image cards without explanations (C-19), the design refuses icons in chrome and hover-only reveals, and the Reading Log must transmit nothing (C-22). Panel session 03 ratified the spec, recorded in docs/06-design.md with its dissents. APPLIED to the three artifacts that have citable sections — museum (32), women (16), instruments (13): head strip, foot strip, and a per-section return that is the first Tab stop after the fragment target. The checker now validates 157 links inside published artifacts, up from 81. QUEUED: the five decks, the three artifacts without citable sections, the Reading Log, and the site-side wording that pushes readers over the cliff L-20
C-33 07-19 Not an error — the Atlas's two gates cleared, logged. The object layer: 17 of 18 cleared, each with a named licence at a named URL, fetched rather than inferred; the one that did not clear carries a period document in its slot, which is still a second register. The Ordnance Survey gate: closed by reading the licence, not by describing it. The per-image tag on the NLS Dublin sheets reads Re-use: CC-BY (NLS) and the terms page resolves it to CC BY 4.0 — not NC, not ND, not SA — with the credit line "Reproduced with the permission of the National Library of Scotland" and a link to maps.nls.uk. County Dublin exists in a revision surveyed 1906–1909, which is the layer wanted. Two doors that looked right and were not: the Digital Repository of Ireland applies its own CC BY-NC-ND reuse licence, which fails this project's bar, and links back to NLS anyway — so the peer-reviewed paper that named DRI was pointing at the wrong end of the chain; and Wikimedia Commons holds no OS Ireland Dublin sheets, so the sidestep considered earlier does not exist RIGHTS.md clause 7 extended with the map route, the exact credit line, the two false doors, and the build constraint that matters: the NLS IIIF server caps a request at roughly half a megapixel, so there is no whole-sheet download and the Atlas must tile at 512×512 or smaller. Both gates are now closed and dimension 14 is buildable at three registers. It is not begun in this session — the panels themselves are the next session's work
C-32 07-19 Not an error — an author rescope and its rights survey, logged. Dimension 14, the Atlas, was rescoped to publicly available material, on the condition that it be struck if a rights problem could not be avoided. Four material classes surveyed, every conclusion adversarially challenged; three of the four initial surveys were found to have overstated what they had established. The load-bearing finding: an institution's terms are not the copyright — the NLI and Tailte Éireann both assert re-use conditions over their own scans while holding no copyright in a French photograph or an expired Ordnance Survey sheet, so the remedy is sourcing, not permission. The most consequential finding is about form rather than rights: CC BY 4.0 §3(a)(2) permits attribution in a colophon rather than beside the image, and CC BY-SA 2.0's "at least as prominent as" clause is satisfied vacuously only while no panel carries any credit at all. Warburg's refusal of the caption is therefore what makes the licensing lawful — and one signature added to a panel would breach every share-alike licence on it at once The dimension stands. Rescoped in the data model and in RIGHTS.md clause 7, with the sourcing rules, the colophon rule and the no-caption trap written down. Dropped as uncleanable: any 1904 Dublin newspaper page scan (the text is public domain; the scans are not, and no free source exists), Joyce's handwriting and all manuscript images (the Rosenbach grants nothing, and unpublished Joyce is in UK copyright until 2039), photographic portraits of Joyce, and the separate tram map. Two gates remain and the dimension is not begun until both clear: the object layer has not been surveyed at all — nobody has cleared a single one of the eighteen — and the Ordnance Survey licence line has been read by nobody, resting on a peer-reviewed description of the arrangement rather than the arrangement itself. Neither is a rights problem; both are unfinished work, named so the dimension is not started on the assumption they are closed L-19
C-31 07-19 Not an error — a standing limit on the project, set by the author and logged. This project does not consult primary sources it does not already hold. No library visit, no printed Norton edition of Wilson's translation, no screening of Nolan's film. The consequence is precise and worth stating: dimension 16's Wilson claims stop at what public sources bear (C-30's markings are final, not provisional), and the film's four open questions are closed as permanently unresolved rather than left pending. Every "when someone opens the book" note in the project was a task nobody was ever going to do, and carrying it made the record look less finished than it truthfully is Dimension 16's confidence field and note rewritten so the markings read as final; the four open questions closed with their last known state kept, because an abandoned path is shown, not hidden (A4); the "held at Medium until the interview is found" clause made permanent. The dimension is kept — its Wilson half is now the best-evidenced material in the project, and its finding (that fidelity to plot and interior orientation are separable axes) never rested on the unverifiable film detail. Dimension 9 is confirmed to survive: its rows verify against sources/ulysses-1922-pg4300.txt, which the project already holds, so it is not affected by this limit L-18
C-30 07-19 3 C-28 resolved as far as the open web can take it, and all three Wilson claims came back overstated — each by exactly one word. The author directed a public-source check in place of the primary verification. Adversarially run, two passes. Results: the equal line count is High (Translator's Note, Norton, three independent readers of the printed book) but the figure 12,110 is withdrawn — no source gives a number for the English, it is arithmetic inherited from a Wikipedia sentence, and the Greek total is edition-dependent (Perseus numbers to 12,110 and prints 12,107). "Line-for-line" is Wilson's own phrase for her constraint but does not describe a strict mapping — her rendering of the tenth Greek line begins on her ninth. The meter is iambic pentameter (High) but "strict" is withdrawn: it appears in no source of any class, Wilson's invariable word is regular, and the closest published reading of her meter argues the opposite. "Slave" is High and primary for deliberateness and verified against printed text for the contrast — "slave" appears zero times in Fagles's Books 21–22 — but the implied uniformity is Partial, because Wilson writes "often" and, in the Book 22 hanging this dimension cites, writes "these girls" where the Greek has dmoai. Two ancestors identified, not one: the Translator's Note for intent, Mason's Nov 2017 NYT Magazine profile for the numbers. A "173 versus 18" word count traced to a single Quora answer and is struck. A search engine fabricated a Fagles line count when asked; several citations here would have been fabrications had the underlying pages not been fetched Dimension 16's confidence field rewritten claim by claim with its markings; the two untraceable figures struck; the corrected wordings are what any published surface must use. Nothing found was false — every claim was true in substance and wrong in its qualifier, which is its own lesson (L-17). What remains has one shape: nobody has opened the printed Norton edition, and reading the Translator's Note plus counting Book 1 would settle the rest in an hour L-17
C-28 07-19 4 The project asserted a verification it never performed — inside the paragraph warning against exactly that. Dimension 16's confidence field called two facts about Wilson's translation (strict iambic pentameter line-for-line across 12,110 lines; 'slave' where older translations say 'maid') High and "independent of any journalism", on the grounds that they are checkable against Wilson's own book. They are checkable. Nobody checked them. Both trace, in this repository, only to the admitted third-model commentary in library/ — the same document the same field describes as having a block bibliography in which no individual claim is traceable. The dimension's central finding rests on these two facts. Found by the adversarial audit built into the print-register pipeline, not by reading Both facts held at Medium and marked as relayed until the translation is actually opened; the confidence field now states plainly that the check was asserted rather than done. Dimension 16's PDF register is held — its draft asserts the same thing and will not be published until the marking is honest. Escalated to L-16 L-16
C-29 07-19 2 The print-register audit found four defects in already-published artifacts. Building a second register over existing work turned out to be a second pass over it. (a) women.html carries Project Gutenberg's plaintext italic delimiters unconverted — _(Eagerly.)_ and three others render as literal underscores inside matter the document calls verbatim. (b) instruments.html's figure caption says the marks concentrate "only at Cyclops and Circe"; its own matrix contradicts that. (c) model.html says sixteen modelling assumptions and lists seventeen, and its inline references number them one behind the printed list. (d) women.html says "the only one of the fifteen" once, among nine correct "sixteen"s The print documents carry the corrections and, where the source contradicts itself, show the contradiction rather than resolving it (anchor A4). The upstream artifacts are not yet fixed — they are published assets and each correction is its own byte-verified change; queued and named here so the debt is visible rather than forgotten. Corrected 5 August 2026 by the closing audit: the queue was discharged the same evening it was written — (a), (b) and (d) were fixed in the artifacts on 19 July 2026 (commits fda92ad and 8588970; instruments.html discloses its caption correction on the page as "Correction, 19 July 2026 (catch C-29)", the two women.html corrections were made without an on-page note), and (c) is deliberately SHOWN as a contradiction in model.print.html per A4 rather than resolved upstream. This cell carried the debt as open for seventeen days after it was paid.
C-23 07-19 3 Anchor A17 met a case it did not anticipate. The author supplied two documents of commentary generated by a third model (Kimi) on Homer, Wilson, Nolan and Joyce, and instructed that they be added to the project and used. A17 excluded "output from other models" so a second independent build could be compared later — read literally, that forbade this Resolved by the author, 19 July: A17 is revised, not merely scoped. The blanket exclusion becomes selective admission at the author's discretion — "I am now opening up the system for selective LLM input. I will use personal discretion at times I see fit." The chair's narrower reading (commentary on external works only) is superseded by the broader rule. What survives: nothing enters unless the author admits it; everything admitted is marked (provenance, and fact / report / interpretation kept apart); the ChatGPT answer-set stays out because it has not been admitted. Held in library/, source-only, never republished wholesale L-12

Ulysses — Learnings

Standing rules escalated from catches. A learning that has not changed an artifact is not yet a learning.

L-01 — The absent are a category, not a footnote. From C-01. In a book whose engine is a dead son, a dead mother and a dead father, characters who never appear need their own tier. Applied: fourth circle in the character map; anchor A3; dimension 6.

L-02 — A faithful map inherits the book's blind spots. From C-02, C-03. Mapping what the protagonists do reproduces what the protagonists ignore. The omission is data, not error. Applied: dimensions 2 and 3 were created from this; anchor A5.

L-03 — Author markup will be malformed; parsers must be total. From C-04. Real prose contains crossed emphasis. Converters must produce well-formed output from ill-formed input rather than fail. Applied: the PDF builder's inline converter.

L-04 — Verify coverage before claiming novelty. From C-06. Across two passes, five of seven "surely nobody has done this" candidates were occupied. Applied: anchor A12; source-research.md precedes any novelty claim.

L-05 — Count the operations, not the topics. From C-07. A project can look varied and be monotonous. Twelve dimensions, ten identical operations. The failure was invisible at the level of subject and obvious at the level of method — and the panel had already said so, which means a logged objection that produces no artifact change is not a catch, it is a note. Applied: the seven-type taxonomy; dimensions 13, 14, 15; anchor A11 capping Type I at three; the panel skill's type discipline; step 1 of the pipeline is now declare the type.

L-06 — Verify structure after every scripted edit. From C-08. A regex meant to remove a duplicate heading deleted the section between two matches. The write reported success; only a structural grep revealed the loss. Applied: scripted edits split on markers rather than substituting across them, and are followed by a heading/count check. Same family as the PDF coverage check.

L-07 — An instrument cannot precede the analysis that specifies it. From C-09. Urgency about collecting data is not the same as readiness to collect it. The questions a public reading log asks come from knowing what the categories of difficulty actually are, which is dimension 11's output. And unlike a document, a badly specified collection cannot be fixed later — you cannot return to respondents and ask what you forgot. Applied: anchor A15; the shipping order separated from the build queue in 04-dimensions.md and HANDOFF.md.

L-08 — Provisionality is structural, not stylistic. From C-10. A container cannot signal "this is temporary" through its appearance, because every appearance reads as a decision and gets reacted to as a proposal. The only way to defer design is to withhold the structures that carry it. Applied: anchor A16 — no navigation, no sections, one flat page — in CODE-PROMPT.md as a binding scope limit rather than a stylistic preference.

L-09 — A handoff document must not name its own container by version. From C-11. Any prompt or document that references the bundle by exact filename breaks the moment the bundle is revised — and handoffs are revised more than anything else in the project. Reference containers by pattern or by role, never by version string. Applied: HANDOFF-PROMPT.md now refers to "the zip beginning ulysses-bundle-." Standing check added to the audit: grep for version strings in every handoff artifact before shipping a bundle.

L-10 — An absence is not a gap until you know it wasn't chosen. From C-13. A consistency audit can prove a file is missing. It cannot tell you whether the file is missing by mistake or by design, and the difference is the whole meaning of the finding. Reporting an intentional exclusion as a defect wastes the author's time and — worse — invites them to "fix" something that was load-bearing. Applied: anchor A17; audits now report absences as questions ("is this intended?") rather than as findings, unless a document elsewhere in the bundle claims the file exists.

L-11 — Distinguish the unknown thing from the known container. From C-14. A project can be genuinely uncertain about its contents while being certain about their kinds. Deferring structure because the contents are unsettled throws away the part that was settled, and costs far more later — architecture retrofitted onto finished work is always compromise, while architecture built at n=0 is nearly free. The cost asymmetry runs opposite to the intuition that says wait until you know more. Applied: A16 withdrawn; A18 added separating architecture from visual design; base document 05 written and the Code prompt rewritten from build almost nothing to build the structure properly, and no styling.

L-12 — Admitted input is marked input. From C-23. The project's posture toward other models changed from a blanket exclusion to selective admission at the author's discretion (A17, revised 19 July). A rule of exclusion needs no bookkeeping; a rule of selective admission needs a great deal, because the danger moves from contamination to untracked provenance — material that is useful, unattributed, and eventually indistinguishable from the project's own findings. So every admitted item carries three things: who generated it, that the author admitted it, and what kind of claim each import is — sourced fact, second-hand report, or the commentator's interpretation (A5). An interpretation is never evidence: the commentary admitted on 19 July asserts that Nolan reads Homer through Joyce, and that assertion does not close the open question of whether Nolan has ever mentioned Joyce. Applied: library/ and its README; RIGHTS.md clauses 4 and 5; A17's revision; the fact/report/interpretation split required of every import.

L-13 — Two documents agreeing is not two witnesses. From C-24. When a second source appears to corroborate the first, check their bibliographies before raising any confidence marking. If both trace to the same underlying reporting, the agreement is one ancestor counted twice — and the project has promoted a claim on the strength of an echo. Three companion checks belong with it: a block bibliography (sources lumped at the end rather than tied to claims) makes no individual claim traceable, so nothing from such a document is a sourced fact merely because the document has sources; a count mismatch against a cited source (nine relayed where the source names ten) shows the framing is the relayer's, not the source's; and date coherence must be checked, because a citation that predates the event it supposedly attests is a gap hiding inside authoritative prose. Applied: dimension 16's confidence field; the advisors panel skill (Ginzburg's newest test); the external-input-provenance skill's common-ancestor section.

L-14 — A growth rule that is not derived is not a rule, it is a hope. From C-25. The README promised that adding an artifact costs one entry plus its file. Three separate mechanisms — the build's passthrough, the contracted inventory, the byte-comparison — each kept its own hand-maintained copy of the same list, and only one of the three failed loudly when it drifted. A documented invariant that no code derives will be true on the day it is written and false by the fourth artifact, and the project will not notice, because the build stays green when a list is merely incomplete. The test: for every "nothing is hand-maintained" claim, find the code that derives it. If there is none, the claim is a wish, and it is worse than no claim, because it is published. Applied: the asset field on every artifact; passthrough, inventory and byte-pairs all derived from it; a check that fails when an artifact declares no asset or names a missing source; the README rewritten to describe the mechanism rather than the aspiration.

L-15 — Discharge an anchor on its own reasoning, not on its restatements. From C-27. A15 was quoted in five places and each restatement compressed it a little further — from "the instrument's questions come from the analysis" to the single word "complete." By the fifth telling the anchor appeared to be waiting on a register, which is not what the veto said and not what it was protecting. Worse, one of its two legs had been quietly dissolved by a later author ruling (C-22 abolished collection), and nobody noticed, because nobody had gone back to the original. A binding constraint should be discharged by returning to the sentence that created it and asking whether its stated reason still holds. Being stricter than a rule's reason is not rigour; it is deference to a summary. And the same discipline that makes the project check whether two sources share an ancestor (L-13) applies to its own documents: a claim repeated five times inside one repository is still one claim. Applied: A15 marked discharged with its reasoning; dimension 15 unblocked; the anchor text now carries the two legs explicitly so the next reader can test them rather than inherit a word.

L-16 — "Checkable" is not "checked", and the difference is the whole claim. From C-28. A fact that could be verified against a primary source reads, in a confidence field, almost exactly like a fact that was. Dimension 16 said two facts about Wilson's translation were High because they are checkable against her book — and the sentence was true about their checkability and false about their status, because nobody had opened the book. The error survived because the phrasing was accurate on the axis the reader would test it on. A confidence marking must record what was actually done, not what could be done. Where the project has verified something, name the act: collected against the 1922 text, adversarially verified, recomputed at every build. Where it has not, the marking is whatever the weakest actual source supports — and a claim relayed by a commentator with a block bibliography is a relay, however checkable the underlying fact may be. Note where this one was found: not by reading the field, which had been read many times, but by building a second register over the same material. A second register is a second pass. Applied: dimension 16's confidence field rewritten and both facts held at Medium; its PDF register held rather than published; the print-register pipeline's adversarial audit kept as a standing step rather than a one-off.

L-17 — The error is almost never the claim; it is the qualifier. From C-30. Three claims about Wilson's translation went to adversarial web verification. Not one came back false. All three came back overstated, each by a single word: 12,110 where the source says only "the same number"; strict where Wilson says regular; the implied always where she writes often and hedges in her own note. The substance survived every test; the precision did not. This is the characteristic failure of relayed material, and it is nastier than fabrication, because a claim that is true in substance passes every plausibility check a reader can run — and the qualifier is exactly the part that makes it feel verified. A number, a superlative, or an absolute is the part of an inherited claim most likely to be wrong, and the part least likely to be questioned. So: strip inherited qualifiers back to what the source actually says, and if a figure cannot be traced to something that counted it, do not carry the figure at all. Two companion habits from the same pass: a search-result summary is not a source — this one appended a Wikipedia sentence to results from four unrelated publications and fabricated a line count outright, and several citations would have been fabrications had the pages not been fetched; and a name in a footnote is not a reading — the two root citations behind the disputed figure were both unreachable, so the strong form of the claim was unverified at its source the whole time. Applied: dimension 16's confidence field rewritten claim by claim with markings; the 12,110 and "173 vs 18" figures struck as untraceable; "strict" and "line-for-line" replaced with Wilson's own words.

L-18 — Name the project's reach, and mark what falls outside it as closed, not pending. From C-31. The project had accumulated a set of notes shaped when someone opens the book — the Norton edition, the film, the archive. None of them was ever going to happen, and none of them had been declared impossible either, so they sat in the record as outstanding work. That is a quiet dishonesty in both directions: it makes the project look less finished than it is, and it makes a permanent limit look like a temporary one, which invites a future session to keep the claim warm on the strength of a verification that is never coming. A project has a reach — the sources it actually holds — and the reach should be written down. Inside it, verify properly and mark High. Outside it, mark what the available evidence bears and close the question, keeping its last known state so the path is shown rather than hidden (A4). Closed as permanently unresolved is a legitimate and final state, and it is more honest than an open question nobody is working on. The test that survives: an open question is only open if someone could actually answer it with what the project has. Otherwise it is a limit, and limits get declared. Applied: C-31 states the limit; dimension 16's four film questions closed with their state preserved; its Wilson markings recorded as final rather than provisional; dimension 9 confirmed unaffected, because the 1922 text it verifies against is in the repository.

L-19 — The constraint that looked like the obstacle turned out to be the clearance. From C-32. The Atlas refuses captions: that is Warburg's method and the dimension's whole reason for existing. Going into the rights survey, that refusal looked like the thing most likely to kill it — every Creative Commons image wants an attribution, and there was nowhere on the panel to put one. It resolved the other way. CC BY permits attribution in a colophon; and CC BY-SA 2.0's requirement that credit appear "at least as prominent as" any other authorship credit is satisfied vacuously when no panel carries any credit at all. The form and the compliance are one decision. The moment a caption, a source note or a signature appears on any panel, every share-alike licence on it is breached at once. Two generalisations worth keeping. First: check what a constraint actually requires before treating it as an obstacle — the licences turned out to describe this project's own aesthetic. Second, and less comfortable: a rule that holds vacuously is fragile in a way a rule that holds substantively is not. Nothing in the artifact records why the panels are bare; a future session tidying up with a discreet credit would break eighteen licences and see no warning. That is why it is written into RIGHTS.md as a trap and not merely as a style note. Applied: RIGHTS.md clause 7; the dimension's rescope; the no-caption rule recorded as a licensing condition rather than a design preference.

L-20 — Publishing an address is a promise to answer it. From C-34. The project put roughly sixty-one citable addresses into the world across fifteen artifacts and answered none of them: every one was a door that only opened inward. It went unnoticed for a simple reason — everyone who tested the site arrived through it, and from inside, the artifacts are reachable, embedded and framed. Nobody arrives that way twice. The playtest cohorts all praised the artifacts and none of them landed in one cold, because a persona given a site to test starts at the top. Worse, the project had begun manufacturing the arrivals it could not answer: the hyperlinked PDF register built the same day links into these artifacts by design. A new capability walked readers into an old defect, and neither half was wrong on its own. The test: for every address you publish, ask who arrives there without passing through you. Search engines, citations, shared fragments, and your own exports. If the answer is "nobody would," you have not checked — you have assumed your own front door. Applied: panel session 03; the .whence strips; the per-section return as the first Tab stop after the fragment target; the checker's artifact link-walk extended from 81 links to 157.

L-21 — A refusal costs nothing while you have nothing to refuse. From C-35. The design refused photography and imagery at a moment when the project owned no images, had no rights position, and had no dimension that needed one. That refusal read as principle and was, in part, free — it forbade a capability the project did not yet have, so it never had to be paid for. It only became expensive later, and it became expensive quietly: dimension 14 is a made object of images, and it was allowed to proceed for a whole session under a design that formally refused its own medium. Nobody had to override anything, because nothing had been built yet that the rule would bite. A refusal made at zero should be re-examined the first time the project acquires the thing it refuses. Not overturned — re-examined. The test is whether the rule was protecting something real or merely describing the project's current poverty. Here it was doing both, which is why the replacement is a rule about PURPOSE (an image must carry the work, never decorate it) rather than a restored ban or a free-for-all. And the second-order lesson, which is about how the contradiction surfaced: it was visible to the session that flagged it and invisible to the process, because a data model can hold two rules that contradict each other and pass every check06-design.md refused imagery, 04-dimensions.md specified a dimension made of images, and no build has any way to notice. Rules live in prose; only their consequences live in code. Applied: the refusal struck rather than deleted (A4); the purpose rule written; dimension 14 made consistent with the design it is built under; the audience decks freed to be image cards.

L-22 — Derive it, or it will drift. From C-38. Every generated surface on this site told the truth all day; every hand-written sentence about the same facts went stale within hours, including one that sat directly beneath a correction note for the identical error. A count in prose is a snapshot of a moment nobody records. If a build can compute it, prose must not assert it — and where prose must carry it, it should name its date and its source so a reader can tell how old the claim is. Same family as L-14, one level up: L-14 was about lists the code did not derive, this is about facts the prose asserts.

L-23 — A global default can silently break a local promise. From C-37. The Reading Log's whole design is that nothing leaves the reader's device, and it says so in bold. A site-wide analytics tag, added months earlier for good reasons and reviewed as a site-wide decision, ran same-origin with that page and could read exactly the store the page promised to keep private. Neither decision was wrong on its own; nobody re-read one against the other. When a page makes a promise stronger than the site's default, the default must be checked against the promise — and the exception must carry its reason inline, or someone will restore consistency and quietly break it again.

L-24 — A redesign re-reads the pictures and inherits the words. From C-41. Five decks were rebuilt to a new grid, a new type scale and a new stroke system, and every caption, foot line and register label came across untouched — including one sentence the project's own presenter notes forbid twice, in bold, on a card. It survived because a visual pass looks at visuals. Nobody re-read the foot, because the foot was not what was being changed. When you change how a thing looks, re-read everything it says. The words are the part a redesign is least likely to touch and most likely to carry forward unexamined — and on this project the words are where the rules live (C-19 governs what a card may say, not how it may look). Second finding from the same pass, and the more uncomfortable one: a measurable improvement is not necessarily the improvement that was asked for. The rebuild could show real gains — thirteen text alternatives where there had been none, inline styling eliminated — while the actual complaint, that the decks are visually poor, went unaddressed, because the drawing inventory barely moved. Systematising a thing is easier than redesigning it and produces a more impressive report. Applied: the six strings replaced; C-41 records that the author's verdict still stands.

L-25 — "Fixed" is a claim, and this project verifies claims. From C-42. The catch log's resolution column is the only prose in this repository that asserts work was done and is checked by nothing. Every artifact is byte-compared to its source; every colour pairing is recomputed; every internal link is resolved. The sentence "HANDOFF and README corrected" was believed because it was written down. The commit that wrote it touched neither file, and the falsehoods it quoted verbatim were still sitting there two commits later, where they told the next session to build a pipeline the project had already built. A catch is not closed when the resolution is written. It is closed when something outside the log can show it. The test is cheap and it is the same one L-14 asks: for every resolution that claims a file changed, name the commit; for every one that claims a count is now right, derive the count; for every one that claims a check was added, break it and watch it go red. Two things make this failure mode specific rather than a restatement of L-22. First, the fix that must be applied in two places will be applied in one — C-38's remedy was rewrite three documents, which is three chances to forget and no mechanism that notices. That is why C-42's remedy is a generator and a byte-comparison rather than a better-worded correction. Second, and worse: the error log is the project's memory of its own mistakes, so a false entry in it is a corrupted memory, not merely a stale sentence. A reader trusts C-38 precisely because the project publishes its failures — the honesty of the log is what made its one dishonest cell invisible. Applied: tools/state.mjs derives the state into docs/STATE.md; npm run check fails when it drifts; HANDOFF, README and the handoff prompt carry no counts of their own; C-42 and C-43 record what was verified rather than what was intended.

L-26 — Your own scaffolding is not a witness. From C-51. To decide which episode an exchange of the reading record belonged to, the project supplied an alias list — "the tower" for Telemachus, "The Bloom household" for Calypso — and recorded, mechanically, which alias each exchange title matched. A passage selection then cited that match as a second support for the claim that the record names this scene: the evidence string, and the fact that the brief's matchedOn field agreed with it. The alias was the project's. The match was arithmetic on the project's own list. The two together were presented as the record speaking twice. This is L-13's common-ancestor test turned inward. L-13 asks whether two documents share a source before their agreement raises a confidence marking. The harder case is when one of the two is not a document at all but a step in your own derivation — a lookup table, a slug map, a normalisation, an alias. Those steps feel like machinery rather than testimony, which is exactly why they get quoted: they carry the authority of having been computed. Anything a build computes in order to ASK a question must not be quoted as part of the ANSWER. The test is one line and it is cheap: for every sourced claim, name the file the string came from, and check that file was not written by this project. If it was, the claim is an inference wearing a citation. Applied: the alias list is gone from the exchange placement entirely — an exchange is placed only when its own title contains the episode's scaffolding title, three exchanges are therefore unplaced, and the page says so and lists them; every passage's evidence.quote must be verbatim in the study artifact and is checked against it at every build; the tier that rests on that quote must name a phrase found inside it.

L-27 — A marking must carry the phrase it rests on. From C-51. L-16 established that a confidence marking records what was done, not what could be done. This is the next turn of the same screw: where a marking rests on a source's own words, the marking must carry those words, and a build must check them. Nine selections out of eleven wrote a paragraph arguing that the reading record named a scene. The paragraphs were careful, specific, and in several cases beautiful. Not one of them survived being asked a much smaller question — point at the noun. Once the noun had to be quoted verbatim, had to sit inside the evidence string, and had to be narrower than the episode, the argument was no longer available: "the tower" cannot be narrower than an episode set in the tower, and no amount of prose changes that. So the generalisation is about the SHAPE of a claim, not its honesty. Make the strongest claim carry the shortest quotable thing. A tier, a noun, a verbatim string — checkable in one line — beats a paragraph of justification, because a paragraph can be made true of almost anything while a quoted noun cannot. Prose defends a claim; a quoted phrase exposes it. And note which way the incentives run: the paragraph is what a careful worker naturally produces, and it is the form that hides the defect best. A companion observation, recorded because it was the pleasant surprise: the honest vocabulary already existed in this repository and had been used exactly once — the pilot's Oxen entry reads "the exchange names the chapter, not a line." One entry's good instinct, enforced nowhere, did not survive contact with ten more entries. A distinction that lives in one item's prose is not a rule; it is a coincidence (the same lesson as L-14, applied to vocabulary instead of lists). Applied: evidence.tier on every passage with scene / chapter / motif; the checker requiring a scene tier to name its locus and that locus to be verbatim inside a quote that is itself verbatim in the study; chapter and motif forbidden from carrying a locus at all; the tiers and their per-episode spread derived into docs/STATE.md and printed on /episodes/.

L-28 — A project with audited surfaces of its own will quote itself. Name the admissible region. From C-53. Every passage's sourcing pointed at one file, artifacts/difficulty-curve/curve.html, and that felt like enough: the file is a built artifact, audited, machine-verified, with its quotes checked against the 1922 text at every build. But it holds three different kinds of sentence, and only one of them is a summary of the reading record:

L-29 — Correct the claim, not the string you found it in. From C-54. A withdrawn claim was published on one page in three places: five rendered cites, the section's own intro, and an entry in the caveats list. The debt was found by grepping for the cite string, so the debt was recorded as being about cites, so the fix corrected cites — and the intro, which is the sentence a reader meets first, went on saying the same thing in different words. It was found afterwards by a verifier that had been asked about something else and mentioned it in passing. The mechanism is worth stating exactly, because it is not carelessness and it will recur. The grep that finds a defect also frames it. A search returns strings; a defect is a claim; and the scope of the fix silently inherits the shape of the search. Every paraphrase of the claim sits outside that scope by construction, and paraphrases are what prose is made of. So two habits. First, when a claim is withdrawn, write down the claim in your own words and then search for the claim, not for the sentence — synonyms, the passive voice, the noun form. Second, make the gate a pattern set from the start: the enforcement that follows a withdrawal should refuse every form the claim can take, not the one instance that happened to be found. Here that is three regexes instead of one substring, and reintroducing the claim as either a cite or an intro now turns the build red. A companion note, smaller and more embarrassing: the same catch deferred its own fix on an overstated cost. C-51 estimated that correcting the artifact meant "rebuilding its PDF and its deck", and neither was true — the print source and the deck carry no passages at all, and the correction cost five lines. An overstated cost defers a real fix, which is L-17's wrong qualifier pointed at effort instead of at evidence. Before deferring anything, check the cost the way you would check a claim. Applied: both prose assertions corrected, with the correction disclosed on the page rather than swapped in quietly (A4); §11f's gate broadened from one string to a pattern set applied to every surface a passage declares, and mutation-tested in both forms.

L-30 — A region you recognise by shape will admit whatever else has that shape. Mark it instead. From C-57. The project needed to quote the reader's own words, and the reader is quoted inside the project's own analytic prose, so the region could not be defined by place. Defining it by form looked like the answer: a quoted run followed by its page marker, which is how the study prints the reader and which carries the page beside the sentence so a citation cannot be misfiled. It was a good rule and it was wrong, because the project's prose has the same form — it also writes sentences and follows them with page numbers. Two sentences of the project's own commentary were admitted as the reader speaking. The door opened to let the record's voice in let the project's voice in with it, which is the same defect (L-28) one turn further round. The general shape: a pattern is a description, not a boundary. When a rule must separate two things that live in the same file and look alike, recognising one of them by its features will always admit the other's near-misses, because the features were never what distinguished them — authorship was. So put the distinction in the artifact as a mark: <q class="reader" data-record-page="6">. A mark cannot be produced by writing a sentence. It makes the region's extent a dated, auditable decision instead of whatever the pattern happens to catch, and it fails closed — an unmarked quote is refused rather than guessed at. Two companion lessons from the same catch, both about how far a check reaches: Verification against the surface that publishes the claim is not verification. The reader-words warrants were checked "verbatim" against curve.html — the file that also prints them. That is a citation, not a check (L-16), and it stayed hidden because the file is audited and trustworthy in every other respect. This learning first ended by declaring that closing it was outside the project's reach. That declaration was wrong and is struck — see L-31 and catch C-58: the record's pages read once the right filter chain is applied, §11m now verifies every quoted reader sentence against its own page of the record, and doing so caught three of the reader's sentences printed with a comma where he said a full stop. The lesson that survives is the first sentence of this paragraph, not the concession that followed it. And an absence must be scoped to what you actually searched. Episode 5's refusal said the reader's recorded words name nothing in that episode. True of the study; false of the record, which holds two of his questions about that very episode's text. "…that this study marks" is four words and it is the difference between a true sentence and a false one. The verifier that found it had extracted all 117 pages of the record — the only pass in this project's history to check the study against the thing the study derives from. Applied: the marker, and §11f reading only marked runs; §11i requiring the scope phrase and requiring both empty episodes to say the record is not silent; episode 2's passage withdrawn, since its ordinal warrant was contradicted by the record on the page it cited; the answer's words refused by name in data/passages.json before a future session reaches for them; the reach declared.

L-31 — A declared limit is a hypothesis. Test it before you write it down. From C-58. C-57 closed by declaring a boundary: a warrant taken from the reader's own words could only be verified against the study that publishes it, because the reading record is a PDF and nothing here opened it. That was honest, it was written into the artifact and the handoff, and it was wrong — and the evidence that it was wrong had already been produced. A first attempt at extraction read 12 of 129 streams and returned zero characters, which felt like proof. It was proof of one thing only: that the streams were not plain Flate. They sit under [ /ASCII85Decode /FlateDecode ], and decoded in that order all 129 read and all 117 pages come out. This is L-18's neighbour and its opposite. L-18 says name the project's reach, and close what falls outside it — and that is right, because an open question nobody can answer is a limit. But a limit declared from one failed attempt is not a reach, it is a guess wearing a reach's clothes, and it is more durable than a guess because declaring it feels like rigour. The test that distinguishes them is small: can I say what would have to be true for this limit to be false, and did I check that? Here the answer was "the streams use a filter I did not try", and one diagnostic settled it. And what the check found once it ran is the reason it mattered. Three of the reader's sentences were printed with a comma where he said a full stop, because each quotation sits mid-sentence inside the project's prose and a comma made that sentence flow. Nobody decided to alter him. The alteration is what careful sentence-writing does to a quotation, which is why anchor A6 has to be enforced by something other than care. Two surfaces even disagreed with each other about his punctuation, in prose that the table-level comparison does not reach. One more time, the same lesson in the same afternoon: this section's first run used the checker's existing decode, which handles &#39; and not the &#x27; the study is written with. It parsed one sentence out of twenty-one and would have printed a green line. A parse-count floor caught it. Any check that discovers its own subjects by pattern needs one, because the failure mode is not a wrong answer, it is a confident answer about almost nothing (L-14, C-43). Applied: tools/extract-record.mjs and npm run record, source-only and byte-compared at every build; §11m verifying every quoted reader sentence against its own page of the record, with two dated exceptions and a parse floor; the three quotations restored and curve.pdf rebuilt; C-57's limit struck in the artifact, the handoff and this file rather than left standing.

L-32 — The disclosure of a withdrawn claim can satisfy the gate that enforces its withdrawal. From C-59 and C-61. This project's practice on a corrected falsehood is fixed and good: do not swap the sentence out quietly, write the correction beside it with its date (A4). And its practice on a new rule is also fixed and good: make a build refuse the claim, in every form it can take (L-29). Put the two together and they interfere, in a way neither one predicts. The Atlas's unit field was corrected from "a place and a period document" to name three layers, with a correction clause appended: "this field named two layers where the source manifest has always carried three." The gate written to hold that correction asked whether the field states the manifest's layer count. It does — in the correction. Restoring the exact two-layer wording left the build green, because the word three was still sitting there, in the sentence describing the error. The gate passed on the confession. The same shape appeared twice more in one afternoon. The forbidden-repository gate failed the project's own disclosure — "for six days after C-33 this entry routed sourcing through the Digital Repository of Ireland" — because past-tense narration of a route has the grammar of a route; that is the error in the other direction, a disclosure read as an instruction. And §11f had already met the benign face of this and handled it, by matching only the present tense. So the rule: an A4 disclosure is text about a claim, and a gate must be able to tell it from the claim. Two ways, and prefer the second. Match only the assertive form, as §11f does — or better, make the test structural rather than lexical, so no sentence about the rule can satisfy the rule. Asking "does this field say three?" is answerable by prose. Asking "does this field name object, place and document?" — the manifest's own keys — is not. A companion note, cheaper and easier to forget: the first mutation written to test that gate changed bytes and left the tested property standing, so the harness reported a real gate as untested. The repository already records that a no-op mutation reports a gate as untested rather than as passing. This is its sibling: byte-changed is not mutation-tested. A mutation must remove the property under test, and the only way to know it did is to watch the build go red for the reason you named in advance. Applied: §11n's Atlas gate strips any Corrected <date> clause before testing and then tests structurally, against the manifest's layer keys; its forbidden-route gate scopes its disclosure test to the sentence rather than to a window of characters; every branch negative-tested, ten of ten red for the right reason, with each expected failure named before the mutation ran.

L-33 — A remedy belongs to its class, not to the file you found it in. From C-72. On 25 July catch C-64 found a real defect and fixed it well: apply-atlas-rulings.mjs reads the file it writes, so it only ever ADDED keys, and an earlier run's output survived every later one untouched. The remedy — delete the keys you own before rebuilding them — was written into that tool, negative-tested there, and escalated into the handoff as a named failure mode. Its identical twin sat in fetch-atlas.mjs and nobody looked, because the fix had been scoped to the tool where the defect was noticed rather than to the shape of the defect. It was still there a day later, and it was demonstrated rather than argued: episode 17's document slot was set back to to-source, a full pass was run, and the ep17-document record survived it — 21 provenance records standing for 20 cleared slots, in a file whose entire job is to say which images have a licence behind them. This is L-29 one level over. L-29 is about a claim: the grep that finds a defect also frames it, so the fix inherits the shape of the search and every paraphrase escapes. This is the same mechanism in code: the file that contains a defect also frames its remedy, and every sibling implementation escapes by construction. The pull is strong because fixing the found instance feels complete — it is testable, it goes red and then green, and the report reads like a closed loop. So the habit, and it is cheap: when a fix is written, describe the defect in one sentence with no filename in it, then go and find every other place that sentence is true of. Here the sentence is "a generator that reads the file it writes cannot remove anything", and it is answerable mechanically — seven tools under tools/ read a path they also write. Five of them (state.mjs, build-substrate.mjs, derive-atlas-targets.mjs, extract-record.mjs, apply-place-choices.mjs) read their own output only to byte-compare it in --check and build their content from scratch, so the defect cannot reach them. Exactly two ever used their own output as a BASE, and both are now fixed. The class is closed across tools/, and that sweep is what makes this a learning rather than a second anecdote — a rule asserted from one instance and not swept is the thing L-31 warns about wearing different clothes. One refinement worth keeping, because the obvious fix was wrong: the remedy here is not "empty the file and rebuild". This tool hits Commons rate limits often enough to carry a retry, and rebuilding from empty would let a transient 429 erase a good record for a slot that is still cleared and whose file is still on disk. The ownership rule is stated against the manifest instead — a provenance record exists if and only if the manifest marks that slot cleared — which removes exactly what was withdrawn and nothing else, and a run scoped to one episode owns only that episode's records because it did not look at the others. Applied: fetch-atlas.mjs drops the records it owns and deletes their orphaned files, logging what it dropped rather than printing a total; demonstrated absent before the fix and present after, which is the mutation test run in the right order; the sweep above recorded so the next session does not repeat it.

L-34 — When a rule's words and its purpose diverge, fail closed and hand the divergence up. From C-72. RIGHTS.md clause 7 forbids any credit on an Atlas panel, and says so twice over: attribution lives in the colophon, which is lawful "only while no panel carries any credit at all", and "a credit in the image is still a credit, whoever put it there." The clause was written after a survey found a photographer's name burned into a correctly licensed photograph — an authorship credit, which is exactly what CC BY-SA 2.0's "at least as prominent as any other authorship credit" condition is about. Then the only scan on Commons of the period document episode 17 needed turned out to carry a Wellcome Library ownership stamp on page 1 and a Wellcome barcode on page 2. Read by its words the clause refuses it. Read by its purpose it does not reach it at all: a library's ownership mark is not an authorship credit, Wellcome is neither author nor licensor, and the file is public domain, so no share-alike prominence condition is engaged by anything in the frame. Both readings are defensible, which is the whole difficulty. The temptation is to resolve it, and the direction the resolution goes is predictable: a session that wants the slot filled reads the purpose, and a session that wants to look rigorous reads the words. Neither is a session's call, because a rule's scope is a decision about what the rule is for, and this project's own record is that reading a rule's purpose against its own text is the one-notch-too-strong move it has logged more often than any other (L-17, and C-51 and C-53 are two faces of it). So: fail closed, and say what you did not decide. The slot goes back to open with the finding on it, not the image with a caveat on it — because an image on a panel is a published fact and a caveat in a data file is not, and if the author later reads it the other way the cost of having waited is one fetch. And the part that makes this worth a rule rather than a note: check whether the divergence is local before you describe it as local. This one is not. The Atlas's document layer is specified as Thom's 1904 and the Ordnance Survey sheets, both institutional scans, and library and archive scans of period documents routinely carry stamps, accession numbers and barcodes because that is how institutions mark physical holdings. On the literal reading the layer may not be buildable from institutional scans at all — which is a structural fact about the dimension, and the difference between a question about one page and a question about eighteen panels. Applied: the image refused, the file removed, the provenance record dropped, episode 17's document slot returned to to-source with the whole finding recorded in the manifest, and the question put to the author with its reach stated rather than resolved by the session that found it.

L-35 — Check the bytes the reader receives, not only the ones you generated them from. From C-81. This checker verifies a great deal: that rendered document text matches its source, that 1131 internal links resolve, that every declared colour pairing meets its contrast floor, that no page carries a stray styling vector, that no artifact has drifted from its bytes. Every one of those tests reaches BACKWARDS from the output to the input it was made from. Not one of them asked the simplest question a reader asks: is this finished prose? So nine dimension pages published fifty-two literal asterisks — markdown written in a data field and printed raw — and the worst of them was the field carrying the project's most careful rights markings. It had been true for as long as the fields existed. Nothing was broken; a property had simply never been asserted. The distinction that makes this a rule rather than a bug report: a derivation check and a delivery check are different checks. "The output matches its source" and "the output is fit to read" can both be true, can both be false, and can differ — raw markdown matches its source perfectly. A project that only checks derivation will keep every promise it made about provenance and still hand a reader asterisks. And note who found it, because it is the second time in two sessions: an adversarial panel that read the BUILT TREE rather than the data model. The chair had read the data model all night. The build is the artifact; the data is the argument for it; and a session that only ever reads its own argument will not see what it shipped. The cheap version of the habit: before shipping, grep the output for the syntax of every language you author in — **, __, ~~, ](, {{, {%, TODO, FIXME — and make the ones that must never appear into a gate. It is one section and it found a defect on its first run. Applied: the prose filter (inline-only, so a data field cannot become a document); the four dimension fields rendered through it; §11y failing the build on raw emphasis anywhere in a walked page outside <code> and <pre>, run clean across every page before being added and negative-tested by reverting one field.

L-36 — A contiguity check cannot see a missing tail, and a record written only in a commit message is not written. From the repair of C-83, C-84 and C-85. Three catches were produced in one night, written into commit messages, cited by name in docs/panel-session-08.md — and never inserted into docs/catches.md at all. The insert helper anchored on the previous catch's row, did not check that the anchor existed, and when it did not indexOf returned −1; raw.slice(0, -1) + row + raw.slice(-1) then spliced the row in before the file's final byte, landing it inside an unrelated row's line behind a bare \r. On a CRLF file a lone \r starts no line, so the row was invisible to every line-anchored pattern in the project, including the one that counts the log. And the count reported "contiguous", and was right. C-01…C-82 with the tail absent IS contiguous. A gap detector finds holes BETWEEN the first and last id it can see; a missing tail is invisible to it by construction. This is the shape worth carrying: an integrity check that measures a set against ITSELF cannot notice that the set is short. Contiguity, byte-comparison, round-tripping and schema validation are all this kind. Every one of them would have passed a log missing its last three entries, because none of them knows what the last entry ought to be. The test that works is a cross-reference to something outside the set: every C-NN and L-NN cited anywhere in docs/ must resolve to a row or a definition. A citation is a claim that a record exists, and this project checks claims. It would have caught this the moment the session record cited the catches that session had produced — which happened within the hour. Two smaller rules fall out and both are cheap. A script that locates by anchor must fail when the anchor is absent, never proceed on a −1; a silent fallback to "somewhere" is worse than a crash because it produces a file that looks edited. And the log is the artifact, not the commit message. L-25 says a catch is not closed when its resolution is written but when something outside the log can show it; this is its twin — a catch is not recorded when its story is written, only when the row is in the file, and the commit trail is not the file. Applied: the three rows restored and the mis-spliced one relocated; §11aa cross-checking every citation in every document against the log, negative-tested by deleting a row and watching the session record's own citation turn the build red; the insert helper made to fail on a missing anchor.

L-37 — A fallback that cannot fail makes the gate behind it unreachable. From C-87. Catch C-85 did the right thing and did it well: it found placeholders standing where reasons were promised, wired the generator to the reasons the derived data already held, and added a gate — if no reason can be derived for an empty slot, the build fails, naming the episode and the layer. It fired four times on its first run and each firing was a real gap. It was also, from that moment, incapable of firing again, because two string literals sat at the end of the same expression and between them they always produced a value. The gate was not weak; it was unreachable — and it read as strong, because it had a good failure message and a history of firing. The rule: when you add a gate that fails on an absent value, delete every default that guarantees the value is present. They are the same edit, and doing only the first is worse than doing neither — a check that cannot go red reports the property as held (L-14), and this one reported it to a reader in a table headed "What is missing, and why". How to find them, and it is cheap: for every gate of the form if (!x) fail(...), read the whole expression that produces x and ask what its LAST term is. If the last term is a literal, the gate is decorative. ?? and || chains are where this lives, and one swept grep for a string literal on the right-hand side of a nullish coalesce found the instance C-85 had left behind — plus one more, armed and unreached, in a second generator (C-86). And the companion, found within the hour by the fix’s own first draft. The replacement gate was written as a POSITIVE test — every reason must cite a rule, a catch, a date or a base document — and it failed nine sound rows, among them a reason C-85 had itself ratified. A whitelist of what counts as an explanation will not contain the project’s own honest prose, and a gate that refuses true work is the same class of defect as one that passes on a confession (L-32): both measure the shape of a sentence instead of the property. Prefer refusing the defective family by shape to admitting the sound family by list — the defective family is small, closed, and you have examples of it; the sound family is open, and you are guessing at it. Applied: both fallbacks deleted so C-85’s gate is reachable, and demonstrated reachable by removing the derived reason and watching the generator refuse to write the artifact; §11ab(b) added as the delivery-side backstop, refusing the placeholder family by shape and naming the two strings this artifact actually shipped; the positive draft withdrawn and recorded here rather than quietly replaced.

L-38 — Some subjects are drawn and not named, and a rule that admits by naming cannot reach them. From C-95. Rule 4(i) is a good rule and this project earned it: the held record, quoted, must establish that the frame shows the thing the slot names. In practice that means the source has to NAME the subject — the sheet prints ECCLES STREET, and the position is established. Then episode 3 was looked at. Sandymount Strand on the six-inch sheet is an unbroken field of the Ordnance Survey stipple that renders sand, and there is no lettering in it at all. Not faint, not cut off, not at another zoom — the cartographer drew the strand and did not label it, because a beach is not a street and the convention says so. The place is unmistakably depicted and permanently unnamed. So a test that admits by naming can never admit it, however good the frame, however certain anyone is that this is the right stretch of sand. That is not the rule failing; it is the rule reaching its edge, and the edge is a fact about the SOURCE rather than about the search. The failure mode to avoid is the obvious one: a session that has read four sheets successfully will start treating "not established" as "not found yet" and go looking harder, and the looking cannot terminate. The rule: when an admissibility test rests on a property of the source, record which subjects that source structurally lacks it for, and mark them as OUT OF THE TEST’S REACH rather than as failing it. A slot that fails a test and a slot the test cannot address are different facts and a reader deserves both. The distinction is the same one this project already draws between an exhausted search (episode 14 place: nothing admissible exists) and a refusal by rule (episode 7: bombardment) — and this is a third thing again, which neither of those covers. What to do about it is the author’s, and the options are worth stating so the question is real: admit a drawn-and-unnamed subject on corroboration instead of naming (adjacent labels, the coastline’s own shape, the sheet number); leave the slot empty and say the sheet does not name it; or take the document from Thom’s instead, which names by address and so cannot have this problem. Applied: episode 3 recorded as not established with the reason stated as a fact about the sheet rather than about the search; §11ad refuses a third confidence state so the distinction cannot be smuggled in as a middle value; the question carried to the author with its three options named.

L-40 — A hand-typed line number is a coordinate recalled, and an edit is what makes it wrong. From C-101, and it is C-95's lesson moved from the map to the repository. C-95 established that a coordinate supplied from memory looks exactly like a coordinate read, and is wrong at precisely the scale that matters. A line number written into a citation has the same two properties, plus a third that makes it worse: the edit that adds the citation is often the edit that moves the line. In one delivery run, five citation families went stale THE DAY THEY WERE WRITTEN — fields inserted into data/dimensions.json shifted the file under the self-references being typed into it; a register inserted into women.html moved the section its own dimension record was citing; two sections added to the concordance moved everything a fresh field pointed at. Every rule text was genuine; every address was wrong. That is the worst ratio the project knows: content that verifies, wearing citations that don't. The rule: cite by region, not by offset. A section id, a field name, a heading, a box — names survive insertion, and a checker can find a name; nothing can re-find "line 352" after the file grows. Where a line number genuinely earns its place (a verbatim source line in a held text that never changes, like the 1922 source's own lines), the file it indexes must be one nothing edits. And the cheap audit, run once per session that inserts anything: grep the data files for :\d+ citations into any file the session touched, and treat every hit as stale until shown current. The second-order half: the SUMMARY BLOCK is the same defect wearing a plural. A tally stored beside the records it summarises (positions: 10, documented: 7 — beside sixteen records) is a set of hand-typed coordinates into the file's own state, and it drifts the same way for the same reason. Derive it at read time, or recompute it in every edit that touches the set — C-99 said this about one sentence, and this run proved it about every stored summary it met. Applied: every stale citation replaced with a region name; the positions tally recomputed from the positions themselves with the correction noted; dimension 14's truncated field completed; the §11af gate's path parse taught to read a leading path rather than split on a colon it may not find.

Second-order note on L-11: the panel produced this error unanimously, and the author caught it. Designed disagreement is not a guarantee — a panel composed for one kind of caution will be uniformly cautious. When the panel is unanimous, that is a signal to test the question, not to trust the answer (the skill's own rule, which the chair did not apply to a vote that went the way the chair already leaned).

L-39 — A derived sentence is only as true as the narrowest set its clauses came from. From C-99. L-22 is one of this project's load-bearing rules — derive it or it will drift — and it has closed more staleness defects than any other. C-99 is the failure L-22 does not reach: the sentence was derived, every token in it computed from the data model, and it was false anyway. "5 item(s) only the author can rule, from docs/panel-session-08.md (2026-07-27)" took its count from two arrays and its attribution from a field describing one of them. Neither derivation was wrong. The sentence was. So the rule: when a generated sentence joins a count to a name, a date, a source or a scope, every clause must range over the same set. A count over A ∪ B beside a label taken from A is a falsehood the generator will keep telling forever, and it is worse than a hand-written one, because nobody re-reads generated prose — the whole point of deriving it was to stop having to. L-22 makes a number true; it does nothing for the words around the number. Finding them is cheap and mechanical: read every template that interpolates two or more expressions, name the collection each one ranges over, and where the collections differ either widen the label to the union or narrow the count. This repository has many such sentences and they should be swept once, not audited one at a time (L-33). And the second-order half, which is what actually cost the time. The same asymmetry had been built into the CHECK. §11ac cross-referenced the items array and not alsoOnTheBoard, so the half of the board that can grow was measured against itself — L-36 inside the section written for L-36. The generalisation is worth more than the instance: when a record is split into a checked part and a loose part, the loose part is where the next thing waits. Not by accident — a loose part is exactly what a later session reaches for when the checked shape does not fit what it has to record, which is precisely the moment the record is growing and precisely the moment nothing is watching it. Applied: tools/state.mjs computing the provenance from the open items' own sources rather than from the board's first session, with a zero-open branch that says so in words; §11ac extended to cross-reference alsoOnTheBoard one-for-one against the numbered list of every session that raised an entry, each key phrase matched inside its own numbered item, listedN required so an omission cannot look like a decision, and the list parse bounded to its own section; STATE required to name every document an open item was raised in; six mutations, six red builds, each for the reason named before it ran.

L-41 — A correction is a change like any other, and the session that makes it is the session least able to see it. From C-108, the closing audit's self audit. This project's discipline has always been that new work faces an adversary. Corrections were the exception nobody declared: a fix is written in the belief that it fixes, it is checked against the defect it names, the build goes green, and it ships. One audit made about sixty corrections in a day and then put its own diff to five refuters — and they found twenty defects in the corrections, four of them worse than what was corrected. The shapes are worth naming because they are not random, and every one of them is a shape the fixer could not see from inside the fix: A fix breaks the rule it is applying. Two citations were rewritten to cite by region under L-40, and the same session's insertions into the same files invalidated three OTHER citations that had been accurate before it started. The learning was applied and violated in one edit, because the edit that adds a citation is also the edit that moves the lines — which is what L-40 says, read from outside. A new gate is weaker than its own comment. Four were. A comment is written to describe the intention; the code is what runs; and the author of both, in the same hour, cannot tell them apart. One test matched a sentence-shape the ruling it "followed" had never contained — vacuous the day it was written, and it took a floor firing red to prove it. A verification that cannot pass is worse than none. A live-parity leg compared a 32-count regex to a 9-count model. It could never have gone green, and the prose that leaned on it declared a property nothing established. A check nobody has watched go both red AND green is a claim, not an instrument. The remedy stamps the thing it is removing. A security fix scrubbed a leaked user-agent from eighteen public files and wrote the author's RETIRED title into them, on the day the neighbouring pass was scrubbing that title everywhere else. Two correct fixes, one collision, invisible to each. The record over-claims what the fix did. "Each artifact declares it" was true of two of three. A resolution field is a claim like any other (C-91), and a claim written while the work is still warm is written from the intention rather than from the bytes. The rule: audit the corrections, adversarially, before shipping them — as a separate pass, by somebody who did not make them, reading the bytes and not the account. Budget for it: it is not overhead on the work, it is the last part of the work. And the corollary, which is the part that stings: the more corrections a session makes, the less able it is to review them, because every one was made in good faith against a real defect and they all feel finished. Sixty corrections is not sixty small risks; it is one large one. Applied: self audit #1 run as a commissioned pass over the session's own uncommitted diff, five refuters over five rule clusters, default REFUTED; all twenty findings closed and recorded in C-108; the fixes that could not be mutation-tested named in C-107 rather than implied; and the one decision that lived only in a session's working notes moved onto the record as the chair's, dated and reversible.