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.
| Target | Shipped | Wired | Open | Not planned |
|---|
| SCIM (RFC 7643/7644) | adapters/directory/scim.py · tests/unit/adapters/test_directory_scim.py — turns standard provisioning resources into PrincipalLedger calls | no — adapters/directory/__init__.py imports it, and nothing imports that package | — | — |
| Generic OIDC | core/security/sso_oidc.py · tests/unit/test_sso_oidc.py — Authorization Code flow, .well-known discovery, PKCE, refresh, group→role mapping | no — named in rbac.py prose only, imported nowhere | — | — |
| Any directory, as a protocol | core/security/directory_bridge.py · tests/unit/test_directory_bridge.py — resolve a principal, list group memberships, report a revocation | no — one TYPE_CHECKING import from core/security/directory_registry.py, which is itself unreachable | — | — |
| Okta | via the OIDC and directory-bridge surfaces above | — | #5018 — bridge agent principals to Okta | — |
| Microsoft Entra ID | via the OIDC and directory-bridge surfaces above | — | #5018 | — |
| LDAP | — | — | — | No issue and no module. The directory bridge is the extension point; an LDAP adapter would implement it. |
| Target | Shipped | Wired | Open | Not planned |
|---|
| HashiCorp Vault | core/security/vault_injector.py (_VaultInjector) · tests/unit/test_vault_injector.py — per-agent credentials injected at spawn, revoked at exit | no — see the note below | #5021 — reference backend for the broker | — |
| AWS Secrets Manager | core/security/vault_injector.py (_AwsInjector) · same suite | no | — | — |
| 1Password | core/security/vault_injector.py (_OnePasswordInjector) · same suite | no | — | — |
| Broker in front of a store | core/security/secrets_broker.py · tests/unit/security/test_secrets_broker.py | yes — imported by core/security/secrets.py | #5021 | — |
| Azure Key Vault | — | — | — | No 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.
| Target | Shipped | Wired | Open | Not 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 default | no — named in authzen.py prose only, imported nowhere | #4912 — engines are bridged but the decision path is incomplete | — |
| Cedar | core/security/external_policy_hook.py · same suite | no — same module | #4912 | — |
| AuthZEN 1.0 | request shape in external_policy_hook.py (AuthZenResource) | partial | #5032 — speak AuthZEN 1.0 at the decision boundary | — |
| Target | Shipped | Wired | Open | Not planned |
|---|
| SPIFFE | core/identity/spiffe/ — spiffe_id.py, svid.py, workload_api.py, grant_identity.py, binding.py | yes — spiffe_id imported by core/identity/agent_registry.py, svid by core/security/token_binding.py | — | — |
| SPIRE | reached through the SPIFFE Workload API above (workload_api.py) | yes | — | — |
| mTLS | core/identity/spiffe/mtls.py | yes | — | — |
| Target | Shipped | Wired | Open | Not planned |
|---|
| OpenTelemetry (ingest) | core/observability/otlp_ingest.py · tests/unit/test_otlp_ingest.py | yes — cli/commands/governance_cmd.py | — | — |
| OpenTelemetry (export) | core/observability/telemetry.py | yes | — | — |
| OpenLineage | core/persistence/openlineage_export.py · tests/unit/test_openlineage_export.py | yes — cli/commands/lineage_export_cmd.py | — | — |
| Target | Shipped | Wired | Open | Not planned |
|---|
| MCP | src/bernstein/mcp/, core/protocols/mcp_catalog/, core/routes/mcp_bot_tools.py, core/protocols/mcp_bot_allowlist.py | yes — mcp_bot_tools router registered in core/server/server_app.py | — | — |
| A2A | core/protocols/a2a/, core/routes/a2a_jsonrpc.py, core/routes/task_a2a.py · tests/unit/test_a2a_receipt_caller.py | yes — a2a_jsonrpc router registered in core/server/server_app.py | — | — |
| Target | Shipped | Wired | Open | Not planned |
|---|
| Hosted and self-hosted endpoints | the adapter layer under src/bernstein/adapters/ | yes | — | — |
| AWS Bedrock | named only in adapters/garak.py, as a scanner target | — | — | No first-class adapter and no issue. Bedrock endpoints are reachable through the generic endpoint configuration; a dedicated adapter is not scheduled. |
- 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.