AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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/
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
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.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 |