Connector live certification¶
Connector capability bundles are release inputs, not proof that a connector and engine work together. The live-certification harness closes that gap without persisting source records or deployment details.
Each provider's ontology/certification.json is an exact schema-v2
ConnectorSourceAttestation. It is signed, marked mode=offline-source,
status=source-validated, and live_certified=false. Its checks cover declared
tool fingerprints, generated synthetic-fixture contracts, SHACL parsing, privacy,
and manifest integrity only. It contains no live_tool_schema pass state. The
capability-bundle gate rejects the former shape that inferred live or executed
fixture success from a nonempty manifest.
Source-bundle generation derives its exact provider set from the explicit repository-manager workspace, resolves one signer for the whole run, and stages and validates every selected provider before publication. An ordinary staging or write failure leaves provider-owned and bundled artifacts unchanged; successful publication uses the same validated bytes for both copies.
python scripts/generate_connector_capability_bundles.py \
--agents-root "$AGENTS_ROOT" \
--bundled-output "$BUNDLED_MANIFEST_ROOT" \
--workspace "${XDG_CONFIG_HOME:-$HOME/.config}/agent-utilities/workspace.yml" \
--now "$RELEASE_TIMESTAMP" \
--apply
The source signature and external production certification are different evidence
classes. ConnectorSourceAttestation proves only offline repository structure.
Production acceptance requires a separate ConnectorLiveCertification record with
mode=external-live, status=certified, live_certified=true, all required checks
passed, and a current bundle binding. An ephemeral source key is suitable only for a
disposable local source cycle: the live-certification gate trusts the public key in the
signed manifest, so a releasable bundle and its later live evidence must use the
operator-managed release key rather than a discarded ephemeral key.
For each signed source preset, the harness checks the real connector's MCP tool
name and structural schema, then sends the connector-owned synthetic fixture through
the real ChangeEnvelope ingestion driver in an isolated scope. It proves:
- bounded initial ingest and exact live-count reconciliation;
- identical-envelope replay is an idempotent no-op;
- a new source version updates without changing the live count;
- delete and delete replay preserve the expected live count;
- tenant, ACL, classification, retention, and legal-hold state survive updates and remain attached to the tombstone;
- the materialized synthetic objects satisfy the connector's SHACL shapes; and
- cleanup returns the isolated live count to zero.
The signed record contains only aggregate counts, pass/fail states, bundle hashes, evidence hashes, controlled labels, and release signature material. Endpoint, credential, runtime-reference, host, user, local-path, source-record, and object-id values are never written. Failures are signed with an exception class only.
Offline fixture validation¶
Offline mode uses the same lifecycle sequence against a bounded in-memory reference
driver. It is useful while authoring a bundle, but the record is deliberately marked
offline-validated and live_certified=false; the release gate rejects it.
graph-os-certify-connector \
--mode offline-fixture \
--connector-root "$CONNECTOR_ROOT" \
--output "$CERT_RECORDS/connector.json"
Signing still requires the normal external release-key contract:
ONTOLOGY_RELEASE_SIGNING_PRIVATE_KEY_REF is preferred. A source checkout can invoke
the equivalent scripts/certify_connectors_live.py wrapper.
External live validation¶
Live mode accepts one argument containing a secret reference. Literal URLs, credentials, engine addresses, TLS-disable flags, and command lines are not accepted. The referenced JSON object has this exact deployment-neutral shape:
{
"driver_command_ref": "secret://connector-certification/driver",
"connector_runtime_ref": "secret://connector-certification/source",
"engine_runtime_ref": "secret://connector-certification/engine",
"tenant": "connector-certification",
"retention": "certification-ephemeral",
"tls_profile_ref": "secret://connector-certification/tls"
}
The command reference resolves to a JSON argv array. The driver starts or connects to
the real MCP connector, lists tools, and applies/inspects/counts synthetic envelopes on
the configured engine. It resolves the source, engine, and TLS references at runtime;
the harness never resolves or records their contents. The child receives a minimal
environment plus only variables explicitly named by env:// references. TLS
verification remains enabled and is controlled by the referenced TLS profile.
graph-os-certify-connector \
--mode external-live \
--profile-ref secret://connector-certification/profile \
--connector-root "$CONNECTOR_ROOT" \
--output "$CERT_RECORDS/connector.json"
The driver is a bounded JSON-stdin/JSON-stdout protocol with four actions:
list_tools, apply, inspect, and count are called by the harness (cleanup uses
apply with delete envelopes). A non-zero exit, timeout, oversized response, malformed
JSON, schema drift, governance mismatch, replay mismatch, SHACL failure, count mismatch,
or incomplete cleanup produces a signed failed record and a non-zero CLI exit.
Release gate¶
Promotion must validate the complete fleet with live evidence:
python scripts/check_connector_live_certification.py \
--agents-root "$AGENTS_ROOT" \
--records-root "$CERT_RECORDS" \
--require-live
The gate derives the certifiable provider set from signed manifests. It rejects a missing record, offline record, failed/not-run check, invalid signature, altered record, or evidence bound to older manifest/fixture/shape bytes. Providers without a source-sync preset are not falsely reported as live-certified.
For the current exact release train, the aggregate signed ledger contains exactly 65 ordered, unique connector entries. The schema enforces the closed-world count and the release verifier also rejects duplicate identities, ordering drift, sentinel digests, and count mismatches.