Commissioning Handoff Runbook
Status: Active. Audience: Machine integrators commissioning in Workbench and handing a machine off for deployment with the runtime's install.sh.
1) Preconditions
- Project validates and launches cleanly in Commission workspace.
- Operate checks are complete for target behavior.
- Runtime contracts and Workbench tests are green locally.
2) Three Artifacts, Three Roles
A commissioned machine is carried by three artifacts. They compose; none replaces another.
- Machine-profile project (
machine-profile.yamland the configs it references): the source of truth. It is what you author and commission in the workbench. - Handoff package (
.anpkg, optional): a provenance record of what was commissioned and validated. It is never a step on the install path. - Staged bundle (an
anolis-*.tar.gzfrominstall.sh --stage): the deployable. It carries the runtime, the providers, the project's configs and every runtime variant, andinstall.sh --localinstalls it on the target as a systemd service.
3) Deploy
The runtime's install.sh performs every deploy. Each path below installs binaries, providers, configs and the systemd service.
Facility path (air-gapped baseline): stage a bundle, carry it to the target (USB or any offline transfer), and install it there.
anolis-provision bundle --project <project-name> --arch arm64 --out <dir>Commission's bundle export builds the same bundle. On the target, as anolis-provision bundle prints:
sudo ./install.sh --local <bundle>.tar.gzOnline convenience path: when the target can reach the GitHub release downloads, deploy straight from the workbench, with Commission's Deploy to device or:
anolis-provision install --project <project-name>
anolis-provision remote --target user@host --project <project-name>These run install.sh --project on the target, which downloads the runtime and provider releases from GitHub there. For remote, the machine running the workbench must reach GitHub as well (it fetches install.sh and copies it over SSH). They are a convenience over the facility path, not a replacement for it.
On a target that already has a runtime or provider config, install.sh keeps it in place and the deploy result says so.
Before it fetches install.sh, the deploy runs the target's <prefix>/bin/anolis-runtime --version. When the project pins an older runtime, the deploy:
- refuses, with nothing fetched or pushed, if the pin is older than 0.1.45, because that
install.shwould downgrade without asking; - warns otherwise, and
install.shrefuses the downgrade itself.
A runtime that is installed but reports no version is refused as well. A target with no runtime installed is a fresh install.
To see this before deploying, use Commission's Check target. It installs nothing and needs no sudo. It lists each of the project's pins beside the version installed on the target, and gives the runtime verdict the deploy would act on. The runtime's installed version is measured from its binary. The providers' versions come from the target's <prefix>/manifest.json, which records the last install, and the card says when that file is missing, unreadable or was written for another runtime version.
4) Export Package (Provenance Record)
Workbench path:
- Open project in
Commission. - Click
Export Package…. - Save generated
.anpkgartifact.
CLI path:
anolis-package <project-name> [output.anpkg]5) Validate Package
Static package validation:
python3 contracts/validate-handoff-packages.py <path-to-package.anpkg>Replay hardening with runtime binary:
python3 contracts/validate-handoff-packages.py \
<path-to-package.anpkg> \
--runtime-bin <path-to-anolis-runtime>Manual replay, as a validation step only: extract the package into a scratch directory and start a runtime against it. This checks that the package is self-contained. It does not deploy: nothing is installed, no service is created, and the target's /opt/anolis is not touched.
unzip <machine>.anpkg -d <scratch-dir>
cd <scratch-dir>
export INFLUXDB_TOKEN='<token-value>' # only if telemetry is enabled
<path-to-anolis-runtime> --config runtime/anolis-runtime.yamlExpected: runtime loads config and providers without dependency on systems/<project>/.
6) Operator Handoff Package Contents
Deliver all of:
- The staged bundle that was deployed
.anpkgartifact, as the provenance record- Runtime/provider binary provenance (build IDs/refs)
- Validation output (
validate-handoff-packages.pylogs) - Mode/operation checklist used during commissioning
- Deployment env requirements (
INFLUXDB_TOKENpolicy)
7) Rollback Guidance
Keep the prior known-good bundle and its
.anpkgin deployment storage. The.anpkgrecords the configs that rollout shipped.If a new rollout fails, restore the previous binaries on the target:
bashanolis-provision rollback --target user@hostOmit
--targeton the target itself. This runsinstall.sh --rollback, which swaps the previous binaries (and theirmanifest.json) back and restarts the service. It does not revert runtime or provider configs; they stay as they are on the target.Record failure cause and attach validation output before next rollout attempt.
8) Troubleshooting
- Checksum mismatch:
- Artifact tampered/corrupted after export.
- Re-export and re-validate package.
- Secret leakage validation failure:
- Token-like value exists in package content.
- Remove embedded token and re-export.
- Path escape/reference failure:
- Runtime/provider/behavior path is not package-relative.
- Fix project config, re-export, and validate.
- Replay
--check-configfailure:- Review runtime error output and runtime schema expectations.
- Re-run static validator first, then replay validator.
