Case 23/3: the confession that outlived its gap
The field with which a constraint declares that nothing verifies it, while nothing verifies that it stays unverified
🩺 Show the full clinical history → 📋 Session protocol →
Clinical history · Software Pathology
The patient described its own ailment precisely. It named the organ it was missing, and named it correctly. The organ had been in place for weeks.
Show clinical picture
- gateable = false
- A typed confession: the claim binds and nothing verifies it. Not an escape hatch — the contract requires naming in gate_source what would verify it.
- gate_source
- The field where an unverifiable constraint names its absent verifier. Prose inside a governed file, which is why it reads as governed.
- carrier
- A surface holding a copy of a governed fact instead of invoking it. ADR-074 names them outside the corpus; this case finds one inside.
The protocol to declare, version and verify this → ontoref.dev
The double ledger — what it cost, and what it left
After treatment the organ watches 13 descriptive confessions and detects the stale ones. It does not reach 23 of 36: those naming no probeable surface. The mechanism can say nothing about them — neither that they hold nor that they are stale.
What the crime cost
- Assertions that the command group did not exist 23
- Groups that did exist in that same tree 3
- ADRs carrying the denial 7
- Times a single file repeated it 5
- False positives from the first probe 3 of 5
- Confessions the probe still cannot judge 23 of 36
What the case left
</ul>
And the probe itself is in no automatic chain: a single mode invokes it. The lesson reaches whoever already adopted the mode, which is the very shape this case diagnoses, one level up.
The point of abandonment — what the table doesn't show
What stopped being watched was not the constraint: it was the confession. gateable = false obliges naming the absent verifier so the absence is visible. No rule obliges checking that the absence is still absent, and the corpus has no way to notice that a verb was born in the meantime.
Differential diagnosis — what was ruled out
| Asking whether the verb exists, instead of whether the confession asserts it does not | “Ruled out by reading the five gate_sources by hand: adr-073 names its validator by design, adr-074 bounds a declared residual gap, adr-088 warns of a recursion. Three false positives out of five.” | False positive |
| Detecting the absence with a regular expression | “Ruled out because it broke the whole command while the trace pointed at the ADR loader. The datum I ignored was in plain sight: it had worked before that edit.” | Iatrogenic |
| «Fixing» the ADR loader with do {…} | complete | “Ruled out on the spot: complete captures an external's stdout, not the value of a nu def. It broke the healthy report and was reverted.” | Iatrogenic |
| Treating 22 confessed constraints as a finding | “Ruled out by reading the schema's own comment: they were not a finding, they were confessed one by one with their verifier named.” | Misread |
| Dating the drift in days | “Ruled out by command: fef21f4 is an init of 874 files, so no duration is derivable from this history.” | Not traceable |
Etiology — the cause — The pathogen, verbatim
gate_source = "the `criteria` command group: this constraint invokes
`ontoref criteria validate --check <id>`
and the CLI has no `criteria` group at all"
A gate_source is prose inside a governed file, and prose inside a governed file reads as governed. That is why it lasted longer than it would have in a README.
Treatment — The treatment
onre governs confessions resolved the verb EXISTS and the confession says it does not stale the group exists; «no X group at all» is no longer true descriptive names a verb WITHOUT asserting its absence — cannot go stale unnamed names no probeable surface — the probe stays silent
The first version asked the other question and gave three false positives out of five. The correction was not tuning a threshold: it was changing the question.
Prognosis
The uncomfortable diagnosis is that there is no external pathogen. Every author wrote a true sentence, the contract obliged them to name the absent verifier, and all of them did. The ailment is structural: the record stores measurements and the reader treats them as facts. Ontoref did not contain this — it produced it, with a mechanism whose declared purpose was to prevent precisely this class.
| A confession is checked, not merely written | governs confessions reads every gate_source and asks whether the absence is still absent. Before, it was only ever read as prose. |
| The assertion, not the existence | Only what ASSERTS an absence is probed. Asking whether the verb exists gave three false positives out of five: a gate_source may name a live verb to describe it, to bound a declared residual gap, or to warn of a recursion. |
| The maintenance belongs to the act that caused it | The close-with-destinations step of ordinary-act does not close while a confession is left stale or resolved — observed failing on a fixture before being trusted. |
The regimen — the session, replayed with protocol
What was asked — reconstructed from refs:sessions/2026-08-17-la-confesion-y-su-hueco — bounded extract in custody: the verbatim prompt with its line number, the three commands establishing the simultaneity without needing dates, the number discarded for not being traceable, and the population warning separating the three figures that were mixed once.
no sabemos qué hacer con los 22
What should have been asked
Before deciding what to do with them: each one should declare in `gate_source` what would verify it. Read them and tell me how many assert an absence that is no longer true — checking the verb they name against the dispatcher, not against your recollection.
| Microtask | Verifiable |
Read what gateable = false means in the schema, not in memory | rg -n 'CONFESSION' .ontoref/adrs/adr-schema.ncl |
| Extract the gate_source of every confessed constraint | ontoref adr show <id> --fmt json | jq -r '.. | objects | select(.gateable? == false) | .gate_source' |
| Classify by ASSERTION of absence, never by existence of the verb | governs confessions --fmt json | jq '.detail[] | select(.state=="resolved") | .adr' — must not contain adr-073, adr-074 or adr-088 |
| Test the classifier against a deliberate fixture before trusting it | inject «which does not exist» over an existing verb → state=="resolved" appears; revert → it disappears |
The gate before delegating: The classification rule —absence ASSERTED, not surface named— written and observed FAILING on a fixture before sweeping the corpus. Without it the sweep produces a list with three false positives in every five that reads as findings.
The ADR trigger: The moment that rule stopped being a heuristic and started deciding which confession gets touched and which does not. It is a constraint others inherit, and it would have fired adr? there — not three steps later.
Prophylaxis — what enforces the lesson today
- ✓An act does not close while a confession is left stale
.ontoref/reflection/modes/ordinary-act.ncl — verify of close-with-destinations - ✓The probe that asks whether the absence is still absent
.ontoref/reflection/modules/routing.nu — governs confessions - ✓The declared limit: it cannot tell «built» from «built and empty»
.ontoref/ontology/core.ncl — constraint-routing node
⊘Declared debt: The probe is in no automatic chain: zero occurrences in .pre-commit-config.yaml, and the only mode invoking it is ordinary-act. An act that never opens never runs it, so the lesson reaches exactly whoever already adopted the mode — the same shape this case indicts, one level up. And 23 of 36 confessions remain unnamed: their gate_source names no probeable surface, so the mechanism can say nothing about them, neither that they hold nor that they are stale. And the set GROWS BY CONSTRUCTION: every new ADR confessing something without naming a probeable surface enlarges it. It happened on this case-file's own day — on acceptance, adr-095's constraint a-new-refusal-is-conditional-on-the-act went straight into unnamed, moving the split from 22+13 to 23+13. With no gate counting it, that growth is visible only if someone runs the probe by hand, which is this same debt, looped.
From the project vocabulary (4)
- Gate
- Typed prerequisites and policies controlling FSM state transitions in a project.
- adr?
- Evaluation procedure invoked at the end of a session or feature.
- onre
- Shell alias for the `ontoref` CLI.
- 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.