Integrations

September 14, 2026 · View on GitHub

The systems Bernstein bridges to, named the way you name them. Use this page to answer "does it talk to the thing I already run" without reading the tracker.

Every row cites its evidence. Shipped names a module and a test you can open. Open names an issue number. Not planned gives the reason in one line. A row that can cite none of the three is deleted, not softened — the same rule the compliance packs run under, where a claim with no evidence behind it is not a weaker claim, it is not a claim.

One column here does not appear on pages like this, and it is the one worth reading: Wired says whether anything in a running system actually reaches the module — an import chain from a CLI command, a route registered on the server app, or a package entry point. A mention in a docstring is not a caller, and neither is an entry in core/__init__.py's redirect map. A module with a green test suite and no caller is a working feature to every reader of the source and to nobody else (see #5093). Where the two differ, this page says so.

Directories and identity providers

TargetShippedWiredOpenNot planned
SCIM (RFC 7643/7644)adapters/directory/scim.py · tests/unit/adapters/test_directory_scim.py — turns standard provisioning resources into PrincipalLedger callsnoadapters/directory/__init__.py imports it, and nothing imports that package
Generic OIDCcore/security/sso_oidc.py · tests/unit/test_sso_oidc.py — Authorization Code flow, .well-known discovery, PKCE, refresh, group→role mappingno — named in rbac.py prose only, imported nowhere
Any directory, as a protocolcore/security/directory_bridge.py · tests/unit/test_directory_bridge.py — resolve a principal, list group memberships, report a revocationno — one TYPE_CHECKING import from core/security/directory_registry.py, which is itself unreachable
Oktavia the OIDC and directory-bridge surfaces above#5018 — bridge agent principals to Okta
Microsoft Entra IDvia the OIDC and directory-bridge surfaces above#5018
LDAPNo issue and no module. The directory bridge is the extension point; an LDAP adapter would implement it.

Secret stores

TargetShippedWiredOpenNot planned
HashiCorp Vaultcore/security/vault_injector.py (_VaultInjector) · tests/unit/test_vault_injector.py — per-agent credentials injected at spawn, revoked at exitno — see the note below#5021 — reference backend for the broker
AWS Secrets Managercore/security/vault_injector.py (_AwsInjector) · same suiteno
1Passwordcore/security/vault_injector.py (_OnePasswordInjector) · same suiteno
Broker in front of a storecore/security/secrets_broker.py · tests/unit/security/test_secrets_broker.pyyes — imported by core/security/secrets.py#5021
Azure Key VaultNo module and no issue. vault_injector.py's three injectors are the shape a fourth would take.

The directory, SSO, policy-engine and secret-injection modules are not wired. vault_injector, sso_oidc, external_policy_hook, directory_bridge and the SCIM adapter all ship with tests and none of them is reached from a running system. The only reference to vault_injector anywhere in src/ is an alias entry in core/__init__.py's redirect map; sso_oidc and external_policy_hook are named in neighbouring docstrings (rbac.py, authzen.py) and imported nowhere; directory_bridge has one TYPE_CHECKING import from directory_registry.py, which is itself unreachable; and adapters/directory/__init__.py imports the SCIM adapter while nothing imports that package.

This is the exact shape #5100 describes — the redirect map and a prose mention both make a module read as reachable to any tool that asks "does this name appear anywhere" — and most of these are in the caller-less set on #5505.

Policy engines

TargetShippedWiredOpenNot planned
Open Policy Agent (Rego)core/security/external_policy_hook.py (OPAHook) · tests/unit/test_external_policy_hook.py — fires before the permission check; the response overrides the defaultno — named in authzen.py prose only, imported nowhere#4912 — engines are bridged but the decision path is incomplete
Cedarcore/security/external_policy_hook.py · same suiteno — same module#4912
AuthZEN 1.0request shape in external_policy_hook.py (AuthZenResource)partial#5032 — speak AuthZEN 1.0 at the decision boundary

Workload identity

TargetShippedWiredOpenNot planned
SPIFFEcore/identity/spiffe/spiffe_id.py, svid.py, workload_api.py, grant_identity.py, binding.pyyes — spiffe_id imported by core/identity/agent_registry.py, svid by core/security/token_binding.py
SPIREreached through the SPIFFE Workload API above (workload_api.py)yes
mTLScore/identity/spiffe/mtls.pyyes

Telemetry and lineage

TargetShippedWiredOpenNot planned
OpenTelemetry (ingest)core/observability/otlp_ingest.py · tests/unit/test_otlp_ingest.pyyes — cli/commands/governance_cmd.py
OpenTelemetry (export)core/observability/telemetry.pyyes
OpenLineagecore/persistence/openlineage_export.py · tests/unit/test_openlineage_export.pyyes — cli/commands/lineage_export_cmd.py

Agent protocols

TargetShippedWiredOpenNot planned
MCPsrc/bernstein/mcp/, core/protocols/mcp_catalog/, core/routes/mcp_bot_tools.py, core/protocols/mcp_bot_allowlist.pyyes — mcp_bot_tools router registered in core/server/server_app.py
A2Acore/protocols/a2a/, core/routes/a2a_jsonrpc.py, core/routes/task_a2a.py · tests/unit/test_a2a_receipt_caller.pyyes — a2a_jsonrpc router registered in core/server/server_app.py

Inference endpoints

TargetShippedWiredOpenNot planned
Hosted and self-hosted endpointsthe adapter layer under src/bernstein/adapters/yes
AWS Bedrocknamed only in adapters/garak.py, as a scanner targetNo first-class adapter and no issue. Bedrock endpoints are reachable through the generic endpoint configuration; a dedicated adapter is not scheduled.

Keeping this page honest

  • A row moves to Shipped when a module and a test exist, and names both.
  • Wired is a separate question from shipped. It is answered by an import edge from something reachable — a CLI command, a registered route, a package entry — not by the name appearing somewhere. A docstring that names a module is prose; core/__init__.py's redirect map is an alias table. Neither is a caller, and both will fool a grep.
  • A capability that is neither shipped nor tracked by an issue does not get a row. Aspirational entries are the failure mode this page invites.
  • Comparisons with other projects belong nowhere on this page.