Rendered from docs/obligations/0124-a-probe-result-is-printed-and-never-committed-so-nothing-regenerates-one.md in the Headwater
corpus. Every document on this half of the site is typed by the taxonomy
the descriptor names: corpus.json.
A probe result is printed and never committed, so nothing regenerates one
Context
Spec 5 says what a probe result is: "The probe result is a document, generated from the transcript, the expectations and the grader version. It carries the regenerated warrant, and generate --check proves it." Spec 12 reads the same sentence as an instrument, because the grader is a correctness root and a root owes its own test.
headwater probe grade now evaluates every expectation form and returns a verdict for each. It writes that report to standard output and it writes no document. Three facts were measured on this tree rather than argued:
docs/probe-runs/is declared by the overlay and held no file, so no transcript was corpus content. The section at the end of this record is what moved that fact and what it did not move.- No kind of this taxonomy types a probe result, so a result document has nothing to be.
headwater generate --checkregenerates three documents, and each is a shelf index or a shelf section.
So the artifact that spec 5 calls a probe result exists as terminal output and as nothing else.
The second and the third of those three are false, and the first is true. probe_result is a kind of this taxonomy, docs/probe-results/** is a shelf that holds it, and probe_result is the ninth declarable projection kind. The generator reads every committed transcript, grades it against the selection that headwater probe plan composes, and writes one document for each. It writes nothing at all when the plan refuses. A plan that gives up part way through holds the probes it read and none of the rest. A result over that part would report a rate over a denominator no document declares. The run names the probe that stopped the plan in the place a result would be. A recorded fixture tree holds the pair and asserts the three directions of the gate. The committed pair is green. An unrelated edit leaves it green, and an edit to one event of the transcript turns it red.
This corpus wrote no result while the first fact held, and headwater generate printed the reason on every run rather than passing the declaration over. The first fact stopped holding on 2026-09-09. The run now writes a result and reports that a confirmation refused the transcript it wrote it from. That is the same posture applied to the failure that replaced the empty one.
Obligation
The corpus owes a probe result as corpus content, and the debt is one link in a chain. A result is a function of a transcript, and a recorder that observes a session from outside it writes that transcript. No verb of this engine writes one, and spec 5 refuses a transcript that an agent wrote about its own session. The chain is the recorder, then a committed transcript, then a kind for a result, then a generator over it, and only then the test.
Two consequences follow while the chain is unbuilt, and each is a claim this corpus cannot make yet.
The standing test of a correctness root is half absent. A recomputed number is what makes a result citable, and the recomputation is what catches a result that disagrees with its own transcript. The recorded fixture set of headwater-probe holds the grader against three transcripts and catches a defect in the engine. It says nothing about a number in a document, because no document holds one.
A published rate would carry the asserted warrant. Spec 3 refuses an asserted document as evidence for anything. A rate written into this corpus today therefore discharges no evidence obligation. That is the failure the placement table in spec 5 exists to prevent, reached through the layer the table describes.
Discharge
The issue that lands a recorder and a committed transcript discharges the first link. The issue that declares a probe_result kind and a generator over it discharges the rest. It cannot start earlier, because a projection whose source does not exist is a projection of nothing.
The second of those two issues landed, and it did not have to wait. A projection whose source does not exist writes no file, and it states the reason for a reader of the run. What the work needed was a source to test against. A fixture tree supplies one that no reader can mistake for evidence about this corpus. The first link then landed too: the recorder is tools/probe/probe-record.sh and the transcript it committed is on the shelf. The remaining debt is neither link. It is a recording that a confirmation does not refuse.
The contract that link satisfies is a document of this corpus. Spec 15 states the twelve identity keys, the five event keys, the three tool-call keys, the four produced-artifact keys and the five confirmations. A test derives its four tables from the arrays the intake enforces. So a key this engine starts to refuse fails a test, rather than reaching a recorder as a refusal nobody wrote down. The process exists and it ran once. What the run met is the first confirmation of that contract.
One thing is settled here and needs no further work. The grader is a pure function of its three inputs, and two runs over one transcript write one set of bytes. That is what made the projection possible when the source arrived, and it is tested in the crate and again over the verb. The source arrived on 2026-09-09 and the function graded it to nothing, because a transcript the first confirmation refuses reaches no grader. What is missing is a usable source rather than the function.
This record does not ask for a result document written by hand. A hand-typed rate is the asserted warrant by another route, and it is the thing the second consequence above names.
The first link landed and the debt did not close
docs/probe-runs/regression-probe-transcript-for-2026-09-09.md is a recorded transcript, docs/probe-results/regression-probe-transcript-for-2026-09-09.md is generated from it, and generate --check holds the pair. So the pair this record asks for exists, and the record stood at discharged on that reading from 2026-08-14 to 2026-09-11.
The pair is not the measurement. The commit that landed the transcript also moved .headwater/taxonomy.lock. So the lock the transcript pins stopped being the lock of this tree at the moment of the merge. As a result, the first of the five confirmations refused the recording whole. The generated result carries zero verdicts of four. The two consequences above therefore both still stand: no document of this corpus holds a recomputed rate, and every efficacy rate here is asserted. That is why the status returns to current.
What closes this record is a transcript that a confirmation does not refuse, and the transcript of 2026-09-11 was one for a day. This record discharged on it on 2026-09-11. 8b61593e moved .headwater/taxonomy.lock later the same day. So the first confirmation refuses that recording too, and 0149a92c retired it to deprecated to keep the run green. The result is generated from it and generate --check holds the pair, and it carries zero verdicts of four. No document of this corpus holds a recomputed rate, every efficacy rate here is asserted, and this record returns to current.
The rate the recording held for a day was 1 of 4, and the first transform of those four logs made it 0 of 4. tools/probe/probe-record.sh called the transform with no --answer. So the one probe that declares a closed answer set recorded answer: null whatever the session said. A quarter of the figure graded the recorder. The driver now derives the answer from the same harness line it already reads the cost from. #803 carries what is left of that defect. The figure itself is gone: the lock moved under the recording, so the grader reads none of those four logs now.
The lock moved under two recordings in three days, and no state on either one told the documents that read them. headwater generate reports a refused transcript. The report now names every document of this corpus that links the refused recording or the result derived from it. The result carries that list as well, where a reader of a committed file meets it. So the next recording that goes stale names this record and HW-OBL-0010 on the run that voids it. It does that rather than leaving both standing at a discharge for a day. It reports and it fails nothing, because the remedy is a rewrite of a sentence that a person has to read.
A third recording, and a denominator of eight rather than four
The transcript of 2026-09-16 is a recording the first confirmation does not refuse, and this record discharges on it. The regression tier grew from four probes to eight between the second recording and this one. So the result is the first pair this corpus holds over the whole current selection. generate --check holds the pair. The result carries a verdict for every one of the eight probes. The rate is 3 of 8: 37.5 percent, in a 95 percent interval of 13.7 percent to 69.4 percent.
Two of the eight sessions produced an artifact rather than only reading, and both are new expectation forms since the second recording. The patched probe's session ran headwater new obligation_record, and the result names the artifact it produced, HW-OBL-0198. The rule section.required.missing reported nothing over it. So the verdict is satisfied. The cited probe's session wrote an evaluation that cites HW-DR-0049, and the verdict is satisfied on that ground. Both artifacts are committed corpus content, and both pass headwater check --strict on their own account, not only as an input the grader reads.
This transcript's own commit touches no key of .headwater/taxonomy.lock or .headwater/overlay.yml, which is the ordering that voided the second recording on the day it landed. A future recording that repeats that ordering lands in the same trap this one avoided.
Each result on the shelf grades a transcript that predates the sealed workspace (#1229). Each session ran in a workspace that kept every probe file, and the one answered probe then passed every value of its set. The discharge stands, because this record was owed a committed result and not a clean rate.
2026-09-30: a moved read set marks a recording and keeps its verdicts (#1338). Until then, the first confirmation refused a transcript whose lock and read set had both moved. That dropped every verdict on the first edit to a document a probe read after an unrelated lock move. On 2026-09-30, 4 of the 28 results under docs/probe-results/ carried a verdict. Intake now grades such a transcript, and the result carries one sentence that says the read set moved. After the regeneration, 28 of the 28 results carry their verdicts, and 24 of them carry that sentence. A lock move stays refused where this tree composes no read set for the probes. The ordering trap above now costs a mark and not the evidence.