# REL-08: candidate-bound package release ledger The previous plan described batch release gates but had no executable per-package binding between current source, candidate archives and reviewed evidence. Added release-ledger.json for22 packages, a pure decision model, a filesystem/CLI adapter and a maintained procedure in release-ledger.md. This completes the ledger task, not package verification, version preparation, remote workflow activation or release. ## Scope and ownership The JSON registry owns target versions, explicit historical distribution mappings, capability requirements, rollback basis and future candidate/evidence bindings. It does not duplicate task/risk status: the adapter reads tasks.json, risks.json, third-party.json and the existing dependency/impact model. Open package-specific risks propagate through dependencies; a generic review owner alone does not widen a concrete HLS finding to unrelated packages. Truly global risks stay global. Source fingerprints include own/dependent packages and shared scripts, tests, toolchain, contracts and frozen release/SDK inputs. Text CRLF is normalized with explicit algorithm labels and separate raw-byte hashes; binary fonts/WASM/media, candidate SRI and evidence attachments use exact bytes. A per-report input table avoids duplicating hashes across22 package rows. Unrelated package source changes can leave another batch unchanged; shared engineering/test/provenance changes are conservatively revalidated. Unknown dynamic imports widen the dependency scope. Actual tarball name/version, source commit existence, SRI and archive members are checked. Site manifests additionally require an exact build tree inventory and matching bytes. Evidence envelopes bind package/version/gate, candidate integrity, input fingerprint, actual environment, command, reviewer, successful check IDs and hashed underlying reports. Device requirements reject missing device identity, mock/emulation and skipped results. Remote CI requires a remote run reference; license coverage includes relevant vendor/SDK and direct runtime dependency IDs. This is mechanical bookkeeping, not a verifier of the truth of prose. Candidate build origin, complete scenario coverage, report interpretation and device/vendor evidence still require the three independent reviews. A source fingerprint must be captured in the actual build/validation snapshot, not copied onto an old package. No historical done task or old report is automatically accepted for a new candidate. ## Distribution and compatibility All22 independent next-major targets are recorded without changing manifests. The iframe row explicitly maps its frozen artplayer-plugin-iframe predecessor; the recovered Thumbnail tool remains blocked for missing complete historical archive. VitePress stays a site/URL/build gate, without inferred new npm publication. Rollback links the historical basis and requires an actual rehearsal report. No core/plugin public API, runtime, declaration, dependency or lockfile changed. Four Yarn scripts expose structural check, immutable report output, strict preflight and tests. ci:check includes the structural check; test:baseline already discovers the new test. Strict preflight runs the existing pinned toolchain check. Normal check exit0 explicitly permits incomplete package evidence; only strict mode is a release gate. publicationAuthorized stays false even in the synthetic evidence-complete test. CI-03 already depends on REL-08 and will integrate strict preflight into the later publication workflow. ## Validation See [recorded validation](../baselines/release-ledger-validation.json). - 30 regression cases pass. They reject stale source/test/SDK/lock inputs, wrong version/package/gate, old tarball reports, tampered reports/attachments, missing license/capability/review evidence, simulated devices and local-as-remote CI. Real temporary archives/site files exercise SRI, manifest, complete output inventory and byte checks; these are synthetic tooling fixtures, not product package/browser/device acceptance. - Package source isolation, dependency propagation, unknown import fallback, 22-package coverage and text/binary hashing are tested. Site cannot silently be changed to npm scope or lose mandatory review gates. - CI script suite50 passes; targeted lint passes after ordinary formatting fixes. Strict Node24.21.0/Yarn1.22.22 toolchain check passes with unchanged dependencies. - Current all-package report has22 blocked packages and zero candidate bindings. The explicit HLS strict preflight exits1 for the expected missing gates; this is correct rejection, not a failed tooling implementation. Generated reports use separate cache directories and previous evidence remains intact. ## Rollback and next work Revert this task commit to remove the new scripts, registry, tests and ci:check step. No package rebuild is necessary. Continue outstanding runtime/device/source tasks; REL-01/09 prepare final versions, REL-02 generates real candidates, REL-04 executes rollback and CI-03/04 plus the reviews supply candidate-bound evidence. Do not fill pass envelopes from plans or rename existing historical report fields to manufacture a ready state.