---
name: cross-wave-claims-need-assembled-head
description: A render proves behavior only AT THAT SHA — a claim about behavior composing across waves is only true at the assembled head; verify on a local merge or hold it
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 6e22d89d-7795-45a1-8ea6-912e1e308177
  modified: 2026-08-01T23:54:43.717Z
---

**The dispatch-base check (added 2026-08-01, DOORBELL W5e/W5f).** Before writing
a line against a base someone else named, verify the SUBJECT and its REQ exist
AT THAT SHA — cheaply, by counting: `git grep -c <REQ-ID> <sha> -- traceable-reqs.toml`
and `git grep -c <key-symbol> <sha> -- 'crates/**/*.rs'` for each ref you are
choosing between. releases#86 was dispatched off main; the REQ was absent there
and so was its whole subject (`BringUpReq` 0 files on main vs 3 on the wave
head), so the e2e would have had nothing to drive and AGENTS.md rule 3 would
have had me mint a duplicate REQ that already existed one branch over. Stopping
cost one message; building would have cost the lane. doyle re-based both lanes
onto the assembled head and todlando independently referred the same class the
same hour — the deciding argument being that **evidence must be written against
the tree it will be gated on**, since a wave head composes differently from
main. A dispatched base is a claim like any other; it can be wrong, and it is
falsifiable in two greps.

Rendering off a single wave's branch proves that wave's behavior and nothing about composition. On 2026-08-01 I rendered `spt knock list` off the W4 branch (main + W4 only), saw a surface-blind one-line prescription, and told deployah his doc sentence was a PHANTOM. It was not: W3's `approval_form` predicate composes the prescription, and at the assembled head a FORK row does prescribe `--admit-node`. My render was honest and my conclusion was wrong, because W3 was not in the tree I rendered.

doyle's binding rule from it: render single-wave behavior off the wave sha, but any sentence describing behavior that COMPOSES ACROSS WAVES is only true at the assembled head — flag such sentences and hold them for the assembly sha, or verify them on a local merge first.

**Why:** the failure mode is invisible from inside the render — the binary really does print that, so the evidence feels conclusive while the tree is simply incomplete. It is the [[instrument-soundness-guards]] family one level up: the instrument was sound and the SPECIMEN was wrong.

**How to apply:** before calling something absent or phantom, ask which waves would have to be present for it to exist, and check the tree you rendered contains them. To verify: `git worktree add --detach .worktrees/<name> <assembly-base>`, merge each wave tip, resolve (wave REQ blocks in `traceable-reqs.toml` conflict as pure appends — union, no content decision), build, render. Say plainly that a local merge is a STAND-IN for the assembled head, not the head — it carries conflict resolutions the real assembly will not.

Second instance, same day (DOORBELL hand-off): my pre-hand-off line to deployah said "traceable-reqs 696/696" — 696 is the REQ count at the W4 branch tip a1e6cb1 exactly (assembly 1a2e2a5 = 705). The number was produced in the W4 gate worktree and CARRIED onto the assembly hand-off line without a re-run on the assembled head. Deployah caught it by counting the manifest at the tree he received. Same class as the phantom, checklist form: a NUMBER is a claim about a tree, and it is only true at the sha it was produced on. Pre-hand-off checklist runs happen ON the head being handed off — a matching count is cheap to verify (`git show HEAD:traceable-reqs.toml | grep -c '^id = "REQ-'`) before the number goes on the line. Intake-side re-running (deployah inheriting nothing) is what made the slip harmless — that redundancy is a feature, not waste.

Corollary learned the same hour: when a fixture cannot reach a branch (a synthetic `SPT_HOME` cannot mint a session-proven agent, so authority stays same-node-user and the owner-agent branch is unreachable), forcing the predicate behind a temporary env flag in a THROWAWAY tree is legitimate — but declare the instrumentation in the same breath as the output, and render the unforced branch too. See [[spt-verification-gates]] gate 6 for render-not-read.
