AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
Open-source control plane for Claude Code, Codex, Gemini CLI and Copilot CLI. One policy repo becomes signed releases, rolled out ring by ring, gated by evals and live telemetry.
Developer toolsGo · TypeScriptGitHub @dshakesOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Control plane for AI coding CLIs (Claude Code, Codex, Gemini, Copilot): signed releases, rollout rings, A/B, canary, shadow, toggles, eval-gated promotion. Docs: https://dshakes.github.io/halos/
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Ship AI coding tools like software. Versioned · signed · ring-deployed · proven by evals
Halos is the open-source control plane for AI coding CLIs: Claude Code, Codex, Gemini CLI and Copilot CLI.
• One policy repo becomes a signed release.
• Releases roll out ring by ring, behind A/B tests, canaries, shadows and feature toggles.
• Each step can be gated on evals and live telemetry.
• A human-merged PR promotes. A regression measured at the gateway is killed automatically when halo-server serves a signed kill list; any other regression opens a rollback PR.Read the full README ↗Halos is the open-source control plane for AI coding CLIs: Claude Code, Codex, Gemini CLI, Copilot CLI, Cursor CLI and OpenCode.
halod and the gateway enforce on every machine.brew install dshakes/tap/halo # other installs below
halo quickstart # the whole stack in Docker, about a minute
halo doctor && halo onboard local # or pin and manage the CLIs on this machine
halo onboard company # or: policy repo, gateway, IdP, fleet, first PR
Each path can also be driven by the AI CLI you already use: Start here.
Your platform team keeps a policy repo: a Git repo that halo init creates. It starts as one file, and developers never touch it.
# halos.yaml: the whole policy, in simple mode
org: acme
tools: {claude-code: 2.1.280, codex: {version: 0.99.0, model: codex}}
provider: anthropic # bedrock | vertex | openai | gemini | multi
models: {default: claude-sonnet-5-5, strong: claude-opus-5-5, codex: openai/gpt-5-codex}
gateway: https://ai.acme.example
identity: {issuer: https://login.acme.example, audience: halos, adminGroups: [ai-platform]}
safety: standard # strict | standard | relaxed: never bypasses permissions
rollout: standard # fast | standard | careful: rings, canary steps, bake times, gates
Presets expand into profiles, rings and gateway routes. Intent commands write the rest for you. The ones that write policy (upgrade start, model switch, enable, eject) support --dry-run, validate their output and list the files they change; halo kill writes to halo-server at once (no release) and takes effect at the next poll, by default 10 s at gateways and 60 s on devices:
# A/B + gated rollout for a CLI upgrade. Builds and signs a candidate release, so it needs a registry
# and key (HALO_REGISTRY / HALO_KEY) and the GA ring's published pointer, or --baseline <digest>.
# --dry-run still reads that pointer.
halo upgrade start claude-code 2.1.300 --registry ghcr.io/acme/halos --key halo.key
halo model switch strong claude-opus-5 --canary
halo enable mcp github --url https://… --for 10%
halo kill <experiment|toggle|rollout> --reason "…"
halo status # rings, rollouts, experiments, toggles
halo explain | halo eject # see, or take over, the full policy
A change is a pull request:
halo validate, halo plan and evals.halo release publish builds and signs a release for each ring.halod on laptops and CI runners, the Dev Container Feature in workspaces, and halo-proxy or Kong for model traffic.examples/simple is the one-file version and examples/acme-corp the full one; make demo runs it locally; halo quickstart is the same stack (55 s warm, 86 s with a cold build cache, on an arm64 laptop with Docker Desktop 28). Codespaces is UNVERIFIED: CI builds the dev container, but the demo has not been run in a real Codespace. More: how Halos works.
A Rollout is an ordered list of steps. Each step sets:
apiVersion: halos.dev/v1
kind: Rollout
name: opus-5-5-upgrade
axis: traffic # client: a CLI/config release · traffic: a model route
experiment: opus-5-5-canary
change: {alias: opus}
steps:
- name: dark-launch # mirrored to the candidate, nothing served
strategy: dark-launch
percent: 10
bake: 2d
gates:
scorecard: {file: evals/opus-5-5.scorecard.json, variant: opus-5-5, minPass1: 0.75}
- name: canary-5
strategy: canary
percent: 5
bake: 12h
minSamples: 500
gates:
guardrails: [{metric: halo.api.error_rate, direction: decrease, maxRegression: 0.05}]
- name: holdout # 5% stay on the old model for 14 days
strategy: holdout
percent: 5
bake: 14d
gates: {approval: true}
The controller evaluates every active step on each tick (default every 5 minutes):
Commands: halo rollout plan | status | simulate | advance | rollback (docs).
halod picks the arm with the same hash the gateway uses.| Offline evals | Replay real tasks in containers, N trials each. Reports pass@1, pass@k and pass^k, with paired bootstrap CIs on pass rate, cost, tokens and time. Flaky tasks are detected and excluded. Verdict: ship, hold or block. |
| Matrix | Runs one suite across harness × model × provider (Claude Code vs Codex vs Gemini, Anthropic vs Bedrock) and produces a PR-ready report. |
| Online | Shadow pairs are graded against a pinned LLM-judge rubric and land in the same evidence plane as cost, latency and errors. |
| Sequential stats | mSPRT guardrails stop an experiment as soon as a regression is real, not at an arbitrary horizon. |
| Upgrade watch | halo upgrade watch spots a new CLI or model release, pins it on a branch, runs the suite and opens a PR with the scorecard. |
| Claude Code | Codex | Gemini CLI | Copilot CLI | Cursor CLI | OpenCode | |
|---|---|---|---|---|---|---|
| Version pin | CLI-enforced | halod | halod | halod | not installable by halod | halod |
| Model lock | ✓ | ✓ | ✓ | default only | - | ✓ |
| MCP allowlist | ✓ | ✓ | ✓ | ✓ | - | - |
| Permissions | ✓ | ✓ | partial | partial (UNVERIFIED) | - | ✓ |
| Gateway | ✓ | ✓ | ✓ | - | - | ✓ |
| Telemetry | ✓ | ✓ | ✓ | ✓ | - | - |
A setting a CLI can't enforce produces a warning in the release manifest; it is never silently dropped. halo harnesses prints the capability matrix; the harness reference has every cell and its source.
Traffic goes through halo-proxy to Anthropic, Bedrock (SigV4), Vertex, OpenAI, Azure OpenAI or the Gemini API:
halo-kong plugin applies the same identity, cohort and experiment decisions. It routes each alias to its first target, with no translation or failover.| Control | What it does | Docs |
|---|---|---|
| RBAC | IdP groups map to viewer, operator, approver, auditor, admin; every route is deny-by-default and denials are audited | security model |
| SCIM 2.0 | Okta and Entra provisioning; deprovisioning revokes sessions and device tokens at once | SCIM |
| Org units | Delegated owners and overlays that can tighten, never loosen, enforced fields | org hierarchy |
| Cost budgets | Per user, group, ring or org caps in USD or tokens, warn or enforce, answered as 429 at the gateway | budgets |
| Audit to SIEM | Hash-chained audit forwarded to Splunk HEC, signed webhook or syslog TLS, native or OCSF | SIEM export |
| CI and workload identity | RFC 8693 exchange of a GitHub, GitLab, Buildkite, CircleCI or cloud OIDC token for a credential of at most 1 h | CI and cloud agents |
| Agent identity | Delegated agent credentials with an act chain, down-only model scope and an A2A allowlist | agent identity |
| Extension governance | Marketplace, plugin, skill and subagent policy, rendered where the vendor documents a key and warned elsewhere | harness reference |
The current release is v0.4.0 (CHANGELOG). Or build from source: git clone https://github.com/dshakes/halos && cd halos && make build (builds halo, halod, halo-shadow, halo-server, halo-proxy and halo-kong into bin/).
brew install dshakes/tap/halo # macOS / Linux
scoop bucket add dshakes https://github.com/dshakes/scoop-bucket && scoop install halo # Windows
# The script works everywhere; halod runs as root from a root-owned prefix
curl -fsSLO https://raw.githubusercontent.com/dshakes/halos/v0.4.0/install/install.sh
sh install.sh --version v0.4.0 # halo into ~/.local/bin
sudo sh install.sh --version v0.4.0 --prefix /usr/local --with-agent # plus halod
Also available:
install.ps1 from the v0.4.0 tag; a winget manifest is built but not yet submittedghcr.io/dshakesArchives are checksummed and carry SBOMs; checksums.txt is cosign-signed and every archive has a GitHub build-provenance attestation. install.sh verifies the checksums, and the cosign signature when cosign is installed (otherwise it warns). The release workflow re-verifies all of it from the published artifacts before a release counts as done (RELEASING.md, install guide).
halo mcp serve exposes these to any MCP client: validate, plan, rollout status, experiment analysis, toggle evaluation and eval scorecards.
The write tools (propose a rollout step, a rollback or a toggle change, kill a change, run an eval) are opt-in and dry-run by default. Proposals commit to a new local branch; propose_promotion and, on request, the rollout proposals push a review branch and open a PR. None pushes to the base branch, merges or publishes a release. The Claude Code plugin, the Codex config, the Gemini CLI extension and the Copilot CLI config drive the same flows: onboarding (doctor → dry run → approve → write → verify) and rollout (edit → validate → eval → experiment → propose).
Deep dive, traced to the code: tech stack, components and low-level design.
trusted_header mode, accepts identity only from pinned proxy CIDRs), strips client x-halo-* headers and fails closed on unknown models.bypassPermissions and danger-full-access are rejected at validate time and again on the rendered output.Every component is implemented and covered by unit, race, e2e (make e2e) and evidence-plane (make obs-e2e) tests. Every pull request also runs three acceptance suites against real software:
| Suite | Runs against | Report |
|---|---|---|
make uat-clis | the real Claude Code, Codex, Gemini CLI and Copilot CLI (Cursor CLI and OpenCode are not in this run yet), including the eval runner | CLI-REPORT.md |
make uat-k8s | a kind cluster with the Helm chart installed | REPORT.md |
make uat-kong | open-source Kong 3.9.3 with the halo-kong plugin | KONG-REPORT.md |
Unit tests also run on Windows and macOS in CI. A nightly provider smoke sends real requests through halo-proxy to Anthropic and OpenAI (streaming and non-streaming) and checks the gateway metrics.
Not yet exercised against the real systems:
install.ps1, enroll.ps1 and halod as a SYSTEM scheduled task on a hosted Windows runner)gitlab-ci-local, an emulation)CONTRIBUTING.md · AGENTS.md for coding agents · ADRs · Apache-2.0
| OTel GenAI |
gen_ai.* semantic-convention metrics and opt-in content-free spans from the gateway |
| evidence plane |
| HA on Postgres | Several halo-server replicas behind one load balancer with a fenced controller lease | production deployment |
| Vendor admin sync | One policy drives the vendors' cloud admin consoles; halo admin plan fails CI on drift, apply writes what has a public API and never loosens | vendor admin sync |
| Change governance | Freeze windows and an incident freeze hold advances and promotions, never rollbacks; N-of-M approvals with separation of duties and tickets; halo plan --diff previews who a change reaches | change governance |