feat: READ-RECEIPT dispatch provenance + marker parity (check 38) - #6
Open
miladaslaner wants to merge 2 commits into
Open
feat: READ-RECEIPT dispatch provenance + marker parity (check 38)#6miladaslaner wants to merge 2 commits into
miladaslaner wants to merge 2 commits into
Conversation
The one failure class the loop could not learn from. A dispatch acting on recorded intent is supposed to have read that record; nothing observed whether it did. A skipped read produces no verdict, no bounce and no round — so it was invisible to all three RC verifiers (which inspect the diff) and therefore to retro, which classifies bounce causes from verdict lanes. No trace, nothing to learn from, so it recurred while each session reported having learned. - contract: define READ-RECEIPT once in reference/structured-lanes.md — shape, the verbatim-quote field that makes it self-checking, freshness scoped to the current round and dispatch, and the permitted cases as a decision TABLE (note resolves -> write it; pending-with-drafting-outstanding -> intake dispatches as today; no owning note -> existing invalid-intent branch; quarantined -> blocked as today). Written as cases, not a prohibition, because one absolute clause produced seven denial-of-service defects on 2026-07-21. - orchestrate: write the receipt at the intent gate it was ALREADY resolving. It rides in the dispatch brief like the producer terminal report, so every producer inherits it and no per-producer rule exists to drift. - retro: no edit needed — its Conformance checklist derives from the internal config's lanes table and marker prefixes at run time. - check 38: every marker the contract defines must be named by the orchestrator. Directional on purpose; the reverse asymmetry is legitimate. Adversarially tested — a contract-only marker fails and is named. Deliberately additive: a missing receipt is a provenance gap surfaced in the run summary, never a bounce, never a round increment, never a block on drafting. Not restated in the contract body: that body sits at exactly the 450-line soft cap, and this skill's own rule is cite-and-restate-nothing. The body already links structured-lanes.md. ./lint-platform.sh --strict: 0 FAIL 0 WARN. tests: 243 pass. +2 evals. The behavioural eval run is not included (real cost, rate-limited; check 29 is NOTE-only for that reason) — ./run-pending-evals.sh. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RqAwCCiY6xE9MT3fTk8x25
The first draft matched only the backticked prose form (`NAME:`). READ-RECEIPT is specified in a fenced code block — which is how a marker is actually written where it is defined — so the check reported PASS while being blind to the very marker it was built for. Caught by noticing the marker count drop 13 -> 12 after an unrelated edit, not by the check itself. - Match both forms: backticked in prose, and bare at the start of a line. - Name the marker in structured-lanes.md prose as well, so it reads naturally. - Re-tested adversarially in the previously-blind case: a contract-only marker introduced in a code block now fails and is named. This is the second time in this branch that a check needed proving it could fail, and the second time the proof found something. A check that has not been watched to fail is an assumption. ./lint-platform.sh --strict: 0 FAIL 0 WARN. tests: 243 pass. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RqAwCCiY6xE9MT3fTk8x25
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Phases 2 and 3 of the read-receipt work. Follows #5, which wired the hooks.
The problem this closes
A dispatch acting on recorded intent is supposed to have read that record. Nothing observed whether it did.
The three RC verifiers inspect the diff — correctness, coverage, attack surface. None asks did you read the record. So a skipped read produced no
VERDICT: FAIL, no bounce, no round — and retro classifies bounce causes from verdict lanes. The class was structurally invisible to the learning organ: the one failure the loop could not learn from, because it left no trace to learn from. It recurred all day while each session reported having learned from it.The change — 3 files, not 38
One writer, one definition, one auditor:
reference/structured-lanes.mdREAD-RECEIPT:once — shape, the verbatim-quote field, freshness scoped to the current round and dispatchZero producer edits. CLAUDE.md is explicit that an inheritor cites and adds no rule of its own — a local restatement is the copy that survives the next central fix and keeps misbehaving.
Why the verbatim quote
It cannot be reliably reproduced from memory, and a fabricated one is falsifiable by re-fetching the source. The receipt is simultaneously evidence-of-read and self-checking — unlike "I read it", which is unfalsifiable and therefore worthless.
Written as cases, not a prohibition
Per the 2026-07-21 lesson, where one absolute clause produced seven denial-of-service defects:
pending, drafting outstandingA missing receipt is a provenance gap surfaced in the run summary — never a bounce, never a round increment, never a new gate.
Second commit: check 38 was passing vacuously
Worth reading on its own. The first draft matched only the backticked prose form, and
READ-RECEIPTis specified in a fenced code block — so the check reported PASS while blind to the very marker it was built for. Caught by noticing the marker count drop 13 → 12 after an unrelated edit, not by the check itself.Now matches both forms, and re-tested adversarially in the previously-blind case. Second time in this branch a check needed proving it could fail, and the second time the proof found something.
Not restated in the contract body
That body sits at exactly the 450-line soft cap, so any restatement would have bought prominence with a
--strictfailure. The body already linksstructured-lanes.md. Flagging separately: the contract has been sitting on the cap, so the next substantive change hits this wall and needs a real reference extraction.Gates
--strict0 FAIL / 0 WARN · 243 tests · scan-secrets clean · dist rebuilt · +2 eval scenarios.Behavioural eval run not included — real cost, rate-limited; check 29 NOTEs the three pending skills and
./run-pending-evals.shis the remedy.🤖 Generated with Claude Code
https://claude.ai/code/session_01RqAwCCiY6xE9MT3fTk8x25