How Halos works
Halos is run by a platform team for everyone else. The platform team describes how the org’s AI coding CLIs should behave in a policy repo. Halos turns each merged change into a signed release and rolls it out ring by ring. Developers install nothing new and never touch the repo: they keep running claude, codex or gemini, and their config and model routing change underneath them.
Who does what
Section titled “Who does what”| Platform team | Developer | |
|---|---|---|
| Owns | The policy repo, the registry, the gateway, the rollout | Nothing new |
| Runs | halo in CI and on their laptop; reviews and merges PRs |
claude, codex, gemini as usual |
| Sees | Plans, eval scorecards, experiment verdicts, the console | The config and models their ring gets; the portal to enroll a machine |
What a policy repo is
Section titled “What a policy repo is”A plain git repo of Halos YAML, owned by the platform team the way a Terraform repo is. Nothing in it is specific to one CLI: Halos compiles it into each harness’s own config files. halo init starts you in simple mode, where one file is the whole policy:
$ halo initcreate halos.yamlnext: halo explain --policy-dir . (the full policy this expands to)next: halo validate --policy-dir .# halos.yaml, as scaffoldedapiVersion: halos.dev/v1kind: Halosorg: my-orgtools: claude-code: 2.1.280provider: anthropic # anthropic | bedrock | vertex | openai | gemini | multimodels: default: claude-sonnet-5-5gateway: https://ai.my-org.examplesafety: standard # strict | standard | relaxedrollout: standard # fast | standard | carefulhalo explain prints the low-level policy those few lines expand to. When you need full control, halo eject writes it out as files; the policy loads to exactly the same thing afterwards:
$ halo ejectcreate gateway.yamlcreate profiles/default.yamlcreate rings/ring0-team.yamlcreate rings/ring1-canary.yamlcreate rings/ring2-early.yamlcreate rings/ring3-ga.yamlupdate halos.yaml$ halo validateOK: policy valid (0 warnings)my-policy/├── halos.yaml # org, identity provider, self-service portal├── gateway.yaml # model aliases, upstreams, routes├── profiles/ # desired behaviour: CLI versions, models, permissions, MCP, hooks, egress├── rings/ # who gets which profile: team → canary → early → GA├── experiments/ # optional: A/B, canary, shadow├── rollouts/ # optional: phased steps with gates└── toggles/ # optional: targeted switches with a kill pathhalo whoami and halo render show what a developer gets, without publishing anything:
$ halo whoami --user you@example.comuser you@example.comring ring3-gaprofile defaultvariants (none: no running experiment enrolls this user)$ halo render --ring ring3-ga --out renderedwrite rendered/Library/Application Support/ClaudeCode/managed-settings.jsonThe paths mirror the target machine (macOS here; Linux and Windows get their own). The policy repo itself has a complete model and a field reference.
How a change travels
Section titled “How a change travels”- Pull request. Someone edits YAML: bump a CLI version, add an MCP server, route
opusto a new model. - CI checks.
halo validate(schema and guardrails:bypassPermissionscan never ship),halo plan(the diff each ring would get), and optionally an eval gate. - A human merges. Halos never merges or promotes on its own; only rollback is automatic.
- Publish.
halo release publishbuilds the release for a ring, signs it and pushes it to your OCI registry. Releases are immutable and content-addressed. - Rings. A ring is a signed pointer to a release. Promotion moves the pointer to the next ring; rollback moves it back. See rings and releases and rollouts.
- Devices and gateway.
halod, the agent on each laptop, dev container or CI runner, verifies the signature and writes the managed config for its ring. The gateway (halo-proxyor Kong withhalo-kong) loads the compiled policy and routes each model alias by the caller’s verified identity, so experiments and canaries apply without touching the client.
Telemetry from the gateway and the CLIs feeds back into experiment verdicts. A breach measured at the gateway trips the kill switch on its own; any other breach, and everything else, waits for a PR.
What runs where
Section titled “What runs where”| Component | Where | Does |
|---|---|---|
halo |
CI, platform laptops | Validate, plan, render, publish, eval, rollouts |
halod |
Every developer machine | Pull, verify, apply the ring’s release; honour the kill switch |
halo-proxy / halo-kong |
Your network | Model routing, experiments, header stripping; failover and wire translation in halo-proxy only |
halo-server |
Your network | Console, self-service enrollment portal, signed kill switch |
halo-shadow |
Your network | Mirror sampled requests to a candidate for shadow evals |
You can adopt in pieces: config only (halo + halod), or traffic only (the gateway), or both. Next: try it all in the playground, or follow your first 10 minutes.