Case 6/0: the arbiter that disagreed with itself
Case 6/0: the arbiter that disagreed with itself
🕵️ Show the full case file → 📋 Session protocol →
Case file · Code Homicide Dept.
The project's vocabulary was written in six places. None owned the others; none witnessed the others. The glossary — the one document whose only job is to fix the words — used both forms of the same concept in the same file, five times. And when an investigator arrived with the full ontology loaded to sort it out, it wrote a SEVENTH vocabulary and misfiled a term by misapplying a rule it had authored that same day. It was not carelessness. It was that nothing could contradict it.
Show glossary
- PAP
- The project's architecture principles, rules and patterns. An anti-PAP is an approach that runs head-on against them.
- witness
- A signed receipt that a check ran and what it returned. It proves structure, never truthfulness. A witness RECORDS; it does not refuse. It becomes a barrier only when a control point declines to proceed without one.
- declared twice
- The series' pathogen. One truth written in TWO places, which must agree BY HAND, with nothing checking that they do. Cases 404-PAP and 69/58 are the same disease in other organs.
- false friend
- A translation that LOOKS right and displaces the meaning. Spanish «librería» is a SHOP; the word is «biblioteca». It is dangerous precisely because it does not grate.
The protocol to declare, version and verify this → ontoref.dev
The double ledger — what it cost, and what it left
The left column is the crime. The right is what the crime left, and one entry there is not an engineering metric: the four ruled-out suspects are four models of the problem that could only be ruled out by facing them. The third — “a cognate is safe” — and the fourth — “it collides with a directory, therefore it is untranslatable” — were not produced by any validator. They were produced by a human reading the word «compuerta» and saying: that loses the concept.
What the crime cost
- Live vocabularies, none owning the others 6
- …one of them dead: a .ftl nobody reads 1
- Concepts carrying two different renderings 7
- …of those, incoherent INSIDE one file 5
- Spanish files the previous gate looked at 10 of 110
- ES content families never scanned 6
- CI recipes that called the gate 0
- Pages serving English to a Spanish reader 4 · for months
- False friends in a published post 1 («librería»)
- Concepts already merged into one word 2 · «gate» and «door» → «puerta»
- Generated pages no route ever served 1
What the case left behind
- A term registry with a language axis 45 concepts · 71 rules
- Cross-registry contracts over the union 7
- Gate coverage 10 → 110 files
- Measured divergences, after the cure 7 → 0
- The gate's false positives 43 of 52 → 0
- Surfaces × languages declared 4 × 1, and adding a language breaks the build
- The spine, governed by its own protocol for the first time
The point of abandonment — what the table doesn't show
There was a moment, with the new contract barely frozen, when the gate returned 52 findings and 43 were false. It flagged “puerta” eighteen times in texts about the four funnel doors. It flagged “every build system uses DAGs” demanding “compilar”. That was the point of abandonment, and it had two comfortable exits: weaken the rule until the tool went quiet, or edit correct prose to appease it. Both kill the policy. The third exit is the only honest one, and it names half the ADR: the gate declares what it cannot check. A form rejected for one concept may be the right rendering of another. A loanword inside a compound is not a bare anglicism. A verbatim quotation is not translated. None of that can be established by a regular expression — so the policy says so in the data, and stays silent. A gate that cries wolf is a gate people learn to skip. And a skipped gate is the green tick over unread files this whole thing began with.
The suspects — the false leads
| The Anglicism | “"It is a list of words to purge." It does not explain why `commit` stays. If the criterion were "sounds English", `commit` would be first to fall — and translating it leaves the reader with no way back to the tool. The list could not tell a word from a name.” | ruled out |
| The Surface | “"Just type it by surface: a README is not written like a talk." Correct, and insufficient. The axis was added and the term still carried ONE verdict. "Commiteé" spoken is alive; written it is jargon. That is fixed — and it does not fix that nobody knew WHY `gate` stayed.” | ruled out — true but short |
| The Cognate | “"If it looks like the original, translate it: it is a cognate." Spanish «librería» looks like the original and is a SHOP. «Compuerta» looks like it and comes from ELECTRONICS. Languages evolve their cognates apart, and the displacement is invisible precisely because the word still resembles its source. This suspect does not grate: that is what makes it dangerous.” | ruled out — and it does not grate |
| The Identifier | “"It stays because it collides with a directory." This is the one that killed the investigator. The collision with `reflection/` is handled by blanking code spans — not by a lexical class. But the file's note said "collides with the reflection/ directory", and the investigator read it as "untranslatable". It filed `reflection` — which HAS a faithful cognate — beside `gate` — which has none. The same day. In the same file. While applying the rule correctly to `schema` two lines below.” | GUILTY |
The weapon — anglicisms.ncl — where the policy lived in a comment
# anglicisms.ncl — the list it all came from
{ en = "gate", es = "puerta", severity = 'Warning, prose_safe = false,
note = "collides with gate.ncl / the 'Gate type" },
{ en = "reflection", es = "reflexión", severity = 'Warning, prose_safe = false,
note = "collides with the reflection/ directory" },
# And at the top of the file, in a COMMENT:
# Terms kept by technical convention (NOT denied):
# commit, exit, NCL, ADR, DAG, JSONL, Ed25519...
The weapon is not the list. It is that the list COULD NOT BE WRONG, because there was nothing to check it against.
The turn — rendering.ncl — the verdict and the reason, kept apart
# rendering.ncl — the verdict and the REASON, kept apart 'Keep + 'Identifier # translating breaks the REFERENCE (commit, ADR, NCL) 'Keep + 'NoFaithfulRendering # translating breaks the CONCEPT (gate) 'Render + 'FaithfulRendering # Spanish carries it whole (reflexión, esquema) # And the contract nobody had written: RenderingsAreInjective # two concepts may NOT render to the same word → "es::puerta ← gate; es::puerta ← door" exit 1
A human found it, reading. No validator would have. Now one does.
The verdict
The series asks: with ontoref, would it not have gone like this? The answer, again, is NO — and it is the third time it has been, for the same cause. The mechanism existed: contracts, witnesses, gates. All built, accepted, working. And never pointed at this surface. It is literally the sentence from the mirror case: having the mechanism is not enough, you have to point it at the surface that hurts. But this case adds something the previous ones did not have, and it is the reason to publish it. The pathogen reproduced ITSELF, LIVE, during the investigation, executed by an agent with the full ontology loaded. It built a seventh vocabulary parallel to the six that already existed, without seeing them. And it misfiled reflection by misapplying a rule it had itself written that same day — while applying it CORRECTLY to schema, the same day, in the same file. It was not carelessness: it was that nothing could contradict it. There was nowhere to check the classification against, so it checked it against its own reasoning. Which is exactly the sin the protocol claims to fight. A vocabulary without a witness does not produce an error. It produces an arbiter that convinces itself — and then convinces everyone who consults it.
| The vocabulary lived in six places | One registry of concepts, and the contracts run over the union of the two that remain. Reading half a registry is believing half a policy. |
| "Do not translate" never said why | Two incompatible reasons: 'Identifier (breaks the reference) and 'NoFaithfulRendering (breaks the concept). A 'Keep justified by «a faithful word exists» is refused by contract. |
| A cognate was assumed safe | 'FalseFriend and 'Displaces are classes of their own, and every rejection carries what it costs — or someone reverts it in good faith in six months. |
| The translation invented an ambiguity | Injectivity per language: two concepts may not render to the same word. It fires on the real data, today. |
| A language could be half-added | languages is declared once, and adding one breaks the build until all 45 concepts answer for it. A half-added language is a site serving the wrong one. |
| The gate asserted what it could not know | The policy declares its own limits: gateable, gate_source, <!-- lang:xx -->. The rule is still emitted for the human — who has the context a regex lacks — but no surface fails on it. |
| The gate could not read the surface where the disease was | mode = 'I18nKeys: export the bilingual file and walk only the target language. The spine is governed by the protocol it ships. |
| Nobody called the gate | just ci-lexicon. Inherited from ADR-070: existence is not participation. |
Case law — what enforces the lesson today
- ✓The vocabulary has ONE policy, and every surface consults it — never six copies
adr:071/registry-is-the-single-policy - ✓The gate declares what it cannot check, instead of asserting it
adr:071/the-gate-declares-what-it-cannot-check - ✓A declared language is answered on every surface, or there is no discharge
adr:071/a-language-is-answered-everywhere - ✓The vocabulary's witness runs in the chain, with its negative case
test:.ontoref/reflection/tests/test_es_vocab_gate.nu
The throwaway script that measured the original incoherence is today less reliable than the gate that replaced it: it still returns a false positive the gate does not. That, in one line, is the difference between measuring once and declaring forever.
Glosario
Sin coincidencias.