Case 18/0: the verb that reported a record it never wrote
Three surfaces said the task had been created. None of the three had looked at the file — and the file had not changed in twenty-six days
🕵️ Show the full case file → 📋 Session protocol →
Case File · Code Homicide Dept.
I asked the project to register a task. The command answered "New backlog item: bl-044", with its identifier, its title and its priority. The action log booked it as a write. The manual, from the repository's very first day, promised "create new item". I wrote that identifier into a governed record that now pointed at it. And only much later, while drafting something else, did I ask the store for its last item. It answered bl-043. I ran git diff --stat over the file: zero lines. The record did not exist, had never existed, and three different surfaces had confirmed to me that it did.
Show glossary
- verb
- A CLI subcommand that mutates state: `add`, `done` or `cancel` over the backlog, `qa add` over the Q&A store. It is the surface through which a person — or an agent — mutates the project's declared state. Unlike a mode's step, nothing ever asked it to demonstrate its effect.
- derived verification
- The ADR-066 rule: a step that declares a `verify` does not decide whether it worked — the check's exit code does, and a self-report contradicting it is refused. It existed, it was accepted, and it reached a mode's steps. Not the verbs.
- action log
- The CLI's audit surface: every verb declares whether its act is a read or a write. It is what you consult to know what a session touched. Its entire value rests on the declared matching what occurred.
- validate before replacing
- Write the candidate beside the real file, export it with Nickel, and only then move it over. If the contract rejects it, the store never finds out. The reverse — write, then check — leaves a broken file on disk while you decide what to do.
The protocol to declare, version and verify this → ontoref.dev
The double ledger — what it cost, and what it left
What the crime cost
- Surfaces asserting the record 3
- …that had looked at the file 0
printstatements inbacklog add18- Writes in
backlog add0 - First commit of the repo where it was already so fef21f4 · 2026-07-10
- Provable days in which the three surfaces agreed 26
- Commits touching the file in that window 2
- …that changed this 0
- Options accepted by the command's signature 3
- …emitted in the record it printed 0
- Dispatcher verbs declaring
write65 - …that do not write, found on audit 2
- Identifier announced by the command bl-044
- Identifier present in the store afterwards none
- What gave it away
git diff --stat· 0 lines - Size of the fix 129+ / 28− across 3 files
What the case left behind
- The rule a verb that declares a write is not a verb that writes
- The lock it writes, RE-READS the store, and refuses if the identifier does not come back
- The second lock the candidate is validated by Nickel before the file is replaced
- The escape that does not exist
%{has no escape in a normal Nickel string — it is refused by name - The sibling that was right
qa addalready wrote, and already refused malformed input - The third verb
backlog promotebooked a write and only prints — corrected - The remainder, with an address nothing audits the other 63
The suspects — the false leads
| "The daemon wrote the record somewhere else" | “"The daemon wrote the record somewhere else." Reasonable: this project runs a daemon that caches exports, and the store's root depends on an environment variable. Ruled out by searching the whole tree for the identifier: zero hits, in any file, under any root. And `git status` reported no file touched.” | ruled out — zero hits in the tree |
| "An explicit confirmation was missing" | “"An explicit confirmation was missing." Also reasonable: mutating a governed surface without asking would be the opposite of what this project preaches, so a `--write` opt-in would have been a defensible design. Ruled out by reading the whole command: there was no branch that wrote, with or without an option. It was not permission that was missing. It was the write.” | ruled out — not permission, the write |
| "It is the design: it prints a record to paste by hand" | “"It is the design: it prints a record to paste by hand." This was the good hypothesis, and it stayed alive a while — until I looked at its siblings. `backlog done` and `backlog cancel`, in the same module, patch the file. `qa add`, in another, writes and additionally refuses malformed input by name. If printing were the design, it would be the design of exactly one of the four. Not a convention: an anomaly, twenty-six days old.” | ruled out — its three siblings do write |
| "If the command says created and the log says write, it is created" | “"If the command says created and the log says write, it is created." GUILTY. And it is nobody's: it is the default belief. What makes this a case and not a typo is that the three surfaces were CONSISTENT WITH EACH OTHER. Checking the message against the log confirmed the record. Checking the log against the manual, likewise. The drift was not contradictory: it was coherent, and that is why it survived every check that was not against the file. The only question that broke it is the one nobody asks after a success message.” | GUILTY — and consistent with itself |
The weapon — Eighteen statements that print, and two more surfaces repeating it.
# modules/backlog.nu — the tail of `backlog add`, as it stood. # Eighteen statements. All print. None touches the disk. print $"New backlog item: ($new_id)" print "Add to reflection/backlog.ncl:" print $" id = \"($new_id)\"," ... # And the other two surfaces, saying the same without having looked either: bin/ontoref.nu:916 log-action $"backlog add ($title)" "write" nulib/help.nu:140 "create new item" # The sibling right next to it, in the same module, DID write: modules/backlog.nu:268 def backlog-set-status ← done and cancel patch the file # Three agreeing assertions. Zero reads of the store. # An agent checking any one of the three against another came away just as convinced.
The identifier was computed as the maximum plus one over the existing ones. With no write, two consecutive sessions receive the same one. The command did not merely fail to create: it handed the same number to whoever asked.
The turn — It writes, and then submits itself to the store.
# 1. It writes. And then it does NOT believe itself: it re-reads the store and
# demands to see itself in it. This is adr-066 — the check decides, never the
# reporter — applied to a VERB instead of to a mode's step.
let landed = (backlog-load | where id == $new_id)
if ($landed | is-empty) {
error make {
msg: $"backlog add: ($file) was written and ($new_id) is NOT in it when re-read —
refusing to report a creation the store does not confirm"
}
}
# 2. And before replacing anything, the store's own contract decides:
$patched | save -f $candidate # beside it, never over it
let check = (do { ^nickel export $candidate } | complete)
if $check.exit_code != 0 {
rm -f $candidate # the store never finds out
error make { msg: $"...NOTHING was written. nickel said: ($check.stderr)" }
}
mv -f $candidate $file
# The action log now receives the act that actually happens, not the one intended.
The refusals were tested against what they must refuse, not only against what they must accept: a kind outside the enum, and a title containing %{. In both, the file was left untouched, with the same digest, and with no orphaned candidates.
The verdict
The series asks: with ontoref, would it have gone like this? And this case answers that the rule already existed and was already running. ADR-066 states, at Hard severity, that a step declaring a check does not decide its own status: the exit code does, and a self-report contradicting it is refused. It is accepted, it carries its typed check, and it runs over every step of every mode in this project. What this case file finds is not an absence: it is a frontier. The rule begins when a mode starts, and an agent types verbs long before that. On the far side of that frontier, the verb certified itself with exactly the ease with which, on the near side, it was forbidden to. And there is something worse than one surface lying, which is three corroborating each other: the message, the audit log and the manual said the same thing from the repository’s first commit, so any check between them returned coherence. The drift was not detectable by comparing declarations. It was detectable only by asking the store — which is exactly what a success message persuades everyone not to do.
| The verb certified itself | ADR-066 already forbade it: the check decides, and a self-report contradicting it is refused. It reached a mode's steps and not the CLI's verbs. The fix extends the same rule: write, re-read the store, and refuse if the effect does not come back. |
| Three surfaces asserting the same, none having looked | One truth in three places, matched by hand: precisely the disease this series' own manual declares about itself. The log now receives the act that occurs and the help says it writes the file. The three are still three, and none of them is the source any more. |
| Three options accepted and silently discarded | --adr, --mode and --dim were collected and never emitted. An option that is taken and thrown away is worse than one that does not exist: the caller has no way to notice. They are emitted now, under the schema's own field names. |
| A title with a quote could break the store | Title and detail were interpolated raw into a Nickel string. They are escaped now; and %{, which opens interpolation and has no escape in a normal string — verified in all three forms — is refused by name rather than mangled. On top of all of it, validate before replacing. |
| The sixty-fourth verb that does the same tomorrow | NOT COVERED, and declared: nothing compares a verb that says it writes against whether it writes. Both found were corrected by hand. The shape is ADR-072's — coverage asserted and never checked against extent — and it has an address in the backlog. |
The reconstruction — the session, replayed with protocol
What was asked — reconstructed from refs:sessions/2026-08-05-assess-signal-y-el-verbo — a bounded excerpt held in custody. NOT the session's opening prompt: it is the one that opened the work where the drift happened, which is what a replay reconstructs. Typos preserved: a corrected quotation stops being collatable. Session identified by the work — 71 mentions of `backlog add`. The prompt stays in Spanish: it is a quotation.
además el backlog add noe es del todos correcto, tiene carencias ¿ no ¿
What should have been asked
A verb says it writes. Before believing it, look at the file. 1. Check against the ARTEFACT, not against another surface. Three mutually coherent surfaces are not three confirmations: they can be one error repeated. 2. A verb that claims to write is verified with `git diff` or the file's mtime, never with its own output message. 3. If the system has an action log, ask who EMITS the entry: an entry written ALONGSIDE the write can record a mutation that never happened. 4. And when you find one, do not fix it alone: count how many verbs claim the same. One is a typo; the number tells you whether it is a case.
| Microtask | Verifiable |
| Verify the effect against the file, not against the output | git diff --stat .ontoref/reflection/backlog.ncl after running the verb — zero lines IS the finding |
| Distrust surfaces that confirm each other | message, log and manual agreed; the file did not. Three agreeing is not proof |
| Ask who EMITS the log entry | rg -n 'log_action' code/crates --type rust — the entry sits beside the write, it is not emitted by it |
| Count the rest before calling the fix done | 233 calls to the action log, 65 claiming a write; audit the 65, not only the one that fell over |
The gate before delegating: Before accepting «done» from a verb that claims to write, the command that checks THE FILE must be written down. It was not, and the drift survived for exactly that reason: it was not contradictory, it was consistent — message, log and manual all said the same thing, and none of them had looked at disk. A contrast between surfaces derived from one another is not a witness: it is the same error quoted three times.
The ADR trigger: Yes, and it is still undeclared as a constraint: that the action-log entry be EMITTED BY the write rather than written beside it. While they stay separate, a mutation that does not happen can still be logged — and that is this case, not its anecdote. Address: bl-045.
Case law — what enforces the lesson today
- ✓Whoever executes does not certify: the state is decided by the check, and a self-report contradicting it is refused
adr:066/check-decides-never-reporter - ✓An item that would break the store's contract is refused before the file is replaced, and the store never finds out
contract:.ontoref/reflection/schemas/backlog.ncl#kind
⊘Declared debt: Nothing compares a verb that declares a write against whether it writes. The dispatcher makes 233 action-log calls, 65 of them declare a write, and the 2026-08-05 audit found two that mutate nothing; both were corrected by hand and nothing prevents the third. What would settle it: the log entry being EMITTED BY the write rather than sitting beside it, so a mutation that does not happen cannot be recorded. Address: bl-045.
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.