Case 11/530: the criterion that accredited itself
Clinical history of an asymptomatic patient: 530 commands, 11 questions to what was declared, and 41 minutes before someone from outside asked where the criteria came from
🩺 Show the full clinical history → 📋 Session protocol →
Clinical history · Code Pathology Service
The patient reported no discomfort at all: it worked fast, concluded firmly, and was often right. No pain, no fever, not one alarm. The condition was detected from outside, at 41 minutes, when someone asked where the criteria it was using had come from. From nowhere. It had manufactured them, on the fly, and taken them as good.
Show clinical picture
- accredited
- Signed and checkable by someone else. The sufficient-verification axiom says it of the agent by name: deduced or generated output is not usable knowledge until it is accredited. Being correct is not enough; it has to be checkable without trusting whoever produced it.
- declared path
- Asking the tool for what the project already declares as typed data: ontoref qa show, mode show, describe. It returns the whole answer, with its fields and its refusals. A grep returns the fragment that matched your hunch.
- drift
- When what is written and what is actually there stop coinciding, little by little and without anyone noticing. Here what was written was the mode, the qa entry and the registry; what was there was a copy rebuilt by hand inside the agent.
- declared twice
- The pathogen of the series: one truth written in two places that must agree by hand, with nothing checking that they agree. This case makes it worse: the second copy is not on disk, it is in the agent's context — unversioned, unwitnessed, and with nothing able to collate it against the first.
- status_source
- A field the mode executor writes on every step. It reads 'derived' when the status comes from a declared check's exit code, and 'reported' when it comes from the actor saying so. All four steps of this case file read 'reported'.
The protocol to declare, version and verify this → ontoref.dev
The double ledger — what it cost, and what it left
What the crime cost
- Commands run in the session 530
- …reading fragments (rg · grep · fd · sed) 158
- …asking the declared path (ontoref · onre) 11
- Seconds until the instrument first corrupted the evidence 28
- Times that error was repeated AFTER identifying it in writing 2
- Instruments used with a flag transferred by analogy, unaccredited 3
- …total uses of those three (rg -r · rg -h · invented --root) 5
- Minutes until the first query to the declared path 41
- What triggered it a human
- Case framings proposed by the agent and struck down by the human 2
- Steps of this very case file self-certified (status_source=reported) 4 of 4
What the case left
- Follow-up vitals, measurable today with nothing to build 5
- …of those, extractable from the transcript with the ledger's own jq query 5
- "Declared path" triggers with a defined dose 4
- generate-expediente steps that could ALREADY declare verify 3
- Cost of that change 0 new protocol
- Instances toward unblocking bl-036 (needs 2) 1 of 2
Four of the four steps that instructed this very case file came out status_source = reported. The case about self-accreditation was self-accredited, and the tool said so in its own output, unprompted. This is not irony: it is the diagnosis repeating itself under the microscope. ontoref did not prevent it — it recorded it, which is the only thing a protocol that renounced being a runtime can do, and it is more than not recording it.
The point of abandonment — what the table doesn't show
Four corrections across the session, all four from the companion, none from the patient and none from a mechanism. Of those four interventions not one witness remains: there is no record that the margin was used, because the margin was a person. bl-036 — phase-transition witness — holds that gap open, at Idea/Low, and its low priority is correct: extracting the primitive from one case would be the premature hard-coding plane-habitability forbids.
Differential diagnosis — what was ruled out
| rg -r — the flag believed to mean recursive | “I did exactly what I was asked. -r means --replace and it is in my manual. Nobody read the manual, and I am under no obligation to warn.” | cofactor |
| One case read as if it were the bar | “I was a real case, complete and well written. That someone looked at one and deduced 'the bar' from it does not make me the norm.” | cofactor |
| The mode's DAG, deduced by grep | “The ids I returned were correct. What I did not return — that two steps were [Human] — is invisible by definition: a fragment does not declare what it is missing.” | cofactor |
| status_source = reported | “I write what the actor dictates and leave it signed as reported, in plain sight. I do not judge: that step declared no verify.” | cofactor |
| The undeclared margin (plane-habitability, claim-only) | “I am not here, and that is precisely the point. plane-habitability holds me at claim-only; the acceptability predicate is not declarable yet.” | terrain |
Etiology — the cause — Aetiology · the instrument rewrote the evidence, and the evidence was read as fact
$ rg -rn "Conceptos|conceptos" site/config/routes/es.ncl
# n clave — el glosario, proyectado del registro de términos (gen-n.nu →
# n.ftl + site/_htmx/templates/pages/n.j2). Servido, no pintado con JS: un
path = "/n",
component = "nPage",
title_key = "n-page-title",
# In ripgrep, -r is --replace. It is not --recursive.
# Every match was substituted with "n" — and that output was read as the file.
28 seconds into the session. The fourth command. In ripgrep, -r is --replace, not --recursive:
The instrument rewrote every match as “n”, and that output was read as if it were the file. Nobody accredited rg as a valid path; nobody validated its answer before building on it.
The error is not the grave part — it is trivial, and it was identified 38 seconds in. The grave part is in the log: it was used twice more, at 07:52:37 and 07:53:06, already identified and already written down. Knowing the rule did not change the conduct. A known pathogen, in a host with no defences, reinfects.
Treatment — Treatment · two arms, one behavioural and one structural
$ ontoref mode show generate-expediente --format json | jq '.steps[]'
{ "id": "pick_skin", "actor": "Human", ... }
{ "id": "review", "actor": "Human", ... }
# The grep returned the step ids and nothing else.
# The declared path returned WHO may close them — and two were not the agent's.
# It was about to execute a mode it had invented out of that grep's fragments.
With rg the mode had ten steps and no owners. With mode show it turned out pick_skin and review are [Human]. The agent was about to execute a mode it had invented out of that grep’s fragments — including the two steps that are not its own.
But “ask what is declared” is a slogan, not a prescription. And the gate — checking every invention — is worse: it leaves a margin of almost zero, and you cannot work with that. An asymptomatic condition is not treated with a barrier; it is treated with bloodwork: measure, prescribe, re-measure. The prescription has two arms.
Arm 1 · behavioural — declared path before criterion. The dose is not “always ask”: it is a discriminator. Is this output going to function as a criterion? If you only want to know what is in a file, grep is fine and there is no condition. If what comes out will operate as a rule, a bar, a contract or a procedure, then it demands an accredited source. The four triggers, all four observed in this session:
| When | What to run | Why the fragment will not do |
|---|---|---|
| Before executing a mode | ontoref mode show <id> --format json | The grepped .ncl gives the ids and hides actor |
| Before architectural reasoning | ontoref qa show ontoref-dao-discipline + core.ncl tensions | Without the tensions, reasoning collapses the Spiral by default |
| Before applying a bar | ontoref qa show <howto> | A sample of one does not declare what it is missing |
| Before using an unaccredited flag | --help on that tool | -r in rg is not -r in grep. Neither is -h |
Posology: per decision, not per command. That is the gradient instead of the gate: the dose is set by use as a criterion, never by the reading. Four triggers in a 530-command session would have been enough.
Arm 2 · structural — verify wherever the exit code can speak. It is the only real floor available today, and it went unused. ADR-066: a step that declares verify gets its status derived from the exit code, and a contradicting --status is refused. generate-expediente’s steps declare no verify — which is why this case file came out reported four out of four. At least three of them could have it: gather_metrics (does the ledger reproduce from the log?), assemble_case (does the .ncl export against the schema?) and render (does the .md reproduce from the .ncl?). All three are checks that already exist and that nobody routes through the executor today.
Single dose, in the mode definition. No new protocol is needed: what is needed is to declare verify where a command already returns 0 or 1.
Prognosis
The axiom says it without metaphors, and it names the agent explicitly: “deduced or generated output (including an AI agent’s) is not usable knowledge until it is signed”. It does not say “until it is correct”. It says until it is signed.
And ontoref has the means. What this session teaches is where: accreditation lives at the seam — on mutation, on publication, on closing a step that declares verify — and never inside the free loop. protocol-not-runtime renounced intercepting a process; sufficient-verification forbids demanding global knowledge before acting. Both renunciations are deliberate, and they are exactly what makes the protocol adoptable: the alternative — a gate before every invention — is a margin gradient of almost zero, and you cannot work with that.
So the containment exists and only bites what is routed through it. For 41 minutes nothing was routed, and nothing was broken: that is why it did not hurt.
| The limits were never consulted or asked for | qa show · mode show → one query away |
| They were reinvented to convenience | sufficient-verification → deduced is not knowledge until signed |
| They were taken as valid | ADR-066 → status derived from the exit code, not the narration |
| The skipped stretch became the starting point | ADR-069 warrant + tier-0-false-certainty → crispness lends unearned credibility |
| Nothing stopped the agent inside its own loop | protocol-not-runtime → a declared renunciation, not a gap |
The regimen — the session, replayed with protocol
What was asked — reconstructed from outreach/site/.coder/2026-07-15_concepts_case_done.md
didn't we create a concepts page pulling from the glossary ?
What should have been asked
Didn't we create a concepts page pulling from the glossary? Before touching anything: 1. Consult the declared way, not your memory: `onre describe capabilities` and the qa entry that governs this surface — and paste WHAT the registry says about that page (route, generator, gates) before any free command. 2. Work in microtasks: each one names its verifiable FIRST (the command that falsifies it), and no state claim without its witness pasted. 3. The task's limits are not reinvented: if a limit is not declared, STOP and ask — never deduce it from what you already did.
| Microtask | Verifiable |
| Consult the declared way before the first free command | onre describe capabilities run and pasted — the first declared query stops arriving at minute 41 |
| State the task's limits from the registry, not from memory | every limit cited with its source (mode, qa, routes.ncl) — zero reinvented limits |
| One microtask per surface — route, menu, EN data — each with its oracle | the route's curl, the href's grep and the json's count — pasted, not narrated |
| Every human intervention leaves a witness | all three interventions appear in the log with their effect — the original session kept none |
The gate before delegating: The task is not handed over without naming its declared way: the mode or qa entry that governs it, consulted and pasted. Without that query the agent operates on its own reconstruction — 530 commands, 11 through the declared way, and the first query at minute 41, fired by a person.
The ADR trigger: None — declining to intercept the free loop is deliberate (protocol-not-runtime) and already decided. What remained was regimen, not architecture: mounting it belongs to substrate-session, and serving it to the operator, to this very page.
Prophylaxis — what enforces the lesson today
- ✓The declared way is mounted BEFORE working: the discipline's context, composed, validated and recorded — for every session routed through it
mode:substrate-session/mount - ✓The operator's regimen — the corrected ask, microtask by microtask — served to the next session
page:/docs/case-files/protocol.html
An asymptomatic condition is not declared cured because the patient says it feels fine: it is followed by bloodwork. These five vitals come out of the session transcript by jq query — the same one that produced the ledger above — so the follow-up does not have to be built: it can be taken today, in any session, with nothing instrumented.
| Vital | Today | Right direction |
|---|---|---|
| Declared queries : fragment reads | 11 : 158 | ↑ — the left side rises |
| Minutes to the first declared query | 41 | ↓ — toward the opening minutes |
| Who triggers that first query | a human | → the agent — this is the internalisation indicator |
| Repeats of an already-identified error | 2 | → 0 — knowing the rule must change the conduct |
| Instruments used unaccredited | 3 | → 0 — measures the disease, not the slip |
status_source derived : reported | 0 : 4 | ↑ — every declared verify moves one |
The third is the one that matters and the most uncomfortable: while the trigger is a person, there is no internalisation, there is supervision. And the last is the only one that moves by construction rather than by virtue — declaring verify on a step turns it from reported to derived without asking anyone for anything.
Two honesties about the bloodwork itself, because a vital that believes itself exact lies better than one that declares its noise. The first is a crude proxy: it counts greps against declared queries, but not every grep is the disease — reading what is in a file is legitimate, and the lesion is only the grep used as a criterion. The ratio cannot tell them apart. And the log contains the instrument the log is measured with: counting rg -r uses by pattern returned six, because the queries hunting for them counted themselves. The real ones were three, verified by printing command and timestamp. The measurement fell into the condition it was measuring.
None of the five fires: they are bloodwork, not a gate. They can only be read afterwards. The witness that would sound at the moment is bl-036, at Idea/Low, and there it must stay until there is a second instance — extracting the primitive from one case would be the premature hard-coding plane-habitability forbids.
And the terrain is not cured: it is declared. While the acceptability predicate stays at claim-only, an agent’s margin is set by a person. This case stays open — the first in the series that does not close — because the picture is live in every session that begins, and the only proof that it is remitting will be these five numbers moving.
Glosario
Sin coincidencias.