---
name: assembly-textual-merge-hides-semantic-composition-break
description: "Cherry-pick assembly of independently-gated lanes can merge textually clean and still not compile — a refactor lane's helper hoist vs a feature lane's pre-hoist cell; the assembled head's OWN compile-gate is the only thing that catches it."
metadata: 
  node_type: memory
  type: project
  originSessionId: f04d6c7b-b129-427d-a73c-28fb262ca68a
  modified: 2026-08-19T10:30:48.831Z
---

KEYSTONE #182 golden-head v2 assembly (2026-08-19): 11 cherry-picks, ZERO conflicts, fidelity
blob/patch-proven — and the head did not compile. Hygiene lane (IR-36/IR-39) hoisted
`output_bounded`/`sibling_bin` into `tests/common` and deleted the file-local copies; W3's int
cell in the same file was authored on a pre-hoist base and called the bare names. Each lane
gated PASS in isolation; the defect exists ONLY at the composition. E0425 x4, first clippy run
on the assembled head.

**Why:** git's 3-way merge composes TEXT regions; a rename/hoist and a new call site never
touch the same lines, so no conflict fires. "All lanes gated green + zero pick conflicts"
therefore proves nothing about the assembled head compiling. The more lanes share a file
family (here: a refactor lane sweeping 60+ test files beside feature lanes adding cells), the
more likely the class.

**How to apply:** treat the assembled-head compile-gate (clippy --all-targets) as a REAL gate
arm, never a formality — run it before hand-off every time, even when every pick auto-merged.
Fix shape: minimal declared stage-only commit adopting the refactor lane's landed idiom (here
4 call sites -> `common::`), declared in the hand-off as carried by no lane tip. If the broken
sites sit inside a never-executed cell, say so — the fix is then compile-proven only and the
first-execution declaration is unchanged. Related: [[lane-diff-byte-identity-limit]],
[[include-str-fixture-inherits-checkout-eol]] (the other assembly-environment class).

**2026-09-08 variant (W3 gate, RED 1) — the rider imports a seam the producer never built.**
Same class, different door: hertz's drift cells `use super::{gen_changelog, PUBLISHED_DOC_PATHS}`
per a written rider CONTRACT; the producer (me) implemented the behaviour INLINE and never cut
the two named seams. Merge-tree clean, `traceable-reqs` exit 0, head does not compile
(`E0432` unresolved imports, both OSes). The composition here is CONTRACT-to-code, not
lane-to-lane, so no shared file and no shared line is needed at all.

**Why it survived every check but the build:** treqs counts TAG PRESENCE, not build truth —
it reads `+unit` green over a test target that fails to compile, and a `unit` stage was
ACTIVATED on that reading. Only clippy caught it, and only because someone ran clippy.

**How to apply:** when a rider names a seam by SIGNATURE, grep the producer tip for that exact
name before calling the head composed — the import list IS the contract's assertion surface.
Never read a treqs 0 as evidence that cells build. And on the seam's shape: a fn that
`process::exit`s on the failure path cannot be called by the cell that tests the failure path,
so a contract asking for a testable drift check is asking for `-> Result`, with the exit at the
CLI edge. Related: [[a-fallback-that-fires-only-in-release-is-untestable-by-construction]].
