Skip to content

feat: READ-RECEIPT dispatch provenance + marker parity (check 38) - #6

Open
miladaslaner wants to merge 2 commits into
mainfrom
feat/read-receipt-contract
Open

feat: READ-RECEIPT dispatch provenance + marker parity (check 38)#6
miladaslaner wants to merge 2 commits into
mainfrom
feat/read-receipt-contract

Conversation

@miladaslaner

Copy link
Copy Markdown
Owner

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:

Where What
contract reference/structured-lanes.md Define READ-RECEIPT: once — shape, the verbatim-quote field, freshness scoped to the current round and dispatch
orchestrate Write it at the intent gate it was already resolving. It rides in the dispatch brief, so producers inherit it
retro No edit needed — its Conformance checklist derives from the internal config's lanes table at run time
lint Check 38 — every marker the contract defines must be named by the orchestrator

Zero 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:

Intent-gate branch Receipt
Note resolves Write it; proceed
pending, drafting outstanding intake dispatches as today — drafting is never blocked
No owning note Existing invalid-intent branch; nothing to cite
Quarantined Blocked as today

A 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-RECEIPT is 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 --strict failure. The body already links structured-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

--strict 0 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.sh is the remedy.

🤖 Generated with Claude Code

https://claude.ai/code/session_01RqAwCCiY6xE9MT3fTk8x25

miladaslaner and others added 2 commits July 31, 2026 22:22
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant