Compatibility
apiVersion: halos.dev/v1 is the stable policy API. This page covers what it promises, how anything in it can be deprecated, and how halo, halod, halo-server and halo-proxy (and halo-kong) can run at different versions. The decision record is ADR-0012.
v1 guarantees
Section titled “v1 guarantees”For every release in the halos.dev/v1 line:
- Kinds and fields are frozen.
Halos(halos.yaml),Gateway,Profile,Ring,Experiment,Toggle,RolloutandUnit(an additive kind, ADR-0018) keep every field name, type and meaning listed in the policy schema. No field is renamed, removed, retyped or given a new meaning within v1. - Same policy, same output. A policy that validates without errors keeps validating, and it renders to the same harness configs and gateway behaviour. Exceptions: a guardrail fix for a security issue, or a harness vendor changing its own config format. Both are listed in the changelog.
- Additions are optional. New fields and kinds can arrive in a minor release. They are optional and default to the old behaviour. Decoding is strict, so a policy that uses a new field needs a
haloandhalo-serverat least as new as that field (see version skew). - Invariants hold. Rendered configs never contain
bypassPermissionsordanger-full-access, unsupported settings warn rather than drop, and releases are immutable and content-addressed. - Schemas are published.
schemas/*.schema.jsondescribe v1. The frozen v1alpha1 schemas stay inschemas/v1alpha1/.
New warnings can appear in a minor release. They never turn into errors within v1, except for the security exception above.
halos.dev/v1alpha1
Section titled “halos.dev/v1alpha1”halos.dev/v1alpha1 is deprecated. It still loads, with exactly the semantics of v1: the two versions decode into the same types, and a v1alpha1 document is treated as v1 in memory. halo validate reports one warning per file that still uses it:
warning profiles/base.yaml apiVersion halos.dev/v1alpha1 is deprecated; it reads as halos.dev/v1 with identical semantics until halos.dev/v2. Run `halo migrate --policy-dir .`To migrate:
halo migrate --policy-dir . --dry-run # review the diffhalo migrate --policy-dir . # rewrite in placehalo validate --policy-dir .halo migrate changes only the top-level apiVersion value of each document. Comments, quoting, key order and the other documents in a multi-document file stay byte for byte the same. Running it again is a no-op. It runs on overlay directories too (directories without a halos.yaml).
The compiled snapshot records each document’s apiVersion. The first release you build after migrating gets a new content digest even though nothing else changed. That is a new release, not a change to an old one.
Deprecation policy
Section titled “Deprecation policy”- A deprecated version, kind or field warns (in
halo validate, CI and the MCPvalidatetool) for at least one minor release before anything else changes. - It is removed only in the next major API version (
halos.dev/v2). Within v1 a deprecated form keeps loading with its documented meaning. - Every deprecation has a mechanical migration (
halo migrateor a documented edit) and an entry in the changelog. halos.dev/v2, if it ever ships, comes with ahalo migratepath from v1 and its own entry on this page.
Version skew
Section titled “Version skew”Each binary reads a different artifact, and each artifact has its own version:
| Binary | Reads | Version it checks |
|---|---|---|
halo (CLI, CI, MCP server) |
policy YAML | apiVersion (halos.dev/v1, halos.dev/v1alpha1) |
halo-server |
policy YAML (--policy-dir) |
apiVersion |
halo-proxy, halo-kong |
compiled snapshot (halo gateway compile) |
halos.dev/snapshot/v1 |
halod |
signed release bundles and ring pointers | manifest schemaVersion: 1 |
Rules:
- Policy YAML.
haloandhalo-serverreleases before v1 support accept onlyhalos.dev/v1alpha1, and they reject v1 documents withapiVersion "halos.dev/v1" not supported. Upgrade everyhalothat reads the repo (laptops, CI, the MCP server) andhalo-serverbefore runninghalo migrate. Newer binaries read both versions, so upgrading first is always safe. - Snapshots.
halo-proxyandhalo-kongaccept any snapshot withversion: halos.dev/snapshot/v1, whicheverapiVersionthe source documents used. An older proxy ignores snapshot fields it doesn’t know, so a policy that relies on a new gateway feature needs the proxy upgraded first. - Releases.
halodreads manifests withschemaVersion: 1, and the policyapiVersiondoesn’t affect them. Ahalodolder than the release format it is given fails verification and keeps its last-good config. It never applies a partial release. - Recommended upgrade order:
halodand the traffic plane (halo-proxyorhalo-kong), thenhalo-server, then thehaloCLI in CI and on laptops, thenhalo migratein the policy repo.