Release channels and automation¶
Main is the installation channel¶
All default installation paths follow main. Release-ready source, runtime descriptors and immutable image promotions belong there. develop is the explicit opt-in development channel. There is no automatic develop-to-main merge. An authorized main push may start CI and is already eligible for reconciliation by branch-following appliances; publishing a GitHub Release is not a deployment gate.
The Linux installer now retains the requested branch in its bootstrap metadata, as the USB and Kubernetes entrypoints do. Explicit tags and commit pins remain supported. Existing pinned installations do not silently change channels; see updates and rollback.
Create develop once from the agreed release baseline before enabling development
updates. This repository change alone does not create a remote branch, enable
Actions permissions, merge a release or switch an existing appliance.
Development dashboard builds publish commit-addressed images and separate
web-develop, api-develop and console-develop aliases. They cannot overwrite
the main aliases. Other container builders also accept develop and publish
commit-addressed candidates; AMD DRA, Mesh and FreeToken keep development aliases
separate. Companion develop builds provide CI artifacts, not published main
downloads. Promote tested digests into the descriptor on the intended
branch; do not insert mutable aliases into runtime manifests. Other image-specific
promotion workflows retain their explicit approval/provenance requirements.
Feature-branch appliance testing¶
Administrators can explicitly follow an existing feature branch in System → Settings → Updates, or pin a compatible tag/commit. A branch is executable host automation, not just a different dashboard build; only select trusted branches in the configured public repository.
For dashboard changes, dispatch Build MagicStick dashboard clients on the feature branch. It publishes commit-addressed web/API/console images without moving either main or develop aliases. Promote all three matching digests into that branch's descriptors using the existing image promotion workflow. Unchanged components may retain existing reviewed image pins. Do not substitute branch-name image aliases for immutable runtime references.
The host preflight checks magic-host/software-channel.json and the four critical
image references before allowing a switch. Keep its management contract compatible
or introduce a deliberate migration; do not add the marker to historical code just
to bypass the check. Registry availability does not prove runtime compatibility.
An actual change still requires host/Flux convergence and ready, matching images.
See channel operation and recovery.
Reusable reduced installer images¶
The reduced installer pipeline builds only when installer
inputs change. It reuses an existing checksum-verified download for identical
inputs, independently of product version numbers. main and develop have
separate, immutable test/prerelease downloads; their first boot follows the
selected branch. The pipeline does not make a product release or verify a live
installation. Product release notes can link an existing installer candidate.
Weekly runtime image proposals¶
Review runtime image updates
runs every Monday at 05:23 UTC, or manually. It resolves the public supplier
tags for Odysseus, Chroma and ntfy, verifies the manifest digest and Linux/amd64
availability, and opens or updates one PR targeting develop. The runtime
chart consumes the immutable digests in its
image lock.
The supplier's latest tag is only a discovery input, never a runtime reference.
The job tests the resolver, renders the chart and refreshes dependency-reference evidence. It does not merge, restart services, change application data or automatically upgrade main. Review supplier release notes and backup/migration requirements, exercise an existing instance on develop, then promote the tested change in a release. Digest identity is reproducibility, not compatibility proof.
One-time setup after publishing these workflow files:
- Ensure the remote
developbranch exists and uses this workflow/tooling. - Allow GitHub Actions to create pull requests in repository settings.
- Run the update workflow manually once and inspect its proposal.
- Approve the pending PR workflows, or run Public release checks manually
on the proposal branch before merging. According to
GitHub's workflow-trigger rules,
PRs created/updated through
GITHUB_TOKENrequire workflow approval; their pushes do not recursively start push workflows. An approved GitHub App/token can be adopted later for unattended PR checks; no secret is bundled.
Local preview: python tools/update_runtime_images.py. Add --write to update
the lock, then run python tools/license_audit.py --refresh-references and the
focused tests. Network/registry errors fail the job without a partial lock update.
This initial automation covers the three previously floating application images,
not arbitrary GPU drivers, operators, model files or every third-party dependency.
Native Ubuntu security maintenance remains the separate
host update policy.
Prepare a version¶
Use $magicstick-release, or follow these steps without an agent. Confirm the
version, actual first-public-distribution date, source revision and release scope.
Keep unreleased work on develop; prepare the reviewed release for main.
Write curated notes to a local Markdown file. Preview the metadata changes:
python tools/release.py prepare --version v1.2.3 --date 2026-09-24 --notes /tmp/release-notes.md
The values above are examples, not this project's next version or publication
date. Use the actual first-public-distribution date. Public source/image
distribution may precede a GitHub Release. A future or invented date is rejected
or invalid for this purpose. Add --write only after reviewing the preview.
The helper updates LICENSE-RELEASE.json, retains per-version records under
licenses/releases/, and inserts a curated changelog section. It calculates the
three-year Change Date using the existing license-date validator and refuses to
overwrite an existing version's dates or notes. It does not erase Unreleased notes,
approve licenses/release-review.json, commit, tag, push or deploy.
Run the release helper tests and applicable sections of the release checklist. Review remaining Unreleased notes so they do not imply the version contains unfinished work. Existing legal/artifact review findings remain advisory in normal CI; select the explicit strict mode only for a full-distribution review. A technical check is not legal clearance.
python -m unittest tests.test_release tests.test_license_release
python tools/release.py check --version v1.2.3
python tools/license_audit.py --review
Draft and publish deliberately¶
After the requested source publication and successful checks, create an immutable version tag on the reviewed main commit. Never move an existing tag. The manual Prepare versioned release draft workflow runs from main and takes that existing tag. It verifies main ancestry, matching metadata/archive/changelog and successful Public release checks for the exact commit, then creates a draft GitHub Release. Existing releases are not overwritten. It does not publish the draft or attach unverified build assets.
Use image promotion and the affected artifact workflow for the exact images/platforms being distributed. Review checksums, provenance, notices and acceptance evidence before publishing any draft/assets. For a dashboard release, run the real-browser smoke and relevant live acceptance separately. An offline test appliance leaves live acceptance pending; a green fixture test does not replace it.
Report source commit, CI, artifact publication, promoted digests and live rollout as separate outcomes. Preparation or a source-only push must not be described as a completed release/rollout.