Case 2/8: the note that silenced the alarm
The case of the comment that declared safe the shape nobody had looked at, and of the next author who believed it: two stylesheets read, eight loaded, zero browser queries
🕵️ Show the full case file → 📋 Session protocol →
Case file · Code Homicide Dept.
A correct CSS fix left, inside its own comment, a sentence declaring safe the shape nobody had rendered: «so every fenced block with a language was fine». Seven and a half hours later the next author — another agent — read it, believed it, and diagnosed the failure by reasoning about two stylesheets the page does not even load. Zero browser queries. The one that was needed would have given the whole answer. The operator caught it, attaching the screenshot of an illegible code block.
Show glossary
- declared extent (ADR-072)
- A mechanism says what it covers, and a check can say «I did not look at that». A check's green is a statement about its own extent, never about the world. The sentence that opens this case did the opposite: it asserted coverage over a shape that was never rendered.
- the page is the publication
- A hard rule of the series and an ADR-072 constraint: a .ncl that validates, a .md that regenerates and a green gate are three statements about FILES. What the reader receives is the page. Here the diagnosis was built on two files the page does not even load.
- specificity
- CSS's tiebreaker. `pre { color }` is (0,0,1); the nested prose rule that was winning is (0,1,0). A class selector beats an element selector ALWAYS, regardless of order or good intentions. The previous fix never won that tiebreak, and its comment took for granted that it had.
- folklore
- The word this repository uses for a rule that lives where no surface and no check can read it. A CSS comment is folklore with write permissions: it is versioned, it is reviewed, it is read with confidence — and nothing verifies that what it asserts is true.
- declared twice
- The series' pathogen. Here the second copy is not code: it is the NOTE about the code. A rule's real extent is in the rendered cascade; the note restated it in prose, and when the two disagreed the prose won, because it is what gets read first.
The protocol to declare, version and verify this → ontoref.dev
The double ledger — what it cost, and what it left
What believing the note cost
- Stylesheets the diagnosis was built on 2
- …of those, loaded by the page 0
- Sheets the page does link 8
- DOM queries made before declaring the cause 0
- DOM queries that sufficed to have it whole 1
- Code blocks in the post 3
- …illegible in light mode 2
- Contrast of the invisible text (#e5e7eb on #f8fafc) 1.16:1 · AA requires 4.5
- Specificity of the rule believed to be winning 0,0,1
- Specificity of the one actually winning 0,1,0
- Fixes written before one resolved the symptom 2
- Post languages registered in the hljs bundle (nu · nickel) 0
- Hours the sentence sat in the tree before blinding the next author 7h34m (04:07:40 → 11:42)
- Own verifications that went green while blind, that same day 1
- Files in the SAME commit already holding the sentence's refutation 1
- Distance between the claim and its refutation one file · zero commits
What the case left
- Blocks legible in light after the real fix 3 of 3
- Contrast measured after the fix (light · dark) 9.9:1 · 11.87:1
- Corrections written inside the comment that lied 2
- Verified pointers in lesson_codified_in 5
- Gates preventing a repeat 0 → declared debt
The suspects — the false leads
| The previous fix's note, declaring safe the shape nobody looked at | “I described what the fix touched, and about that I was not wrong: the bare <pre> was the expedientes' case. That the next sentence spoke about a shape nobody rendered does not make it a lie: it makes it unverified. Nobody asked me for a measurement to write it.” | the-note |
| Two stylesheets the page does not load, read as if they were the cascade | “We were in the right file. app.min.css and site.min.css contain exactly the prose rules that explained the symptom — word for word. That this page loads eight others is stated by neither of them.” | phantom-sheets |
| The github-dark palette, partly guilty and a perfect alibi | “I paint tokens on a dark background and I do it well. Nobody served me conditionally: I was linked unconditionally, after custom.css, and on top of that I was half right — the tokens were wrong in light mode.” | github-dark |
| The browser cache (max-age=86400), which explained the symptom without being the cause | “max-age=86400 is what I was asked for. And the symptom I produced was identical to the real one, which makes me the most comfortable explanation: the browser was seeing something stale. That was true, and it was not the cause.” | cache |
| hljs with no module for nu or nickel — the real mechanism, invisible in every file | “I have no module for nu or nickel, so I give up in silence and never add the .hljs class. That appears in no file in the repository. Only on the page.” | hljs-no-module |
The weapon — The weapon · a sentence no check backs
/* custom.css — the previous fix's comment, commit 3294761, 04:07:40 */
It only bites the BARE <pre>. `pre code` already reads `--code-text`,
which does flip, so every fenced block with a language was fine
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# No check backs that sentence. No page with a tagged fence was
# rendered to write it. At 11:42 the operator attached the screenshot
# of an illegible ```nu fence: the shape declared safe.
The previous fix was good. It corrected a bare <pre> that in light mode came out nearly white on nearly white, and it documented that with the detail this series demands. Then it wrote one more sentence:
It only bites the BARE
<pre>.pre codealready reads--code-text, which does flip, so every fenced block with a language was fine
No check backs that last line. No page with a tagged fence was rendered to write it. It is a claim about a shape its author did not look at, placed exactly where the next reader will meet it before the rule itself.
At 11:42 the operator attached a screenshot: a ```nu fence, washed-out grey, illegible. The shape declared safe.
And what makes this a case is what happened next. The following author did not ignore the note: they used it. They looked for the cause where the note said it was not — in the token palette — wrote a fix for that, and declared it resolved without measuring anything. When the operator asked «why aren’t the css corrections showing?», the diagnosis had been built on app.min.css and site.min.css: two files that contain exactly the rules explaining the symptom, and that this page does not load. Eight sheets linked, neither of those among them.
One getComputedStyle query returned the whole answer. Zero were made.
And there is a twist that came out of git show itself. Commit 3294761 touches two files: custom.css (+91) and gen-case-file.nu (+56). In the second one, its author wrote that the first repair of this same failure «resolved against a sheet this site does not even load» — the exact fact that, seven hours later, nobody used. The knowledge existed, in the same commit, in the neighbouring file. What did not exist was its co-location with the claim it contradicted.
The turn — The fix · one DOM query, and the cascade that actually won
// one query, and the whole answer:
[...document.querySelectorAll('.post-content-body pre')].map(pre => {
const code = pre.querySelector('code');
return { lang: code.className, ink: getComputedStyle(code).color };
});
// language-nu #e5e7eb ← no .hljs class, nothing overrides it
// language- hljs sql #334155 ← hljs rescued it with !important
// language-nickel #e5e7eb
//
// Two blocks, one page, opposite outcomes.
// The difference was never the theme: it was whether the language module existed.
Measured in the browser, light mode, before touching anything:
| block | <code> class | ink | contrast |
|---|---|---|---|
| 0 | language-nu | #e5e7eb | 1.16:1 |
| 1 | language- → hljs sql | #334155 | 9.9:1 |
| 2 | language-nickel | #e5e7eb | 1.16:1 |
AA requires 4.5:1. Blocks 0 and 2 carry no .hljs class because the hljs bundle ships no module for nu or nickel: highlightElement gives up and marks nothing. Block 1 was marked, and then .hljs { color: … !important } rescued it.
And the rule winning in both lost cases was in website.css, nested:
:is([prose=""]) :where(pre):not(…) { color: var(--un-prose-pre-code) } (0,1,0)
:where(pre code):not(…) { color: inherit }
Against that, pre { color: var(--code-text) } is (0,0,1). It loses.
So what fixed the expedientes? This, in gen-case-file.nu:
.exp pre { color: var(--exp-ink) } (0,1,1) → beats prose (0,1,0)
The .exp class wrapping every expediente raises the specificity by exactly enough. And it is in the same commit 3294761 — 91 lines in custom.css, 56 in gen-case-file.nu, one author, one small hours. With a comment saying, word for word, that the first repair «resolved against a sheet this site does not even load».
The knowledge was not missing. It was fifty lines away, in another file of the same commit — and not next to the claim it refuted.
The real fix raises specificity to (0,1,2), in both forms — class and attribute — because the post body carries class="prose" while the UnoCSS rule is written for [prose=""]. Assuming which one applied is how the previous one came to be believed.
Then, measured again: 3 of 3 blocks at #334155, 9.9:1 in light and 11.87:1 in dark.
The verdict
Three Hard constraints already say what is needed — a mechanism declares its extent, a check can say «I did not look at that», the page is the publication — and none of them reached the sentence that opened this case, because they govern CHECKS and this was a COMMENT. A comment is folklore with write permissions: versioned, reviewed, travelling with the file and read before the rule it explains, and nothing verifies that what it asserts is true. The series’ pattern is «declared twice»; here the second copy is not code, it is the note about the code, and when the two disagreed the prose won because it is read first. The note’s alibi almost holds, and that is why this case matters more than an error: its author was being careful, and the defect was not carelessness but a claim of coverage written without the measurement backing it. Worse, and this is what git show revealed while the expediente was being written: the same commit touches two files, and in the second one its author had already written the exact fact refuting the first one’s sentence. The knowledge was not missing — its co-location was. A claim and its refutation can share a commit with nothing to confront them, because a diff presents them as two changes and never as a contradiction. What is not closed here is said below: nothing yet refuses a fix whose justification asserts a coverage that was never rendered. And while this expediente was being written, in the same session, an own check went green without being able to look: a pattern that did not cross a line break. Four times in one day — the same defect, with and without a note.
| The note asserted a coverage nobody measured | ADR-072 a-mechanism-declares-its-extent → extent is declared, not assumed |
| The diagnosis was made on files, never on the page | ADR-072 the-page-is-the-publication → verify the page, never the file |
| Two sheets the page does not load were read | getComputedStyle → the substrate, one query away |
| An own check went green without being able to look | ADR-072 a-check-can-say-i-did-not-look → green declares its extent |
| The refutation was in the same commit, in another file | none today → nothing co-locates a claim with its refutation |
| Nothing stopped the note from being written unbacked | none today → ADR-072 does not reach the prose justifying a fix |
The reconstruction — the session, replayed with protocol
What was asked — reconstructed from refs:sessions/2026-08-06-la-nota-que-apago-la-alarma — bounded excerpt in custody. The session contains the incident AND the writing of the case; self-reference declared. It was identified by the WORK it did (it edited custom.css, it ran the DOM queries), never by counting mentions.
css el tema de los tags <pre> se arregó para los expedientes en modo light pero en los post no lo está [screenshot of the post served in light mode, attached]
What should have been asked
css the <pre> theme was fixed for the expedientes in light mode but not in the posts [screenshot attached] Before writing a single rule: 1. Measure the DOM, do not read stylesheets. For every <pre> on the page: the <code>'s classes, its computed `getComputedStyle(...).color`, and the contrast against the background. Paste the output. A cause without that table is a hypothesis, not a diagnosis. 2. Check WHICH SHEETS THE PAGE LOADS before reasoning about its cascade. A rule read in a file the page does not link is a rule that does not exist. 3. Compare against the case that DOES work (an expediente) in the same turn: the difference between the two is the diagnosis, and guessing it costs more than measuring it. 4. After the fix, measure the same numbers again. And write no claim in the comment about a shape you have not rendered.
| Microtask | Verifiable |
| Enumerate the sheets the page actually loads | curl -s <url> | rg -o 'href="/styles/[^"]*"' pasted — no cascade reasoning about files absent from that list |
| Measure the computed colour of every code block in the reported theme | getComputedStyle(code).color per block, with its class — no cause declared before that table |
| Compare against the case that works, in the same turn | expediente and post measured with the same query; the observed difference is the cause, never the inferred one |
| Re-measure after the fix, in both themes | computed contrast ≥ 4.5:1 in light AND dark — the fix is declared with the number, not with the intent |
| Assert no unrendered coverage in the fix's comment | every sentence in the comment that speaks about a shape names the measurement backing it, or is not written |
The gate before delegating: A presentation fix is not declared until the number measured in the DOM is pasted, before and after, in the reported theme. Without it the agent delivers its reasoning about the cascade, not the page — which is exactly what happened: two sheets read, zero queries, and the only one needed would have given the whole answer.
The ADR trigger: None new: ADR-072 already declares that a mechanism declares its extent and that the page is the publication. What is missing is not the decision, it is the gate — see lesson_debt.
Case law — what enforces the lesson today
- ✓A mechanism declares what it covers; green is a statement about its own extent, never about the world
adr:072/a-mechanism-declares-its-extent - ✓What the reader receives is the page: a file that validates and a green gate are statements about files
adr:072/the-page-is-the-publication - ✓A check can — and must — say «I did not look at that» instead of passing in silence
adr:072/a-check-can-say-i-did-not-look - ✓Verify the page, never the file; and if a check and a reader disagree, suspect the check's transport first
qa:case-file-howto - ✓Every figure comes from a log or an artifact; one that cannot be traced is dropped from the count rather than estimated
mode:generate-case-file/gather_metrics
⊘Declared debt: Nothing today refuses a presentation fix whose JUSTIFICATION asserts a coverage that was never rendered. ADR-072 governs checks and mechanisms; a code comment is neither, and that is why its three Hard constraints walked straight past the sentence that opened this case. What would settle it: a gate that, on a change to a served stylesheet, demands in the same change the number measured in the DOM — before and after, in both themes — and refuses the commit without it; measurable with what already exists (getComputedStyle and a contrast computation), no new protocol. Named, not shrugged off, and NOT replaced by «review comments more carefully», which is a promise of discipline and is exactly what failed: the sentence was written by someone who was being careful.
From the project vocabulary (2)
- Gate
- Typed prerequisites and policies controlling FSM state transitions in a project.
- ontoref
- The protocol itself: a typed, queryable surface on which a project declares WHAT IT IS (ontology) and HOW IT ACTS (reflection), so a claim about the project can be contradicted by a machine and not only by a reader.