Defect
A release declaring go-binary beside any plan-emitting class publishes green with an inventory that does not describe its Go binaries. Measured 2026-08-21 against the real aggregator (publish.yml, "Derive the per-artifact inventories and the release view", stele v0.19.1): with go-binary,rust-binary, the release view carried 4 packages (lab-cli only) and the decision population only the cargo plan — the shipped Go binaries' 80 packages appeared nowhere, and nothing went red. Mechanism: binaries_speak is set only when EVERY class is in {go-binary, oci-image}; any other class clears it and the run falls to the plan branch, where the go-binary leg emits no plan (its inventory is read from the shipped bytes by stele derive sbom, stele#46). The class that cannot state a plan is silently dropped the moment one that can is declared beside it.
Not live: no org repo declares go-binary beside a plan-emitting class (stele is go-binary alone). #775 guards the reachable half of the hazard; this is the branch it cannot reach.
Decided build
Decided in direction 2026-08-24, blocked on the engine for its vocabulary:
The go-binary leg emits an inventory plan like every other shipping class — a plan whose params say "derive this from the shipped binaries" rather than naming a cargo closure — so the aggregator has exactly one branch ("artifacts that own documents") and binaries_speak stops being a whole-release mode. That needs a params vocabulary the derivation leg can act on, which is stele's surface: file the engine half upstream (a stele issue: a plan class whose derivation instruction is read-from-artifact) once the current stele batch (ledger release-lab#262) is closed and the engine tree is unowned — not before, and never as a canon-side workaround. The canon half (builder emits the plan; aggregator's binaries_speak branch deleted) lands after the engine release and its pin, in the pin-then-consuming-edits order.
The #833-shipped declaration/producer lint constrains this build: when go-binary gains a planned obligation in slsa/assert-policy.json, the lint demands its producer in the same commit — declaration and emission move together or the gate reds.
Rejected, recorded so it is not re-proposed: making binaries_speak win whenever BINARIES_DIR is set — it would discard the OTHER classes' plans, the same defect pointed the other way. Also rejected: doing nothing until a repo hits it — this is written down precisely so it is not found in a release.
Canon consequence
publish.yml loses its two-mode aggregation; every shipping class owns its documents through one branch. No repository is affected until one declares the combination — after this, that repository simply works.
Done when
Sequencing
BLOCKED — do not start: the engine half waits for the 2026-08-24 stele batch to close (release-lab#262); the canon half waits for the engine release and pin bump. Nothing in the org can reach the defect today, so this queues without cost. Refs #492, #537, #775, #833, stele#46, release-lab#262.
Defect
A release declaring
go-binarybeside any plan-emitting class publishes green with an inventory that does not describe its Go binaries. Measured 2026-08-21 against the real aggregator (publish.yml, "Derive the per-artifact inventories and the release view", stele v0.19.1): withgo-binary,rust-binary, the release view carried 4 packages (lab-clionly) and the decision population only the cargo plan — the shipped Go binaries' 80 packages appeared nowhere, and nothing went red. Mechanism:binaries_speakis set only when EVERY class is in{go-binary, oci-image}; any other class clears it and the run falls to the plan branch, where the go-binary leg emits no plan (its inventory is read from the shipped bytes bystele derive sbom, stele#46). The class that cannot state a plan is silently dropped the moment one that can is declared beside it.Not live: no org repo declares
go-binarybeside a plan-emitting class (stele isgo-binaryalone). #775 guards the reachable half of the hazard; this is the branch it cannot reach.Decided build
Decided in direction 2026-08-24, blocked on the engine for its vocabulary:
The go-binary leg emits an inventory plan like every other shipping class — a plan whose params say "derive this from the shipped binaries" rather than naming a cargo closure — so the aggregator has exactly one branch ("artifacts that own documents") and
binaries_speakstops being a whole-release mode. That needs a params vocabulary the derivation leg can act on, which is stele's surface: file the engine half upstream (a stele issue: a plan class whose derivation instruction is read-from-artifact) once the current stele batch (ledger release-lab#262) is closed and the engine tree is unowned — not before, and never as a canon-side workaround. The canon half (builder emits the plan; aggregator'sbinaries_speakbranch deleted) lands after the engine release and its pin, in the pin-then-consuming-edits order.The #833-shipped declaration/producer lint constrains this build: when
go-binarygains a planned obligation inslsa/assert-policy.json, the lint demands its producer in the same commit — declaration and emission move together or the gate reds.Rejected, recorded so it is not re-proposed: making
binaries_speakwin wheneverBINARIES_DIRis set — it would discard the OTHER classes' plans, the same defect pointed the other way. Also rejected: doing nothing until a repo hits it — this is written down precisely so it is not found in a release.Canon consequence
publish.ymlloses its two-mode aggregation; every shipping class owns its documents through one branch. No repository is affected until one declares the combination — after this, that repository simply works.Done when
go-binarybeside a plan-emitting class carries an inventory naming the Go binaries' packages — measured on a real tree with the real aggregator, both the union and the decision population quotedbinaries_speakas a whole-release mode is gone frompublish.ymlSequencing
BLOCKED — do not start: the engine half waits for the 2026-08-24 stele batch to close (release-lab#262); the canon half waits for the engine release and pin bump. Nothing in the org can reach the defect today, so this queues without cost. Refs #492, #537, #775, #833, stele#46, release-lab#262.