Skip to content

go-binary ships no inventory when a plan-emitting class is declared beside it #784

Description

@CarlAllenn

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions