The package compiler moves by itself, every day. Nothing else does. The tasks in this chapter are the only way the repository’s tooling changes, and each is a pull request a maintainer opens and reviews.
No workflow performs them on a schedule. A pull request opened by a workflow
with the repository’s GITHUB_TOKEN does not start CI, so an automated update
would arrive untested and wait for a maintainer anyway. More to the point, each
of these changes decides which code runs in CI, which is a decision to review
and not a chore to automate.
| Task | Files changed | When |
|---|---|---|
| Update the lock | Blueprint.lock | To take newer tool versions, or to make a newer nightly selectable as roc-stable |
| Change the tooling compiler | Blueprint.roc, the roc field of every script, sometimes Blueprint.lock | When scripts need a newer compiler, or periodically to stay close to current |
| Upgrade Blueprint | Blueprint.roc, Blueprint.lock, and the reviewed setup-action revision | For a new roc-blueprint release |
| Update script dependencies | Script headers, RocPackages in Blueprint.roc, and Blueprint.lock when build sources change | For a new release of a platform or package the scripts use |
| Regenerate host bindings | A platform’s committed bindings | When ci.yml reports that the latest nightly generates different bindings |
Risks and controls for input upgrades§
An upgrade can change executable code through a URL, digest, transitive input or compiler selection without an obvious change to the product. Treat new identities as reviewed input changes. Update the declared recipe and lock, inspect the resolved artifacts and run the affected tasks before adopting them. Compiler and binding updates remain explicit maintainer work. The resulting checks establish the selected combinations. Matching an upstream revision or passing compatibility tests does not establish that an input is unaffected by known vulnerabilities; advisory analysis uses its own component evidence.
Update the lock§
Run
blueprint update, orblueprint update <input>to move one input and keep every other pin.Run
blueprint run check.Open a pull request whose only changed file is
Blueprint.lock.Merge after
ci.ymlpasses.
A lock update moves the overlay revision, the package source and tool versions.
It never changes which release is roc-stable, because that tag is written in
Blueprint.roc. It does not change the blueprint binary or the platform URL.
Where the repository fingerprints native build inputs, a lock change can make
those inputs stale. ci.yml reports that, and the fix is a new linker-input
release in the same pull request; see
Choose the correct maintainer path.
Change the tooling compiler§
Choose a published nightly release.
Change the tag in the
Command("roc-stable", ...)setting ofBlueprint.roc.Change the
rocfield in every script header to the same tag. The check script fails until they all match.If the locked overlay revision predates that release, run
blueprint update rocand commitBlueprint.lockin the same pull request.Fix any script the new compiler breaks in that pull request, so the tag and the scripts move together.
Merge after
ci.ymlpasses.
This is a maintainer’s decision for each repository. Repositories need not agree.
Upgrade Blueprint§
A release’s blueprint binary must be used with that release’s platform URL.
actions/setup-blueprint reads the release from that URL. Keep that selection
in one place while migrating configuration and locked inputs together:
Choose a roc-blueprint release.
Move the workflows' reference to
actions/setup-blueprintto a revision that records that release, if the current one does not. Dependabot proposes this change;actions/setup-blueprintexplains where the checksums are reviewed.Change the platform URL in the
Blueprint.rocheader.A repository that generates sidecars with
actions/sbom-sidecarsalso needs a revision that records the release’s SBOM tool inactions/setup-blueprint/sbom-tools.json: the app bundle and its compiler, the reviewed SHA-256 of eachblueprint-sbom-<system>binary the release ships, and itsfeatures(members,manifest) as its release notes state them. With binaries recorded the action needs no compiler; otherwise the tool runs on the release’sblueprint compiler-version, so update that fixed compiler recipe with it.Migrate configuration to the release’s supported Spec and run
blueprint check.Run a full
blueprint updatewhen the release changes the lock format, review changed identities against the previous lock and commit the regenerated lock.Remove generated
.blueprint/state when the release requires it.Run the affected named tasks and merge after
ci.ymlpasses.
External tools should read blueprint lock show --json, validate its public
report format and use content_identity and namespaced provider metadata.
Do not parse the internal representation of Blueprint.lock. Consumers of
build reports use build_identity; report and package versions are separate
compatibility contracts. Run cold and warm provisioning checks and exercise
corrupt-cache recovery: a successful lock conversion alone does not demonstrate
that the selected programs execute correctly.
Update script dependencies§
Change the release URL in each script header that uses the dependency.
Change the same URL under
RocPackagesinBlueprint.roc, and add any new dependencies of that dependency.roc-stable deps scripts/check_all.roclists them.For sandboxed builds using those bundles, run
blueprint update, review the changed source identities and commitBlueprint.lock. Task-only bundles are pinned by their committed URL hashes and do not change the lock.Run the affected tasks and merge after
ci.ymlpasses.
Regenerate host bindings§
See Upgrade the bindings.
Maintain released utility downloads§
For Roc packages, Programs and Fetch lock released utilities and fixed
tooling without Nix. Change the utility recipe in Blueprint.roc, run
blueprint update, review per-system URLs, hashes, lengths and download hosts,
and commit the lock. Keep the package compiler floating independently. Native
platforms can retain Nix sources and sandboxed builds for their toolchains.
The shared artifact cache key changes with the lock and installer/registry
identity. Separate logical tool subsets use separate cache-workload values,
so an immutable compiler-only cache cannot claim the docs cache key. Restored
artifacts are rehashed before use and extracted trees/task links are rebuilt;
cache hits do not authenticate executables. Routine use needs no remote
attestation service. Review provenance when adopting a release, following
released artifact verification.
See the complete adoption guide for the tested cold/warm
workflow and persistent executable handoff. The shared setup’s install-nix
option defaults to false; opt in where the selected tools/builds need Nix.