Skip to main content

agent-capability-broker

Keep agents at parity across harnesses. A capability that exists on a machine — an AD service-account credential, a Playwright browser, a web-search backend — should be uniformly discoverable and invocable by an agent regardless of which harness it runs in (Claude Code, opencode, cron, …). Today it isn't: the same box can have working Chromium browsers that opencode can't reach (because its Playwright MCP dies on an npx fetch) while Claude Code never exposes them at all. That asymmetry — capability present, access uneven — is what this tool closes.

acb is a small deterministic CLI driven by one declarative manifest of the capabilities an estate's agents should have. From that single source it does two things:

  • Reports (acb doctor) — diff every harness against the manifest and say, per capability, whether it is present-and-working, present-but-broken, absent, or not-applicable. This is discoverability and the parity report. Read-only.
  • Reconciles & brokers (acb reconcile, acb exec) — render the correct per-harness wiring from the manifest so two configs can't drift by hand, and inject the capability (credentials, a browser endpoint) into a child process at runtime. Acting; gated, dry-run by default, provenance-emitting.

Why it exists

Two real pains, one shape:

  1. Credentials. Agents increasingly need real creds (AD binds, service accounts, a remote VM). The fix so far has been per-secret Vault AppRoles delivered as .env files — better than plaintext, but still hand-placed per harness, and a secret in a transcript is a leaked secret.
  2. E2E tooling. opencode agents complain "no Playwright" while Claude Code never does — not because the browsers are missing (they're installed) but because opencode reaches them through a fragile per-session MCP and Claude doesn't reach for them at all.

Both are the same problem: a capability the host can provide, that agents can't find or use the same way across harnesses. acb makes the desired set explicit and reconciles reality to it.

Scope

In:

  • A declarative capability manifest (capabilities.toml): the desired set, per estate/host, with which harnesses should expose each. It is resolved independently of the working directory — $ACB_MANIFEST, then the suite config dir ($AGENT_SUITE_CONFIG~/.config/agent-suite/), then ~/.config/acb/capabilities.toml, then ./capabilities.toml for in-repo dev — so acb works the same from any harness's shell, not only from its own checkout. In a suite deployment the manifest is the estate's capability contract: one file, provisioned into every harness by acb install-harness.
  • A provider interface; cred (Vault-brokered AD/service-account creds) and e2e (Playwright/browser provisioning, local or remote backend) are the first two. Adding a provider is the extension point.
  • Harness adapters that read and render each harness's wiring (Claude Code settings.json + skills; opencode opencode.json MCP/commands). codex is recognized by the closed suite contract but currently returns explicit, non-zero unsupported from install-harness until Plan 007 lands. Hermes remains an explicit component-private target. Direct install-harness all expands only the currently supported public set (Claude + OpenCode); Codex is promoted atomically after its adapter and conformance proof land.
  • doctor (read-only parity report), reconcile (generate wiring, dry-run by default), exec (inject-and-run, never surfacing the secret), install-harness (bootstrap: provision one harness from the manifest + verify), shims (read-only shim parity report).
  • Provenance emission of every acting verb to regista / agent-provenance.

Out / non-goals:

  • Not a secret store. Vault, Azure Key Vault, or Windows-native custody remains the credential backend; acb's cred provider is a client, never a vault. No secrets are stored at rest in acb's own state.
  • Not the browser runtime. A remote Playwright/browser endpoint (k8s or otherwise) is a backend the e2e provider targets; acb does not host it.
  • Not an MCP-first design. A per-harness MCP is exactly the fragility that caused the parity gap. acb is a CLI substrate; an MCP front is a possible future option, not the mechanism (see Design principles).
  • Not pipeline state. Coordination/durable state is regista's job; acb emits to it and depends on it for nothing in its truth path.

Design principles

  • One manifest, generated wiring. Parity is maintained by reconciling each harness's config from the manifest, not by hand-syncing two files.
  • CLI substrate, thin per-harness shims. Callable from any harness's shell with zero server wiring. (agent-notes already went MCP→CLI+skills and that won for cross-harness reuse; the opencode Playwright failure is the same MCP fragility, observed again.) An MCP front over the same core stays possible for harnesses that can't shell out — but it is not the default.
  • Two faces, one boundary. The read path (doctor/inspect) is deterministic and read-only — no mutation, no secret ever surfaced. The act path (reconcile/exec) mutates configs and injects secrets: it is dry-run by default, backs up before writing, never clobbers an existing secret, and emits provenance on every action.
  • Inject, don't surface. acb exec cred:svc-bot -- ./script injects the secret into the child process. ACB never emits the value itself, but the child inherits stdout/stderr and can emit or transform it. Suite manifests therefore require an exact absolute trusted_argv, minimal environment, and bounded process-tree timeout; the purpose-built child remains part of the qualified trust boundary. Timeout/interruption terminates the owned POSIX session or Windows process tree; Windows fails closed if its containment tools are absent.
  • Provider-neutral suite refs. source = "suite" maps explicit vault:, azure:, or windows: refs to named child environment variables through the optional regista.secrets facade. ACB refuses inherited-variable collisions and validates provider availability during doctor without reading a value. Azure and Windows support here reflects adapter wiring only; live backend/OS conformance remains separately gated validation.
  • Value-free checkout binding. Suite children receive an ACB_CHECKOUT_RECEIPT JSON envelope with invocation/timing metadata and a one-entry extensible checkouts list. It contains capability/field names but no refs or values. It is correlation metadata, not a cryptographic token; nested inheritance and multi-capability composition remain unsupported. The receipt maps each semantic field to its injected environment name.
  • Deterministic core, no AI in the truth path. doctor's verdicts are computed, not narrated. Any narration layer imports the core, never the reverse (enforced by an architecture test).

Boundary with sibling tools

  • Secret backends retain custody. The legacy Vault path authenticates through k8s auth → AppRole .envVAULT_TOKEN; source = "suite" delegates explicit provider refs to Regista's public resolver. ACB brokers credential use without storing any value itself.
  • regista / agent-provenance receive acb's provenance events; a brokered capability check-out becomes an attestable agent action. acb does not store state there in its truth path.
  • agent-notes / agent-wake are siblings in the same agent-infra family (CLI + skills, provenance, stdlib core); acb follows the same conventions and composes with them, but owns a distinct concern — capability parity.

Status

Charter stage (2026-06-15). Landed through Plan 005: the manifest schema, provider interface (cred, e2e), harness adapters (Claude Code, opencode), and five verbs — doctor (read-only parity report), shims (read-only shim parity), reconcile (gated wiring generation), exec (inject-and-run), and install-harness (suite bootstrap). See docs/capability-model.md (design spine) and plans/001plans/005 for the build sequence.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

agent_capability_broker_hraedon-0.1.0.tar.gz (153.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agent_capability_broker_hraedon-0.1.0-py3-none-any.whl (47.7 kB view details)

Uploaded Python 3

File details

Details for the file agent_capability_broker_hraedon-0.1.0.tar.gz.

File metadata

  • Download URL: agent_capability_broker_hraedon-0.1.0.tar.gz
  • Upload date:
  • Size: 153.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for agent_capability_broker_hraedon-0.1.0.tar.gz
Algorithm Hash digest
SHA256 967dae74feab0f2d2d23a3e2e3c80eaf8f8133eff4964612ae35bcfbed798193
MD5 de1d7a2cba46237d12a38d4664d6027c
BLAKE2b-256 57402c460898ba34f665b2125c0bce2e6fbe929d4b4669384430a601828cf6d9

See more details on using hashes here.

File details

Details for the file agent_capability_broker_hraedon-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: agent_capability_broker_hraedon-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 47.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for agent_capability_broker_hraedon-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f450c91f9c48454aeacdf90adf798f8b9c4efb24c3841759131ef7a1033577c9
MD5 24045773c36926a5589d21f6545eaba9
BLAKE2b-256 1bef39576f3b7752f97f4545ceb9ce93bf8e58d3d9e8941402d2c0249db746f0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page