{
  "version": 1,
  "repository": "Knuckles-Team/scion-sdk",
  "revision": "6437ebf4a3e4979f51429a4f79d054f6e270a35d",
  "captured_at": "2026-10-25T22:18:08.686481+00:00",
  "records": [
    {
      "id": "SDK-CONNECTOR-CONTROL",
      "kind": "spec",
      "parent": null,
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/SDK-CONNECTOR-CONTROL/spec.md",
      "component": "Connector registration",
      "code_refs": [
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/config.py:35",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/config.py#L35"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/config.py:75",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/config.py#L75"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/config_git.py:8",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/config_git.py#L8"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/credentials/resolver.py:36",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/credentials/resolver.py#L36"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/mcp/action_dispatch.py:196",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/action_dispatch.py#L196"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/mcp/method_tools.py:157",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/method_tools.py#L157"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/mcp/server.py:88",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/server.py#L88"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/mcp/tool_surface.py:102",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/tool_surface.py#L102"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/mcp/tool_surface.py:121",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/tool_surface.py#L121"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/testing/fleet_migration.py:90",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/testing/fleet_migration.py#L90"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/adapters/event_feed.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/adapters/event_feed.py"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/adapters/mcp_tool.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/adapters/mcp_tool.py"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/artifacts/annotations.py:94",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/artifacts/annotations.py#L94"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/artifacts/pack.py:127",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/artifacts/pack.py#L127"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/artifacts/pack.py:159",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/artifacts/pack.py#L159"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/artifacts/tools.py:25",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/artifacts/tools.py#L25"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/artifacts/tools.py:34",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/artifacts/tools.py#L34"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/artifacts/tools.py:64",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/artifacts/tools.py#L64"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/certify/certification.py:75",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/certify/certification.py#L75"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/certify/cli.py:124",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/certify/cli.py#L124"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/certify/options.py:26",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/certify/options.py#L26"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/credentials/provider.py:33",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/credentials/provider.py#L33"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/credentials/resolution.py:43",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/credentials/resolution.py#L43"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/http/client.py:84",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/http/client.py#L84"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/manifest/tool_schema.py:31",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/manifest/tool_schema.py#L31"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/mcp/action_dispatch.py:194",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/action_dispatch.py#L194"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/mcp/action_dispatch.py:88",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/action_dispatch.py#L88"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/mcp/context.py:49",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/context.py#L49"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/mcp/graphql.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/graphql.py"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/mcp/method_tools.py:133",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/method_tools.py#L133"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/mcp/tool_surface.py:97",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/tool_surface.py#L97"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/ports/transport.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/ports/transport.py"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/transports/mcp.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/transports/mcp.py"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/vendor_extractors/a2a.py:34",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/vendor_extractors/a2a.py#L34"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/vendor_extractors/a2a.py:98",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/vendor_extractors/a2a.py#L98"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/vendor_extractors/a2a_helpers.py:79",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/vendor_extractors/a2a_helpers.py#L79"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/writeback/connector.py:75",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/writeback/connector.py#L75"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/writeback/epistemic_graph.py:43",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/writeback/epistemic_graph.py#L43"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/test_mcp_native_primitives.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/tests/test_mcp_native_primitives.py"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/config.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/config.py"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/ontology/access_contract.ttl",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/ontology/access_contract.ttl"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/requirements.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/test_mcp_confirmation_roundtrip.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/tests/test_mcp_confirmation_roundtrip.py"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "external declaration; not verified",
          "kind": "depends on",
          "label": "Arbora host contract",
          "repository": "Knuckles-Team/arbora",
          "url": "https://github.com/Knuckles-Team/arbora/blob/7af96428d92ffbdd963515f7b129d1ad4132e462/specs/host-composition-boundary/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "external declaration; not verified",
          "kind": "references",
          "label": "ARBORA-FLEET-R036",
          "repository": "Knuckles-Team/arbora",
          "url": "https://github.com/Knuckles-Team/arbora/blob/main/specs/fleet-catalog-and-tools/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "external declaration; not verified",
          "kind": "references",
          "label": "ARBORA-FLEET-R038",
          "repository": "Knuckles-Team/arbora",
          "url": "https://github.com/Knuckles-Team/arbora/blob/main/specs/fleet-catalog-and-tools/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "external declaration; not verified",
          "kind": "references",
          "label": "EG-FEDERATED-QUERY-R073.2",
          "repository": "Knuckles-Team/epistemic-graph",
          "url": "https://github.com/Knuckles-Team/epistemic-graph/blob/main/specs/federated-query-and-reasoning/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "external declaration; not verified",
          "kind": "references",
          "label": "EG-TYPED-PACKS-R104",
          "repository": "Knuckles-Team/epistemic-graph",
          "url": "https://github.com/Knuckles-Team/epistemic-graph/blob/main/specs/typed-packs-and-catalog/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "depends on",
          "label": "SDK-CONNECTOR-CONTROL-R016",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "depends on",
          "label": "SDK-CONNECTOR-CONTROL-R020",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "depends on",
          "label": "SDK-CONNECTOR-CONTROL-R026",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "depends on",
          "label": "SDK-CONNECTOR-CONTROL-R026.1",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "depends on",
          "label": "SDK-CONNECTOR-CONTROL-R029",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "depends on",
          "label": "SDK-CONNECTOR-CONTROL-R032",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "references",
          "label": "SDK-CONNECTOR-CONTROL-R014.17",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "references",
          "label": "SDK-CONNECTOR-CONTROL-R019",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "references",
          "label": "SDK-CONNECTOR-CONTROL-R040",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "references",
          "label": "SDK-CONNECTOR-CONTROL-R041",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "references",
          "label": "SDK-CONNECTOR-CONTROL-R042",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "references",
          "label": "SDK-CONNECTOR-CONTROL-R043",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "references",
          "label": "SDK-CONNECTOR-CONTROL-R044",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "evidence": "local spec declaration",
          "kind": "references",
          "label": "SDK-CONNECTOR-CONTROL-R067",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        }
      ],
      "plan_diagrams": [
        "flowchart LR\n  S[SDK source census and owner bindings] --> E[Public environment_declarations]\n  E --> D[SDK declaration rows and receipt]\n  D --> H[Planned Arbora manifest composer]\n  A[Separate AU declaration producer] --> H\n  H --> V[Host condition resolution and validation]\n  V --> L[Launcher before listeners or children]\n",
        "flowchart LR\n  S[\"Pinned connector sources\"] --> I[\"SDK loader census\"]\n  I --> G[\"SDK served parity gate\"]\n  G --> O[\"Source server fixture\"]\n  G --> P[\"Declared Python registration\"]\n  P --> D[\"Existing authorization and dispatch\"]\n  D --> B[\"Controlled connector backend\"]\n  O --> E[\"Independent parity receipt\"]\n  B --> E\n"
      ],
      "unparsed_references": [
        {
          "declared_in": "specs/SDK-CONNECTOR-CONTROL/plan.md",
          "text": "this contract derives from connector context and MCP progress needs."
        }
      ]
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R001",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Pack retries reuse one key",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "dcc7d285ccc9"
      ],
      "verified_by": [
        "tests/test_contracts_and_sink.py:511"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Pack retries reuse one key.** The SDK's ConnectorPackClient submits requests through generated ConnectorPack types. It derives the idempotency key from tenant, connector identity, canonical pack digest, and operation. Repeating an identical request returns the same durable result. | Unit tests retry an identical publish request after simulated transport loss and assert reuse of the same import operation key. They use generated wire types for status and import.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 5
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R002",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Contract pin travels as a claim attribute, not recomputed downstream",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "dcc7d285ccc9"
      ],
      "verified_by": [
        "tests/test_artifacts_discovery.py:102"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Contract pin travels as a claim attribute, not recomputed downstream.** The SDK computes the contract pin. It normalizes tool input and output schemas through manifest/tool_schema.py. It passes the pin to the graph service as a claim attribute. The graph service stores that value. It does not recompute the SDK's schema normalization. | Conformance tests asserting the pin calculation lives in the SDK and that a stored claim attribute matches the SDK-computed value unchanged.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 6
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R003",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Canonical output-schema digest on every certified tool pin",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "0f826d4ca6db",
        "93afc6b075df"
      ],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Canonical output-schema digest on every certified tool pin.** Certification computes a normalized output-schema digest for every tool pin alongside the input-schema digest. It fingerprints a missing output schema canonically, never as an empty wildcard. | A conformance test certifies a tool without a declared output schema and asserts that it produces a canonical, nonempty digest.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 7
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R004",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Contract-pin verification owned by the SDK's own test kit",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "dcc7d285ccc9"
      ],
      "verified_by": [
        "tests/test_artifacts_discovery.py:111"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Contract-pin verification owned by the SDK's own test kit.** The SDK's own conformance test kit computes and checks the contract pin from its tool schema normalization. That normalization is SDK-specific logic, and the graph service cannot reproduce it independently. | A conformance suite that recomputes the contract pin from a sample manifest and asserts it matches the certified value.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 8
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R005",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Pack publisher and source submission use generated graph-client types",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "584fb45cdf24",
        "602215e2ddd8"
      ],
      "verified_by": [
        "tests/test_contracts_and_sink.py:54",
        "tests/test_mcp_native_primitives.py:47",
        "tests/test_mcp_native_primitives.py:78"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Pack publisher and source submission use generated graph-client types.** The pack publisher uses the graph service's generated ConnectorPack and AgentComponent.Content types. It no longer uses a hand-written placeholder content pack. SQL-backed source record submission also uses the generated SourceIngest request and receipt types through the existing sink. | Integration tests publish a pack and submit a source record through the generated types. They assert that no placeholder or hand-written duplicate type is used.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 9
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R006",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Decision-service proposals for tool choice and triage stay observational",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "077a14c9f3d3",
        "0f826d4ca6db",
        "91801315ccaf",
        "daeb199f91c0",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_decide_consumers.py:158"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Decision-service proposals for tool choice and triage stay observational.** Connector-internal tool choice and inbound event triage may request a proposal from a decision service, but that proposal is observational only: it never directly authorizes a side effect or bypasses the deterministic write-back rules. | A contract test issues a decision-service proposal. It asserts no side effect is authorized without the deterministic write-back path.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 10
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R007",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Fleet-wide re-certification yields nonempty schema fingerprints",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "0f826d4ca6db",
        "93afc6b075df"
      ],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Fleet-wide re-certification yields nonempty schema fingerprints.** Re-certifying the connector fleet means every package produces current, nonempty fingerprints for each declared tool pin. Each package also passes a current live-contract comparison. A package count alone is not sufficient evidence. | A certification run across the full connector set asserts every pin's fingerprints are nonempty. It also asserts they match a live contract comparison.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 11
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R008",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Closed, canonical pack annotation map across the connector fleet",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "077a14c9f3d3",
        "e444b35a4c21",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_artifacts_discovery.py:350",
        "tests/test_artifacts_discovery.py:367",
        "tests/test_artifacts_discovery.py:383"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Closed, canonical pack annotation map across the connector fleet.** Every connector pack entry carries a closed, canonical annotation map. The map holds capability names, input and output schema digests, modality, and bounded cost and latency estimates with units. A missing estimate is recorded as unknown, never zero. | Conformance tests that validate the annotation map's types and units and assert a semantic annotation change shifts the pack digest.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 12
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R009",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Connector batch A-E migrates fully onto the SDK client",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5e1bd9257555",
        "7a38ee433346",
        "d3617301012c"
      ],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Connector batch A-E migrates fully onto the SDK client.** Connector packages in the A-E range import agent_connector_sdk modules for server construction, configuration, exceptions, and transport security. These imports replace the prior agent_utilities imports. The packages call the generated EG client instead of a local ingestion helper. | A per-package import scan and test run across the A-E batch confirms no agent_utilities import remains. It also confirms ingestion runs through the EG client.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 13
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R010",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Connector batch F-J migrates fully onto the SDK client",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5e1bd9257555",
        "7a38ee433346"
      ],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Connector batch F-J migrates fully onto the SDK client.** Packages in batch F-J use agent_connector_sdk for server construction, configuration, exceptions, and transport security. They replace prior agent_utilities imports and call the generated EG client for ingestion. | A per-package scan and test run cover batch F-J. They confirm no agent_utilities imports remain and ingestion uses the EG client.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 14
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R011",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Connector batch K-O migrates fully onto the SDK client",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5e1bd9257555",
        "7a38ee433346"
      ],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Connector batch K-O migrates fully onto the SDK client.** Packages in batch K-O use agent_connector_sdk for server construction, configuration, exceptions, and transport security. They replace prior agent_utilities imports and call the generated EG client for ingestion. | An import scan and test run cover each package in the K-O batch. They confirm that no agent_utilities import remains. Ingestion runs through the EG client.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 15
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R012",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Connector batch P-S migrates fully onto the SDK client",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5e1bd9257555",
        "7a38ee433346"
      ],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Connector batch P-S migrates fully onto the SDK client.** Connector packages in the P-S range import agent_connector_sdk modules for server construction, configuration, exceptions, and transport security. This includes the repository-manager package's own agent_utilities imports. These packages call the generated EG client instead of a local ingestion helper. | An import scan and test run cover each package in the P-S batch. They confirm that no agent_utilities import remains. Ingestion runs through the EG client.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 16
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R013",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Connector batch T-Z migrates fully onto the SDK client",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5e1bd9257555",
        "7a38ee433346"
      ],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Connector batch T-Z migrates fully onto the SDK client.** Connector packages in the T-Z range import agent_connector_sdk modules in place of their prior agent_utilities imports. They call the generated EG client, not a local ingestion helper. The shared package-builder templates that scaffold every batch also move onto the SDK. | A per-package import scan covers the T-Z batch and the scaffolding templates. It confirms no agent_utilities import remains.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 17
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK fully supersedes the duplicated connector toolkit",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "5e1bd9257555"
      ],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK fully supersedes the duplicated connector toolkit.** The duplicated connector toolkit kept elsewhere covers the server factory, action dispatch, concurrency, transport security, credentials and related helpers. Once every connector package imports the SDK's equivalents, that toolkit becomes safe to delete. No compatibility alias is retained. Rollup: delivered once the fleet-wide census (R014.1) reports every connector migrated. | Tests confirm that the SDK modules fully replace each listed toolkit area. A cross-repository import scan shows that no connector still depends on the superseded implementation.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 18
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "One reusable cross-repository import-scan call site",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "077a14c9f3d3",
        "ab73ea5005a0",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_fleet_migration_scan.py:90"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**One reusable cross-repository import-scan call site.** `scan_many_packages` accepts several connector roots in one call. It keys results by package name. R014's fleet census and R009-R013 batches reuse this scanner. They do not re-derive loops over `scan_for_agent_utilities_imports`. | Test migrated and unmigrated synthetic roots. Confirm the scan retains each caller package name.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 19
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R015",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK is sole owner of connector source lifecycle and certification",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "061f9b58abb2",
        "077a14c9f3d3",
        "5e1bd9257555",
        "9cec9cea7d37",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_duplicate_symbol_scan.py:21",
        "tests/test_duplicate_symbol_scan.py:29",
        "tests/test_duplicate_symbol_scan.py:43",
        "tests/test_duplicate_symbol_scan.py:56",
        "tests/test_duplicate_symbol_scan.py:69"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK is sole owner of connector source lifecycle and certification.** Connector manifest parsing, live-contract validation, tool-schema normalization, artifact and pack construction, and certification live only in the SDK's manifest and certify packages; equivalent logic kept in a duplicate location is retired, and other consumers import the SDK packages directly instead of maintaining a parallel schema or publisher. Rollup: delivered once the real fleet-wide scan (R015.1) reports no dependent repository defines its own copy. | An import scan across dependent repositories confirming manifest and certification logic is sourced only from the SDK packages, plus certification conformance tests passing unchanged after the cutover.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 20
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R015.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "A duplicate-definition scan for the manifest/certify surface",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "061f9b58abb2",
        "077a14c9f3d3",
        "9cec9cea7d37",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_duplicate_symbol_scan.py:21",
        "tests/test_duplicate_symbol_scan.py:29",
        "tests/test_duplicate_symbol_scan.py:43",
        "tests/test_duplicate_symbol_scan.py:56",
        "tests/test_duplicate_symbol_scan.py:69"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**A duplicate-definition scan for the manifest/certify surface.** `scan_for_duplicate_manifest_or_certify_definitions` flags a connector package that defines `ConnectorManifest`, `CertificationReport` or `certify_connector` locally. It does not flag a plain mention in a string, comment or import. | A test proves an importing package is clean and a locally defined class or function is caught. It proves a string or comment mention is not a false positive. It proves an unparsable file is skipped rather than reported clean.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 21
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R016",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Connector base settings live in the SDK's own config module",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "584fb45cdf24",
        "602215e2ddd8"
      ],
      "verified_by": [
        "tests/test_foundation.py:139"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Connector base settings live in the SDK's own config module.** Connector base settings move from a shared configuration module into the SDK's own config module. Hosting and deployment settings remain with their owning repositories. Agent and model settings also remain with their owners. | Configuration-loading tests confirm connector packages read base settings from the SDK's config module. They confirm no connector depends on the removed shared module.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 22
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R017",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Every connector uses the shared TLS profile, no bare verify bypass",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_tls_profiles.py:200"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Every connector uses the shared TLS profile, no bare verify bypass.** Every connector package performs HTTPS calls through the SDK's shared TLS profile. No connector disables certificate verification with a bare boolean flag. No connector silences the underlying TLS warning library. | A static scan across connector packages looks for bare verify-disabling flags and suppressed TLS warnings. A negative test asserts such a bypass is rejected.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 23
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R018",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK source and test suite build cleanly from a fresh checkout",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "b0c376748245"
      ],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK source and test suite build cleanly from a fresh checkout.** The SDK's full test suite, strict type checking, and documentation build pass cleanly against the connector control implementation from a fresh checkout, with no partial or broken module left in the merged source tree. | A full test run, strict type check, and documentation build executed in continuous integration against the merged source.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 24
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R019",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Host servers register ontology resources without duplicate skills or prompts",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "045ba48df230",
        "077a14c9f3d3",
        "3ddd773fb6dc",
        "434185d3a820",
        "8f36880f39a7"
      ],
      "verified_by": [
        "tests/test_connector_hooks.py:108",
        "tests/test_connector_hooks.py:121",
        "tests/test_connector_hooks.py:133",
        "tests/test_connector_hooks.py:139",
        "tests/test_connector_hooks.py:160"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Host servers register ontology resources without duplicate skills or prompts.** `ontology_resources` and `register_ontology_resources` build resources from one ontology directory. These are `ontology://<connector>/<file>.ttl` and `shapes://<connector>/<file>.ttl`. `register_connector_content` reuses the same builder. A missing directory yields no resources. | MCP client tests list and read the resources. They prove that no prompt registers and that a missing directory yields an empty result.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 25
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R019.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "The SDK runs the connector server from its declared identity",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8f36880f39a7",
        "aa58c5dd6858"
      ],
      "verified_by": [
        "tests/test_connector_run.py:104",
        "tests/test_connector_run.py:113",
        "tests/test_connector_run.py:126",
        "tests/test_connector_run.py:132",
        "tests/test_connector_run.py:189"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**The SDK runs the connector server from its declared identity.** `agent_connector_sdk.run()` and the `agent_connector_sdk.cli:serve` console target resolve the `agent_connector_sdk.connector` entry point to a `Connector` value. The value holds the client class, the client factory, the tool module, the instructions, extra registrations and the offered transports. It also holds `tool_prefix`, `verbose_targets`, `verbose_register`, `result_coercer` and `action_dispatch`, which `run()` forwards to the tool surface. `run()` and `build_server()` name the server by the fleet name. They set its version from package metadata. They serve skills, prompts, ontology, shapes and `connector://resources` through `register_connector_content`. They register the tool surface, add the middleware and parse the transport and authentication flags. They print the standard banner, serve the chosen transport and refuse an unknown one. A connector package holds no bootstrap function, no health route, no transport dispatch and no banner. Its `__main__` module calls `run()` and nothing else. | `tests/test_connector_run.py` builds a fixture connector from its declaration. It lists the tools, skills, prompts, ontology and `connector://resources`. It reads the metadata version from the server. It serves stdio, streamable-http and sse, and refuses an unknown transport. `run()` with no argument serves the calling package.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 26
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R019.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "A connector declares its bootstrap extras as typed hooks",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "434185d3a820",
        "f5707824fa51"
      ],
      "verified_by": [
        "tests/test_connector_hooks.py:108",
        "tests/test_connector_hooks.py:121",
        "tests/test_connector_hooks.py:133",
        "tests/test_connector_hooks.py:139",
        "tests/test_connector_hooks.py:160"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**A connector declares its bootstrap extras as typed hooks.** `Connector` carries every registration a connector server makes beyond the plain bootstrap, and `build_server` applies each one through fastmcp's own API. `tool_registry` holds explicit `(tag, toggle_setting, registrar)` entries and replaces the `tools` module. Declaring both raises `ValueError`. `action_tools` holds entries in the same form. The SDK splits their action-routed tools into one typed tool per action, with or without a client. `action_prefixes` maps a routed tool name to the prefix of its per-action tools, which defaults to the routed name. `inline_tools` holds tool functions or fastmcp `Tool` values, added with `FastMCP.add_tool` before the tool surface. `routes` holds `Route(path, handler, methods, name)` values, added with `FastMCP.custom_route`. `Route` raises `ValueError` for `/health`, `/ready` or a relative path. `build_server` raises it for a repeated path and method. `readiness` is an async probe that returns `Readiness(ready, detail)`. The SDK serves it at `/ready` with 200 when ready and 503 otherwise. For a probe exception the SDK answers 503 with only the exception class name. `/health` stays liveness-only. Each `extra_registrations` callable receives a `RegistrationContext`. It holds the server, the fleet name, the metadata version and the parsed settings. It also holds the declared client factory and the authentication provider. `content_root` names a package-relative directory that holds the content kinds. An absolute or escaping path raises `ValueError`. The connector name in content URIs stays the declared fleet name (`SDK-CONNECTOR-CONTROL-R071`). | `tests/test_connector_hooks.py` builds the fixture connector with each hook and lists the served tools. It checks the explicit tags and toggles, the per-action tools and the inline tools. It requests the declared route and `/ready` for a ready, a down and a failing probe. No probe message leaks. It reads the registration context fields and the content from `content_root`. The SDK refuses each malformed declaration. `tests/test_ingest_strategies.py` runs `ingest_registration` with a context.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 27
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R019.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Container config mounts are declared once with an SDK schema",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "434185d3a820",
        "f5707824fa51"
      ],
      "verified_by": [
        "tests/test_connector_hooks.py:310",
        "tests/test_connector_hooks.py:327",
        "tests/test_connector_hooks.py:348",
        "tests/test_connector_hooks.py:357"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Container config mounts are declared once with an SDK schema.** A connector that reads a reference-only configuration directory declares the mount in `pyproject.toml`. The table is `[[tool.pipelines.container.config_mounts]]` with `source` and `target`. The shared container renderer reads that declaration. `agent_connector_sdk.config_mounts.CONFIG_MOUNTS_SCHEMA` is the field's JSON Schema. `config_mounts(pyproject)` returns `ConfigMount(source, target)` values. Every config mount is a read-only bind mount. `source` is an absolute host path or one `${VAR}` compose interpolation. `target` is a normalized container directory under `/etc`. An unknown key, an escaping path or a repeated target raises `ConfigMountError`. The conformance plugin runs the `config_mounts` check for every connector repository. | `tests/test_connector_hooks.py` parses interpolated and absolute sources and refuses each malformed or unsafe entry. It reads the schema's required keys. It fails the conformance check for a mount on `/`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 28
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R020",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "One tool per API operation is the default",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "0bc459ee7335",
        "38b66f26f32a",
        "6ccbf6e01d12",
        "c9a2cf7b23cc",
        "d3617301012c"
      ],
      "verified_by": [
        "tests/test_action_split.py:39",
        "tests/test_action_split.py:44",
        "tests/test_operation_tools.py:100",
        "tests/test_operation_tools.py:130",
        "tests/test_operation_tools.py:141"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**One tool per API operation is the default.** `register_tool_surface` registers one MCP tool for each public operation of the client class. The client class is client_cls with get_client, plus each verbose_targets entry. register_method_tools builds each tool. The tool name is `<prefix>_<operation>` in stable snake_case. The prefix is tool_prefix, else the service name without its `-mcp`, `-agent`, `-api` or `-server` suffix. The input schema keeps required and optional fields apart. It comes from the OpenAPI operation manifest when the connector ships one. Otherwise it comes from the client method signature and type hints. The description comes from the manifest summary or the docstring. The HTTP verb sets the annotations. GET sets readOnlyHint=true. DELETE sets destructiveHint=true. PUT and DELETE set idempotentHint=true. Every non-GET verb sets readOnlyHint=false. The SDK splits each registrar tool that routes an `action` string into one typed `<tool>_<action>` tool. It skips an action that a per-operation tool already serves (SDK-CONNECTOR-CONTROL-R020.2). action_dispatch=True keeps those tools whole as an opt-in compatibility mode, off by default. Registrar tools that do not wrap client methods keep registering, such as ingest and GraphQL tools. No MCP_TOOL_MODE or other environment mode selects the surface. | A test serves a sample client with GET, POST, PUT and DELETE operations through tools/list. It checks the tool count, names, typed required fields, descriptions and annotations. Tests prove the default splits action-dispatch tools and the opt-in keeps them. Tests prove manifest entries give the schema, name, description and verb. A source scan rejects MCP_TOOL_MODE reads.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 29
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R021",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Connector ontologies declare access contracts for virtual reads",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0a10559775ea",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_access_contract.py:55"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Connector ontologies declare access contracts for virtual reads.** A connector ontology declares one `ac:AccessContract` per class it answers live. The contract names the access kind, the operation, its parameters, pagination and pushdown operations. It also names an auth reference, a rate limit, and freshness and cost hints. `parse_access_contracts` returns typed contracts whose fields match the agent-utilities `VirtualMapping` fields. The parser refuses a literal secret, an unknown pushdown operation and a missing operation. The vocabulary ships as `agent_connector_sdk/ontology/access_contract.ttl`. | CC-11 parses a fake connector ontology into a typed contract. It proves each refusal and proves that no secret text reaches an error.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 30
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R022",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "The pack builder scopes `owl:imports` to the pack",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "077a14c9f3d3",
        "e6b835dcad49",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_pack_ontology_imports.py:109",
        "tests/test_pack_ontology_imports.py:34",
        "tests/test_pack_ontology_imports.py:49",
        "tests/test_pack_ontology_imports.py:68",
        "tests/test_pack_ontology_imports.py:82"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**The pack builder scopes `owl:imports` to the pack.** `build_content_pack` removes each ontology `owl:imports` that names no ontology entry of the same pack. It records each removed IRI as `ontology-import:<iri>` in that entry's `requires_capabilities` annotation. It handles Turtle and RDF/XML. A body without external imports stays byte-identical. | CC-12 tests removal, recording, mixed lists, lone statements, RDF/XML, self imports and determinism.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 31
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R023",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "A prompt with a required argument becomes a template",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "1cbd6f28d13d",
        "713782e7901c",
        "b9a9652c0135"
      ],
      "verified_by": [
        "tests/test_prompt_content.py:130",
        "tests/test_prompt_content.py:28"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**A prompt with a required argument becomes a template.** `PromptArtifactKind` binds every required argument to deterministic `{{name}}` placeholders. It calls `prompts/get` with those bindings. It records `capture.kind` as `template` and `capture.bound_arguments` as the placeholder map. Prompts without required arguments retain `rendered` capture and an empty map. | CC-13 captures one required and one optional argument. It asserts the placeholder reaches `prompts/get`. It asserts the stored capture metadata and successful `validate`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 32
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R024",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "A prompt the server rejects for its bound placeholder still captures as a template",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "713782e7901c",
        "830a844c6c51"
      ],
      "verified_by": [
        "tests/test_prompt_content.py:166",
        "tests/test_prompt_content.py:209",
        "tests/test_prompt_content.py:225"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**A prompt the server rejects for its bound placeholder still captures as a template.** A typed required argument (`int`, `float`, `bool`, `list`, or an enum) can refuse the string `{{name}}` placeholder `prompts/get` sends for it. `McpClientSession.get_prompt` raises `McpPromptRejectedError` only for a well-formed MCP protocol error, never for a transport failure. `PromptArtifactKind.list_entries` catches `McpPromptRejectedError` for a prompt with at least one required argument and captures a deterministic template from the listed definition alone, with no rendered server content. A prompt with no required argument, or any failure that is not a protocol-level rejection, still raises. | CC-14 simulates a required typed argument raising `McpPromptRejectedError` from `prompts/get` and asserts the capture still succeeds as a `template` with no server-rendered text; a second case with no required argument asserts the same error still raises; a third case asserts a plain `McpTransportError` (a transport failure) always raises.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 33
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R025",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK provides identity-scoped resource entitlement resolution",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "5a476653a386",
        "e266bf988bb9"
      ],
      "verified_by": [
        "tests/test_entitlements.py:34",
        "tests/test_entitlements.py:39",
        "tests/test_entitlements.py:44",
        "tests/test_entitlements.py:52",
        "tests/test_entitlements.py:61"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK provides identity-scoped resource entitlement resolution.** `agent_connector_sdk.entitlements` resolves which backend resources (kube contexts, SSH hosts, database connections, mounts) a caller's roles and groups entitle. This generalizes \"what may I do\" to \"what may I reach\" over `agent_connector_sdk.identity.ActorContext`. A connector then auto-loads only the resources its caller's identity grants without importing `agent_utilities.security.entitlements`. A caller with no matching capability resolves an empty set. An unauthenticated or tenant-less actor is rejected before any resource catalog is exposed. | Tests use a fake available-resource catalog. A namespaced capability, a namespace wildcard, a bare zero-config capability, and a super-capability (`admin`/`system`) each resolve the documented entitled subset. No matching capability resolves empty. An unauthenticated or tenant-less actor raises before a catalog is read.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 34
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R020.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "JSON tag-loader migration inventory and parity gate",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**JSON tag-loader migration inventory and parity gate.** Define `JsonTagLoaderEntry` in `agent_connector_sdk/testing/fleet_migration.py` with package, source revision, loader path, JSON path, JSON digest and target operation mapping. Each mapping binds source and target operation IDs with identical input/output schemas, tags and authorization. Classify registration as operation, explicit callback or action dispatch. Extend `scan_many_packages` to cover existing loader paths and compare parity before replacement. Preserve R026 and R032 opt-ins. | Tests prove loader inventory completeness, parity comparison rejects schema/tag differences, and explicit opt-ins survive migration. Served acceptance exercises the scanner and migration gate.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 35
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R020.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "A split action never duplicates or collides with an operation tool",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3fd28fa8b883",
        "ae05eddb4588"
      ],
      "verified_by": [
        "tests/test_action_split_dedupe.py:128",
        "tests/test_action_split_dedupe.py:191",
        "tests/test_action_split_dedupe.py:263",
        "tests/test_action_split_dedupe.py:290",
        "tests/test_action_split_dedupe.py:342"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**A split action never duplicates or collides with an operation tool.** The splitter skips a split `<tool>_<action>` tool when a served tool already has its name. It also skips the split when the action resolves to a served client method. An action resolves through its own name, a branch that returns one operation's result, or an action-table entry. A table entry may be a handler lambda that calls one operation. A router that hands its `action` to one served client's method lookup is covered by that client's operation tools. The splitter reads actions from an `action` Literal, enum, branch tests, quoted names or a `One of: a, b` list in the description. The per-operation tool wins. The splitter logs each skip at debug level. The registration report `action_split_report(mcp)` names the tool that serves every action. Such a collision never raises. Only two different tools with one name raise. Every action stays served, by its split tool or by the operation tool it duplicates. | Tests reproduce a branch collision, a closure-table collision and a reused router name. In each case the operation tool serves the action and the report holds a `covered` entry. Tests cover dict-literal, selector and lambda table actions and a listed description. A generic router over one served client is covered by that client's tools. A computed branch stays split. A registrar tool that takes an operation tool's name still raises.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 36
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R020.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "A router tool is split, never dropped",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**A router tool is split, never dropped.** `register_tool_surface` must split each action-routed tool into one `<tool>_<action>` tool per listed action. `action_split_report` in `agent_connector_sdk/mcp/action_split.py:100` must list each split. A router whose actions cannot be listed keeps its router tool and records the reason. No served tool disappears. | `tests/test_action_split.py` registers a router with three actions and a router with unlistable actions. It asserts three split tools, one kept router and no lost tool.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 37
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R020.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "A split tool inherits its parent's risk class and never gains read-only by inheritance",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d0d04813b42e"
      ],
      "verified_by": [
        "tests/test_action_split.py:113",
        "tests/test_action_split.py:63",
        "tests/test_action_split.py:79",
        "tests/test_action_split.py:93"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**A split tool inherits its parent's risk class and never gains read-only by inheritance.** `agent_connector_sdk/mcp/action_split.py` offers `split_tool_classes`, `unclassified_tools` and `assert_tools_classified`. A connector declares risk classes by tool name, or per action. Each split `<tool>_<action>` takes its own action's declared class, else its parent's single class. A parent class the connector lists as read-only passes only to an action whose verb reads. A mutating or unrecognised action stays unclassified. A tool with no declared parent stays unclassified. `assert_tools_classified` raises `Unclassified MCP tools prevent startup` for any remaining name. | `tests/test_action_split.py` splits a router and asserts parent and per-action inheritance. A purge action never inherits a read class and still raises. A stray tool is unclassified.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 38
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R020.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "A successor release keeps every predecessor tool",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**A successor release keeps every predecessor tool.** A connector release must serve each tool of its predecessor release. Each old tool must keep its name or split into `<tool>_<action>` tools. Otherwise a per-operation tool must cover the same API call. An action-dispatch tool that remains served fails this rule. The release check must refuse a release with a lost tool. | `tests/test_successor_tool_parity.py` compares a predecessor and a successor tool list. It asserts kept, split and covered outcomes, and a refusal for one lost tool.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 39
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R026",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK derives one typed tool per client method",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "38b66f26f32a",
        "851969957034",
        "c529b133556b",
        "c65195236264",
        "d3617301012c"
      ],
      "verified_by": [
        "tests/test_mcp_confirmation_roundtrip.py:134",
        "tests/test_mcp_confirmation_roundtrip.py:178",
        "tests/test_mcp_confirmation_roundtrip.py:198",
        "tests/test_mcp_confirmation_roundtrip.py:36",
        "tests/test_method_tools.py:27"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK derives one typed tool per client method.** `agent_connector_sdk.mcp.method_tools.register_method_tools` registers one directly invocable tool per public method of a client class. Each tool name is `<prefix>_<method>`, with no doubled prefix. Its tags are `operation`, `granular`, `gated` and the domain of the method's defining class. The input schema mirrors the method's typed parameters. A bare `**kwargs` method uses the fields of the one Pydantic model it validates through. A method with no typed surface takes one `params_json` object. The server records that tool as untyped debt. The verb comes from the manifest, an `__http_method__` attribute, or a `VERB /path` docstring line. Otherwise it is the single verb the method body sends. Without a verb, name tokens classify the operation. A result coercer makes every result JSON-ready. A destructive method needs a live caller's confirmation before it dispatches. DELETE methods and destructive names are destructive. The SDK excludes a method that only a base-infrastructure class defines, such as auth, pagination or retry. A name collision fails registration. | Tests prove one tool per public method across two domain classes, with no doubled prefix. Tests prove typed arguments reach the client. Tests prove the SDK excludes base-infrastructure methods. Tests prove a destructive method asks for confirmation before it calls the client. A declined or unattended confirmation never dispatches. Tests prove the SDK awaits an asynchronous `get_client`. Tests prove a bare `**kwargs` method falls back visibly, and a collision fails.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 40
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R027",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK resolves the selected provider-runtime profile for a multi-backend connector",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "284fb12a19ed",
        "584fb45cdf24",
        "602215e2ddd8",
        "9e35fb93e960"
      ],
      "verified_by": [
        "tests/test_provider_runtime.py:27",
        "tests/test_provider_runtime.py:35",
        "tests/test_provider_runtime.py:42",
        "tests/test_provider_runtime.py:48"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK resolves the selected provider-runtime profile for a multi-backend connector.** `resolve_selected_provider_runtime_profile` reads a connector's configured provider identifier and returns the matching runtime profile (base URL, auth mode, capability flags) from its registered profile set, rejecting an unconfigured or unknown provider before any request is attempted, for connectors that support more than one backend implementation (audiobookshelf-mcp, pulselink-mcp, fan-manager, vector-mcp). | Unit tests selecting a known profile by identifier, asserting an unknown identifier raises before any network call, and asserting the returned profile's fields reach the client that constructs requests.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 41
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R028",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK's governed HTTP client controls egress with named escape hatches, not ad hoc trust",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK's governed HTTP client controls egress with named escape hatches, not ad hoc trust.** `create_http_client` builds an outbound client. It checks each destination against an SSRF policy. It takes explicit `pin_egress`, `allowed_private_hosts` and `allow_loopback` parameters. `pinned_egress_transport` returns a transport pinned to a resolved, policy-checked address. A later DNS change cannot redirect an approved request. Connectors that call self-hosted or private-network targets use it (vaultwarden-mcp, searxng-api, pulselink-mcp). Rollup: delivered once R028.1 to R028.4 are specified, wired, and verified. | Unit tests assert three cases. A disallowed private or loopback destination is rejected by default. An explicitly allowed private host or loopback passes. A pinned transport reuses the resolved address and does not resolve DNS again.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 42
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R028.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "A standalone, typed SSRF egress-destination check and pinned-address transport",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "284fb12a19ed",
        "54744d32428a"
      ],
      "verified_by": [
        "tests/test_http_egress.py:17",
        "tests/test_http_egress.py:24",
        "tests/test_http_egress.py:31",
        "tests/test_http_egress.py:36",
        "tests/test_http_egress.py:41"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**A standalone, typed SSRF egress-destination check and pinned-address transport.** `agent_connector_sdk.http.egress.check_egress_destination` takes the host and one frozen `EgressOptions` policy value (`pin_egress`, `allowed_private_hosts`, `allow_loopback`; strict by default); it rejects a loopback or private-network host unless the policy's `allowed_private_hosts` or `allow_loopback` names it, and is a no-op when the policy sets `pin_egress=False`. `pinned_egress_transport` wraps an inner transport so every request it handles dials the resolved `host`/`port` it was built with, never the request's own host, so DNS is never re-resolved after the policy check. | Unit tests asserting a disallowed private or loopback destination is rejected by default, an explicitly allowed private host or loopback passes, `pin_egress=False` disables the check, and a pinned transport dials the same resolved address across repeated requests.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 43
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R028.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "`create_http_client` wires the SSRF egress policy into construction",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**`create_http_client` wires the SSRF egress policy into construction.** `create_http_client` takes `pin_egress`, `allowed_private_hosts`, and `allow_loopback` parameters, builds one `EgressOptions` from them, calls `check_egress_destination` (R028.1) with it before opening a connection, and uses `pinned_egress_transport` to hold the resolved address, for connectors that call self-hosted or private-network targets (vaultwarden-mcp, searxng-api, pulselink-mcp). | Integration tests building a client against a disallowed private destination and asserting construction is rejected before any request, and a client against an explicitly allowed private host completing a request through the pinned transport.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 44
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R028.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "API-key identity stays header-based",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "64bcd00be5ef",
        "c991698b90bf",
        "d791b8cb5ca5",
        "e40ff88a9bbc"
      ],
      "verified_by": [
        "tests/test_http_client.py:351",
        "tests/test_http_client.py:373",
        "tests/test_http_client.py:395",
        "tests/test_http_client.py:426"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**API-key identity stays header-based.** A shared API-key client's HTTPX cookie jar is not an identity source. Do not add cookie-session auth or store a provider session. For sync and async governed clients, strip outbound Cookie after HTTPX injects jar cookies. Strip inbound Set-Cookie before HTTPX receives each response, for all statuses. Preserve configured auth, destination, TLS, redirect, retry, status, body, and Location behavior. Scope the change only to ApiKeyAuth; preserve other auth strategies. | Local MockTransport tests cover explicit and seeded cookies. They cover login, redirect, error and success responses. They cover concurrent calls through one client. A Bearer control checks other auth. Downstream served acceptance pins the immutable SDK revision and checks login/finishOAuth followed by protected calls from two MCP clients.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 45
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R028.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "A connector declares its outbound auth in one line and the SDK builds the governed client",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "19ca24046d12"
      ],
      "verified_by": [
        "tests/test_auth_declarations.py:106",
        "tests/test_auth_declarations.py:114",
        "tests/test_auth_declarations.py:145",
        "tests/test_auth_declarations.py:165",
        "tests/test_auth_declarations.py:192"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**A connector declares its outbound auth in one line and the SDK builds the governed client.** `agent_connector_sdk.auth.declare` offers `Bearer`, `ApiKey`, `Basic`, `ClientCredentials`, `RefreshToken`, `SessionLogin` and `NoAuth`. A declaration names a secret by `env=` or by an `env://` or `openbao://` `ref=`; it never holds a value. `client_factory` and `open_client` resolve the named TLS profile (CA bundle, client certificate, minimum version) and return one governed client. When delegation is on, they exchange the caller token instead. A static credential re-reads its secret after a 401 and retries once only when the value changed. An OAuth token refreshes 30 seconds before expiry and re-mints once on a 401. A rotated refresh token stays in memory. A session login logs in again once on a 401 or 403. A repr, log record or error never shows a secret. An incomplete declaration raises `AuthConfigurationError`. | Stub-server tests per scheme cover header shapes, the 401 retry after rotation, no retry when the secret is unchanged, refresh before expiry, refresh-token rotation, session re-login, and a CA bundle that works only through the declared TLS name. They also cover redaction in repr, logs and errors, and typed configuration errors.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 46
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R029",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK exposes a structured configuration singleton, not only a flat `setting()` lookup",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "284fb12a19ed",
        "7aad77a0eb66"
      ],
      "verified_by": [
        "tests/test_agent_config.py:17",
        "tests/test_agent_config.py:34",
        "tests/test_agent_config.py:50"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK exposes a structured configuration singleton, not only a flat `setting()` lookup.** An `AgentConfig` object groups related settings into named sections (auth, transport, limits) with typed fields and validation at construction, and is accessible as a process-wide singleton so a connector reads validated structured configuration instead of re-parsing individual `setting()` calls at each use site, for connectors with more than a handful of interrelated settings (vector-mcp, systems-manager, repository-manager). | Unit tests constructing `AgentConfig` from environment input, asserting invalid combinations fail at construction, and asserting the singleton accessor returns the same validated instance across call sites.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 47
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R030",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK provides GraphQL introspection context helpers for connector tools",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "284fb12a19ed",
        "e4ffa1a49677",
        "f5de79afc1e0"
      ],
      "verified_by": [
        "tests/test_graphql_client.py:20",
        "tests/test_mcp_graphql_context.py:67",
        "tests/test_mcp_graphql_context.py:74",
        "tests/test_mcp_graphql_context.py:90"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK provides GraphQL introspection context helpers for connector tools.** `ctx_graphql_list_types` and `ctx_graphql_get_type_details` resolve a schema's declared types. They also resolve a named type's fields and arguments from the connector's own session context. The tool writes no introspection query. These helpers serve connectors with a GraphQL-native backend (leanix-agent, twenty-mcp). | Unit tests against a fake GraphQL schema assert `ctx_graphql_list_types` lists the declared types. They assert `ctx_graphql_get_type_details` returns a named type's fields and argument shapes. A not-found case covers an unknown type name.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 48
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R030.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK owns the one GraphQL client for connectors",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "f5de79afc1e0"
      ],
      "verified_by": [
        "tests/test_graphql_client.py:20"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK owns the one GraphQL client for connectors.** The SDK class `GraphQLClient` lives in `agent_connector_sdk.transports.graphql`. It takes the endpoint and one auth header strategy: bearer, token or basic. It applies the TLS profile from `resolve_tls_profile` and a request timeout. It retries HTTP 429 and 5xx with exponential backoff, up to a fixed bound. It offers a sync and an async call, opt-in partial data, and bounded cursor pagination. A failure raises `GraphQLExecutionError`, which names only the exception class. Its payload matches `graphql_failure_payload` and holds no server error text, request or credential. The `graphql` extra installs the protocol client and the query-language core. A connector declares GraphQL through this extra only. The R030 introspection helpers stay. | Tests in `tests/test_graphql_client.py` cover each auth header and the retry bound. They cover retry on 429 and 503, and no retry on 400 or a query error. They cover the redacted payload, partial data, pagination over nodes and edges, and the async call. They check the TLS, timeout and schema flags on the built client.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 49
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R031",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK's client-credentials token provider accepts a literal client secret, matching the signature connectors already call",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "284fb12a19ed",
        "eed8dd9a117e"
      ],
      "verified_by": [
        "tests/test_client_credentials_literal_secret.py:29",
        "tests/test_client_credentials_literal_secret.py:49",
        "tests/test_client_credentials_literal_secret.py:68"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK's client-credentials token provider accepts a literal client secret, matching the signature connectors already call.** `ClientCredentialsTokenProvider` accepts a literal `client_secret` string argument, in addition to any credential-reference form, so a connector migrating from its prior client-credentials helper keeps the same construction call shape, for connectors using OAuth2 client-credentials against an identity provider (keycloak-agent, searxng-api). | A signature-compatibility test constructing `ClientCredentialsTokenProvider` with a literal `client_secret` string and asserting a token fetch call is made with that secret, plus a negative test asserting the secret is never logged or serialized.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 50
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R032",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Explicit additional registration",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "38b66f26f32a",
        "629ef53c29f0",
        "bac65b612ced"
      ],
      "verified_by": [
        "tests/test_tool_surface.py:124",
        "tests/test_tool_surface.py:147"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Explicit additional registration.** register_tool_surface must invoke an explicit verbose_register callback after the operation and registrar tools register. No callback means no additional surface. Additional names must not replace or duplicate registered names. | Tests must prove callback-last ordering, availability of the added tools, and collision refusal.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 51
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R033",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK's governed HTTP layer provides a `safe_post_json` helper with the same private-host allowance as its GET path",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "629ef53c29f0",
        "67802528f518",
        "bac65b612ced"
      ],
      "verified_by": [
        "tests/test_safe_post.py:19",
        "tests/test_safe_post.py:29",
        "tests/test_safe_post.py:45"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK's governed HTTP layer provides a `safe_post_json` helper with the same private-host allowance as its GET path.** `safe_post_json` performs a JSON POST through the SSRF-checked client, accepting `allowed_private_hosts` so a connector that must POST to an explicitly allowed private or self-hosted endpoint does not have to drop to an unchecked client, for connectors that submit data rather than only read it (audiobookshelf-mcp, pulselink-mcp, data-science-mcp). | Unit tests asserting a disallowed destination is rejected before the POST is sent, an allowed private host succeeds and returns parsed JSON, and a non-JSON response surfaces a typed error rather than a raw parse exception.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 52
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R034",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK provides shared library-file-path resolution and cross-process file locking utilities",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2c4e8ae0f172",
        "629ef53c29f0",
        "bac65b612ced"
      ],
      "verified_by": [
        "tests/test_library_state.py:14",
        "tests/test_library_state.py:24"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK provides shared library-file-path resolution and cross-process file locking utilities.** `get_library_file_path` resolves a connector's on-disk library or state file path from configuration in one place, and `file_lock` provides a cross-process advisory lock around a read-modify-write of that file, for connectors that persist local state or library data outside the graph (systems-manager, fan-manager, repository-manager). | Unit tests asserting `get_library_file_path` resolves a consistent path from configuration, and a concurrency test asserting `file_lock` serializes two simulated writers so neither observes a partially written file.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 53
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R035",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK provides a CredentialProvider/SecretsClient abstraction for connectors, not only a credential-reference string",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "39fdd8f06293",
        "629ef53c29f0",
        "9374f2c50a6e",
        "bac65b612ced"
      ],
      "verified_by": [
        "tests/test_credentials.py:124"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK provides a CredentialProvider/SecretsClient abstraction for connectors, not only a credential-reference string.** A `CredentialProvider` (or `SecretsClient`) resolves an `env://` or `openbao://` reference to its secret value on demand, scoped to the requesting connector's identity, and never returns or logs the resolved value in a reusable form, for connectors with multiple credential-bearing calls per request (vaultwarden-mcp, keycloak-agent, repository-manager). `default_credential_resolver()` resolves `env://` references from the process environment when the host sets no OpenBao token reference. With `OPENBAO_ADDR` set and `OPENBAO_TOKEN_REF` unset or blank, it adds no OpenBao resolver and never raises for an `env://` reference. A non-`env://` `OPENBAO_TOKEN_REF` stays a refusal. | Unit tests asserting resolution for both reference schemes, a denial for a reference outside the caller's scope, a logging-inspection test asserting no resolved secret value appears in any log record, and a test that `env://` resolves with `OPENBAO_ADDR` set and `OPENBAO_TOKEN_REF` unset or blank.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 54
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R035.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** CredentialAccessBinding carries verified tenant, owner principal, requesting principal/client, connector, provider, audience, scopes, resource and operation. It includes opaque grant and vault references, expiry and revocation revision. These are injected authority facts, never permissions asserted by request parameters. The binding also pins the declared provider token profile and revision. The existing CredentialProvider remains the resolution boundary. | CC-56 through CC-61 and served credential transport acceptance.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 55
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R035.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** Require the exact current grant before every credential resolution or transport injection. Match its connector to trusted connector admission; refuse caller-forged or mismatched connector IDs. Process-wide environment visibility never authorizes another agent. Resolve secrets only into the approved request transport and discard transient values afterward. Reuse and refresh preserve tenant, account, audience and scope ceilings; the host broker owns persistence and refresh coordination. | CC-56 through CC-61 and served credential transport acceptance.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 56
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R035.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** Extend `CredentialProvider.get_secret` at `agent_connector_sdk/credentials/provider.py:33` with a qualified injected access-authority port. Reuse `resolve_secret_reference` at `agent_connector_sdk/credentials/resolution.py:43` and existing transport composition. Connector registration through `agent_connector_sdk/mcp/tool_surface.py:121` must bind verified request context. The current provider only checks connector path scope; tenant/client grant verification and the host adapter are missing. | CC-56 through CC-61 and served credential transport acceptance.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 57
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R035.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Typed reasons are `scope_denied`, `binding_mismatch`, `grant_expired`, revoked, `authority_unavailable` and `credential_unavailable`. Refuse before calling the underlying resolver when authority is missing or mismatched. An environment reference is not a fallback around a denied vault reference. Never include secret values in errors, status or reusable outputs. | CC-56 through CC-61 and served credential transport acceptance.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 58
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R035.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Record request binding digest, tenant, requesting client, connector, resource, operation, grant revision and safe credential reference. Join host vault and authorization receipts. Cross-client use must retain the actual requesting principal. Record refusal before resolution; exclude resolved tokens, passwords, codes and credential-bearing URLs. | CC-56 through CC-61 and served credential transport acceptance.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 59
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R035.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** `tests/test_scoped_credential_transport.py::test_served_bound_credential_resolution` enters the tools/call wire method through a registered SDK connector. A local provider observes one authorized credential injection. An unrelated co-located client, wrong tenant or mismatched connector produces zero resolver and provider calls. A separate connector grant permits only its own transport. Restart, revocation and unavailable authority preserve refusal without leaking secret material. | CC-56 through CC-61 and served credential transport acceptance.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 60
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R036",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK's identity-scoped resource entitlements cover the backend-resource catalogs these connectors manage",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "629ef53c29f0",
        "bac65b612ced"
      ],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK's identity-scoped resource entitlements cover the backend-resource catalogs these connectors manage.** Building on SDK-CONNECTOR-CONTROL-R025's entitlement resolution, `agent_connector_sdk.entitlements` resolves identity-scoped resource entitlements against the specific backend-resource catalogs these connectors expose (keycloak-agent realms and clients, systems-manager managed hosts, vaultwarden-mcp vaults and collections), so each connector auto-loads only the resources its caller's identity grants without importing `agent_utilities.security.entitlements`. | Tests proving a caller's resolved entitlement set against each connector's own resource catalog shape, that an unmatched capability resolves empty, and that no connector still imports `agent_utilities.security.entitlements`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 61
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R037",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "erpnext supplier and purchase-order operation contract is typed and recorded (unblocks `EG-CQ-XSRC-R002.7`)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**erpnext supplier and purchase-order operation contract is typed and recorded (unblocks `EG-CQ-XSRC-R002.7`).** CONFIRMED-exists: `agents/erpnext-agent/erpnext_agent/ontology/access_contracts.ttl` already declares `erp:Supplier` and `erp:PurchaseOrder` on operation `erpnext_agent_resource`, and `kg_ingest.py` reads both doctypes. This row types the contract. Pin the field list (supplier name, status, key field). Publish one recorded response fixture in `agents/erpnext-agent/tests/fixtures/`. | `tests/test_access_contracts.py` in erpnext-agent parses the ttl through `parse_access_contracts` and asserts the Supplier and PurchaseOrder fields match the recorded fixture.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 62
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R038",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "uptime service-health operation contract is declared (unblocks `EG-CQ-XSRC-R003.4`)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**uptime service-health operation contract is declared (unblocks `EG-CQ-XSRC-R003.4`).** Operation exists (CONFIRMED-exists): `uptime_kuma_monitors` action `get_monitors` and `uptime_kuma_status` in `agents/uptime-kuma-agent/uptime_kuma_agent/mcp_server.py`. No `access_contracts.ttl` exists, so add `ontology/access_contracts.ttl` with one contract for the service-health class (name, status, last-check fields) plus a recorded response fixture. | `tests/test_access_contracts.py` in uptime-kuma-agent parses the ttl and asserts the three fields against the recorded fixture.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 63
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R039",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "container-manager deployed-workload operation contract is declared (unblocks `EG-CQ-XSRC-R003.5`)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**container-manager deployed-workload operation contract is declared (unblocks `EG-CQ-XSRC-R003.5`).** Operation exists (CONFIRMED-exists): `cm_k8s_workloads` has actions such as `list_pods` in `agents/container-manager-mcp/container_manager_mcp/mcp/mcp_k8s_workloads.py`. `kg_ingest.py` has `ingest_deployments`. No `access_contracts.ttl` exists. Add one with a contract for the deployed workload class that carries its image reference. Add a recorded response fixture. | `tests/test_access_contracts.py` in container-manager-mcp parses the ttl and asserts the workload name, status and image fields against the recorded fixture.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 64
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R040",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK declares an MCP source's access contract (unblocks `EG-CQ-CONN-R067.1`)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK declares an MCP source's access contract (unblocks `EG-CQ-CONN-R067.1`).** Exists: access kind `mcp_tool` in `ACCESS_KINDS` (`_contract_fields.py`). The engine fetches at query time (virtual-first, no copying of sources). Remaining work is a conformance case only. | CC-11 parses a fake ontology with an `mcp_tool` contract and returns the typed contract.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 65
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R041",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK declares an A2A source's access contract (unblocks `EG-CQ-CONN-R067.2`)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK declares an A2A source's access contract (unblocks `EG-CQ-CONN-R067.2`).** Exists: access kind `a2a_skill` in `ACCESS_KINDS`. Virtual-first, no copying of sources. Remaining work is a conformance case only. | CC-11 parses a fake ontology with an `a2a_skill` contract and returns the typed contract.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 66
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R042",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK declares an API (REST) source's access contract (unblocks `EG-CQ-CONN-R067.3`)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK declares an API (REST) source's access contract (unblocks `EG-CQ-CONN-R067.3`).** Exists: access kind `http_endpoint` in `ACCESS_KINDS`. Virtual-first, no copying of sources. Remaining work is a conformance case only. | CC-11 parses a fake ontology with an `http_endpoint` contract and returns the typed contract.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 67
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R043",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK declares a GraphQL source's access contract (unblocks `EG-CQ-CONN-R067.4`)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK declares a GraphQL source's access contract (unblocks `EG-CQ-CONN-R067.4`).** Exists: access kind `graphql_query` in `ACCESS_KINDS`, with introspection helpers from SDK-CONNECTOR-CONTROL-R030. Virtual-first, no copying of sources. Remaining work is a conformance case only. | CC-11 parses a fake ontology with a `graphql_query` contract and returns the typed contract.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 68
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R044",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK declares a virtual-graph access contract",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK declares a virtual-graph access contract.** The contract covers relational or document sources and unblocks `EG-CQ-CONN-R067.5`. `ACCESS_KINDS` lacks this kind. Add `virtual_graph` to `_contract_fields.py` and `ontology/access_contract.ttl`. Name the table or collection, key field, and pushdown operations. The engine reads sources at query time. Never place a literal secret in the contract or copy source data. | CC-11 parses a fake ontology with a `virtual_graph` contract. It also proves the parser refuses an unknown kind and literal secret.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 69
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Tool contract facts for the run loop and the tool-subset decision",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "3ddd773fb6dc",
        "910c1a8859ca",
        "f06d1600bb90"
      ],
      "verified_by": [
        "tests/test_schema_disclosure_artifacts.py:22",
        "tests/test_schema_disclosure_provider.py:64"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Tool contract facts for the run loop and the tool-subset decision.** Each tool carries `read_only`, `side_effects`, a typed argument schema and `schema_tokens`. The pack and the manifest publish them. `EG-DECISION-ENGINE` reads them for the tool-subset decision. `AU-HARNESS` reads them to run read-only tools in parallel. | Rows R045.1 to R045.11 bind.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 70
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Type `ToolContractFacts`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Type `ToolContractFacts`.** Add frozen model `ToolContractFacts` in `agent_connector_sdk/artifacts/tool_facts.py`. Fields: `read_only: bool`, `side_effects: frozenset[SideEffect]`, `arg_schema: dict`, `schema_tokens: int`, `declared_by`. `declared_by` is `connector`, `mcp_hint` or `default`. | `tests/test_tool_facts.py::test_facts_model_is_frozen_and_typed`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 71
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Close the `SideEffect` set",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Close the `SideEffect` set.** `SideEffect` in `agent_connector_sdk/artifacts/tool_facts.py` has exactly `none`, `workspace_write`, `external_write` and `network`. `ToolContractFacts` must refuse `read_only = true` with `workspace_write` or `external_write`. It must refuse `none` combined with another value. | `tests/test_tool_facts.py::test_side_effect_set_is_closed_and_read_only_is_consistent`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 72
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Compute `schema_tokens` from the existing canonical tool body",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Compute `schema_tokens` from the existing canonical tool body.** `schema_tokens(body)` returns the ceiling of the UTF-8 byte length of the canonical tool body divided by 4. The body is the `canonical_json` output built at `agent_connector_sdk/artifacts/tools.py:38`. The divisor 4 is a named default. A measured tokenizer count may replace it. | `tests/test_tool_facts.py::test_schema_tokens_uses_canonical_body_and_named_divisor`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 73
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Default to the safe value when a connector declares nothing",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Default to the safe value when a connector declares nothing.** `facts_from_declaration(tool)` must return `read_only = false`, `side_effects = {external_write}` and `declared_by = default` when neither `eg.annotations` nor a tool annotation states a value. It must not infer `read_only` from the tool name. | `tests/test_tool_facts.py::test_undeclared_tool_defaults_to_not_read_only`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 74
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Map MCP annotations as self-declared hints",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Map MCP annotations as self-declared hints.** `_annotations_from_mcp` (`agent_connector_sdk/artifacts/annotations.py:94`) already maps `readOnlyHint` through `_TOOL_HINTS` (`annotations.py:15`). The new facts builder must read that value, set `read_only` from it, and record `declared_by = mcp_hint`. A conflicting `eg.annotations` value keeps the existing `MalformedArtifactError` (`annotations.py:55`). | `tests/test_tool_facts.py::test_mcp_read_only_hint_is_recorded_as_self_declared`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 75
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Read `side_effects` from `eg.annotations`, and gate on the generated type",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Read `side_effects` from `eg.annotations`, and gate on the generated type.** A connector declares `side_effects` under the `eg.annotations` key of the tool `_meta` (`annotations.py:13`). The generated `PackAnnotations` has `read_only_hint`, `destructive_hint` and `idempotent_hint` only. It lacks `side_effects` and `schema_tokens`. The `EG-TYPED-PACKS` row for the pack annotation fields must land first. The SDK then bumps the locked wheel (R005). | `tests/test_tool_facts.py::test_side_effects_round_trip_through_generated_pack_annotations`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 76
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045.7",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Reuse the destructive classification",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Reuse the destructive classification.** `is_destructive_action` (`agent_connector_sdk/mcp/action_dispatch.py:88`) must feed the facts builder. A destructive operation must yield `read_only = false` and include `external_write` or `workspace_write`. An explicit `operation[\"destructive\"]` value wins over the name tokens. | `tests/test_tool_facts.py::test_destructive_action_is_never_read_only`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 77
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045.8",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Attach the facts to the captured tool entry",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Attach the facts to the captured tool entry.** `_tool_entry` (`agent_connector_sdk/artifacts/tools.py:34`) must build `ToolContractFacts` and place them in the `PackAnnotations` it passes at `tools.py:47`. `build_content_pack` (`agent_connector_sdk/artifacts/pack.py:127`) already forwards `entry.annotations` (`pack.py:92`) and needs no change. | `tests/test_pack.py::test_tool_entry_pack_carries_contract_facts`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 78
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045.9",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Certify that a `read_only` tool wrote nothing in its recorded fixture",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Certify that a `read_only` tool wrote nothing in its recorded fixture.** `certify_connector` (`agent_connector_sdk/certify/certification.py:75`) only compares pins today and holds no fixture. Add `ToolFixture` with the tool name, arguments and the observed effects. Add `check_read_only(facts, fixture)` in `agent_connector_sdk/certify/read_only_check.py`. It must return a `read_only_violation` verdict when the fixture records a write. | `tests/test_certify_read_only.py::test_read_only_tool_with_recorded_write_fails_certification`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 79
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045.10",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refuse an unproven self-declared `read_only`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refuse an unproven self-declared `read_only`.** A tool with `declared_by = mcp_hint` and `read_only = true` must have a fixture. Without one, `check_read_only` must return an `unproven` verdict. `_certified` (`agent_connector_sdk/certify/pins.py:84`) must not write a pin for that tool. | `tests/test_certify_read_only.py::test_mcp_hint_without_fixture_is_unproven_and_unpinned`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 80
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045.11",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Certify checks the live declared tools and writes no file",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "92d09c57796b"
      ],
      "verified_by": [
        "tests/test_single_declaration.py:169"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Certify checks the live declared tools and writes no file.** `connector-certify` reads `connector://resources`, lists the tools and checks each declared preset tool against its live definition. It writes no manifest and no pin file. | `tests/test_single_declaration.py::test_certify_reads_the_declaration_and_checks_tools_live`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 81
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R046",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Browser authorization-code flow with PKCE as a reusable auth manager",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Browser authorization-code flow with PKCE as a reusable auth manager.** The SDK provides one authorization-code manager with PKCE for every connector whose system supports it. Connectors that use static tokens or keys keep them. | Rows R046.1 to R046.6 bind.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 82
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R046.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Frozen PkceAuthConfig carries issuer, `client_id`, scope, `redirect_mode`, `token_ref` and a declared ProviderTokenProfile. The profile specifies JWT/OIDC or opaque representation separately for each token role. PkceChallenge binds the authenticated caller/client, operation digest, broker challenge reference, state, nonce, callback and deadline. Headless input carries the complete bound redirect response. PkceAuthResult exposes safe status and references only; codes, verifier and tokens remain private transport material. | CC-26 through CC-31 plus the served inline authorization cases.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 83
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R046.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** PkceAuthManager uses a random 64-character verifier, S256 and a 120-second total deadline. It transports one host-admitted ceremony and persists only through the injected approved broker/vault port. Apply the declared token profile before persistence; opaque values acquire no fabricated JWT claims. Missing credentials may begin inline authorization only under that interaction policy. Headless input is asynchronous, bounded and challenge-bound; no served request waits on blocking stdin or a code file. | CC-26 through CC-31 plus the served inline authorization cases.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 84
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R046.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** The actual certify caller is `agent_connector_sdk/certify/cli.py:124`, which invokes _oidc_auth at `agent_connector_sdk/certify/options.py:26`. That function currently constructs client-credentials auth only. Add the selected PKCE branch and connector credential-missing handler through the same manager. The manager, broker adapter, challenge transport and persistence acknowledgement are missing; `build_outbound_auth` is not an existing call site. | CC-26 through CC-31 plus the served inline authorization cases.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 85
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R046.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** PkceAuthRefusedError distinguishes `no_credential`, `interaction_required`, `browser_launch_failed`, `callback_unavailable`, `input_timeout`, `state_mismatch`, `insecure_redirect`, `provider_unavailable`, `persistence_failed`, cancelled, expired and revoked. Each phase respects the remaining deadline. Cancellation, expiry or callback replay invalidates the ceremony. No token request follows a bad state or redirect, and no operation resumes without confirmed persistence and fresh authority. | CC-26 through CC-31 plus the served inline authorization cases.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 86
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R046.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Record issuer profile, redirect mode, request/client binding digest, challenge reference, outcome, deadline and safe token reference. Join the host grant and vault receipt. Never expose code, verifier, bearer token, pasted redirect input or resolved credential values. Persisted readiness requires an actual receipt; a successful exchange alone is insufficient. | CC-26 through CC-31 plus the served inline authorization cases.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 87
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R046.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** `tests/test_certify_pkce_flow.py::test_certify_run_authenticates_through_pkce` enters the actual certify command and local issuer callback. `tests/test_scoped_credential_transport.py::test_served_inline_pkce_bounds` enters the tools/call wire method on a real connector. Observe S256 exchange, bound callback, host persistence receipt and one authenticated provider request. Exercise positive and negative JWT/OIDC and opaque profiles, including required introspection and connector substitution. Browser failure, input timeout, cross-client replay and failed persistence produce typed errors and no resumed operation. | CC-26 through CC-31 plus the served inline authorization cases.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 88
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R047",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Agent-card discovery from the standard well-known path",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Agent-card discovery from the standard well-known path.** The SDK reads a remote agent's standard card from its well-known path and records it, so delegation can decide when to invoke that agent. | Rows R047.1 to R047.6 bind.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 89
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R047.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Add frozen `DiscoveredAgentCard` in `agent_connector_sdk/vendor_extractors/a2a_discovery.py`. Fields: `base_url`, `card` (the parsed JSON object), `fetched_at`, `etag` and `skills` (a tuple of skill identifiers). | `tests/test_a2a_discovery.py::test_discovered_card_is_frozen_and_typed`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 90
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R047.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** `discover_agent_card(base_url)` requests `/.well-known/agent-card.json` through the governed HTTP client. It accepts a body of at most 256 KiB and a response within 10 s. Both limits are named defaults. A repeated fetch sends the stored `etag` and keeps the stored card on a 304. | `tests/test_a2a_discovery.py::test_fetch_uses_well_known_path_and_etag`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 91
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R047.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** `_collect_cards` in `agent_connector_sdk/vendor_extractors/a2a_helpers.py:79` accepts only inline cards or file paths today. This row creates the call site for `discover_agent_card` there, for a config entry that holds a base URL. Its production caller is `extract` in `agent_connector_sdk/vendor_extractors/a2a.py:98`. | `tests/test_vendor_extractors_archer_infra_a2a.py::test_base_url_entry_is_fetched_into_cards`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 92
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R047.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** The discovery must return `AgentCardRefused` with reason `not_found`, `not_json`, `oversize` or `egress_blocked`. It must not write a partial card to the change set. | `tests/test_a2a_discovery.py::test_refusals_write_nothing`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 93
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R047.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Each discovered card adds `fetched_at`, `etag` and the source URL to its `A2AAgentCard` entity. A delegation decision can then cite the card version it used. | `tests/test_a2a_discovery.py::test_entity_carries_fetch_provenance`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 94
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R047.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** The entry point is the `a2a` vendor extractor run, `extract`. The integration test serves a card from a fake host and runs the extractor with a base URL. It observes the card and skill entities in the change set. | `tests/test_vendor_extractors_archer_infra_a2a.py::test_extract_discovers_card_from_base_url`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 95
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R048",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Agent-readable text form in tool contracts",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Agent-readable text form in tool contracts.** A tool that returns fitted analysis results declares a plain-text form an agent can answer questions from. Graded questions score that form. | Rows R048.1 to R048.6 bind.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 96
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R048.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Add frozen `ReadableForm` in `agent_connector_sdk/artifacts/readable_form.py`. Fields: `template_id`, `max_chars`, `question_set_ref` and `score`. `ToolContractFacts` (SDK-CONNECTOR-CONTROL-R045.1) gains an optional `readable_form` field. | `tests/test_readable_form.py::test_model_is_frozen_and_optional_on_facts`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 97
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R048.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** `render_readable(result, form)` returns plain text of at most `max_chars`, 4000 by default. It lists fitted terms, their effects and the stated fit quality, one line each. The default is a named, replaceable renderer. | `tests/test_readable_form.py::test_render_is_bounded_plain_text`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 98
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R048.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** `_tool_entry` in `agent_connector_sdk/artifacts/tools.py:25` builds the tool body. This row creates the call site there: the function copies the declared `readable_form` into the pack annotations. Its production caller is `ToolArtifactKind.list_entries` at `agent_connector_sdk/artifacts/tools.py:64`. | `tests/test_pack.py::test_tool_entry_carries_readable_form`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 99
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R048.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** `certify_connector` must refuse a tool that declares a `readable_form` and has no `question_set_ref`. It must return the verdict `unscored_readable_form`. | `tests/test_certify_readable_form.py::test_unscored_form_is_refused`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 100
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R048.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** The certification verdict records `score`, the question count and the answered count per tool. The score is a count ratio, not a model judgment. | `tests/test_certify_readable_form.py::test_verdict_records_question_counts`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 101
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R048.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** The entry point is the certify command run loop. The integration test certifies a fixture connector whose tool declares a form with ten graded questions, and observes the score in the verdict and the form in the built pack. | `tests/test_certify_readable_form.py::test_certify_run_scores_form_and_pack_carries_it`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 102
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R049",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Budget-limited, approval-gated payment challenge handling",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Budget-limited, approval-gated payment challenge handling.** The governed HTTP client handles an HTTP 402 payment challenge only within a budget and only after approval. Each payment leaves a provenance record. | Rows R049.1 to R049.6 bind.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 103
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R049.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Add frozen `PaymentChallenge`, `PaymentBudget` and `PaymentRecord` in `agent_connector_sdk/http/payments.py`. The record fields are `transaction_id`, `amount`, `currency`, `payee`, `request_url`, `approver` and `outcome`. | `tests/test_http_payments.py::test_models_are_frozen_and_typed`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 104
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R049.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** `PaymentGate.decide(challenge, budget)` allows a payment when the amount fits the remaining per-call and per-day limits. Both limits default to zero, so nothing is paid until a caller sets them. A decision names which limit applied. | `tests/test_http_payments.py::test_decide_applies_named_limits`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 105
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R049.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** `create_http_client` in `agent_connector_sdk/http/client.py:84` builds the client but handles no 402. This row creates the call site: a response hook calls `PaymentGate.decide`, then `ctx_confirm_destructive` (`agent_connector_sdk/mcp/context.py:49`) for approval. Production callers are the connectors' served operations that build the client. | `tests/test_http_payments.py::test_client_hook_gates_402_through_approval`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 106
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R049.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** The gate must return `PaymentRefused` with reason `over_budget`, `not_approved`, `no_context` or `unsupported_scheme`. It must not send a payment header after a refusal. | `tests/test_http_payments.py::test_refusals_send_no_payment_header`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 107
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R049.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Each attempt, paid or refused, emits one `PaymentRecord` as an entity linked to the requesting actor and request, so the full provenance chain is queryable. | `tests/test_http_payments.py::test_every_attempt_emits_a_record`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 108
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R049.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** The entry point is a served operation that calls the governed client against a fake endpoint returning 402. The integration test observes a paid retry within budget, and a refusal with a record when the budget is exceeded. | `tests/test_http_payments_flow.py::test_served_operation_pays_within_budget_and_refuses_over`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 109
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R050",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Caller-scoped tool context and ordered progress",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Caller-scoped tool context and ordered progress.** Every registered MCP tool receives a typed context for state, redacted logging and incremental progress. Destructive operations consume EG approval decisions through authenticated Arbora serving and governed effect contracts. | Served acceptance CC-50 through CC-55 covers both registration paths.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 110
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R050.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** `ToolExecutionContext` binds verified tenant, actor, session, request, connector and operation IDs to a deadline and optional MCP progress token. `ToolProgress` contains sequence, finite nonnegative completed value, optional total and bounded message. `ToolExecutionResult` contains terminal state, last sequence and effect receipt reference. Terminal states are `succeeded`, `failed`, `cancelled` and `uncertain`. | CC-50 validates typed values, missing identity and unknown terminal states.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 111
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R050.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** Named defaults are `request_cache`, `ordered_progress` and `bounded_delivery`. Cache entries live only within one request and expire at its deadline. Concurrent producers serialize notifications with strictly increasing sequence and completed values, even without a total. Suppress equal completion notifications; internal terminal summaries may update separately. A known total is fixed and bounds completed. Without a progress token no progress notification is sent. Push notifications precede the terminal result, which includes the last progress summary. Delivery never polls. | CC-51 checks ordering, equal concurrent updates, bounds, token absence and request cache isolation.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 112
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R050.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** The served `tools/call` entry point uses `create_mcp_server` at `agent_connector_sdk/mcp/server.py:88`. Add context binding to tools registered through `tool_surface.py:97` and `method_tools.py:133` in that same package. Forward the bound context through `agent_connector_sdk/mcp/action_dispatch.py:194` before invoking the connector method. Reuse `ctx_log` and `ctx_confirm_destructive` from `mcp/context.py`; add the missing typed progress sender there. | CC-52 exercises both registrars through the served operation and observes the same context identity at dispatch.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 113
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R050.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Return closed reason codes `invalid_context`, `invalid_progress`, `approval_required`, `deadline_exceeded`, `cancelled`, `delivery_failed` or `recovery_unavailable`. Missing or mismatched identity refuses before any backend call. Denied, expired or wrong-operation EG approval refuses every destructive call. Progress failure never retries a source effect. If an effect may have happened, return `uncertain` with its receipt reference for governed reconciliation. Reconnect recovery refuses `recovery_unavailable` without an authenticated producer mapping the original request to its durable result and effect receipts. Never synthesize a recovered result or repeat an effect to recover it. | CC-53 asserts zero effects on refusal and no repeated effect after notification loss or unavailable reconnect recovery.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 114
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R050.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Emit tenant, actor, connector, operation, request and trace IDs; schema digest; event sequence; terminal reason; EG approval reference; and effect receipt reference. Record cache hits and notification loss without cached values, credentials or raw arguments. Bind terminal progress metadata to the same request even without a token. | CC-54 checks provenance, redaction and correlation for success and failure.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 115
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R050.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** `tests/test_tool_context_served.py::test_served_context_progress_and_approval` enters the real `tools/call` wire method on a running SDK server. It crosses registration, context binding and dispatch before a controlled connector backend. The client observes ordered progress and terminal metadata. Repeat without a token, with concurrent tenants, denied approval and transport loss; verify backend effects and governed receipt identity. A reconnect retry must refuse when its result producer is unavailable. | CC-55 requires an actual served transport; direct helper tests alone do not satisfy this row.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 116
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R050.7",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Visual observation transport integration",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Visual observation transport integration.** The SDK transports visual observations and provenance between ordered steps within a single run. Observations carry source operation ID, frame provenance, capture time, schema revision and content reference. The next authorized step reads the same-run committed reference only. EG owns durable state storage and retention; AU owns next-step conditioning; SDK request_cache remains request-scoped only. | Integration tests prove ordered same-run observation reuse, cross-run isolation, and stale-reference refusal. Served multi-step test observes matching observation IDs and content at source, state, and consumer.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 117
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R007.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Define immutable `MajorVersionTransition` and `PackageInventorySnapshot` types. Bind transition to the distribution, old and target major pins, target artifact digest, transition ID, and inventory digest. Each sorted snapshot entry binds package and repository IDs, source commit, current pin, and dependency-file preimage digest. Hash canonical entries with SHA-256. Define one immutable `PackageCompatibilityReceipt` per package, bound to transition, inventory, source, pins, preimage, artifact, suite, run, completion, and outcome. | Reject missing identities, duplicate packages, non-major transitions, or receipts with mismatched bindings.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 120
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R007.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** Evaluate every inventoried package against the exact target artifact in an isolated candidate environment. Leave tracked manifests and lockfiles unchanged. Emit exactly one completed receipt per package. Refuse when inventory completeness is unknown. Import scans alone are not compatibility evidence. | Assert exact receipt membership, target binding, complete results, and unchanged dependency-file bytes.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 121
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R007.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** The planned producer is `agent_connector_sdk.testing.fleet_migration.evaluate_major_version_compatibility(inventory, transition)`. The planned fleet gate is `authorize_major_version_pin_changes(transition, inventory, receipts)`. Each package writer calls `require_package_pin_change(gate, package_id, pin_preimage)` before its first pin write. `scan_many_packages` and `PackageScanResult` currently report import scans only. The rollout command and pin writers lack these attachments. Require the same gate in R009-R013. | Enter the real rollout command and every R009-R013 package writer; helper-only tests do not prove wiring.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 122
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R007.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Fleet preflight refuses before its first write if a receipt is missing, duplicate, extra, failed, incomplete, cancelled, stale, or mismatched. It checks transition, artifact, inventory, package, source, current-pin, and preimage bindings. That refusal preserves every pin byte-for-byte. Each writer rechecks its authorization and current preimage before its first write. After admission, package A may write before a check rejects package B. B's writer refuses its write and reports applied/refused package IDs plus a reconciliation-required state. Align this partial outcome with `PIPE-RELEASE-R001.8` through `PIPE-RELEASE-R001.12`. Do not claim an operator restored A's old pin. | Through the rollout path, prove preflight refusal leaves all dependency files byte-identical. Then race B's preimage after A writes. Prove B performs no write. Assert the partial result names A and B and requires reconciliation.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 123
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R007.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Record transition ID, inventory digest and members, package source and preimage, and old and target pins. Record artifact digest, check suite, run, outcome, and gate decision. Bind each consumed authorization to its package. Record each writer's applied/refused outcome and, after a post-admission race, the exact partial package set and reconciliation-required state. Reconstruct decisions from credential-free evidence; reject cross-package and cross-transition reuse. | Rebuild decisions from stored inputs, verify partial-outcome readback, and reject reused package or transition evidence.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 124
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R007.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** Exercise the real rollout command and package writers. A complete passing preflight permits only bound pin changes. Missing, stale, or incompatible preflight receipts refuse before writes and preserve all pins. Also race package B's preimage after package A commits. B refuses before its first write. The result identifies A as applied and B as refused. It requires reconciliation without claiming rollback. | `tests/test_major_version_compatibility_served.py::test_fleet_preflight_refusal_preserves_all_pins` exercises preflight and byte-compares every dependency file. `tests/test_major_version_compatibility_served.py::test_writer_b_preimage_race_reports_partial_rollout` proves B did not write and the result requires reconciliation.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 125
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R055",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Arbora producer-consumer handoff for AU disclosure-set gate",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Arbora producer-consumer handoff for AU disclosure-set gate.** The SDK provisions the real served producer/consumer handoff for disclosed and undisclosed tools. Arbora authorized find (registry/discovery; intent find) returns tool facts. EG Decide ToolRelevance consumes them at stat_decide.rs:134. AU execute_agent dispatches through factory.py:973 DisclosureSet. The current AU plan acknowledges this ownership; exact served cross-owner positive/negative acceptance proves the handoff. The real Arbora find and EG ToolRelevance must be wired and tested. | Served acceptance tests bind Arbora find, EG ToolRelevance, and AU DisclosureSet gate. Prove that disclosed tools pass the gate and undisclosed tools are refused before reaching the tool-call gate.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 126
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R056",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "EG prompt and SDK tool producer-specific compatibility decisions and receipts",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**EG prompt and SDK tool producer-specific compatibility decisions and receipts.** The SDK tool schema authority and EG prompt authority must decide nested incremental producer compatibility and evolution together. Declared contract-version pin equality and source-ingest drift classification do not define that contract alone. Both producers must emit compatibility decision receipts bound to host admission. | Served acceptance tests bind EG prompt version, SDK tool schema, and compatibility decision receipts at schema-fingerprint/FleetOnboarding.onboard. Prove version conflicts and breaking changes are refused.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 127
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R057",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Replaceable search-grounding provider independent of reasoning model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Replaceable search-grounding provider independent of reasoning model.** The search grounding provider is independently selected from the reasoning model and bound to a committed route. Unavailable committed provider must refuse rather than substitute. EG produces the committed provider binding. SDK/Arbora consumer must execute that exact provider. | Served tests prove provider/model independence. Zero alternate-provider calls occur; unavailable committed provider is refused. Test provider selection, model selection, and exact execution of the committed provider.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 128
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R058",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Request durability boundary correction for durable versus ephemeral storage",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Request durability boundary correction for durable versus ephemeral storage.** The literal universal in-memory-default request conflicts with current explicit durability boundaries. Identify the exact deployment/profile default and explicit ephemeral versus durable behavior. Embedded transport/no external service and configurable served mode are distinct requirements. Preserve sync/redb authority and test no-external-service embedded startup plus configured served mode. | Tests prove embedded/in-process client defaults, explicit ephemeral mode, and explicit durable mode with external storage. No conflation of transport selection with durability class.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 129
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R059",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "EG capability-to-existing-method operation bindings for analogy search, blast radius, memory recall, ontology validation and design",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**EG capability-to-existing-method operation bindings for analogy search, blast radius, memory recall, ontology validation and design.** Existing EG public capabilities map to existing EG methods without new engine code. AU legacy action mappings identify the five capability-to-EG-method-to-served-operation bindings. The reuse constraint preserves R023 transport and refusal obligations. | Served tests bind analogy search, blast radius, memory recall, ontology validation and design operations through existing EG methods. Prove each operation is served end-to-end.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 130
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R060",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Native desktop operation port and no-cursor/no-focus invariant",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Native desktop operation port and no-cursor/no-focus invariant.** Arbora grants host execution. SDK native desktop adapter handles background click/type/verification without cursor or focus capture. Grant-bound refusal is enforced. The operation port defines the boundary. | Served tests prove background operation under granted sandbox scope, verify grant-bound refusal for out-of-scope requests, and test click/type/verification without cursor capture.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 131
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R650",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Connector manifest release integrity",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "ad6af590e63c"
      ],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Connector manifest release integrity.** `agent_connector_sdk.manifest.integrity` computes the canonical, serialization-order-invariant hash of a compiled ontology graph and of a complete connector manifest (signature field excluded). It signs and verifies releases with Ed25519 under an injected, versioned secret reference (`vault://` or `secret://`; an `env://` reference is refused for publication). It reads and writes the lock file that pins signer public keys. A signer whose key disagrees with the locks requires a declared rotation. The rotation ledger path comes from `CONNECTOR_RELEASE_ROTATION_RECORD`. Graph hashing needs the optional `integrity` extra; the base install stays light. | `tests/test_manifest_integrity.py` covers lock-key agreement, rotation, canonical base64url refusal and the env-reference refusal.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 132
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R051",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Sandbox allocation producer for AU:29",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Sandbox allocation producer for AU:29.** The SDK provisions and reconciles admitted sandbox requests through one typed port. Arbora owns host admission and the certified support matrix. Source trace: `AU:29 49df21c60c947240d4f02b1424b1de29183f10a69c76bd885f19d13e7237061c`. | Served producer/consumer acceptance and independent readback; runtime remains unclaimed.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 136
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R051.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Define SandboxProvisioner. It consumes Arbora ProvisionRequest. It returns ProvisionResult with allocation ID, actual instances, observed image/platform, state, timestamps, and provider receipt. | Validate all identity fields and actual instance IDs.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 137
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R051.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** Allocate once per stable operation ID. Reconcile uncertain results before retry. Transport loss never proves no allocation. | A replay returns the reconciled allocation without duplication.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 138
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R051.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** The SDK does not yet provide the planned `agent_connector_sdk.ports.sandbox.SandboxProvisioner` producer or adapter binding. Existing generic SDK entry points are `agent_connector_sdk/mcp/server.py:88` (`create_mcp_server`), `agent_connector_sdk/mcp/tool_surface.py:121` (`register_tool_surface`), `agent_connector_sdk/mcp/method_tools.py:150` (`register_method_tools`), and `agent_connector_sdk/mcp/action_dispatch.py:194` (`dispatch_async`). Route AU sandbox access through Arbora `arbora/api/ops/agents.py:97` (`agents.run`) and `arbora/control_plane/runs/admission.py:108` (`NativeWorkItemAdmissionProtocol`) / `arbora/control_plane/runs/capacity.py:53` (`CapacityLedger`); return the SDK adapter receipt to Arbora. The sandbox-specific producer/wiring remains absent. | Exercise the served route, adapter, and result consumer.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 139
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R051.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Refuse unsupported profiles, missing grants, expired requests, and conflicting replay IDs before provider calls. Reconcile unresolved outcomes before retry. Unsupported combinations allocate nothing. | Negative cases observe zero unsupported or unauthorized allocations.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 140
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R051.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Bind request/result digests, adapter version, matrix revision, operation/allocation IDs, instances, state, timestamps, and reconciliation. Exclude credentials and secret values. | Independent readback matches the bound allocation receipt.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 141
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R051.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** Future served tests enter Arbora agents.run. Use a disposable certified adapter. Observe instances and independent readback. Test unsupported profiles and response loss without duplicates. | The served acceptance proves actual allocation and zero duplicate effects.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 142
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R052",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Visual observation transport for AU:35",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Visual observation transport for AU:35.** The SDK transports visual observations and provenance between steps. EG owns durable perception state; AU owns next-step conditioning. SDK request_cache remains request-scoped. Source trace: `AU:35 9da1fe3853d82945989df4194b626b793a37937ff892b483c1583a8d1aae644e`. | Served producer/consumer acceptance and independent readback; runtime remains unclaimed.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 143
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R052.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Define VisualObservationEnvelope. Include observation ID, modality, source operation, and frame or sequence. Bind capture time, content digest/reference, tenant/run/request scope, and schema revision. Keep payload behind governed references. | Reject absent or malformed provenance and unbounded payloads.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 144
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R052.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** Pass ordered observation references to the next authorized step in the same run. EG owns durable storage and retention. SDK request_cache is not cross-request memory. | The next step reads the committed same-run observation only.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 145
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R052.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** Existing generic SDK entry points are `agent_connector_sdk/mcp/server.py:88` (`create_mcp_server`), `agent_connector_sdk/mcp/tool_surface.py:121` (`register_tool_surface`), `agent_connector_sdk/mcp/method_tools.py:150` (`register_method_tools`), and `agent_connector_sdk/mcp/action_dispatch.py:194` (`dispatch_async`). The SDK lacks a visual observation producer; EG has not assigned the state binding, and AU has not assigned the next-step consumer; request-scoped request_cache is not durable state. | A served two-step test observes matching IDs at result, state, and consumer.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 146
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R052.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Refuse expired, invalidated, uncommitted, unauthorized, cross-tenant/run, and wrong-schema references before provider calls. Never substitute another request's cache. | Each refusal produces zero provider effects.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 147
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R052.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Bind the digest, source/frame, producer operation, tenant/run, schema revision, retention decision, and consumer step. Exclude raw visual content and secrets. | EG readback confirms provenance without returning raw content.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 148
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R052.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** Future served tests cross MCP tools/call, EG state write/readback, and AU next-step use. Prove same-run reuse, cross-run isolation, and stale-reference refusal. | The observed path proves reuse and zero effects on refusal.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 149
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R053",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK environment declaration export",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK environment declaration export.** The SDK must export value-free declarations for all SDK-owned environment reads. Arbora owns composition, configuration validation and startup admission. AU owns its separate declarations. | All six children and the served host acceptance must pass. SDK declarations alone cannot establish complete host coverage.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 150
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R053.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** The SDK must define immutable EnvironmentDeclaration rows in agent_connector_sdk.config. Match the declaration fields in the Arbora R010.2 manifest: name, component, source_revision, type, required_when, default, sensitive and call_sites. Use component agent-connector-sdk and an immutable package source revision. Types and constraints must follow the host contract. Defaults must be declared safe constants or null, never resolved settings or credential references. Sort call_sites by repository-relative path and line. Sort rows by component and name. The SDK must not define another HostEnvironmentManifest schema. | Planned `tests/test_environment_manifest_served.py::test_manifest_rejects_duplicate_literal_and_unknown_entries`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 151
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R053.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** Add the public environment_declarations operation with keyword arguments source_revision and dynamic_bindings. Return an immutable EnvironmentDeclarationExport containing declarations and a census receipt. The export must read no live environment values and perform no network or subprocess work. Census every tracked SDK setting call, direct environment read and inherited-environment forwarding path. Resolve literal names and module constants. Combine compatible call sites under one declaration; reject conflicting declarations. Dynamic names require explicit EnvironmentReadBinding entries matching source call site, owning distribution and exact input name. Bind required condition, type, default and sensitivity to the declared owner contract. Unclassified reads and unresolved forwarding dependencies make the export unavailable; a wildcard cannot establish completeness. | Planned `tests/test_environment_manifest_served.py::test_missing_and_undeclared_inputs_block_startup`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 152
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R053.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** Add environment_declarations and its types to the existing public config module at agent_connector_sdk/config.py:35. Existing setting at config.py:75 and AgentConfig are reader binding points, not declaration producers. The export is absent today. The planned Arbora R010.2 composer must import this public operation and wrap its declaration rows in the host version-1 manifest. R010.4 resolves enabled conditions; R010.3 validates before runtime._build_server in arbora/mcp_server/server.py. The host composer and AU declaration producer remain unimplemented prerequisites. SDK export failure must never become an empty passing fragment. | Planned `tests/test_environment_manifest_served.py::test_host_startup_consumes_sdk_declaration_set`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 153
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R053.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Refuse export for absent or mismatched source revision, unknown components, conflicting duplicate names, unresolved dynamic reads and unsupported schema constraints. Refuse unsafe defaults, unresolved condition bindings and sensitive literal values. The host must reject missing enabled-component exports before opening listeners or starting children. Disabled unrelated components must not require credentials. Report component, input name or call site and typed reason only. Never report resolved values, credential references or configuration file contents. Preserve existing setting coercion and precedence; this definition grants no host admission authority to the SDK. | Planned `tests/test_environment_manifest_served.py::test_refusal_diagnostics_redact_secret_values`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 154
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R053.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Emit an EnvironmentDeclarationReceipt containing outcome, component, immutable source_revision and schema_version. Include declaration_count, declaration_digest, census_digest and unresolved_call_sites. Canonicalize UTF-8 JSON with sorted keys and no insignificant whitespace. Hash the sorted declarations and source census separately. Record source file digests and reviewed dynamic bindings without live values. An independent reader must reproduce both digests from pinned inputs. The host separately records its composed manifest digest, selected conditions and startup decision. An SDK receipt must not claim that the host admitted startup. Available exports require outcome available and no unresolved call sites. Refusal must raise EnvironmentDeclarationError carrying only a receipt, never a declaration fragment. Refusal receipts use outcome refused and null for unavailable revisions or digests. | Planned `tests/test_environment_manifest_served.py::test_readback_matches_manifest_and_decision`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 155
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R053.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** Planned tests/test_environment_manifest_served.py must call the public SDK export from the installed package. Compare its declarations with an independently extracted complete source census. Test every dynamic reader family with valid, absent and conflicting bindings. Shuffle source enumeration and binding order; require identical declarations and digests. Enter the real Arbora launcher entry point with the SDK fragment and controlled remaining owner manifests. Valid settings must serve a probe. Invalid, missing or unresolved declarations must open zero listeners and start zero children. A helper-only check cannot establish launcher ordering. Missing host or AU producer implementations keep served acceptance pending. | Planned `tests/test_environment_manifest_served.py::test_served_startup_accepts_declared_and_refuses_invalid`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 156
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R054",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "JSON tag-loader migration",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**JSON tag-loader migration.** The SDK must inventory JSON tag loaders and bind each loader to declared Python registration. Migration must preserve operations, schemas, tags, dispatch, authorization and typed refusals. One tool per API operation is the default under R020; R026 derives those tools and R032 adds explicit callbacks. | All six children require the same pinned inventory and served comparison. Planned tests do not establish runtime delivery.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 157
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R054.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Define immutable JsonTagLoaderEntry in `agent_connector_sdk/testing/fleet_migration.py`. Fields must include package, public_repository, source_revision, loader_path, json_path, json_sha256 and python_target. Each entry must include operation_mappings sorted by source_operation_id. Each mapping must bind source_operation_id, target_operation_id and target_registration. It must pair source and target input/output schemas, tags, authorization_ref and refusal_cases. Reject duplicate source IDs, duplicate targets and missing pairs. registration_kind must equal operation, explicit_callback or action_dispatch. Paths must be repository-relative. Revisions and JSON bytes must have immutable digests. Sort entries by package, loader_path and json_path. Reject duplicate keys and incomplete fields. | Planned `tests/test_json_tag_loader_migration_served.py::test_inventory_finds_every_source_loader` validates complete entries, ordering, duplicate rejection and changed source digests.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 158
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R054.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** The migration gate must scan each pinned package snapshot before replacement. List tracked Python files and JSON assets, including package data and declared startup entrypoints. Classify every registration path that reads JSON as migrated or unresolved. Dynamic paths and unreadable files remain unresolved until an explicit binding explains them. Each source operation must map to one Python operation with identical schemas, tags, authorization and refusal semantics. R020 serves one tool per operation and forbids environment mode selection. R032 preserves explicit callbacks; R026 derives the operation tools. An unexplained difference blocks replacement. | Planned `tests/test_json_tag_loader_migration_served.py::test_registered_operations_match_source_schemas` detects missing loaders, hidden dynamic paths, unmapped operations and every schema/tag difference.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 159
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R054.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** Extend `agent_connector_sdk/testing/fleet_migration.py:90` with the inventory and parity gate; retain its existing import scan. Start both source and replacement servers through `agent_connector_sdk/mcp/server.py:88`. Reuse register_tool_surface at `agent_connector_sdk/mcp/tool_surface.py:121` and register_method_tools at `agent_connector_sdk/mcp/method_tools.py:157`. Exercise dispatch_async at `agent_connector_sdk/mcp/action_dispatch.py:196`. The gate must drive tools/list and tools/call through authenticated server transport. Each connector provides its declared startup and controlled backend fixture. A direct helper call cannot establish served parity. | Planned `tests/test_json_tag_loader_migration_served.py::test_tools_list_and_call_reach_backend` enters the served wire methods and observes the controlled backend.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 160
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R054.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** The gate must reject unknown loaders, unresolved bindings, malformed inventory, operation mismatches and unexplained schema or tag differences. Denied, malformed, unknown and unsupported served calls must preserve their typed refusal and make zero backend calls. Destructive calls must retain SDK-CONNECTOR-CONTROL-R026.1 confirmation on both dispatch paths. A declined, cancelled or invalid confirmation must make zero backend calls. Missing old-server evidence blocks parity; it must not become an empty passing baseline. | Planned `tests/test_json_tag_loader_migration_served.py::test_denied_malformed_and_unknown_calls_have_zero_effects` covers each refusal on both source and replacement servers.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 161
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R054.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Emit a canonical UTF-8 JSON receipt with sorted keys and no insignificant whitespace. Bind ordered inventory digest, package revisions, SDK revision, protocol version, fixture seed and source/replacement server receipts. Record operation, schema, tag, registration-kind, authorization and refusal comparisons. Include backend call counts and unresolved entries. Record references rather than credentials or secret values. An independent reader must reconstruct every comparison from the pinned inputs and receipt. | Planned `tests/test_json_tag_loader_migration_served.py::test_parity_receipt_reconstructs_from_digests` repeats the fixture and compares canonical receipts after excluding declared observation timestamps.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 162
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R054.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** Planned `tests/test_json_tag_loader_migration_served.py::test_default_and_opt_ins_preserve_dispatch_parity` must enter served tools/list and tools/call wire methods. Run every inventory operation against isolated source and replacement fixtures. Compare normalized catalogs, output schemas, results, backend calls and refusal codes. Exercise the operation default, explicit_callback and action_dispatch independently. Cover denied, malformed, unknown, unsupported, collision and schema-mismatch cases. Each permitted fixture call must reach its backend once. Each refused call must reach its backend zero times. Repeat destructive acceptance and decline on both existing dispatch paths. | The served transport, registration, authorization, dispatch and controlled backend must all participate. Helper-only or import-scan-only checks cannot satisfy this row.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 163
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R061",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Shared typed provider interface for host OS service and log operations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Shared typed provider interface for host OS service and log operations.** A single interface maps service start, stop, restart, and log-read operations to each supported operating system. Native tooling operations on Linux, Windows and macOS are enumerated with unified parameter and return schemas. Parity acceptance criteria document equivalence across platforms. | Rows R055.1 to R055.6 bind.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 167
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R061.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Define immutable ProviderPlatformInterface with fields service_name, operation, parameters, return_schema, native_command and documented_refusals. List supported platforms: linux, windows, macos. Each operation maps to its native tooling (systemctl, sc.exe, launchctl). Parity criteria list semantic equivalence across platforms. | Validate all platform values. Reject unknown platforms or operations.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 168
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R061.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** Provide one read-only registry of platform interfaces keyed by (service, operation, platform). Return the matching native command and documented refusals. An unsupported platform or operation returns zero matches. A missing interface is not an error. | List operations query all platforms or filter by requested set.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 169
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R061.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** Add the interface definition and registry to agent_connector_sdk.host.provider_platform at module root. Arbora host-management consumer imports platform_interface and queries the registry. Connect the registry to existing service lifecycle calls in agent_connector_sdk.host modules. | Served query returns the correct platform-native command for documented cases.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 170
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R061.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Unsupported platform, unknown operation or missing registry entry returns zero results. Refuse undeclared refusal types in operation metadata. Never include secret material in refusal reasons. | Unsupported platform returns empty, never error.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 171
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R061.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Record queried service, operation, platform and matched interface digest. Bind parity criteria revision and documented native command. Record cached vs. recomputed registry state. Join Arbora host lifecycle receipts. | Independent registry audit reproduces all parity checksums.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 172
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R061.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** `tests/test_provider_platform_interface_served.py::test_host_lifecycle_queries_platform_native_commands` enters the Arbora host-management consumer entry point. Observe service start/stop/restart and log-read commands for each platform. Verify native commands match documented parity criteria and match field schemas. Exercise unsupported platform and missing operation with zero effects. | Served verification calls the real host consumer and observes matched platform commands.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 173
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R062",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Define minimal EG certification producer and AU orchestration consumer with identity bindings",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Define minimal EG certification producer and AU orchestration consumer with identity bindings.** EG produces final attestation decisions tied to decision request digests. AU orchestration consumes those decisions and acts on agent authorization. Existing ARBORA-FLEET-R034.7-.12 identity bindings carry tenant and actor facts. New rows link certification inputs and outputs to those bindings. | Rows R056.1 to R056.6 bind.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 177
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R062.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Define immutable CertificationAttestation with fields decision_request_digest, outcome, decision_timestamp, decision_reference and au_consumer_binding. Outcome values: accepted, rejected, deferred. AU consumer binding carries actor, tenant and operation scope. Include decision trace reference and optional refusal reason. | Validate outcome enum. Reject missing digests or actor identity.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 178
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R062.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** EG issues one attestation per decision request. AU consumes and acts only on accepted attestations. Deferred outcomes require retry with fresh request. A rejected outcome documents reason and rejects without retry authority. EG decision trace remains sealed from AU. AU orchestration never reissues old attestations. | Reuse produces same attestation. Retry after deferred succeeds or fails anew.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 179
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R062.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** EG producer is planned at agent_connector_sdk.certify.attestation_producer. AU consumer entry is agent_connector_sdk.au_orchestration.consume_attestation at agent_connector_sdk/au_orchestration/execution.py:112. Reuse existing identity bindings from agent_connector_sdk.identity.ActorContext. Connect AU broker receipt tracking to decision trace reference. EG tracing remains sealed. | Served AU orchestration observes decision trace reference in receipt.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 180
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R062.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Refuse unknown outcome values, missing request digests or actor identity bindings. AU refuses accepted attestations with mismatched tenant or actor scope. EG seals its decision trace from AU refusals. Never include trace details in AU rejection output. | Missing identity refuses before AU acts.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 181
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R062.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Record decision request digest, attestation outcome, timestamp and trace reference. Record AU actor, tenant, operation and acceptance binding. Join decision reference to broker receipt. Record refusal reason and typed cause. Exclude trace details and decision internals. | AU receipt references the exact decision digest. Independent audit matches attestations.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 182
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R062.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** `tests/test_eg_certification_attestation_served.py::test_au_accepts_and_rejects_attestations` enters the real AU orchestration entry point with certified EG attestations. Observe accepted decisions permitting AU action, rejected decisions blocking action, and deferred decisions triggering retry. Verify actor and tenant bindings are checked before AU acts. A mismatched actor or tenant refuses without effect. | Served path exercises decision request, attestation issuance, AU consumption and trace sealing.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 183
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R063",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK and AU produce versioned environment-manifest declarations covering enabled components",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK and AU produce versioned environment-manifest declarations covering enabled components.** Public SDK and AU operations export immutable EnvironmentDeclaration rows listing every setting, secret and indirect read their components require. Arbora composes declared sets and validates startup configuration. Declarations cover all SDK-owned and AU-owned component requirements only. | Rows R057.1 to R057.6 bind.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 187
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R063.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Define immutable EnvironmentDeclaration with fields name, component, source_revision, type, required_when, default, sensitive, call_sites and schema_version. Component is sdk or au. Source_revision is immutable source digest. Type is string, int, bool, secret_reference or enum. Call_sites is sorted list of (file, line) tuples. Default is null or a safe constant, never credential reference. | Validate all enum values. Reject credential references in defaults.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 188
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R063.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** SDK and AU each export one unversioned public operation returning immutable EnvironmentDeclarationSet with declarations and export receipt. Each declaration lists all call sites. No live environment read occurs. No network or subprocess invocation occurs. Dynamic environment reads require explicit binding entries matching source call site and input name. Unresolved or conflicting declarations block export. | Repeated calls return identical declarations.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 189
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R063.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** SDK operation is agent_connector_sdk.config.environment_declarations at agent_connector_sdk/config.py:35. AU operation is planned at agent_utilities.config.environment_declarations. Arbora composer imports both and merges rows. Reuse existing setting and environment-read call sites from agent_connector_sdk.config.py:75 and agent_utilities configuration. No new SDK or AU configuration module required. | Served Arbora composer observes both SDK and AU declaration sets.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 190
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R063.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Refuse absent or mismatched source revision, conflicting duplicate declarations, unresolved dynamic reads, unsupported schema constraints and unsafe defaults. Never report resolved environment values or credential references in refusal output. Record component, declaration name and typed reason only. | Mismatched source revision blocks export completely.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 191
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R063.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Emit EnvironmentDeclarationExport with outcome, component_digest, source_revision and schema_version. Include declaration_count, sorted declaration digest and unresolved call-site count. Record source census digest covering all tracked reads and forwarding paths. Hash canonical UTF-8 JSON. An independent reader reproduces both digests from sealed inputs. | Reproducible digest validates declaration completeness without runtime values.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 192
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R063.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** `tests/test_environment_declaration_served.py::test_sdk_and_au_export_and_compose` calls the real SDK and AU environment_declarations operations and feeds both exports to the Arbora launcher startup validation. Observe declarations cover all tracked settings and indirect reads. Missing or conflicting declarations block startup with refusal, not partial acceptance. Verify no live environment value appears in export. | Served composer accepts valid declarations and rejects incomplete or conflicting sets.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 193
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R064",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Default vault storage and enterprise root-bundle propagation across deployed components",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Default vault storage and enterprise root-bundle propagation across deployed components.** Arbora guided deployment selects default vault storage and enterprise root certificate bundle. The bundle propagates and verifies at every touched component during startup. Certificate verification is mandatory, never bypassed. Guided setup documents the complete propagation matrix. | Rows R058.1 to R058.6 bind.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 197
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R064.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Define immutable VaultStorageConfig with fields vault_endpoint, storage_backend, and auth_mode. Define RootBundleManifest with component, bundle_digest, verification_status and deployment_revision. Each component lists verified issuer names and rejection criteria. Propagation matrix lists touched systems by component and root-bundle status. | Validate backend names and auth modes. Reject duplicate components in matrix.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 198
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R064.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** Guided deployment offers default vault endpoint and bundle location. SDK components and deployable services receive the bundle before initialization. Each component verifies every upstream peer and backend certificate chain against the bundle. Certificate verification never silences or bypasses unverified chains. Mismatch causes startup refusal. The propagation matrix must name all touched systems before deployment execution. | Once deployed, no certificate bypasses are reachable.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 199
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R064.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** Agent_connector_sdk.http.tls provides default bundle loader and verification. Agent_connector_sdk.http.egress applies verification in check_egress_destination (R028.1) and pinned_egress_transport (R028.1). Arbora launcher loads bundle at startup. Arbora guided-deployment command builds and documents the propagation matrix. Existing TLS and HTTPS client calls reuse the loaded bundle. | Served startup and certificate chain validation with the default bundle.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 200
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R064.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Startup refuses missing vault endpoint or root bundle before any component initializes. Refusal occurs when bundle verification fails, issuer is unknown, or certificate chain is broken. Report component and verification result only. Never include certificate details or secret material in refusal. | Each refusal preserves zero startup state.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 201
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R064.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Record vault endpoint, storage backend, bundle digest and verification status per component. Record propagation matrix revision and all touched systems. Record deployment decision timestamp and bundle load source. Join Arbora deployment receipt. | Independent bundle audit reproduces digest without secret material.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 202
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R064.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** `tests/test_vault_bundle_propagation_served.py::test_guided_deployment_and_verified_startup` uses the real Arbora guided-deployment command with default vault and bundle options. Observe bundle propagation to all touched components. Verify every component verifies the bundle on startup. Try a certificate chain mismatch and verify startup refusal without partial initialization. | Served deployment command, bundle loading and chain verification exercise the full matrix.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 203
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R065",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Component health endpoint distinguishes not-configured from configured-but-unavailable. Alerts fire only for enabled components",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Component health endpoint distinguishes not-configured from configured-but-unavailable. Alerts fire only for enabled components.** Health endpoint states explicitly separate unconfigured components from degraded or failing enabled ones. Alert evaluation checks component enabled flag before issuing alert. Configuration state and alert gating are served in the host health response. | Rows R059.1 to R059.6 bind.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 207
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R065.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Define immutable ComponentHealthState with fields component_id, state, configuration_status, enabled, last_check_time and optional availability_reason. State enum: healthy, degraded, unavailable, not_configured. Configuration_status: disabled, not_initialized, initialized. Enabled is boolean. Include alert_suppression_reason when applicable. | Validate state and configuration_status enums. Reject contradictory state and configuration pairs.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 208
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R065.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** Unconfigured components report state not_configured and configuration_status not_initialized. Alerts suppress automatically for unconfigured components without alert_suppression_reason required. Configured but disabled components suppress alerts and must show disabled reason. Only enabled and initialized components trigger alerts on degraded or unavailable state. Alert evaluation checks enabled flag before alert generation. | Alerts never fire for unconfigured or disabled components.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 209
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R065.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** Agent_connector_sdk.host.component_health provides state classification and alert suppression. Agent_connector_sdk.host.messaging integrates health state into supervisor backend. Arbora /health endpoint queries component_health.list_states and applies enabled-only alert filter before evaluation. Existing messaging component definitions remain. | Served /health endpoint distinguishes all health states and alert eligibility.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 210
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R065.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Unknown state or configuration_status values are rejected. Contradictory pairs (unavailable and disabled, not_configured and initialized) cause refusal. Alert generation refuses for unconfigured or disabled components. Missing component_id or enabled flag blocks health response. | Invalid state values block health report.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 211
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R065.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Record component_id, state, configuration_status, enabled flag and last_check_time. Record alert_suppression_reason and applicable alert evaluation decision. Join supervisor backend receipt and alert sink notification. | Health audit confirms correct suppression for all non-enabled components.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 212
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R065.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** `tests/test_component_health_served.py::test_unconfigured_and_disabled_suppress_alerts` queries the real Arbora /health endpoint with configured and unconfigured components. Observe unconfigured components report not_configured state. Observe alerts suppress for both unconfigured and disabled components. Enable a component, degrade it and verify alert fires only then. Verify alert evaluation checks enabled flag independently. | Served health endpoint and alert evaluation exercise all component states.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 213
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R066",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "EG defines closed-loop load and headroom scaling proposals to Arbora with applied-state receipt",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**EG defines closed-loop load and headroom scaling proposals to Arbora with applied-state receipt.** EG provides scaled-hosting proposals based on load and headroom premises. Arbora applies the proposal and confirms accepted scaling in hosted application state. Scaling actuation loop closes when applied state is recorded and acknowledged. | Rows R060.1 to R060.6 bind.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 217
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R066.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Define the immutable ScalingProposal. Its fields are operation_id, load_premise_digest, headroom_premise_digest, proposed_instance_count, proposed_strategy and proposal_timestamp. Define AppliedScalingState with fields proposal_digest, accepted_instance_count, applied_timestamp and applied_strategy. Strategy enum: minimal, standard, burst. | Validate strategy enum. Reject missing digests or timestamps.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 218
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R066.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** EG generates one proposal per load and headroom evaluation using existing ARBORA-CAPACITY definitions. Proposal includes strategy choice. Arbora accepts or rejects the proposal. If accepted, Arbora applies the new instance count and records the applied state. The applied state digest is returned to EG. EG acknowledges receipt and closes the loop. A rejected proposal triggers no scaling. | Reuse of same premises produces identical proposal.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 219
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R066.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** EG producer is planned at agent_connector_sdk.scaling.propose_scaling. Arbora capacity consumer is arbora/control_plane/runs/capacity.py:53 (CapacityLedger.apply_proposal). Arbora returns applied state to EG loop. Reuse existing ARBORA-CAPACITY-R001 and R002 premise definitions. Connect EG decision reference to applied state receipt. | Served scaling loop observes proposal generation, acceptance and applied-state receipt.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 220
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R066.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** EG refuses proposal generation for missing or invalid premises. Arbora refuses accepted proposals with incompatible strategies or zero or negative instance counts. Refusal blocks scaling without partial application. Refused proposals permit retry with adjusted premises. Record refusal reason and typed cause. | Arbora refusal preserves current instance count.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 221
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R066.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Record proposal load_premise_digest, headroom_premise_digest and strategy. Record Arbora acceptance decision and applied instance count. Record EG acknowledgment and loop closure. Join decision reference and applied-state receipt digest. | Applied-state audit confirms proposal acceptance and instance count alignment.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 222
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R066.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** `tests/test_eg_scaling_served.py::test_closed_loop_scaling_proposal_and_application` enters the real EG scaling producer and Arbora capacity consumer. Provide test load and headroom premises. Observe proposal generation, Arbora application decision and applied-state receipt. Verify EG acknowledgment closes the loop. Try a refused proposal and verify no scaling occurs but retry is permitted. | Served path exercises proposal generation, acceptance, application and loop closure.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 223
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R026.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Require explicit destructive confirmation across both supported MCP eras",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "851969957034",
        "c529b133556b",
        "d76f26e0e5fa"
      ],
      "verified_by": [
        "tests/test_mcp_confirmation_roundtrip.py:134",
        "tests/test_mcp_confirmation_roundtrip.py:178",
        "tests/test_mcp_confirmation_roundtrip.py:198",
        "tests/test_mcp_confirmation_roundtrip.py:36"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Require explicit destructive confirmation across both supported MCP eras.** The shared agent_connector_sdk.mcp.context.ctx_confirm_destructive gate uses the request and response schema supported by the live negotiated MCP session. Both generated method tools and action dispatch must pass this gate before a destructive backend invocation. Only explicit acceptance with the declared boolean confirmation value equal to true permits dispatch. A false value, decline, cancel, missing context, unsupported capability, malformed response, transport error, or cancelled request must not dispatch. Truthiness of a container or string is not confirmation. A compatibility path must not turn refusal into approval or repeat a destructive effect. | Served tools/call tests traverse registration, context, confirmation, and each real dispatch path to a controlled backend in both supported eras. Record exact protocol and package versions. For each path and era, explicit acceptance calls the backend exactly once; false, decline, cancel, missing/unsupported context, malformed data, and elicitation failure call it zero times. Include a truthy response object containing false and a nonboolean confirmation value. Verify cancellation does not reach the backend and nondestructive operations do not request confirmation. Helper-only tests do not satisfy acceptance.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 227
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R026.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "A manifest field named after a Python keyword keeps its wire name in the schema",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ec63e38e9b5d"
      ],
      "verified_by": [
        "tests/test_operation_tools.py:380"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**A manifest field named after a Python keyword keeps its wire name in the schema.** Some manifest parameter names are Python keywords, such as `from` or `in`. Such a parameter declares a different `python_name`, such as `from_`. The generated tool declares the parameter under `python_name`. A pydantic field alias carries the wire `name`. The input schema shows `name`, and a call validates `name`. The client method receives `python_name`. | `tests/test_operation_tools.py::test_keyword_field_is_exposed_under_its_wire_name`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 228
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Cross-platform advisory file locks",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d",
        "b1a75903b188"
      ],
      "verified_by": [
        "tests/test_connector_runtime_from_au.py:34"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Cross-platform advisory file locks.** `agent_connector_sdk.file_lock` provides `lock_exclusive`, `lock_exclusive_nb`, `lock_shared`, `lock_shared_nb` and `unlock` with POSIX `flock` and Win32 `LockFileEx` parity. A lost non-blocking acquire raises `LockUnavailable`, an `OSError`. | `tests/test_connector_runtime_from_au.py::test_r014_2_file_lock_exclusive_and_nonblocking` holds a lock, proves a second descriptor is refused, then acquires it after release.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 232
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Tool version metadata",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d",
        "b1a75903b188"
      ],
      "verified_by": [
        "tests/test_connector_runtime_from_au.py:53"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Tool version metadata.** `agent_connector_sdk.mcp.versioning.tool_version` stamps `__agentic_version__` and a `Version:` docstring line on an async MCP tool without changing its result. | `test_r014_3_tool_version_stamps_async_tool`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 233
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Reference-only CLI secrets",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d",
        "b1a75903b188"
      ],
      "verified_by": [
        "tests/test_connector_runtime_from_au.py:65"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Reference-only CLI secrets.** `agent_connector_sdk.credentials.runtime_references` accepts only bounded `env://`, `vault://` or `secret://` references. `env://` reads SDK configuration. The vault schemes resolve through the SDK credential resolver as `openbao://`. No error names the reference or the value. | `test_r014_4_runtime_secret_references` covers resolution, refusal, non-disclosure and the argparse action.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 234
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Operator base-URL egress guard",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d",
        "4f377bf3e39a",
        "b1a75903b188"
      ],
      "verified_by": [
        "tests/source_connectors/test_source_connectors.py:46",
        "tests/test_connector_runtime_from_au.py:83"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Operator base-URL egress guard.** `agent_connector_sdk.http.egress.validate_base_url` and `validate_base_url_resolved` refuse unsupported schemes, embedded credentials, and private, reserved or metadata addresses. They return the resolved addresses so the transport can pin them. `agent_connector_sdk.source_connectors.http_safety` is a second outbound read boundary for document sources. It reuses this classification, and it must fold into the governed client of R014.16. This row owns the capability that `SDK-SOURCE-INGEST-R801` named. | `test_r014_5_validate_base_url` covers literal and resolved refusal and loopback control.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 235
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "PII sanitizer",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d",
        "b1a75903b188"
      ],
      "verified_by": [
        "tests/test_connector_runtime_from_au.py:104"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**PII sanitizer.** `agent_connector_sdk.privacy_pii.PiiSanitizer` redacts PII patterns from text, dictionaries and nested payloads before a connector returns or persists them. | `test_r014_6_pii_sanitizer_redacts`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 236
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.7",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Connector state directories",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d",
        "b1a75903b188"
      ],
      "verified_by": [
        "tests/test_connector_runtime_from_au.py:111"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Connector state directories.** `agent_connector_sdk.paths` resolves `config_dir`, `data_dir`, `cache_dir`, `log_dir` and `research_dir` under XDG `agent-connectors`. Each directory has one `CONNECTOR_*_DIR` override. It holds no harness paths. | `test_r014_7_paths_honour_overrides`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 237
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.8",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Delegated-token helpers",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d",
        "b1a75903b188"
      ],
      "verified_by": [
        "tests/test_connector_runtime_from_au.py:122"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Delegated-token helpers.** `agent_connector_sdk.auth.delegation.is_delegation_enabled` and `get_delegated_token` wrap `DelegationSettings` and `exchange_token` for the served caller. Without a caller token they raise `LoginRequiredError`. | `test_r014_8_delegation_helpers`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 238
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.9",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Keyless credential sentinel",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d",
        "b1a75903b188"
      ],
      "verified_by": [
        "tests/test_connector_runtime_from_au.py:131"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Keyless credential sentinel.** `agent_connector_sdk.credentials.provider.NoCredential` is present and contributes no auth material. | `test_r014_9_no_credential`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 239
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.10",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Class-based API client base and auth strategies",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4f377bf3e39a",
        "afc686a65836"
      ],
      "verified_by": [
        "tests/httpsupport/test_httpsupport.py:27",
        "tests/httpsupport/test_pagination.py:17",
        "tests/test_connector_runtime_adds.py:50",
        "tests/test_connector_runtime_adds.py:79"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Class-based API client base and auth strategies.** `agent_connector_sdk.http.support` provides `BaseApiClient`, `AuthHeaderInjector`, `TokenAuth`, `BasicAuth` and `QueryApiKeyAuth`. The client joins relative endpoints under its base URL and returns a `status_code`/`data`/`rate_limit` envelope. It backs off a bounded number of times on HTTP 429 and retries once after HTTP 401 when the strategy can invalidate. It maps error statuses to the SDK exception types and redacts the strategy's secrets from raised messages. TLS comes from the runtime TLS profile, and `verify`/`cert`/`proxy`/`trust_env` overrides are refused. `agent_connector_sdk.httpsupport` is a second copy of these auth strategies, with pagination, rate-limit parsing and redaction. It must fold into `http.support` and the existing `http/pagination.py`, `redaction.py` and `retry.py`. This row owns the capability that `SDK-SOURCE-INGEST-R802` named. | `tests/test_connector_runtime_adds.py::test_r014_10_token_auth_envelope_and_error_mapping` and `test_r014_10_auth_strategies_and_retries` cover the header token, envelope, error mapping, redaction, destructive gate, 429 backoff, 401 refresh and TLS-override refusal.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 240
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.11",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Browser OAuth (PKCE) login",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "afc686a65836"
      ],
      "verified_by": [
        "tests/test_connector_runtime_adds.py:129"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Browser OAuth (PKCE) login.** `agent_connector_sdk.auth.browser` provides `generate_pkce` (S256) and `BaseBrowserAuthManager`. The manager runs the loopback authorization-code flow and refreshes tokens inside a skew window. It keeps tokens in a `TokenStore`. The default `FileTokenStore` writes owner-only (0600) files under the connector config directory. A configured direct API key takes precedence. The callback handler never logs the request line. | `tests/test_connector_runtime_adds.py::test_r014_11_browser_auth_pkce_store_and_refresh` covers the S256 challenge, the 0600 store, the proactive refresh and the API-key override.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 241
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.12",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "GraphQL schema discovery over a connector executor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "afc686a65836"
      ],
      "verified_by": [
        "tests/test_connector_runtime_adds.py:179"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**GraphQL schema discovery over a connector executor.** `agent_connector_sdk.mcp.graphql.ctx_graphql_list_types` and `ctx_graphql_get_type_details` send standard introspection queries through a sync or async connector executor and return its response. A failure returns a fixed `operation_failed` payload with the exception class and a correlation id. It never returns the exception message. | `tests/test_connector_runtime_adds.py::test_r014_12_graphql_helpers_sync_async_and_failure`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 242
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.13",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Per-record external access descriptor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "afc686a65836"
      ],
      "verified_by": [
        "tests/test_connector_runtime_adds.py:205"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Per-record external access descriptor.** `agent_connector_sdk.contracts.ExternalAccess` carries `is_public`, `user_emails`, `group_ids`, `read_roles` and `markings` for one record and refuses unknown fields. `ExternalAccess.public()` is world-readable. `default_external_access()` is quarantined under `CONNECTOR_UNCONFIGURED_MARKING` and is never public. | `tests/test_connector_runtime_adds.py::test_r014_13_external_access_descriptor`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 243
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.14",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Connector env-var drift check",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "afc686a65836"
      ],
      "verified_by": [
        "tests/test_connector_runtime_adds.py:222"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Connector env-var drift check.** `agent_connector_sdk.mcp.env_drift` diffs the variables a connector declares in `.env.example`, `mcp_config*.json` and `docker/*compose*.yml` against the variables its code reads. The read set covers literal reads, aliased constants, `Field(alias=...)`, `register_<tag>_tools` toggles, compose substitutions and declared dynamic families. It reports `DEAD` and `UNDOCUMENTED` findings. `scripts/` reads and the SDK's own reads only suppress `DEAD`. `python -m agent_connector_sdk.mcp.env_drift --check` exits 1 on drift. The module imports nothing from agent-utilities. | `tests/test_connector_runtime_adds.py::test_r014_14_env_drift_against_declarations` builds a connector with each read and declaration kind and checks the exact findings and the `--check` exit.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 244
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.15",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "External ACL sync into ingested documents",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ed3b2f7f83d5"
      ],
      "verified_by": [
        "tests/test_document_sources.py:216"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**External ACL sync into ingested documents.** `agent_connector_sdk.adapters.document_sources.access_properties` maps a source's `ExternalAccess` onto record properties: `access_public`, `access_read_roles` (`group:<id>`, `user:<email>` and provider-neutral roles) and `access_markings`. Every document a document source emits carries them. A source without a configured ACL emits the quarantined descriptor, never public. | `tests/test_document_sources.py::test_connector_ingestion_syncs_external_acl`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 245
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.16",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "DNS-pinned egress on the governed client",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d"
      ],
      "verified_by": [
        "tests/test_http_dns_pinned_egress.py:103",
        "tests/test_http_dns_pinned_egress.py:115",
        "tests/test_http_dns_pinned_egress.py:122",
        "tests/test_http_dns_pinned_egress.py:135",
        "tests/test_http_dns_pinned_egress.py:143"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**DNS-pinned egress on the governed client.** `HttpClientOptions` carries `pin_egress`, `allowed_private_hosts`, `allow_loopback` and `verify_pinned_peer`, with the semantics of the agent-utilities `create_http_client`. With `pin_egress`, each request is resolved once and refused unless every address is public, or the host is named in `allowed_private_hosts` and resolves only into RFC 1918, RFC 6598, ULA or loopback space. The client dials only the pinned address, keeps `Host` and SNI, refuses plaintext public egress, URL credentials and a peer that differs from the pin. The allow-list takes exact hostnames only and needs `pin_egress`; a proxy is refused. | `tests/test_http_dns_pinned_egress.py` proves each refusal and the pinned request for sync and async clients.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 246
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.17",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "MCP-free base install",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d",
        "81ea3e4bedac"
      ],
      "verified_by": [
        "tests/test_base_install_mcp_free.py:35",
        "tests/test_base_install_mcp_free.py:58",
        "tests/test_base_install_mcp_free.py:75"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**MCP-free base install.** `pip install agent-connector-sdk` carries the protocol types (`mcp-types`) and no MCP runtime: `fastmcp` and `mcp` are the `mcp` extra, installed as `agent-connector-sdk[mcp]`. The ports, pack builder, runner, sinks, delegation helpers and `exposure` import without the extra. `agent_connector_sdk.mcp` and `agent_connector_sdk.transports.mcp` raise `ImportError` that names `agent-connector-sdk[mcp]`. Connectors depend on `agent-connector-sdk[mcp]`. | `tests/test_base_install_mcp_free.py` blocks `fastmcp` and `mcp` and imports the base modules, then the refusal for the MCP surface.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 247
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.18",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Default fail-closed served security profile",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d",
        "81ea3e4bedac"
      ],
      "verified_by": [
        "tests/test_served_security_and_provider_profile.py:116",
        "tests/test_served_security_and_provider_profile.py:140",
        "tests/test_served_security_and_provider_profile.py:150",
        "tests/test_served_security_and_provider_profile.py:42",
        "tests/test_served_security_and_provider_profile.py:50"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Default fail-closed served security profile.** `agent_connector_sdk.mcp.served_security.apply_served_security_profile` ports the agent-utilities served profile into the `mcp` extra. For `streamable-http` and `sse` it refuses to start without a constructed auth provider and a token audience, and installs `ServedSecurityMiddleware`. The middleware refuses every MCP request without a verified subject, a tenant claim (`tenant_id`, `tenant`, `org_id`, `tid`, `org`), an active session and every scope in `CONNECTOR_REQUIRED_SCOPES`. `create_mcp_server` applies it to every server. The only opt-out is an explicit `ServedSecurityOverride` with a written reason, logged at warning level. `stdio` is untouched. Static tokens may carry `tenant_id`. | `tests/test_served_security_and_provider_profile.py::test_r014_18_*` prove each refusal, the default application by `create_mcp_server`, the logged override and the static tenant claim.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 248
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.19",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Selected-provider credential profile",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d"
      ],
      "verified_by": [
        "tests/test_served_security_and_provider_profile.py:185",
        "tests/test_served_security_and_provider_profile.py:211",
        "tests/test_served_security_and_provider_profile.py:258",
        "tests/test_served_security_and_provider_profile.py:264"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Selected-provider credential profile.** `agent_connector_sdk.credentials.provider_profile` parses `PROVIDER_CONFIGS` into reference-only profiles (`env://`, `vault://`, `secret://` only; unique keys; bounded; an endpoint requires one TLS selector). `resolve_selected_provider_profile` resolves the profile named by `AGENT_PROVIDER_PROFILE` into an in-memory endpoint (HTTPS, or loopback HTTP), credentials, selectors and TLS profile. `close` drops the values and removes materialized TLS files. Failures are stable codes that never carry a reference or value. | `tests/test_served_security_and_provider_profile.py::test_r014_19_*` cover resolution and close, each failure code and each invalid document.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 249
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.20",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Plugin entry-point groups use the SDK namespace",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "15b099abed9d"
      ],
      "verified_by": [
        "tests/test_served_security_and_provider_profile.py:273"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Plugin entry-point groups use the SDK namespace.** Every entry-point group the SDK declares, reads or documents is `agent_connector_sdk.<x>`: `source_adapters`, `artifact_kinds`, `transports`, `sinks` and `skill_providers`. No `agent_utilities.<x>_providers` group remains. | `tests/test_served_security_and_provider_profile.py::test_r014_20_entry_point_groups_use_the_sdk_namespace` checks the declared groups and scans the package for the old names.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 250
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.22",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "External embedding API client",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "da3aa0ab05a4"
      ],
      "verified_by": [
        "tests/test_embeddings.py:17"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**External embedding API client.** `agent_connector_sdk.embeddings.create_embedding_model` returns a cached `EmbeddingModel`. It serves a connector that keeps vectors in its own external store. The endpoint is a `/v1/embeddings` wire endpoint or a local model server (`openai` or `ollama` provider). `EMBEDDING_*` settings select provider, model, base URL, key reference, private hosts and plaintext. The key is a runtime secret reference sent as bearer auth. Requests are DNS-pinned, never redirected, and errors never echo the response body. Content epistemic-graph ingests is embedded by epistemic-graph. | `tests/test_embeddings.py`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 251
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.23",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Typed epistemic-graph compute adapter",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "da3aa0ab05a4"
      ],
      "verified_by": [
        "tests/test_compute_adapter.py:19"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Typed epistemic-graph compute adapter.** `agent_connector_sdk.compute.EngineCompute` gives a connector one typed path to epistemic-graph compute. `select_algorithms` reads, by SPARQL over the connector's imported ontology pack, the algorithms bound to an analysis (`appliesAlgorithm`) and the served method (`servedBy`, `servedOp`) for each. `run` calls that method. An unbound analysis, a missing client method, or `METHOD_NOT_YET_SERVED` raises `MethodNotServedError`; the connector keeps no local re-implementation. `connect_compute` connects from `EngineSettings` with only `compute:finance` and `sparql:read` scopes. | `tests/test_compute_adapter.py`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 252
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.24",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Engine audience from the environment",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "16cb53774404"
      ],
      "verified_by": [
        "tests/test_compute_adapter.py:128"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Engine audience from the environment.** `EngineSettings.from_settings` reads the token audience from `EPISTEMIC_GRAPH_AUDIENCE`. The default is `epistemic-graph`. `verified_context` signs that audience into its claims. A deployed engine can then expect another audience, such as `agent-services`. | `tests/test_compute_adapter.py::test_r014_24_audience_from_environment`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 253
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.25",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK-consumed env vars are never drift",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "eb0b3b299f31"
      ],
      "verified_by": [
        "tests/test_connector_runtime_adds.py:269"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK-consumed env vars are never drift.** `agent_connector_sdk.tls.selection` exports `SDK_CONSUMED_ENV` (the global TLS profile and CA settings) and `SDK_CONSUMED_ENV_PATTERNS` (the per-service `<SERVICE>_TLS_PROFILE`, `<SERVICE>_TLS_PROFILE_REF` and `<SERVICE>_<TLS setting>` names), both derived from the settings the TLS selection reads. `env_drift` never reports a declared variable in that set as `DEAD`, so a connector may declare them in `.env.example` without reading them in its own code. | `tests/test_connector_runtime_adds.py::test_r014_25_sdk_consumed_env_not_dead` declares the TLS profile variables for a connector that reads none and checks no finding, and checks a non-SDK variable is still `DEAD`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 254
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.26",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Server parser settings are never drift",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "682810f22bdd"
      ],
      "verified_by": [
        "tests/test_connector_runtime_adds.py:286"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Server parser settings are never drift.** `agent_connector_sdk.mcp.parser` exports `PARSER_ENV`, the settings behind its flag defaults, such as `MCP_ALLOWED_HOSTS` and `MCP_TRUSTED_PROXY_CIDRS`. `env_drift.SDK_CONSUMED_ENV` includes them. A connector may declare them without reading them in its own code. | `tests/test_connector_runtime_adds.py::test_r014_26_parser_settings_not_dead` declares parser settings for a connector that reads none and checks no finding.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 255
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R068",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Each connector serves its seed graph and contract resources for first connect (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Each connector serves its seed graph and contract resources for first connect (rollup).** Each connector serves its seed graph as a native MCP resource beside `connector://resources` and the `ontology://` resources (`SDK-CONNECTOR-CONTROL-R019`). The seed graph holds instance identity, the object catalog and references only. The connector emits `notifications/resources/list_changed` when a served digest changes. The engine import is `EG-TYPED-PACKS-R104`. Pack authoring is `SDK-CONNECTOR-CONTROL-R067`. Children `.1` to `.6` deliver it. | See each child.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 256
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R068.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Add `SeedGraphDeclaration{instance_iri, identity, catalog, references}` in `agent_connector_sdk/manifest/seed_graph.py`. Add `SEED_RESOURCE_URI` as `seed://<connector>/seed.ttl` in `agent_connector_sdk/mcp/content.py` beside `MANIFEST_RESOURCE_URI` (line 46). Proving test: `tests/test_seed_graph.py::test_seed_declaration_round_trips`. | A round trip keeps every field and refuses a blank instance IRI.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 257
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R068.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** `emit_seed_turtle` writes deterministic, sorted Turtle in three parts: identity, catalog and references. Each part carries its SHA-256 digest. The catalog comes from connector discovery (`agent_connector_sdk/discovery.py`). The seed graph must stay under 50,000 triples and 8 MiB. Proving test: `tests/test_seed_graph.py::test_seed_turtle_is_deterministic`. | Two emissions of one declaration are byte-identical, with one digest per part.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 258
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R068.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** `register_connector_content` (`agent_connector_sdk/mcp/content.py:163`) registers the seed resource. A digest change sends `notifications/resources/list_changed` through the server session. Proving test: `tests/test_seed_graph.py::test_server_registers_seed_and_notifies`. | A served connector lists the seed resource, and a digest change sends one notification.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 259
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R068.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Emission must refuse a row-valued property with `seed_bulk_data`. It must refuse a seed graph over the limit with `seed_too_large`. A connector without a seed declaration must serve no seed resource. Proving test: `tests/test_seed_graph.py::test_seed_refusals`. | Each case raises its code, and no seed resource is served.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 260
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R068.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Each served contract resource must carry its digest in the resource metadata. Certification must record the digests the engine accepted. Proving test: `tests/test_seed_graph.py::test_resource_metadata_carries_digest`. | The resource metadata digest equals the digest of the body.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 261
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R068.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** The entry point is a real connector server over MCP. An MCP client lists and reads the manifest, ontology and seed resources. The test changes the catalog and observes `list_changed`. Proving test: `tests/test_seed_graph_served.py::test_connector_serves_contract_resources_and_notifies`. | The client reads all three resource kinds, and the change sends one notification with a new seed digest.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 262
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R069",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Connector transports are declared contracts per connection protocol (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Connector transports are declared contracts per connection protocol (rollup).** Each connection protocol has one SDK transport and one access-contract term. The pack states the protocol, the authentication model, the paging or streaming form and the pushdown capabilities. Certification refuses a declared protocol without a transport. Engine planning over each protocol is `EG-FEDERATED-QUERY-R073.2`. The protocol table is in `plan.md`. Children `.1` to `.6` deliver it. | See each child.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 263
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R069.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Extend `ACCESS_KINDS`, `PAGINATION_MODES` and `PUSHDOWN_OPS` (`agent_connector_sdk/_contract_fields.py:9`) with every protocol of the table. Add `STREAM_MODES`, `AUTH_MODELS` and the pushdown values `aggregate`, `join` and `time_range`. Add `TransportContract{protocol, auth_model, paging, streaming, pushdown}` in `agent_connector_sdk/transports/contract.py`. Proving test: `tests/test_transport_contract.py::test_transport_contract_round_trips`. | A round trip keeps every field and refuses an unknown protocol or pushdown value.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 264
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R069.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** Each transport registers its protocol in one registry in `agent_connector_sdk/transports/__init__.py`. A stream protocol must declare `time_range` as its only pushdown. The access-contract parser reads the transport terms from the pack Turtle. Proving test: `tests/test_transport_contract.py::test_registry_one_transport_per_protocol`. | The registry holds one transport per protocol, and a stream contract with a filter refuses.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 265
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R069.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** The access-contract parser (`SDK-CONNECTOR-CONTROL-R021`) reads the transport terms. Certification checks each declared protocol against the registry before it records a pack. Proving test: `tests/test_transport_contract.py::test_certification_checks_registry`. | Certification of a pack reaches the registry check.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 266
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R069.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Certification must refuse a protocol without a transport with `transport_unimplemented`. It must refuse a pushdown value that the transport does not support with `pushdown_unsupported`. It must refuse a second transport for one protocol with `duplicate_transport`. Proving test: `tests/test_transport_contract.py::test_transport_refusals`. | Each case refuses with its code.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 267
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R069.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Certification must write the protocol matrix of the connector into `ontology/certification.json`. Each entry names the transport module and its version. Proving test: `tests/test_transport_contract.py::test_certification_records_matrix`. | The certification file lists every declared protocol with its transport module.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 268
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R069.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** The entry point is the SDK certification command against a running engine. The test certifies a connector with REST, GraphQL and MCP consuming contracts. It then runs one virtual read through each transport. Proving test: `tests/test_transport_contract_served.py::test_declared_transports_serve_virtual_reads`. | Each read returns rows through its declared transport, and the engine records the protocol.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 269
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R014.21",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Reusable A2A protocol module",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Reusable A2A protocol module.** `agent_connector_sdk.a2a` carries the A2A agent card and skill models and the message and task types in the base install. It also carries a bounded JSON-RPC client: `message/send` then `tasks/get` polling, fixed failure messages and no remote error echo. `create_a2a_app` builds the server-side fasta2a app from a broker and storage that the caller passes in. It needs the optional `a2a` extra (fasta2a, starlette). The SDK holds no task store. A2A is one connection protocol of the transport matrix, `SDK-CONNECTOR-CONTROL-R069`. Received from agent-utilities, which no longer serves A2A; arbora mounts the app behind its admission and auth. | `tests/test_a2a_protocol.py::test_r014_21_*` cover the card and task wire forms, send-then-poll, error redaction, card validation and the extra's import error.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 270
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R700",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Declared semantic coverage refusal",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "91301b15d255"
      ],
      "verified_by": [
        "tests/test_certify_declared_coverage.py:15"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Declared semantic coverage refusal.** `agent_connector_sdk.certify.declared_coverage` parses the SHACL target classes and property paths a connector declares into a frozen `DeclaredSemanticCoverage` in one linear pass over the shapes text, and `require_covers` refuses with `DeclaredSemanticCoverageError` unless every declared record type is a target class and all four provenance paths (`sourceRecordRef`, `tenantReference`, `accessPolicyReference`, `provenanceReference`) are present. Budget: p50 under 1 ms and p99 under 5 ms for a 100 KiB shapes text, memory under 2 MiB. | `tests/test_certify_declared_coverage.py` asserts acceptance and both refusal causes.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 272
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R701",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Bundle-based lifecycle certification (definition only, awaiting implementation)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Bundle-based lifecycle certification (definition only, awaiting implementation).** The SDK owns governed connector lifecycle certification over a capability bundle. The bundle holds a policy with limits, a reference driver and a live driver. It also holds a source attestation that claims structure only and never live success, and an installed command-line entry point. The attestation declares compatibility bands for the SDK and the engine only; no agent-harness band. Manifest to ontology compilation is the engine's (`EG-TYPED-PACKS-R097`), not an SDK emitter. Budget: certification of one bundle under 2 s p99 with memory under 128 MiB. | Rows `.1` onward add the implementation and its tests; until then this row is verified by none.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 273
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R900",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Source credentials by source name (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Source credentials by source name (rollup).** `agent_connector_sdk.credentials.source` builds typed credentials (keyless, API key, cookie session, basic and refreshing OAuth2) from descriptors that hold only secret references. `SourceCredentials` looks them up by source name from `SOURCE_CREDENTIALS`. `agent_connector_sdk.credentials.sensitivity` decides which configuration keys a tool surface must redact. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 274
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R900.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** `AuthMaterial`, `SourceCredential`, its five kinds, `build_credential` and `SourceCredentials` are the public surface. | `tests/test_source_credentials.py::test_descriptor_materializes_request_auth`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 275
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R900.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** An OAuth2 credential refreshes inside a 30-second expiry skew. A failed refresh sends no header. | `tests/test_source_credentials.py::test_oauth2_refreshes_inside_the_expiry_skew_with_an_injected_clock`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 276
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R900.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** References resolve through `agent_connector_sdk.credentials.resolution.resolve_secret_reference`. Token refresh uses `agent_connector_sdk.tls.resolve`. | `tests/test_source_credentials.py::test_registry_caches_degrades_and_reports_status_without_values`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 277
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R900.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/test_source_credentials.py:77"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** A literal secret, a non-SDK reference scheme, inline cookie or refresh-token material and a TLS verification override are refused. An unbuildable descriptor degrades to keyless. | `tests/test_source_credentials.py::test_inline_material_and_non_reference_secrets_are_refused`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 278
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R900.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Tests use an in-memory resolver and an injected clock. `status` never returns a secret value. | `tests/test_credential_sensitivity.py::test_key_sensitivity`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 279
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R900.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/test_source_credentials.py:137"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** The entry point is `SourceCredentials.get`. The proof gets one source twice and receives the same cached credential. | `tests/test_source_credentials.py::test_registry_caches_degrades_and_reports_status_without_values`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 280
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R901",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Identifier gate and datapoint signing (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Identifier gate and datapoint signing (rollup).** `agent_connector_sdk.identifiers` validates graph and SQL names before they are written into query text. `agent_connector_sdk.signing` signs and verifies catalog datapoints with Ed25519 over canonical JSON. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 281
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R901.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** `InvalidIdentifierError`, `validate_identifier`, `validate_sql_identifier`, `quote_sql_identifier`, `sign_datapoint`, `verify_datapoint` and `public_key_b64` are the public surface. | `tests/test_identifiers.py::test_quote_sql_identifier_returns_a_quoted_name`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 282
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R901.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** A graph name has at most 128 characters and a SQL name at most 63. A signature verifies for any key order of the same datapoint. | `tests/test_signing.py::test_signature_round_trips_over_canonical_json`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 283
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R901.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** `UniversalConnector` quotes every introspected table name with `quote_sql_identifier`. The signing seed comes from `ARD_SIGNING_PRIVATE_KEY` through `agent_connector_sdk.config.setting`. | `tests/test_signing.py::test_configured_seed_is_used_and_malformed_seed_is_refused`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 284
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R901.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/test_identifiers.py:27",
        "tests/test_signing.py:21",
        "tests/test_signing.py:42"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** A hostile name raises `InvalidIdentifierError` and the message never holds the name. Verification fails closed on any mismatch. A malformed seed raises `SigningKeyError`. | `tests/test_identifiers.py::test_hostile_names_are_refused_without_echo`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 285
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R901.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** Tests cover hostile names, length limits, tampered datapoints, wrong keys and malformed signatures. | `tests/test_signing.py::test_any_mismatch_fails_closed`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 286
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R901.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/test_signing.py:42"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** The entry point is `verify_datapoint`. The proof verifies a datapoint signed with a configured seed. | `tests/test_signing.py::test_configured_seed_is_used_and_malformed_seed_is_refused`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 287
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R902",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Connector tools declare and receive an acting user (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Connector tools declare and receive an acting user (rollup).** A connector tool may require an acting user. The SDK must declare that need and bind the forwarded user for each call. Children `.1` to `.6` deliver it. | Satisfied only when `.1` to `.6` are verified.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 288
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R902.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Add `requires_actor: bool` to the tool declaration in the connector manifest. The default is false. `ActorContext` in `agent_connector_sdk/identity.py:40` holds the bound user. | A unit test reads the flag from a fixture manifest.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 289
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R902.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** For each call, the MCP transport must verify the forwarded delegated token and bind its subject with `use_actor`. A tool without the flag runs under the process actor. | Tests cover one actor-required call and one ordinary call.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 290
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R902.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** The MCP server factory binds the actor before the tool body runs. `current_actor()` in `agent_connector_sdk/identity.py:68` then returns the user. ARBORA-IDENTITY-R028 sends the token. | A served test calls an actor-required tool with a forwarded token and reads the subject.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 291
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R902.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** An actor-required call without a valid delegated token must raise `IdentityRequiredError`. A token for another audience must refuse with `IDENTITY_AUDIENCE_MISMATCH`. | A served test asserts each refusal and no upstream call.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 292
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R902.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** The connector trace event must name the actor subject and the audience. It must hold no token text. | A test reads the trace event and asserts no token.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 293
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R902.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** The entry point is a served MCP tool call with a forwarded token. Token verification must add under 5 ms p99. | `tests/test_actor_forwarding_served.py::test_actor_required_tool_binds_forwarded_user` passes.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 294
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R067",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "The SDK authors each connector pack as Turtle from typed declarations (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**The SDK authors each connector pack as Turtle from typed declarations (rollup).** One typed declaration per connector is the single source of truth. The SDK emits its domain ontology, ingest contract and surface as Turtle under the engine's connector-pack vocabulary. The SDK imports the pack into the engine. Manifests and mapping files become generated views. Children `.1` to `.9` deliver it. Engine owners: `EG-TYPED-PACKS-R101`, `EG-TYPED-PACKS-R102`, `EG-TYPED-PACKS-R103`. | Rollup closes when every child `.1` to `.8` passes its proving test.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 298
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R067.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Add `ConnectorPackDeclaration` in new file `agent_connector_sdk/manifest/pack_declaration.py`. It holds connector identity, contract version and source objects with ontology class IRIs. It also holds field mappings, key rules, cursor policy, access policy, privacy classes and provenance requirements. It lists features, tools, prompts, skills and their domain classes. Each nested source value is a typed relationship to a declared node. The declaration admits no nested dictionary property, such as a `sourceProperties` map. | `tests/test_pack_declaration.py::test_declaration_round_trip_and_nested_property_refusal`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 299
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R067.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** Add `emit_pack_turtle(declaration)` in new file `agent_connector_sdk/manifest/pack_turtle.py`. It emits deterministic, sorted Turtle with absolute IRIs and no blank nodes. It uses only `cp:` and `vg:` terms from the engine's `connector_pack-v1` module. It replaces `compile_manifest_ontology` (`agent_connector_sdk/manifest/ontology_pack.py:190`). The SDK retires its own `ac:` vocabulary (`agent_connector_sdk/ontology/access_contract.ttl`). | `tests/test_pack_turtle.py::test_emit_is_deterministic_and_uses_engine_terms`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 300
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R067.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** The SDK renders `ontology/mappings/source.yaml` from the declaration as a generated view. Certification compares the view with a fresh render. A hand edit fails certification. The tool-schema fingerprint domain at `agent_connector_sdk/manifest/tool_schema.py:31` must use an SDK-owned algorithm id. That id must not name another package. Every fingerprint the SDK computes uses the new id. | `tests/test_pack_declaration.py::test_views_render_and_fingerprint_id_is_sdk_owned`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 301
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R067.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** The SDK must validate the emitted Turtle before import. It calls the engine's `ShaclValidate` method with inline triples (`EG-TYPED-PACKS-R098`). The SDK does not hold its own SHACL engine. A runtime domain ontology revision uses the engine's `ImportOntology` operation (`EG-TYPED-PACKS-R103`). | `tests/test_pack_turtle.py::test_preflight_uses_engine_validation`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 302
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R067.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** `build_connector_content_pack` (`agent_connector_sdk/artifacts/pack.py:159`) adds one `contract://<connector>` entry from `emit_pack_turtle`. The certification command publishes it through the generated `ConnectorPackClient`. Every connector calls the same path; no connector writes Turtle by hand. | `tests/test_pack_turtle.py::test_content_pack_carries_contract_entry`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 303
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R067.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** Declaration loading must refuse an unresolved ontology class and a nested dictionary property. It must also refuse a duplicate mapping and a source object without a key rule. Each refusal names the field. An engine import refusal must reach the caller with its typed code unchanged. | `tests/test_pack_declaration.py::test_declaration_refusals_name_the_field`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 304
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R067.7",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Evidence.** The pack must carry the declaration digest. `ontology/certification.json` must record the contract digest that the engine accepted. A reader can tell whether a connector's views and pack come from one declaration. | `tests/test_pack_declaration.py::test_certification_records_accepted_contract_digest`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 305
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R067.8",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** The entry point is the SDK certification command against a running engine. The test declares a connector with one source object, one tool and one skill. It certifies the connector and reads the contract and surface through the engine's served SPARQL method. A changed declaration must produce a new contract revision. A hand-edited view must fail certification. | `tests/test_pack_rdf_served.py::test_declaration_to_engine_pack_end_to_end`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 306
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R780",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK helpers replace the retired agent-utilities harness modules",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK helpers replace the retired agent-utilities harness modules.** Connectors import actor identity, exceptions, the governed HTTP client, TLS profiles and value helpers from the SDK. Seven agent-utilities modules had SDK replacements. Five children prove the delivered part. `SDK-CONNECTOR-CONTROL-R780.6` holds the remainder. | Closes when every child closes.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 307
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R780.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Actor type",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "889be6e354c7"
      ],
      "verified_by": [
        "tests/test_au_helper_parity.py:15"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Actor type.** `agent_connector_sdk.identity.ActorType` has the five members `human`, `ai_agent`, `automated_service`, `hybrid_team` and `system`. The value never grants authorization. It replaces `agent_utilities.security.actor_identity`. | `tests/test_au_helper_parity.py::test_actor_type_members_match_the_retired_enum`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 308
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R780.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Exceptions",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "889be6e354c7"
      ],
      "verified_by": [
        "tests/test_au_helper_parity.py:27"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Exceptions.** `agent_connector_sdk.exceptions` defines `AuthError`, `ApiError`, `UnauthorizedError`, `MissingParameterError`, `ParameterError` and `LoginRequiredError`. `UnauthorizedError` is an `AuthError`. It replaces `agent_utilities.core.exceptions`. | `tests/test_au_helper_parity.py::test_all_six_exceptions_keep_their_hierarchy`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 309
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R780.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Governed HTTP client and retry",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "889be6e354c7"
      ],
      "verified_by": [
        "tests/test_au_helper_parity.py:42"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Governed HTTP client and retry.** `create_http_client` and `create_async_http_client` wrap one transport in the retry policy. `RetryPolicy` rejects an attempt count outside 1 to 10. A 503 on an idempotent request retries. Pinned egress is `SDK-CONNECTOR-CONTROL-R014.16`. | `tests/test_au_helper_parity.py::test_governed_client_retries_an_idempotent_request`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 310
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R780.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "TLS profile resolution",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "889be6e354c7"
      ],
      "verified_by": [
        "tests/test_au_helper_parity.py:61"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**TLS profile resolution.** `agent_connector_sdk.tls.resolve.resolve_tls_profile` resolves a selected profile to a `ResolvedTLSProfile`. `SDK-CONNECTOR-CONTROL-R017` owns the rules. It replaces the profile part of `agent_utilities.core.transport_security`. | `tests/test_au_helper_parity.py::test_tls_profile_resolver_is_exported` with `tests/test_tls_profiles.py` (R017).",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 311
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R780.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Value helpers and configuration projection",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "889be6e354c7"
      ],
      "verified_by": [
        "tests/test_au_helper_parity.py:66"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Value helpers and configuration projection.** `agent_connector_sdk.utilities` provides `to_boolean`, `to_integer`, `to_float`, `to_list`, `to_dict` and `get_logger`. `load_config` projects one JSON document into the environment without overriding it (`SDK-CONNECTOR-CONTROL-R016`). | `tests/test_au_helper_parity.py::test_value_coercions_and_logger` with `tests/test_foundation.py` (R016).",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 312
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R780.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Remainder with no SDK equivalent",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Remainder with no SDK equivalent.** Six helpers have no SDK equivalent. They are environment-variable expansion in value helpers, the air-gap transport guard, the `requests` session factory and standard request headers. The others are TLS resolution from configuration keys and the generic retry, fallback and timeout runner. The SDK has no generic callable retry runner. The one agents importer of the runner moves to `RetryPolicy` or to this row. The 7,903-line `AgentConfig` stays in agent-utilities as harness plumbing. | A conformance case for each helper before agent-utilities deletes the module.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 313
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R781",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Training-trajectory recorder helper",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Training-trajectory recorder helper.** `agent_connector_sdk.writeback` gains a helper that records one trajectory through `eg.graph.StartTrajectory` and `eg.graph.AppendStep`. It reads returns through `eg.graph.DiscountedReturn` and `eg.graph.BestTrajectory`. It passes training samples to `eg.compute.DsGrpoSurrogate`, `eg.compute.DsDpoLoss` and `eg.compute.MineText`. It adds no engine method. Consumers: the data-science connector training-data and task-corpus tools; arbora training signals. Parity row: `EG-DECISION-ENGINE-R751`. | `tests/test_trajectory_recorder.py` runs the helper against a fake engine client. It asserts the call order, that a failed step leaves no open trajectory, and the typed unavailable result.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 314
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R782",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Message-stream adapters normalize into change envelopes",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Message-stream adapters normalize into change envelopes.** A stream adapter reads through `eg.messaging.StreamRead` and `eg.messaging.CdcRead`. It maps each record to an `EventEnvelope` and then to change-envelope drafts for `eg.transactions.ApplyChangeEnvelopeDrafts`. It commits the offset through `eg.messaging.StreamCommitOffset` only after the engine accepts the batch. A rejected batch leaves the offset unchanged. Consumer: the stream-broker connector. Parity rows: `EG-UNIFIED-DATA-PLANE-R710` and `EG-UNIFIED-DATA-PLANE-R711`. Those rows are absent from the engine main branch. | `tests/test_stream_adapter.py` asserts the record mapping, the offset commit after acceptance, an unchanged offset after rejection, and a replay that adds nothing.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 315
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R070",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Current-plan boundary models",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ea6e90065040"
      ],
      "verified_by": [
        "tests/test_current_plan.py:16"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Current-plan boundary models.** `agent_connector_sdk.current_plan` exports strict frozen `CurrentPlanRequest`, `PlanItem`, `CurrentPlanSnapshot` and `CurrentPlanRead`. The request has only nonempty `run_id` (maximum 512 characters). A snapshot has that run ID, nonnegative integer revision, UTC observation and strictly later UTC expiry, and immutable ordered items with nonempty text and pending/in_progress/done status. Available requires a snapshot; unavailable requires null. Unknown fields, coerced values and malformed nested model instances are refused. JSON round trips preserve fields and order. | `tests/test_current_plan.py` covers valid empty and populated reads, round trips, immutability, malformed input and nested validation. No authority or current-time claim comes from constructing a DTO.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 321
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R071",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "One declared connector identity",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8ec791033514",
        "aa58c5dd6858",
        "e94990c8a480"
      ],
      "verified_by": [
        "tests/test_connector_identity.py:20",
        "tests/test_connector_run.py:140",
        "tests/test_connector_run.py:152",
        "tests/test_connector_run.py:161",
        "tests/test_connector_run.py:172"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**One declared connector identity.** A connector declares its fleet name once, in its package metadata. The fleet name is the name arbora and epistemic-graph use, for example `searxng-mcp`. The declaration is the single entry point of the `agent_connector_sdk.connector` group. Its value is the connector's top-level package, or `<package>:<attribute>` naming its `Connector` value (`SDK-CONNECTOR-CONTROL-R019.1`). `agent_connector_sdk.connector_identity.connector_name(package)` resolves the installed name. An uninstalled source checkout falls back to the declaration in the `pyproject.toml` beside its package. `declared_connector_name(pyproject)` reads the name without an install, for manifest generators and the pipelines name gate. The SDK raises `ConnectorIdentityError` for zero names, two or more names, or an invalid name. `ConnectorContent.for_package` and `IngestBinding.for_package` take the name from this declaration, so a connector passes no name literal. `ConnectorContent` raises `ContentError` when its connector disagrees with its manifest's `connector`. | Pack, manifest and ingest binding resolve to the one declared name. A disagreeing content name raises `ContentError`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 322
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R071.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Content is found by convention",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "aa58c5dd6858"
      ],
      "verified_by": [
        "tests/test_connector_run.py:140",
        "tests/test_connector_run.py:152",
        "tests/test_connector_run.py:172"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Content is found by convention.** The SDK discovers `skills/`, `prompts/`, `ontology/`, `connectors/` and `connector_sources` under the package named by the connector entry point. `content_dirs(package)` returns the directories, and `installed_connectors()` lists every installed declaration with its directories. The `skill_providers`, `ontology_providers` and `source_connector_providers` entry-point groups are not read, and the conformance plugin rejects a connector that declares them. | `tests/test_connector_run.py::test_content_is_found_by_convention_with_one_entry_point` serves every content kind from a fixture with only the connector entry point. `tests/test_conformance_plugin.py` fails a fixture that declares a provider group.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 323
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R071.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "The version is read from package metadata only",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "aa58c5dd6858"
      ],
      "verified_by": [
        "tests/test_connector_run.py:161"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**The version is read from package metadata only.** `pyproject.toml` is the one file that spells a version. `agent_connector_sdk.connector_identity.distribution_version(distribution)` and `connector_version(package)` read it with `importlib.metadata`. The SDK's own `__version__`, the server version and the startup banner come from them. The release version bump edits `pyproject.toml` alone. A connector module that assigns a string to `__version__` fails the conformance plugin. | `tests/test_connector_run.py::test_versions_come_from_package_metadata` and `::test_server_version_is_the_metadata_version`. `tests/test_conformance_plugin.py` fails a fixture that spells `__version__`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 324
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R072",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Certify names the connector from its declaration",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "85fafc5b02ad",
        "92d09c57796b"
      ],
      "verified_by": [
        "tests/test_single_declaration.py:184"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Certify names the connector from its declaration.** `connector-certify` takes the connector name from `connector://resources`. A server that declares no preset, or presets for more than one MCP server, fails certification. | `tests/test_single_declaration.py::test_checkout_names_exactly_one_server`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 325
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R073",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "The server factory serves all five connector surfaces and keeps the parent link",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "268d030fffad",
        "57d0997107dd",
        "8f36880f39a7",
        "cf3d6e92c008"
      ],
      "verified_by": [
        "tests/test_default_content.py:12"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**The server factory serves all five connector surfaces and keeps the parent link.** `run()` and `build_server` pass `ConnectorContent` from `content_dirs(package)` to `create_mcp_server`, under the declared identity of `SDK-CONNECTOR-CONTROL-R071`. The factory registers the content it receives and does no lookup of its own. A call with no `content=` serves tools only. It serves each `prompts/<name>.json` as an MCP prompt. It serves each `skills/<name>/SKILL.md` as a `skill://` resource. It serves `ontology/*.ttl` as `ontology://` resources and `ontology/shapes/*.ttl` as `shapes://` resources. It also serves `connector://resources`. A connector with no packaged content serves only its tools. Each packaged domain ontology must declare `owl:Ontology`. It must import the parent IRI `http://knuckles.team/kg`. Each class it declares must reach a parent class by a direct or transitive `rdfs:subClassOf`. The pack builder keeps the parent import as the `ontology-import:` requirement of `SDK-CONNECTOR-CONTROL-R022`. The engine then resolves the link. | A test builds a connector with each content kind through `build_server`. Another test shows the factory serves tools only without `content=`. It lists each kind over MCP. It captures a pack that holds each entry kind. A test refuses a packaged ontology with no parent import. A test refuses an unlinked class. The pipelines `connector-surface-audit` (`PIPE-GATES-R014`) reports the fleet against this row.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 326
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R074",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "A connector pack declares every surface and the source contracts for virtual access (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**A connector pack declares every surface and the source contracts for virtual access (rollup).** Builds on `SDK-CONNECTOR-CONTROL-R073` (surfaces served by default) and the access kinds of `SDK-CONNECTOR-CONTROL-R040` to `R044`. The pack lists tools, prompts, skills, ontology, shapes and data resources. It adds one source contract that maps each data resource to ontology terms, an access method and a pagination form. EG federates the data at query time from that contract. The SDK never copies source rows. Children `.1` to `.7` deliver it. | See each child.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 327
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R074.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Model.** Add `ResourceDescriptor{uri, kind, ontology_class, fields, access_kind, key_field, pagination, read_only, owner, credential_ref}` in `agent_connector_sdk/artifacts/resource_descriptor.py`. `kind` is `data`, `ontology`, `shapes`, `skill`, `seed` or `manifest`. `access_kind` is a member of `ACCESS_KINDS`. `fields` lists `{name, ontology_property}` pairs, so EG catalogs each field and the contract binds it to an ontology property. `owner` names the accountable team. `pagination` is `cursor`, `page`, `offset` or `none`. `credential_ref` names a reference only, never a secret. | `tests/test_resource_descriptor.py::test_descriptor_round_trips_and_names_only_a_credential_reference` builds a descriptor, serialises it and reads it back.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 328
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R074.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Prompt role",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Prompt role.** Each `prompts/<name>.json` declares `role` (`system`, `task` or `template`) and the `ontology_class` or capability IRIs it serves. A prompt with no `role` is `task`. The pack carries both fields on the `mcp_prompt` entry so EG can select a system prompt for dynamic agent creation (`EG-DECISION-ENGINE-R814`). | `tests/test_prompt_role.py::test_prompt_role_and_concepts_reach_the_pack_entry` packs a `system` prompt and reads `role` and the class IRIs from the entry.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 329
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R074.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Behavior.** `build_content_pack` (`agent_connector_sdk/artifacts/pack.py:125`) emits one descriptor entry per data resource and a `contract://<connector>` Turtle body. The body maps each descriptor to an ontology class, an access method, a key field and a pagination form. `connector://resources` lists the count and digest of each of the six surfaces. The pack builder keeps the parent import of `SDK-CONNECTOR-CONTROL-R073`. | `tests/test_pack_surfaces.py::test_pack_lists_all_surfaces_and_contract` builds a fixture pack and reads six counts and one contract from the manifest.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 330
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R074.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Wiring.** The factory `create_mcp_server` (`agent_connector_sdk/mcp/server.py:93`) registers each data resource as an MCP resource through `register_connector_content` (`agent_connector_sdk/mcp/content.py:212`). `build_content_pack` reads the same descriptors. One declaration feeds both the live listing and the pack. | `tests/test_pack_surfaces.py::test_live_resource_listing_equals_pack_descriptors` compares `resources/list` with the pack entries.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 331
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R074.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Refusal.** The build refuses a data resource whose `ontology_class` is not declared in the connector ontology with `RESOURCE_UNMAPPED`. It refuses an unknown `access_kind` with `ACCESS_KIND_UNKNOWN`. It refuses a list operation with no `pagination` with `PAGINATION_UNDECLARED`. It refuses a literal secret in a descriptor with `SECRET_IN_CONTRACT`. | `tests/test_resource_descriptor.py::test_build_refuses_unmapped_unknown_unpaged_and_secret_descriptors` asserts each of the four codes.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 332
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R074.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Hot-path proof.** The entry point is `create_mcp_server` for a fixture connector with all six surfaces. The test lists every surface over MCP. It builds the pack with `build_content_pack` and compares the two views. It also parses the contract with the access-contract parser of `SDK-CONNECTOR-CONTROL-R044`. | `tests/test_pack_surfaces_served.py::test_factory_serves_and_packs_every_surface_with_a_parseable_contract`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 333
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R074.7",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Default declarations",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "9571c94146e2"
      ],
      "verified_by": [
        "tests/test_resource_declarations.py:32"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Default declarations.** A connector writes no data-resource code. `agent_connector_sdk.artifacts.resource_derivation.derive_descriptors` turns each read-only tool that returns records into a default `ResourceDescriptor`. The tool name gives the resource name and the access method. The response schema gives the fields. The parameters give the pagination form: `cursor`, `page`, `offset` or `none`. A `next_url` parameter counts as `cursor`. The field names give the identity. A destructive tool, a tool without `readOnlyHint`, and a schema without record fields yield nothing. The SDK matches field and record names to the connector ontology and marks each match `proposed`. A name with no match stays `unmapped`. The SDK never marks a mapping approved. A steward approves it in EG. A source declared with `source_meta` (`R075.2`) overrides the default of its tool and marks the mapping `declared`. The codes of `.5` refuse a bad declaration. `create_mcp_server` serves the result inside `connector://resources`. It derives the defaults from the tools registered at read time. The pack carries the result as a `resource` entry. | `tests/test_resource_declarations.py` derives github-agent's repository list: page pagination, `id` key, proposed `Repository` class and `fullName` property. It serves a scaffolded connector's resource over MCP and refuses the four codes.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 334
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R075",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "The connector's MCP server is the only place its metadata is read from (rollup)",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0d150cf96fd8",
        "2078ee0208c5",
        "2487b614c171",
        "647f3de98067",
        "95f251043be1"
      ],
      "verified_by": [
        "tests/test_eg_pack_entry_kinds.py:45",
        "tests/test_eg_pack_entry_kinds.py:54",
        "tests/test_eg_pack_entry_kinds.py:68",
        "tests/test_eg_pack_entry_kinds.py:81",
        "tests/test_eg_pack_entry_kinds.py:95"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**The connector's MCP server is the only place its metadata is read from (rollup).** A connector ships no `connector_manifest.yml`, presets file, fingerprints file, `ingest_sources.json` or `data_resources.json`, and the SDK reads none of them. The SDK runner, arbora, epistemic-graph and the pipelines gates read the live server. The gates start it over stdio. The name comes from the `agent_connector_sdk.connector` entry point (`R071`) and `serverInfo`. Tool fingerprints come from the handshake. Actions come from tool annotations and `split_tool_classes`. Data sources come from code (`R075.2`). Ontology and shapes are authored as TTL and read only through `ontology://` and `shapes://` (`R073`). The server serves one declaration resource, `connector://resources`. Children `.1` to `.6` deliver it. | See each child.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 335
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R075.1",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "No file fallback",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0d150cf96fd8",
        "f0b9e7f4f535"
      ],
      "verified_by": [
        "tests/test_single_declaration.py:85"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**No file fallback.** The SDK has no loader for the manifest, the presets, the fingerprints, `ingest_sources.json` or `data_resources.json`. A connector converts its files to `source_meta(...)` declarations on its read tools. | `tests/test_single_declaration.py::test_server_serves_declaration_live_and_runner_reads_only_that` lists `connector://resources` as the only resource of a declared server.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 336
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R075.2",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Data sources are declared in code and served live",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2078ee0208c5",
        "f0b9e7f4f535"
      ],
      "verified_by": [
        "tests/test_single_declaration.py:86"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Data sources are declared in code and served live.** `source_meta(source_id, record_type, id_field, ontology_class, fields, ...)` in `agent_connector_sdk/ingest/live_declaration.py` returns the `meta` of a read tool. `register_live_declaration` serves the assembled declaration as the JSON resource `connector://resources`, computed when read. It carries the sources, the record-type mappings onto the ontology, the resources and the data-resource descriptors of `R074`. A package that generates its tools from client methods declares them by tool name instead: `<package>/connector_sources.py` holds `SOURCES` (`source_meta(tool=..., ...)`), `SCHEMA_MAPPINGS` and `RESOURCES`, and `register_tool_surface` and `register_connector_content` load it. A source that reads per parent record adds `for_each={source, argument, field}` to `source_meta` (`SDK-SOURCE-INGEST-R004.28`). A name that matches no registered tool raises `ValueError`. A server that already serves the URI keeps its own resource. | `tests/test_single_declaration.py::test_build_declaration_maps_meta_without_any_file`, `::test_connector_sources_module_declares_by_tool_name`, `tests/test_source_sync.py::test_tool_surface_serves_declarations` and `tests/test_for_each.py::test_for_each_is_in_the_served_schema`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 337
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R075.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "The runner and certification read the live declaration",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "f0b9e7f4f535"
      ],
      "verified_by": [
        "tests/test_single_declaration.py:102",
        "tests/test_single_declaration.py:112",
        "tests/test_single_declaration.py:87"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**The runner and certification read the live declaration.** `load_sync_adapters(descriptor, session)` reads `connector://resources` through the open session and builds one adapter per source that carries a `preset`. The tool fingerprint is the live compatibility fingerprint taken at discovery. A declaration that names another connector, or declares no preset, raises `RunnerConfigurationError`. `connector-certify` reads the same resource, checks each declared preset tool against its live definition and writes no file. | `tests/test_single_declaration.py::test_declared_connector_must_match_descriptor`, `::test_server_without_a_sync_preset_is_refused` and `::test_certify_reads_the_declaration_and_checks_tools_live`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 338
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R075.4",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Prompts serve their own directive and carry their metadata over native MCP",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2487b614c171",
        "f0b9e7f4f535"
      ],
      "verified_by": [
        "tests/test_single_declaration.py:192",
        "tests/test_single_declaration.py:230"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Prompts serve their own directive and carry their metadata over native MCP.** `prompts/get` returns the prompt's `instructions.core_directive` as written. `prompts/list` carries the fastmcp fields `title` (the prompt JSON `title`, else the identity role), `description`, `tags` and `meta`. `tags` are the prompt JSON `tags` plus `prompt`, and `system` when the prompt declares a system-prompt target. `meta` sits under the key `team.knuckles/prompt` with role, goal, topic, tone, style, version, `useCase` (JSON `useCase`, `metadata.useCase` or `use_case`) and `systemPromptFor` (JSON `systemPromptFor`, `serves` or `ontology_class`). Any other scalar key under the prompt's `metadata` is carried under its own name. arbora and epistemic-graph capture system-prompt candidates (`EG-DECISION-ENGINE-R814`) from `prompts/list` and `prompts/get` alone. A prompt that takes input declares fastmcp `arguments`. The SDK gives `extends` and `compose` no meaning. | `tests/test_single_declaration.py::test_prompt_serves_its_directive_and_carries_metadata_over_mcp`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 339
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R075.5",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Skills, ontology and shapes stay on fastmcp",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "f0b9e7f4f535"
      ],
      "verified_by": [
        "tests/test_single_declaration.py:294"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Skills, ontology and shapes stay on fastmcp.** The server serves `skills/<name>/SKILL.md` through the fastmcp `SkillsDirectoryProvider` as `skill://` resources. It serves `ontology/*.ttl` and `ontology/shapes/*.ttl` as fastmcp resources with `mime_type=\"text/turtle\"`. A `SKILL.md` `name` equals its directory name. Where fastmcp and the MCP specification differ, fastmcp wins. | `tests/test_single_declaration.py::test_skill_directory_name_matches_frontmatter_name`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 340
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R075.6",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Mapping references name the declaration",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "95f251043be1"
      ],
      "verified_by": [
        "tests/test_ingest.py:95"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**Mapping references name the declaration.** An ingest request refers to a declared mapping as `connector:<connector>#mappings/<record type>` and to a declared relation as `connector:<connector>#relations/<resource>/<relation>`. The bare `connector:<connector>` form names the connector's only mapping. No other scheme is built or accepted. The engine resolves a mapping reference against the pack's `connector://resources` declaration. It resolves a relation reference against the pack ontology's object properties (`EG-TYPED-PACKS-R101.10`). Child slice of `SDK-CONNECTOR-CONTROL-R075`. | `tests/test_ingest.py::test_change_set_maps_to_exact_declared_references`.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 341
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R075.7",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "The declaration entry carries its content schema",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "647f3de98067",
        "bbc715bc3431"
      ],
      "verified_by": [
        "tests/test_eg_pack_entry_kinds.py:45",
        "tests/test_eg_pack_entry_kinds.py:54",
        "tests/test_eg_pack_entry_kinds.py:68",
        "tests/test_eg_pack_entry_kinds.py:81",
        "tests/test_eg_pack_entry_kinds.py:95"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**The declaration entry carries its content schema.** `build_content_pack` emits `connector://resources` as a `resource` entry whose `output_schema` is the JSON Schema of `IngestSourceDeclaration`, generated from the model. The engine refuses a resource entry with no content schema. Ontology, shapes, skill, prompt and tool entries have their own entry kinds and need no declaration schema. The resource URI scheme picks the entry kind. The `ontology`, `shapes`, `model-profile` and `a2a-card` schemes map to their own kinds. `connector://resources` is the one `resource` entry. A pack carries no manifest entry: a `manifest://` resource has no entry kind, so `build_content_pack` refuses it with `MalformedArtifactError`. The declared engine floor is `epistemic-graph>=2.27.6`. Its generated `PackEntryKind` holds every mapped kind. Every SDK module imports against it. The packs are assembled by the SDK library inside arbora, so a connector needs no new release. Child slice of `SDK-CONNECTOR-CONTROL-R075`. | `tests/test_pack_resource_schema.py::test_pack_satisfies_engine_resource_schema_rule`. `tests/test_eg_pack_entry_kinds.py` imports every SDK module and checks each mapped kind. It refuses a `manifest://` resource. It builds a pack on the locked engine.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 342
    },
    {
      "id": "SDK-FINANCE-SOURCES",
      "kind": "spec",
      "parent": null,
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/SDK-FINANCE-SOURCES/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/SDK-FINANCE-SOURCES/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-FINANCE-SOURCES/requirements.md"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "SDK-FINANCE-SOURCES-R001",
      "kind": "requirement",
      "parent": "SDK-FINANCE-SOURCES",
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "Market-data adapters: exchange history fix, CoinMarketCap, FRED/ALFRED",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "840bd894c581"
      ],
      "verified_by": [],
      "parent_title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "definition": "**Market-data adapters: exchange history fix, CoinMarketCap, FRED/ALFRED.** Market-data source adapters correct historical price retrieval for the exchange market-data connector, add CoinMarketCap market data, and add Federal Reserve FRED/ALFRED series with a central-bank announcement calendar, each preserving data vintage and announcement time per the shared adapter contract. | Offline conformance tests using recorded or synthetic responses for each adapter verifying corrected history retrieval and vintage and announcement-time fields.",
      "definition_source": "specs/SDK-FINANCE-SOURCES/requirements.md",
      "definition_line": 5
    },
    {
      "id": "SDK-FINANCE-SOURCES-R002",
      "kind": "requirement",
      "parent": "SDK-FINANCE-SOURCES",
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "Alpaca stocks adapter: history, quotes, fundamentals, calendars",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "077a14c9f3d3",
        "823197633ebb",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_finance_alpaca_stocks.py:56",
        "tests/test_finance_alpaca_stocks.py:69",
        "tests/test_finance_alpaca_stocks.py:75"
      ],
      "parent_title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "definition": "**Alpaca stocks adapter: history, quotes, fundamentals, calendars.** The Alpaca stocks source adapter supports historical bars, quotes, and streaming data with bounded pagination and explicit adjusted-versus-unadjusted and regular/pre/post-market handling, plus profile and fundamentals data, a licensed logo source, news, and an earnings and dividend calendar. | Offline conformance tests against recorded Alpaca fixtures covering pagination, adjustment mode, extended-hours flags, and each additional data type.",
      "definition_source": "specs/SDK-FINANCE-SOURCES/requirements.md",
      "definition_line": 6
    },
    {
      "id": "SDK-FINANCE-SOURCES-R003",
      "kind": "requirement",
      "parent": "SDK-FINANCE-SOURCES",
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "FX, commodities, and real-estate adapters with roll and staleness rules",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "13fcdacb3ff1",
        "6ef04661acc2"
      ],
      "verified_by": [
        "tests/test_finance_records.py:101",
        "tests/test_finance_records.py:113",
        "tests/test_finance_records.py:119",
        "tests/test_finance_records.py:130",
        "tests/test_finance_records.py:142"
      ],
      "parent_title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "definition": "**FX, commodities, and real-estate adapters with roll and staleness rules.** FX source adapters identify base and quote currency and rate direction. Gold and commodities adapters distinguish spot price from a specific futures contract, its expiry, and an explicit roll rule. Real-estate adapters return a dated, potentially stale valuation rather than a live market quote. | Offline conformance tests per asset class asserting correct base/quote identity, spot-versus-futures roll handling, and valuation staleness reporting.",
      "definition_source": "specs/SDK-FINANCE-SOURCES/requirements.md",
      "definition_line": 7
    },
    {
      "id": "SDK-FINANCE-SOURCES-R004",
      "kind": "requirement",
      "parent": "SDK-FINANCE-SOURCES",
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "Alpaca account reads and idempotent CSV activity import",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "077a14c9f3d3",
        "2ef7ca88d676",
        "6ef04661acc2",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_finance_account_read.py:43",
        "tests/test_finance_account_read.py:54",
        "tests/test_finance_account_read.py:60",
        "tests/test_finance_csv_import.py:76"
      ],
      "parent_title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "definition": "**Alpaca account reads and idempotent CSV activity import.** Account import reads Alpaca account and position data and imports CSV activity statements with a column-mapping preview, rejecting ambiguous columns or currencies, and identifies each activity row by a stable provider event ID or source-file digest plus row identity so re-import is idempotent. | Conformance tests that re-import the same CSV file and Alpaca account snapshot and assert no duplicate activity record is created.",
      "definition_source": "specs/SDK-FINANCE-SOURCES/requirements.md",
      "definition_line": 8
    },
    {
      "id": "SDK-FINANCE-SOURCES-R005",
      "kind": "requirement",
      "parent": "SDK-FINANCE-SOURCES",
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "Macro and liquidity panels: FRED series, ETF flows, sentiment, on-chain",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "077a14c9f3d3",
        "36f3c76a370c",
        "840bd894c581",
        "887c201cbff5",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_finance_etf_flows.py:48",
        "tests/test_finance_etf_flows.py:57",
        "tests/test_finance_etf_flows.py:66",
        "tests/test_finance_fred_series.py:40"
      ],
      "parent_title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "definition": "**Macro and liquidity panels: FRED series, ETF flows, sentiment, on-chain.** Macro and liquidity source adapters provide Federal Reserve FRED series with preserved vintage, a versioned liquidity composite and heat-strip panel, ETF fund-flow data, sentiment data, and on-chain position data, each tagged with its source and observation time. | Offline conformance tests against recorded or synthetic fixtures for each panel type asserting vintage preservation and correct source provenance tagging.",
      "definition_source": "specs/SDK-FINANCE-SOURCES/requirements.md",
      "definition_line": 9
    },
    {
      "id": "SDK-FINANCE-SOURCES-R900",
      "kind": "requirement",
      "parent": "SDK-FINANCE-SOURCES",
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "Venue and API connector helpers (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "definition": "**Venue and API connector helpers (rollup).** The SDK provides venue and API helpers only. `finance.market_data` chains market-data providers. `finance.crypto` reads DEX volume, TVL and funding rates. `finance.feeds` builds live bars on `streaming.StreamBus`. `payments` runs the HTTP 402 payment flow. `finance.strategy_export` renders strategy source. `finance.banking` builds ISO 20022 messages. The graph service owns finance calculations and decisions (`EG-FINANCE-PRIMITIVES-R900`, `EG-FINANCE-PRIMITIVES-R901`). The `market` and `stream` extras provide the provider and WebSocket clients. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.",
      "definition_source": "specs/SDK-FINANCE-SOURCES/requirements.md",
      "definition_line": 10
    },
    {
      "id": "SDK-FINANCE-SOURCES-R900.1",
      "kind": "requirement",
      "parent": "SDK-FINANCE-SOURCES",
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "definition": "**Model.** `DataRegistry`, `OnChainAnalytics`, `CryptoDerivatives`, `MarketFeedBus`, `StreamBus`, `X402PaymentClient`, `StrategyExporter` and `ISO20022MessageFactory` are the public surface. | `tests/test_finance_strategy_export.py::test_exporter_dispatches_by_platform_and_exports_all`",
      "definition_source": "specs/SDK-FINANCE-SOURCES/requirements.md",
      "definition_line": 11
    },
    {
      "id": "SDK-FINANCE-SOURCES-R900.2",
      "kind": "requirement",
      "parent": "SDK-FINANCE-SOURCES",
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "definition": "**Behavior.** The registry returns the first non-empty provider result and never fabricates data. A price alert fires once when its threshold is crossed. | `tests/test_finance_market_data.py::test_first_non_empty_provider_wins_and_failures_become_warnings`",
      "definition_source": "specs/SDK-FINANCE-SOURCES/requirements.md",
      "definition_line": 12
    },
    {
      "id": "SDK-FINANCE-SOURCES-R900.3",
      "kind": "requirement",
      "parent": "SDK-FINANCE-SOURCES",
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "definition": "**Wiring.** Crypto reads use `agent_connector_sdk.source_connectors.http_safety`. Feeds publish through `agent_connector_sdk.streaming`. | `tests/test_finance_feeds.py::test_ticks_fan_out_by_symbol`",
      "definition_source": "specs/SDK-FINANCE-SOURCES/requirements.md",
      "definition_line": 13
    },
    {
      "id": "SDK-FINANCE-SOURCES-R900.4",
      "kind": "requirement",
      "parent": "SDK-FINANCE-SOURCES",
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "Refusal",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/test_finance_crypto.py:48",
        "tests/test_payments.py:38"
      ],
      "parent_title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "definition": "**Refusal.** A malformed upstream answer raises `ProviderRequestError`. The payment guard refuses a payment outside any budget, currency or chain limit. | `tests/test_payments.py::test_guard_approves_only_within_every_limit`",
      "definition_source": "specs/SDK-FINANCE-SOURCES/requirements.md",
      "definition_line": 14
    },
    {
      "id": "SDK-FINANCE-SOURCES-R900.5",
      "kind": "requirement",
      "parent": "SDK-FINANCE-SOURCES",
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "definition": "**Evidence.** Tests inject fetch callables and in-memory providers. They use no network and no sleep. | `tests/test_finance_crypto.py::test_malformed_answers_raise_provider_request_error`",
      "definition_source": "specs/SDK-FINANCE-SOURCES/requirements.md",
      "definition_line": 15
    },
    {
      "id": "SDK-FINANCE-SOURCES-R900.6",
      "kind": "requirement",
      "parent": "SDK-FINANCE-SOURCES",
      "source": "specs/SDK-FINANCE-SOURCES/status.json",
      "title": "Hot-path proof",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/test_payments.py:93"
      ],
      "parent_title": "SDK-FINANCE-SOURCES \u2014 Qualified finance source adapters",
      "definition": "**Hot-path proof.** The entry point is `X402PaymentClient`. The proof parses a 402 challenge, makes a proof, records the payment and verifies the remaining budget. | `tests/test_payments.py::test_client_parses_402_proves_and_records_spend`",
      "definition_source": "specs/SDK-FINANCE-SOURCES/requirements.md",
      "definition_line": 16
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK",
      "kind": "spec",
      "parent": null,
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/SDK-GOVERNED-WRITEBACK/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/SDK-GOVERNED-WRITEBACK/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/ports/writeback.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/ports/writeback.py"
        },
        {
          "declared_in": "specs/SDK-GOVERNED-WRITEBACK/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/ports/writeback_transport.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/ports/writeback_transport.py"
        },
        {
          "declared_in": "specs/SDK-GOVERNED-WRITEBACK/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/writeback/connector.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/writeback/connector.py"
        },
        {
          "declared_in": "specs/SDK-GOVERNED-WRITEBACK/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/writeback/connector.py:75",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/writeback/connector.py#L75"
        },
        {
          "declared_in": "specs/SDK-GOVERNED-WRITEBACK/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/writeback/service.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/writeback/service.py"
        },
        {
          "declared_in": "specs/SDK-GOVERNED-WRITEBACK/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/writeback/service.py:74",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/writeback/service.py#L74"
        },
        {
          "declared_in": "specs/SDK-GOVERNED-WRITEBACK/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-GOVERNED-WRITEBACK/requirements.md"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/SDK-GOVERNED-WRITEBACK/plan.md",
          "evidence": "unresolved",
          "kind": "references",
          "label": "RFC 8785",
          "repository": "Unresolved",
          "url": ""
        }
      ],
      "plan_diagrams": [],
      "unparsed_references": [
        {
          "declared_in": "specs/SDK-GOVERNED-WRITEBACK/plan.md",
          "text": "[RFC 8785](https://www.rfc-editor.org/rfc/rfc8785) defines canonical JSON;"
        }
      ]
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R001",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Write-back proposals route through governed authorization, not direct action",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "daeb199f91c0",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_decide_consumers.py:169",
        "tests/test_decide_consumers.py:176"
      ],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Write-back proposals route through governed authorization, not direct action.** A proposed change to an attached source is evaluated only through the governed write-back protocol's deterministic authorization modes; a decision-service suggestion is never itself an approval and cannot directly authorize applying the change. | A contract test submits a decision-service proposal. It asserts refusal without a separate deterministic authorization and approval record.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 5
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R001.1",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Model.** `WalletBusinessIntent` is immutable business input. `WalletExecutionEnvelope` carries its separate proof and confirmation metadata. Neither proof nor plan digest occurs inside intent. The plan defines their exact projection. `WalletProofRequest` binds authenticated tenant and actor, connector, operation, account, wallet, network, key ID, plan digest, change-set digest and idempotency key. It also carries scheme, nonce, issued-at, expires-at and signature bytes. `WalletProofResult` contains `verified` or `refused`, reason, payload digest, signer reference, trust revision and validity interval. It is a verification fact, never an authorization grant. | WB-09 validates the closed request and result models.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 6
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R001.2",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Behavior.** Prepare and confirm immutable intent before signing. `plan_digest` means `params_digest({\"intent\": WalletBusinessIntent})`; adding proof cannot alter it. `verify_bound_intent` reconstructs canonical signed bytes from authenticated request and durable change-set fields. Verify the declared scheme against a current trusted wallet/account key binding. Reject expired, revoked or mismatched proofs. `same_effect_only` binds the nonce to the durable change-set ID and existing idempotency key. A valid proof still requires EG authorization, explicit human confirmation and audit reservation before any effect. | WB-10 exercises valid proofs, canonical payloads and independent authorization.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 7
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R001.3",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Wiring.** Add the SDK-owned `WalletSignatureVerifier.verify` contract at the existing governed effect boundary. `GovernedWriteBack.apply` at `agent_connector_sdk/writeback/service.py:74` must verify wallet proof before transport apply. Reuse `DurableAuthorizationResolver.verify` at `agent_connector_sdk/writeback/authorization.py:78` and `DurableWritableConnector.apply` at `agent_connector_sdk/writeback/connector.py:75`. Connector served operations call this composition. The shared `WalletExecutionEnvelope` transport extension, intent projection, verification and trust resolution are missing; no existing method verifies wallet signatures. | WB-11 traces a served connector call through the verifier and governed apply.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 8
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R001.4",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Refusal.** Return `missing_signature`, `invalid_payload`, `unsupported_scheme`, `untrusted_key`, `revoked_key`, `expired`, `scope_mismatch`, `invalid_signature`, `replay_conflict` or `verification_unavailable`. Missing trust authority, stale trust state or unavailable proof transport refuses before an external effect. Never accept client-supplied verification flags or derive account ownership solely from a valid signature. | WB-12 proves zero effects for every refusal and unavailable dependency.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 9
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R001.5",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Evidence.** Record payload digest, plan and change-set digests, tenant, actor, connector, operation, network, signer reference, trust revision and verification time. Join proof outcome to authorization, confirmation, audit and effect receipt references. Never log private keys, raw signatures or reusable proof bodies. An uncertain effect follows existing durable reconciliation rather than a new submission. | WB-13 exercises redaction, provenance and replay after restart.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 10
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R001.6",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Hot-path proof.** `tests/test_wallet_proof_served.py::test_served_wallet_proof_and_governed_apply` enters the real connector wire method `tools/call`. With synthetic keys and a running durable graph, a correctly bound proof plus confirmation and authorization yields one controlled provider effect. Prepare, confirm, sign and execute through served transports; proof insertion preserves the confirmed digest. Intent tampering, missing confirmation, wrong tenant/network/key, revoked trust, expiry and replay conflict yield none. Restart and repeat the same effect to observe its prior receipt without another mutation. | WB-14 requires served transport and durable read-back; direct verifier tests alone are insufficient.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 11
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R002",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Source-side WriteBackPort composes a durable graph write-back adapter",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2d39be956d8d"
      ],
      "verified_by": [
        "tests/test_writeback_durable.py:143"
      ],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Source-side WriteBackPort composes a durable graph write-back adapter.** The SDK's generated-type WriteBackPort composes a durable operation adapter against the graph service's SourceChangeSet and WriteBackAttempt records, so dry-run, apply, and reconcile calls read and update the canonical change-set state before any source mutation is attempted. | Integration tests exercising dry-run, apply, and reconcile through the durable adapter against a fake backing store, confirming each call reads and writes the canonical change-set record.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 12
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R003",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Full write-back requires an authorization resolver and restart recovery",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2d39be956d8d"
      ],
      "verified_by": [
        "tests/test_writeback_durable.py:254",
        "tests/test_writeback_process_restart.py:105"
      ],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Full write-back requires an authorization resolver and restart recovery.** Beyond the source-side WriteBackPort, governed write-back protocol, and generated graph-client types, the implementation must add a production authorization resolver, at least one writable connector wired end to end, and proven recovery after a process restart before the capability is complete. | A restart-fault test that kills the process mid-apply and confirms reconciliation on restart, plus an end-to-end test of one writable connector through a real authorization resolver.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 13
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Governed write-back: approval, idempotency, and an audit reservation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "6ef04661acc2",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_writeback_audit_reservation.py:13",
        "tests/test_writeback_audit_reservation.py:27"
      ],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Governed write-back: approval, idempotency, and an audit reservation.** Rollup: every child below is required; the original acceptance remains mandatory. Applying a governed change to an attached source requires a recorded approval bound to the same change-set digest, a deterministic idempotency key so a retried request returns the identical durable result, and an audit reservation taken before the source call; when the target application exposes business-rule APIs, the adapter uses that API rather than writing to storage directly. | Tests that replay an identical apply request and assert the same effect and idempotency key are returned, and that a write attempt without an audit reservation is refused.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 14
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004.1",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Generic approval residual",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Generic approval residual.** Model: A generated SourceChangeSet and recorded approval share one canonical digest. Behavior: Require independent recorded approval for every governed attached-source effect, including non-repository adapters; proposals confer no approval. Wiring: Retain GovernedWriteBack.apply and the existing authorization resolver. Refusal: Missing, mismatched or expired approval prevents a new effect. Evidence: WB-15 permits one approved generic effect and refuses each invalid approval before transport apply. | Proposed test: `tests/test_repository_source_effect_served.py::test_generic_approval`. WB-15 permits one approved generic effect and refuses each invalid approval before transport apply.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 15
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004.2",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Generic deterministic replay residual",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Generic deterministic replay residual.** Model: The existing effect key binds one change-set digest and durable result. Behavior: An identical retry returns the identical durable result and effect key across all governed adapters. Wiring: Retain DurableWritableConnector.apply and WriteBackLedger receipt lookup. Refusal: A changed digest under the same key refuses; an uncertain effect cannot be blindly reapplied. Evidence: WB-16 observes one source effect for concurrent identical requests and restart replay. A conflicting replay causes zero additional effects. | Proposed test: `tests/test_repository_source_effect_served.py::test_generic_replay`. WB-16 observes one source effect for concurrent identical requests and restart replay. A conflicting replay causes zero additional effects.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 16
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004.3",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Generic audit reservation residual",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Generic audit reservation residual.** Model: The audit reservation binds the canonical change set and effect key. Behavior: Reserve durably before every new source mutation; a proven-no-effect retry recovers the same reservation. Wiring: Retain AuditReservationPort.reserve before WriteBackTransport.apply. Refusal: Unavailable, missing or wrong-binding reservation prevents transport apply. Evidence: WB-17 records reservation-before-effect ordering and injects each reservation failure with zero provider mutations. | Proposed test: `tests/test_repository_source_effect_served.py::test_audit_before_effect`. WB-17 records reservation-before-effect ordering and injects each reservation failure with zero provider mutations.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 17
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004.4",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Business-rule API residual",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Business-rule API residual.** Model: The adapter profile identifies the target application business-rule operation. Behavior: When that API exists, route every governed change through it and preserve its validation. Wiring: Use the admitted WriteBackTransport implementation, including non-repository adapters. Refusal: No direct storage, local checkout or database shortcut may bypass the application API. Evidence: WB-18 exercises an accepted API mutation and an API business-rule rejection, proving the rejected request never reaches a storage bypass. | Proposed test: `tests/test_repository_source_effect_served.py::test_business_api`. WB-18 exercises an accepted API mutation and an API business-rule rejection, proving the rejected request never reaches a storage bypass.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 18
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004.5",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Typed repository effect request",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Typed repository effect request.** Model: RepositorySourceEffectRequest binds the closed RepositorySourceEffectIntent in plan.md to one generated canonical change set. Behavior: Validate exact repository, connector, target, relative path, immutable base, complete payload bytes and digest before preview. Wiring: Add the proposed repository_effect.py contract beside existing writeback models; reuse generated canonical_digest and patch_digest. Refusal: Unknown fields, inconsistent digests, unbounded bytes or mismatched identity refuse without mutation. Evidence: WB-19 round-trips the complete request and seeded exact-byte vectors; changing each binding fails validation. | Proposed test: `tests/test_repository_source_effect_served.py::test_request_binding`. WB-19 round-trips the complete request and seeded exact-byte vectors; changing each binding fails validation.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 19
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004.6",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Repository path and scope resolution",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Repository path and scope resolution.** Model: Trusted connector configuration defines the provider repository and allowed path scope. Behavior: Resolve the same regular-file path against the immutable tree at preview and effect time without normalization that changes intent. Wiring: The repository transport consumes the canonical intent and trusted connector binding. Refusal: Absolute paths, traversal, aliases, escaping links, unsupported object kinds and out-of-scope targets refuse; ingestion hydration grants no write authority. Evidence: WB-20 serves an allowed nested path and every escape/scope variant, observing only the allowed path change. | Proposed test: `tests/test_repository_source_effect_served.py::test_path_scope`. WB-20 serves an allowed nested path and every escape/scope variant, observing only the allowed path change.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 20
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004.7",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Approval binds the complete source effect",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Approval binds the complete source effect.** Model: The durable change-set digest covers every RepositorySourceEffectIntent field and authenticated tenant/actor binding. Behavior: Match exact preview, existing approval, contract pin, source version and audit reservation before executing the repository operation. Wiring: The admitted connector invokes DurableWritableConnector.apply; GovernedWriteBack.apply remains the approval seam. Refusal: Substituting actor, connector, target, path, base, bytes, digest, policy or approval prevents any new mutation. Evidence: WB-21 approves one preview then changes each field independently; only the unchanged approved effect reaches the provider. | Proposed test: `tests/test_repository_source_effect_served.py::test_approved_effect`. WB-21 approves one preview then changes each field independently; only the unchanged approved effect reaches the provider.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 21
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004.8",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Conditional provider mutation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Conditional provider mutation.** Model: The mutation carries the approved immutable base and expected file state as provider preconditions. Behavior: Enforce compare-and-apply atomically at the provider effect boundary, including a change occurring after preview or preflight. Wiring: Implement WriteBackTransport.apply(change_set, expected_version) through the provider business API. Refusal: A stale base, mismatched file state or provider lacking equivalent conditional semantics refuses; no force or unconditional fallback. Evidence: WB-22 races a competing commit after preflight. The approved write refuses without overwriting it. An unchanged base produces one revision. | Proposed test: `tests/test_repository_source_effect_served.py::test_conditional_effect`. WB-22 races a competing commit after preflight. The approved write refuses without overwriting it. An unchanged base produces one revision.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 22
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004.9",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Actual immutable effect receipt",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Actual immutable effect receipt.** Model: RepositorySourceEffectReceipt binds the canonical request, approval, audit reservation, actual immutable revision and readback evidence. Behavior: Report success only after the provider effect and independent readback are joined to a durable WriteBackAttempt. Wiring: Map the receipt through existing attempt and ledger fields as specified in plan.md. Refusal: An echoed request key, applied flag, mutable branch name, invented revision or failed receipt persistence cannot establish success. Evidence: WB-23 reads the durable attempt through a fresh ledger client. It matches the actual provider revision and complete receipt projection. | Proposed test: `tests/test_repository_source_effect_served.py::test_effect_receipt`. WB-23 reads the durable attempt through a fresh ledger client. It matches the actual provider revision and complete receipt projection.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 23
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004.10",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Independent revision readback",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Independent revision readback.** Model: The readback binds repository, exact path, actual immutable effect revision, bytes digest, size and file mode. Behavior: Fetch the file independently at that revision. Compare exact bytes and mode with approved intent before success. Wiring: Use the repository provider read API after mutation, never the mutation response body or an ingestion cache as readback. Refusal: Unavailable or mismatched readback yields an unresolved outcome, no success and no second mutation. Evidence: WB-24 observes a separate provider read and matching bytes; corrupt, missing and unavailable reads never yield a successful receipt. | Proposed test: `tests/test_repository_source_effect_served.py::test_independent_readback`. WB-24 observes a separate provider read and matching bytes; corrupt, missing and unavailable reads never yield a successful receipt.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 24
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004.11",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Repository restart reconciliation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Repository restart reconciliation.** Model: Durable attempts and provider effect identity retain the original key, request and conditional base. Behavior: Recover a proven prior effect after restart; only authoritative proof of no effect permits another conditional attempt. Wiring: Implement prior_effect and reconcile on the existing transport and use WriteBackLedger receipts through DurableWritableConnector. Refusal: Timeout, lost response, uncertain receipt persistence or ambiguous provider lookup blocks blind reapply. Matching bytes alone cannot prove effect causality. Evidence: WB-25 crashes before effect, after provider commit, after readback and after durable receipt. Restart resolves or remains uncertain without duplication. | Proposed test: `tests/test_repository_source_effect_served.py::test_restart_reconcile`. WB-25 crashes before effect, after provider commit, after readback and after durable receipt. Restart resolves or remains uncertain without duplication.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 25
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R004.12",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Served repository producer composition",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Served repository producer composition.** Model: An admitted repository connector exposes the typed request and receipt through the existing governed write-back operations. Behavior: Run preview, recorded approval, apply, independent readback and replay through the real connector entrypoint. Wiring: Compose its real provider transport with DurableWritableConnector and the generated graph ledger; Arbora remains a separate consumer prerequisite. Refusal: Missing production composition, provider capability, durable authority or trusted configuration leaves the operation unavailable. Evidence: WB-26 traces one real served effect and zero-effect negatives at the provider boundary. After restart it reads the identical durable result. | Proposed test: `tests/test_repository_source_effect_served.py::test_served_journey`. WB-26 traces one real served effect and zero-effect negatives at the provider boundary. After restart it reads the identical durable result.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 26
    },
    {
      "id": "SDK-GOVERNED-WRITEBACK-R005",
      "kind": "requirement",
      "parent": "SDK-GOVERNED-WRITEBACK",
      "source": "specs/SDK-GOVERNED-WRITEBACK/status.json",
      "title": "Write-back implementation passes its full durable test suite together",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2d39be956d8d"
      ],
      "verified_by": [
        "tests/test_writeback_durable.py:218",
        "tests/test_writeback_durable.py:238"
      ],
      "parent_title": "SDK-GOVERNED-WRITEBACK \u2014 Governed write-back to attached sources",
      "definition": "**Write-back implementation passes its full durable test suite together.** The write-back implementation's generated graph-client adapter, durable authorization verification, a writable connector, and restart-safe uncertainty reconciliation pass together as one coherent, tested unit before being considered complete. | A focused test run covering the adapter, authorization, writable connector, and restart reconciliation, executed together in continuous integration.",
      "definition_source": "specs/SDK-GOVERNED-WRITEBACK/requirements.md",
      "definition_line": 27
    },
    {
      "id": "SDK-OBSERVABILITY-FEEDS",
      "kind": "spec",
      "parent": null,
      "source": "specs/SDK-OBSERVABILITY-FEEDS/status.json",
      "title": "SDK-OBSERVABILITY-FEEDS \u2014 Operational event feeds through the source adapter contract",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/SDK-OBSERVABILITY-FEEDS/spec.md",
      "component": "Unassigned",
      "code_refs": [],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "SDK-OBSERVABILITY-FEEDS-R001",
      "kind": "requirement",
      "parent": "SDK-OBSERVABILITY-FEEDS",
      "source": "specs/SDK-OBSERVABILITY-FEEDS/status.json",
      "title": "RUM, security-audit, and CI/CD events join the durable source pipeline",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "077a14c9f3d3",
        "c44284a671b3"
      ],
      "verified_by": [
        "tests/test_event_feeds.py:266",
        "tests/test_event_feeds.py:284",
        "tests/test_event_feeds.py:300"
      ],
      "parent_title": "SDK-OBSERVABILITY-FEEDS \u2014 Operational event feeds through the source adapter contract",
      "definition": "**RUM, security-audit, and CI/CD events join the durable source pipeline.** RUM, security-audit, and CI/CD events enter the same durable source pipeline as other systems of record, carrying a standard event envelope with stable identity, event, observed, and ingest times, actor and target references, and schema version; the adapter contract does not itself interpret an event as a verified incident, vulnerability, release, or user outcome. | Conformance tests using synthetic RUM, audit, and CI/CD event fixtures asserting correct envelope fields, idempotent event identity, and schema-drift quarantine behavior.",
      "definition_source": "specs/SDK-OBSERVABILITY-FEEDS/requirements.md",
      "definition_line": 5
    },
    {
      "id": "SDK-QUALITY-RELEASE",
      "kind": "spec",
      "parent": null,
      "source": "specs/SDK-QUALITY-RELEASE/status.json",
      "title": "SDK-QUALITY-RELEASE \u2014 Portable SDK quality, Pages, and release",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/SDK-QUALITY-RELEASE/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/SDK-QUALITY-RELEASE/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-QUALITY-RELEASE/requirements.md"
        },
        {
          "declared_in": "specs/SDK-QUALITY-RELEASE/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/epistemic_graph_release.json",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/scripts/epistemic_graph_release.json"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "SDK-QUALITY-RELEASE-R001",
      "kind": "requirement",
      "parent": "SDK-QUALITY-RELEASE",
      "source": "specs/SDK-QUALITY-RELEASE/status.json",
      "title": "SDK release builds against a published compatible graph-client wheel",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3edcf05bc64a",
        "42b930057c3e",
        "5b53e943e468"
      ],
      "verified_by": [
        "tests/gates/test_workflow_contract.py:213",
        "tests/test_release_quality_r001_r005.py:46",
        "tests/test_release_quality_r001_r005.py:53",
        "tests/test_release_quality_r001_r005.py:59",
        "tests/test_release_quality_r001_r005.py:77"
      ],
      "parent_title": "SDK-QUALITY-RELEASE \u2014 Portable SDK quality, Pages, and release",
      "definition": "**SDK release builds against a published compatible graph-client wheel.** The SDK release pipeline builds and publishes an installed wheel verified against a published, version-compatible graph-client wheel, confirming generated-type and native-kernel compatibility in an isolated installed consumer rather than a source overlay. The release uploads the wheel and the source distribution together. | A release job that installs the published wheel in an isolated environment and verifies generated-type and kernel compatibility against the graph-client release.",
      "definition_source": "specs/SDK-QUALITY-RELEASE/requirements.md",
      "definition_line": 5
    },
    {
      "id": "SDK-QUALITY-RELEASE-R002",
      "kind": "requirement",
      "parent": "SDK-QUALITY-RELEASE",
      "source": "specs/SDK-QUALITY-RELEASE/status.json",
      "title": "Public-documentation scanner catches private addresses and hosts",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "fad5328aee62",
        "ffb9260d7602"
      ],
      "verified_by": [
        "tests/test_doc_privacy_scanner.py:28"
      ],
      "parent_title": "SDK-QUALITY-RELEASE \u2014 Portable SDK quality, Pages, and release",
      "definition": "**Public-documentation scanner catches private addresses and hosts.** The scanner checks every public Markdown page for private IP ranges, host aliases, and environment-only domains. It applies the graph service's privacy rules and fails builds on violations. | A planted-violation test inserts a private IP and environment-only hostname into a document. It asserts the scanner fails, then confirms a clean tree passes.",
      "definition_source": "specs/SDK-QUALITY-RELEASE/requirements.md",
      "definition_line": 6
    },
    {
      "id": "SDK-QUALITY-RELEASE-R003",
      "kind": "requirement",
      "parent": "SDK-QUALITY-RELEASE",
      "source": "specs/SDK-QUALITY-RELEASE/status.json",
      "title": "Release workflow builds with the pinned managed Python, not the system one",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "42b930057c3e"
      ],
      "verified_by": [
        "tests/gates/test_workflow_contract.py:155",
        "tests/gates/test_workflow_contract.py:190"
      ],
      "parent_title": "SDK-QUALITY-RELEASE \u2014 Portable SDK quality, Pages, and release",
      "definition": "**Release workflow builds with the pinned managed Python, not the system one.** The release workflow installs and builds the SDK using the pinned Python toolchain declared in pyproject.toml rather than falling back to the hosting runner's system Python, while generated contracts and configuration, hardened serving, repository transport, and durable write-back remain intact and the public documentation site continues to build successfully. | A continuous-integration run of the release workflow asserting the build executes under the pinned interpreter and that the documentation site publishes successfully.",
      "definition_source": "specs/SDK-QUALITY-RELEASE/requirements.md",
      "definition_line": 7
    },
    {
      "id": "SDK-QUALITY-RELEASE-R004",
      "kind": "requirement",
      "parent": "SDK-QUALITY-RELEASE",
      "source": "specs/SDK-QUALITY-RELEASE/status.json",
      "title": "Public documentation follows a task-first README and site structure",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "010681764371",
        "cbbf859a5c38",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_public_docs_structure.py:21",
        "tests/test_public_docs_structure.py:40"
      ],
      "parent_title": "SDK-QUALITY-RELEASE \u2014 Portable SDK quality, Pages, and release",
      "definition": "**Public documentation follows a task-first README and site structure.** The public README follows a fixed section order leading with a one-file connector quick start, and the published documentation site presents a task-first tutorial and architecture guide. | A documentation build and link check in continuous integration confirming the README section order, that the one-file quick start example runs, and that the tutorial and architecture pages build without broken links.",
      "definition_source": "specs/SDK-QUALITY-RELEASE/requirements.md",
      "definition_line": 8
    },
    {
      "id": "SDK-QUALITY-RELEASE-R005",
      "kind": "requirement",
      "parent": "SDK-QUALITY-RELEASE",
      "source": "specs/SDK-QUALITY-RELEASE/status.json",
      "title": "Hosted CI reproduces the pinned dependency graph from published wheels",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "096f27ee29e5",
        "0c1f49ced769",
        "42b930057c3e",
        "6856dbff0136",
        "851969957034"
      ],
      "verified_by": [
        "tests/gates/test_workflow_contract.py:132",
        "tests/test_conformance_plugin.py:102",
        "tests/test_conformance_plugin.py:109",
        "tests/test_conformance_plugin.py:119",
        "tests/test_conformance_plugin.py:134"
      ],
      "parent_title": "SDK-QUALITY-RELEASE \u2014 Portable SDK quality, Pages, and release",
      "definition": "**Hosted CI reproduces the pinned dependency graph from published wheels.** The frozen lock reproduces the hosted graph, including requested extras and transitive dependencies. The SDK installs `epistemic-graph` from PyPI only. `uv.lock` pins its registry wheels by SHA-256 and carries no source distribution. `pyproject.toml` lists it in `[tool.uv] no-build-package` and declares no other source for it. So a native build cannot occur. `scripts/epistemic_graph_release.json` names one of the locked wheels, with its version and SHA-256. The installed version matches the lock. SDK-consumed contract modules resolve only from the installed wheel package. No other path may overlay that package on the import path. Active dependencies match locked versions and installed metadata. The graph check rejects synthetic distribution metadata. Reject a Git or source pin, a source distribution, an unhashed wheel, an overlay, a wrong version, or graph drift. | Positive and adversarial tests prove that the lock, the build policy and the release record agree. They verify import origins inside the installed wheel, dependency resolution and extras closure. Negative cases reject Git sources, source distributions, unhashed wheels, overlays, outside origins or graph drift. The graph digest binds a provenance sidecar with the registry declaration and the installed-distribution evidence.",
      "definition_source": "specs/SDK-QUALITY-RELEASE/requirements.md",
      "definition_line": 9
    },
    {
      "id": "SDK-QUALITY-RELEASE-R005.1",
      "kind": "requirement",
      "parent": "SDK-QUALITY-RELEASE",
      "source": "specs/SDK-QUALITY-RELEASE/status.json",
      "title": "The SDK ships connector conformance as a test plugin",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8baf6d9167cd",
        "8f36880f39a7",
        "9a7af09b0f2c",
        "aa58c5dd6858"
      ],
      "verified_by": [
        "tests/test_conformance_plugin.py:102",
        "tests/test_conformance_plugin.py:109",
        "tests/test_conformance_plugin.py:119",
        "tests/test_conformance_plugin.py:134",
        "tests/test_conformance_plugin.py:145"
      ],
      "parent_title": "SDK-QUALITY-RELEASE \u2014 Portable SDK quality, Pages, and release",
      "definition": "**The SDK ships connector conformance as a test plugin.** The `pytest11` entry point loads `agent_connector_sdk.testing.plugin`. The plugin acts when the repository declares an `agent_connector_sdk.connector` entry point. It adds one test per conformance check, derived from the declared `Connector`. The checks cover the fleet name, the metadata version, startup, content surfaces and prompts. They also cover declared sources, ontology roll-up, ingest binding names and the absence of provider entry points. Each test carries the `spec` marker of this row. A run that names explicit node ids adds no test. A repository without the declaration adds none either. A connector repository holds no copy of these tests. | `tests/test_conformance_plugin.py` passes a conforming fixture. It breaks one property per check and expects the named check to fail. A subprocess run in a fixture repository reports one passing test per check.",
      "definition_source": "specs/SDK-QUALITY-RELEASE/requirements.md",
      "definition_line": 10
    },
    {
      "id": "SDK-REPOSITORY-TRANSPORT",
      "kind": "spec",
      "parent": null,
      "source": "specs/SDK-REPOSITORY-TRANSPORT/status.json",
      "title": "SDK-REPOSITORY-TRANSPORT \u2014 Authenticated immutable repository transport",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/SDK-REPOSITORY-TRANSPORT/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/SDK-REPOSITORY-TRANSPORT/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-REPOSITORY-TRANSPORT/requirements.md"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "SDK-REPOSITORY-TRANSPORT-R001",
      "kind": "requirement",
      "parent": "SDK-REPOSITORY-TRANSPORT",
      "source": "specs/SDK-REPOSITORY-TRANSPORT/status.json",
      "title": "Repository transport hydrates code and specification sources from Git",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "acf470ac4906"
      ],
      "verified_by": [
        "tests/test_repository_transport.py:117"
      ],
      "parent_title": "SDK-REPOSITORY-TRANSPORT \u2014 Authenticated immutable repository transport",
      "definition": "**Repository transport hydrates code and specification sources from Git.** The SDK fetches an authenticated, immutable repository revision and pages its file blobs and tombstones to the graph service's generated IndexRepository operation, letting a contributor hydrate both code and specification sources from their own Git provider without the SDK inventing symbol or semantic identity itself. | Integration tests using a local Git fixture that submit a revision through IndexRepository and confirm the graph service, not the SDK, produces the resulting symbol and specification identities.",
      "definition_source": "specs/SDK-REPOSITORY-TRANSPORT/requirements.md",
      "definition_line": 5
    },
    {
      "id": "SDK-REPOSITORY-TRANSPORT-R002",
      "kind": "requirement",
      "parent": "SDK-REPOSITORY-TRANSPORT",
      "source": "specs/SDK-REPOSITORY-TRANSPORT/status.json",
      "title": "SDK is the sole path for repository-native codebase hydration",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-REPOSITORY-TRANSPORT \u2014 Authenticated immutable repository transport",
      "definition": "**SDK is the sole path for repository-native codebase hydration.** Every connector performs repository-native codebase hydration through agent-connector-sdk. No separate repository-fetching path outside the SDK is maintained in parallel as an alternative implementation of the same capability. | A dependency and import scan across connector repositories confirming repository hydration calls route only through the SDK's transport package.",
      "definition_source": "specs/SDK-REPOSITORY-TRANSPORT/requirements.md",
      "definition_line": 6
    },
    {
      "id": "SDK-REPOSITORY-TRANSPORT-R003",
      "kind": "requirement",
      "parent": "SDK-REPOSITORY-TRANSPORT",
      "source": "specs/SDK-REPOSITORY-TRANSPORT/status.json",
      "title": "Repository ref walk traverses each Git tree once with batched reads",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "077a14c9f3d3",
        "9a6fe1ddcf26",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_repository_refwalk_fastpath.py:39",
        "tests/test_repository_refwalk_fastpath.py:78"
      ],
      "parent_title": "SDK-REPOSITORY-TRANSPORT \u2014 Authenticated immutable repository transport",
      "definition": "**Repository ref walk traverses each Git tree once with batched reads.** The repository transport's walk phase visits each distinct Git tree only once and reads objects in batches, using a recursive tree listing and a batched object-read call or an equivalent provider batch API, rather than issuing one call per object, since object-tree traversal is a dominant pre-parse cost on a large repository. | A before/after benchmark on public medium and large repository fixtures with cold and warm caches, reporting clone, fetch, walk, and submit timings separately and confirming output and refusal semantics are unchanged.",
      "definition_source": "specs/SDK-REPOSITORY-TRANSPORT/requirements.md",
      "definition_line": 7
    },
    {
      "id": "SDK-REPOSITORY-TRANSPORT-R004",
      "kind": "requirement",
      "parent": "SDK-REPOSITORY-TRANSPORT",
      "source": "specs/SDK-REPOSITORY-TRANSPORT/status.json",
      "title": "Repository transport submits bounded, outcome-complete index batches",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "acf470ac4906"
      ],
      "verified_by": [
        "tests/test_repository_transport.py:179",
        "tests/test_repository_transport.py:200",
        "tests/test_repository_transport.py:257"
      ],
      "parent_title": "SDK-REPOSITORY-TRANSPORT \u2014 Authenticated immutable repository transport",
      "definition": "**Repository transport submits bounded, outcome-complete index batches.** The repository transport authenticates before fetching, pages file blobs and tombstones within the default batch-size bounds, and submits each batch to the graph service's IndexRepository operation with a per-file outcome, so no blob is silently skipped and a batch is accepted only when requested and returned identity, path set, outcomes, and digest all agree. | Tests against synthetic Git fixtures asserting a too-large file or missing per-file outcome is refused and an oversized or misaligned batch cannot produce a complete indexing receipt.",
      "definition_source": "specs/SDK-REPOSITORY-TRANSPORT/requirements.md",
      "definition_line": 8
    },
    {
      "id": "SDK-REPOSITORY-TRANSPORT-R005",
      "kind": "requirement",
      "parent": "SDK-REPOSITORY-TRANSPORT",
      "source": "specs/SDK-REPOSITORY-TRANSPORT/status.json",
      "title": "Branch-aware transport batches indexing into one call per batch",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "acf470ac4906"
      ],
      "verified_by": [
        "tests/test_repository_transport.py:180"
      ],
      "parent_title": "SDK-REPOSITORY-TRANSPORT \u2014 Authenticated immutable repository transport",
      "definition": "**Branch-aware transport batches indexing into one call per batch.** Repository ingestion submits one batched IndexRepository call per bounded batch of files rather than issuing a separate round trip for each file, eliminating a per-file request loop as the dominant network cost of a large-repository ingest. | A test asserting the number of IndexRepository calls scales with the number of batches, not the number of files, for a repository fixture exceeding one batch size.",
      "definition_source": "specs/SDK-REPOSITORY-TRANSPORT/requirements.md",
      "definition_line": 9
    },
    {
      "id": "SDK-SCM",
      "kind": "spec",
      "parent": null,
      "source": "specs/SDK-SCM/status.json",
      "title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/SDK-SCM/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/SDK-SCM/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/http/client.py:117",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/http/client.py#L117"
        },
        {
          "declared_in": "specs/SDK-SCM/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/http/client.py:92",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/http/client.py#L92"
        },
        {
          "declared_in": "specs/SDK-SCM/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/mcp/action_dispatch.py:196",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/action_dispatch.py#L196"
        },
        {
          "declared_in": "specs/SDK-SCM/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/mcp/tool_surface.py:305",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/tool_surface.py#L305"
        },
        {
          "declared_in": "specs/SDK-SCM/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/ports/source_adapter.py:21",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/ports/source_adapter.py#L21"
        },
        {
          "declared_in": "specs/SDK-SCM/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-SCM/requirements.md"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "SDK-SCM-R001",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Source client",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Source client.** The SDK provides one typed client for the served `source.*` operations. It covers tree, blob, diff, history, blame, commit, land, and revert. A local bounded blob cache keyed by content digest backs blob reads. The connector or host composes the client; the SDK serves nothing itself. | Child rows R001.1 through R001.6 bind; `tests/test_source_client_served.py` proves the served path.",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 11
    },
    {
      "id": "SDK-SCM-R001.1",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Model.** The client exposes one frozen typed method per `source.*` operation. A request binds repository identity, revision or branch reference, a path prefix where the operation takes one, and typed parameters. A result is a typed page or receipt with a stable continuation token. No method accepts or returns an untyped payload. | `tests/test_source_client.py::test_request_and_page_models_are_typed_and_frozen`",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 12
    },
    {
      "id": "SDK-SCM-R001.2",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Behavior.** Read operations return bounded pages with continuations. A blob read consults the local cache first and serves cached bytes only while the stored digest matches. A write submits through its operation with one stable operation identity per logical change. An identical retry reuses that identity and returns the same receipt. The cache is bounded by entry count and byte count and evicts least-recently-used entries. | `tests/test_source_client.py::test_cache_is_bounded_and_digest_checked` and `tests/test_source_client.py::test_retry_reuses_operation_identity`",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 13
    },
    {
      "id": "SDK-SCM-R001.3",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Wiring.** The repository-manager connector composes the client behind its served development tools inside arbora MCP. A host may compose the same client directly. The client is a planned new module under `agent_connector_sdk/`. The connector's served operations build it with the authenticated caller and the served endpoint. They reach the SDK through `register_tool_surface` at `agent_connector_sdk/mcp/tool_surface.py:305` and `dispatch_async` at `agent_connector_sdk/mcp/action_dispatch.py:196`. The SDK owns no serving, registry, or admission code. | `tests/test_source_client_served.py::test_connector_tool_composes_the_client`",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 14
    },
    {
      "id": "SDK-SCM-R001.4",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Refusal.** A refused or failed operation returns a typed refusal with a closed reason code: `unauthorized`, `not_found`, `conflict`, `path_denied`, `oversized`, `deadline_exceeded`, `transport_unavailable`. A refused write produces no effect and advances no revision. A cache read whose digest does not match evicts the entry and re-reads through the served operation. | `tests/test_source_client.py::test_refusals_are_typed_and_zero_effect`",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 15
    },
    {
      "id": "SDK-SCM-R001.5",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Evidence.** Each result binds repository identity, revision, operation identity, request digest, page bounds, and the receipt reference where one exists. Cache events record digest, hit or miss, and eviction count without content. Diagnostics never contain credentials, resolved secret values, or private paths. | `tests/test_source_client.py::test_results_bind_provenance_without_secrets`",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 16
    },
    {
      "id": "SDK-SCM-R001.6",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Hot-path proof.** The served test enters through a registered repository-manager development tool inside arbora MCP. It calls a `source.*` operation through the SDK client against a controlled served backend. It observes the typed page. A warm and a cold blob read agree on digest and bytes. A conflicting commit returns the stable `conflict` code with zero write effect. | `tests/test_source_client_served.py::test_served_client_pages_and_conflict_refusal`",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 17
    },
    {
      "id": "SDK-SCM-R002",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Virtual workspace mount",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Virtual workspace mount.** The SDK provides a FUSE or overlay mount that materializes files on read and records writes as a pending changeset. The mount is sparse by declared path prefix. It performs no repository clone. | Child rows R002.1 through R002.6 bind; `tests/test_source_mount_served.py` proves the served path.",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 18
    },
    {
      "id": "SDK-SCM-R002.1",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Model.** The mount exposes a directory tree over the source client for declared path prefixes only. An entry carries path, mode, and blob digest. Mount state binds repository identity, base revision, prefix set, and pending changeset identity. A write produces one pending changeset entry with path, operation, and new blob reference. | `tests/test_source_mount.py::test_mount_state_and_entry_models_are_typed`",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 19
    },
    {
      "id": "SDK-SCM-R002.2",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Behavior.** Directory entries resolve lazily from the served tree operation. A file read materializes content through the client's blob path, using the local cache where the digest matches. A write appends one entry to the pending changeset and never mutates the mounted revision. A repeated write to one path replaces the earlier entry. A flush submits the pending changeset as one commit through the client. | `tests/test_source_mount.py::test_reads_materialize_and_writes_accumulate`",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 20
    },
    {
      "id": "SDK-SCM-R002.3",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Wiring.** The mount is a planned new module under `agent_connector_sdk/`. The connector or host composes it for tools that need files on a filesystem. FUSE is the default backend on hosts that provide it; an overlay copy-up backend covers hosts without FUSE. The SDK keeps no clone, object database, or full checkout behind the mount. | `tests/test_source_mount.py::test_mount_composes_the_source_client`",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 21
    },
    {
      "id": "SDK-SCM-R002.4",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Refusal.** The mount refuses to start without an admitted source client or with an unknown prefix. Path traversal and symlink escape outside the mount root refuse on every read and write. A flush whose base revision has changed returns the stable `conflict` code. A failed flush leaves the pending changeset intact and visible. | `tests/test_source_mount.py::test_refusals_preserve_pending_changeset`",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 22
    },
    {
      "id": "SDK-SCM-R002.5",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Evidence.** Mount events record repository identity, base revision, prefix set, read count, cache hit count, and pending changeset digest. A flush event binds the commit receipt and per-path outcomes. Diagnostics exclude credentials and private absolute paths. | `tests/test_source_mount.py::test_mount_events_bind_receipts_without_secrets`",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 23
    },
    {
      "id": "SDK-SCM-R002.6",
      "kind": "requirement",
      "parent": "SDK-SCM",
      "source": "specs/SDK-SCM/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SCM \u2014 SDK source client and virtual workspace",
      "definition": "**Hot-path proof.** The served test mounts the workspace over the source client against a controlled served `source.*` backend. Reads return exact bytes for declared prefixes and refuse outside them. A write followed by a flush submits exactly one changeset. A second flush after a conflicting change returns `conflict` and keeps the pending changeset intact. | `tests/test_source_mount_served.py::test_served_mount_read_write_and_conflicting_flush`",
      "definition_source": "specs/SDK-SCM/requirements.md",
      "definition_line": 24
    },
    {
      "id": "SDK-SOURCE-INGEST",
      "kind": "spec",
      "parent": null,
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/SDK-SOURCE-INGEST/spec.md",
      "component": "Source ingestion",
      "code_refs": [
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "external declaration; not verified",
          "label": "Approved query execution",
          "repository": "Knuckles-Team/epistemic-graph",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/epistemic-graph/blob/fe6982b29d0b60ad2a10092c959c238eeb74e919/specs/federated-query-and-reasoning/requirements.md"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "external declaration; not verified",
          "label": "EG-FEDERATED-QUERY-R015",
          "repository": "Knuckles-Team/epistemic-graph",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/epistemic-graph/blob/main/specs/federated-query-and-reasoning/requirements.md"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "external declaration; not verified",
          "label": "EG-FEDERATED-QUERY-R085",
          "repository": "Knuckles-Team/epistemic-graph",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/epistemic-graph/blob/c67bad3d6326da3b7c161c21fbd6cf78fec4cc6d/specs/federated-query-and-reasoning/requirements.md"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "external declaration; not verified",
          "label": "EG-REPO-INGEST-R002",
          "repository": "Knuckles-Team/epistemic-graph",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/epistemic-graph/blob/main/specs/repository-index-and-ingestion/requirements.md"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "external declaration; not verified",
          "label": "Source ingestion authority",
          "repository": "Knuckles-Team/epistemic-graph",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/epistemic-graph/blob/fe6982b29d0b60ad2a10092c959c238eeb74e919/specs/repository-index-and-ingestion/requirements.md"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/mcp/action_dispatch.py:194",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/action_dispatch.py#L194"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/ports/source_adapter.py:21",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/ports/source_adapter.py#L21"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/runner/syncing.py:200",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/runner/syncing.py#L200"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "../../agent_connector_sdk/runner/worker.py:150",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/runner/worker.py#L150"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "SDK-CONNECTOR-CONTROL-R021",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/requirements.md"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "SDK-GOVERNED-WRITEBACK-R001",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-GOVERNED-WRITEBACK/requirements.md"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/adapters/document_sources.py:402",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/adapters/document_sources.py#L402"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/adapters/event_feed.py:133",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/adapters/event_feed.py#L133"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/adapters/mcp_tool.py:107",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/adapters/mcp_tool.py#L107"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/adapters/mcp_tool.py:118",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/adapters/mcp_tool.py#L118"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/adapters/web_fetch.py:182",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/adapters/web_fetch.py#L182"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/adapters/web_fetch.py:86",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/adapters/web_fetch.py#L86"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/http/client.py:97",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/http/client.py#L97"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/http/retry.py:71",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/http/retry.py#L71"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/ingest/request.py:85",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/ingest/request.py#L85"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/ingest/service.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/ingest/service.py"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/ingest/service.py:74",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/ingest/service.py#L74"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/mcp/tool_surface.py:121",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/mcp/tool_surface.py#L121"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/runner/backoff.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/runner/backoff.py"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/runner/cli.py:153",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/runner/cli.py#L153"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/runner/supervisor.py:62",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/runner/supervisor.py#L62"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/runner/syncing.py:106",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/runner/syncing.py#L106"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/runner/worker.py:180",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/runner/worker.py#L180"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/sinks/epistemic_graph.py:91",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/sinks/epistemic_graph.py#L91"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/testing/http_server.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/testing/http_server.py"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/vendor_extractors/erpnext.py:91",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/vendor_extractors/erpnext.py#L91"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/vendor_extractors/odoo.py:74",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/vendor_extractors/odoo.py#L74"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_connector_sdk/vendor_extractors/social.py:160",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/agent_connector_sdk/vendor_extractors/social.py#L160"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-SOURCE-INGEST/requirements.md"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "external declaration; not verified",
          "kind": "depends on",
          "label": "Approved query execution",
          "repository": "Knuckles-Team/epistemic-graph",
          "url": "https://github.com/Knuckles-Team/epistemic-graph/blob/fe6982b29d0b60ad2a10092c959c238eeb74e919/specs/federated-query-and-reasoning/requirements.md"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "external declaration; not verified",
          "kind": "depends on",
          "label": "EG-FEDERATED-QUERY-R085",
          "repository": "Knuckles-Team/epistemic-graph",
          "url": "https://github.com/Knuckles-Team/epistemic-graph/blob/c67bad3d6326da3b7c161c21fbd6cf78fec4cc6d/specs/federated-query-and-reasoning/requirements.md"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "external declaration; not verified",
          "kind": "depends on",
          "label": "Source ingestion authority",
          "repository": "Knuckles-Team/epistemic-graph",
          "url": "https://github.com/Knuckles-Team/epistemic-graph/blob/fe6982b29d0b60ad2a10092c959c238eeb74e919/specs/repository-index-and-ingestion/requirements.md"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "local spec declaration",
          "kind": "depends on",
          "label": "SDK-CONNECTOR-CONTROL-R021",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-CONNECTOR-CONTROL/spec.md"
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "evidence": "local spec declaration",
          "kind": "depends on",
          "label": "SDK-GOVERNED-WRITEBACK-R001",
          "repository": "Knuckles-Team/scion-sdk",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/SDK-GOVERNED-WRITEBACK/spec.md"
        }
      ],
      "plan_diagrams": [
        "flowchart LR\n    Caller[Authenticated caller] --> Registry[Connector tool registration]\n    Registry --> Dispatch[SDK dispatch_async]\n    Dispatch --> Source[Connector source method]\n    Source --> Backend[Database / node / local file / enterprise API]\n    Runner[connector-sync worker] --> Adapter[Certified SourceAdapter]\n    Adapter --> Source\n    Adapter --> Sync[sync_stream receipt validation]\n    Sync --> EG[Generated SourceIngest]\n    EG --> Progress[Durable checkpoint]\n    Progress --> Runner\n"
      ],
      "unparsed_references": [
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "text": "no research-paper derivation is claimed for these six contracts."
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "text": "no research-paper derivation is claimed for this contract."
        },
        {
          "declared_in": "specs/SDK-SOURCE-INGEST/plan.md",
          "text": "the source motivates ordered per-channel backends and observed status."
        }
      ]
    },
    {
      "id": "SDK-SOURCE-INGEST-R001",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK runner completes on generated ConnectorPack and SourceIngest contracts",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK runner completes on generated ConnectorPack and SourceIngest contracts.** The connector SDK's runner implementation replaces placeholder sink and progress-tracking stubs with the generated ConnectorPack and SourceIngest contracts, tracks progress through SourceCheckpoint, and composes connector configuration from one root structure. | Integration tests run the runner against the generated SourceIngest client and confirm SourceCheckpoint state matches the contract after each page.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 5
    },
    {
      "id": "SDK-SOURCE-INGEST-R002",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK drift classifier quarantines incompatible schema changes",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ffb9260d7602"
      ],
      "verified_by": [
        "tests/test_schema_drift.py:181"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK drift classifier quarantines incompatible schema changes.** The SDK's drift classifier deterministically compares prior and current schema digests. It emits a SchemaDriftReport classifying each change as compatible, needing review, or breaking. Incompatible pages are quarantined without advancing the SourceCheckpoint, per a declared schema evolution policy. | Contract tests feed representative schema changes through the classifier and assert the correct SchemaDriftReport classification and quarantine behavior.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 6
    },
    {
      "id": "SDK-SOURCE-INGEST-R003",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK records and pauses on proposed schema repairs",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "23f241b07560",
        "ffb9260d7602"
      ],
      "verified_by": [
        "tests/test_schema_repair.py:138"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK records and pauses on proposed schema repairs.** When a schema repair mapping is proposed, the connector SDK records the proposal and pauses the affected stream. It never constructs a candidate graph schema, validates instances, performs a shadow ingest, or activates a repair itself. Those steps belong to the graph service. | Integration tests assert that a proposed repair pauses the stream and that the SDK makes no direct schema-activation call.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 7
    },
    {
      "id": "SDK-SOURCE-INGEST-R004",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK runner performs enterprise source synchronization",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "23f241b07560",
        "3735e4434463",
        "4ce2308afe64",
        "55bab2b23000"
      ],
      "verified_by": [
        "tests/test_ingest.py:176",
        "tests/test_ingest.py:193",
        "tests/test_ingest.py:221"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK runner performs enterprise source synchronization.** The connector SDK's runner performs enterprise source synchronization through the generated SourceIngest client and the presets the server declares. It also owns connection profiling and data preparation for enterprise sources. Agent-utilities no longer implements these directly. | Integration tests exercise full, delta, and reconcile enterprise sync paths through the SDK runner and confirm receipt parity.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 8
    },
    {
      "id": "SDK-SOURCE-INGEST-R005",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK adapters cover document, conversation, and feed sources",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "3735e4434463",
        "45c6c7c1fd37",
        "8e87ef9675f0",
        "db3659c92a3b"
      ],
      "verified_by": [
        "tests/test_adapters_web_fetch_source_adapter.py:54",
        "tests/test_adapters_web_fetch_source_adapter.py:66"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK adapters cover document, conversation, and feed sources.** The SDK provides typed adapters for web fetch, package-install ingestion, repository transport, and non-model readers. These replace equivalent agent-utilities implementations. Paper-provider search and document retrieval are defined in R005.1 through R005.6. | Adapter parity tests confirm each source type produces typed envelopes and a recoverable SourceCheckpoint through the generated SourceIngest client.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 9
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Frozen `PaperQuery` carries tenant, query, provider IDs, continuation map, page bound and deadline. `PaperRecord` carries canonical ID, revision, title, authors, abstract, publication date, document offers and field provenance. `ProviderReport` carries provider, continuation token, outcome and reason. Outcomes are `ok`, `failed`, `rate_limited` or `refused`. `PaperSearchResult` contains records, reports and completeness (`complete`, `partial`, `failed`). `DocumentReceipt` binds tenant, paper ID, revision, source URL, media type, byte count, SHA-256 and local artifact reference. | SI-09 validates closed fields and malformed identity or limits.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 10
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Query each configured independent provider within declared bounds. Merge exact canonical identities and retain every provider reference. Report a failing provider without discarding healthy results. Enforce each provider quota for search and download. Save complete documents atomically under authorized local storage. Fill only missing provider metadata from document content, preserving extraction provenance. Named rules and conflict handling are defined in the plan. | SI-10 covers deduplication, partial failure, quotas, complete downloads and metadata fallback.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 11
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Reuse `McpToolSourceAdapter.extract` at `agent_connector_sdk/adapters/mcp_tool.py:118` for certified connector tools. Production sync reaches it from `agent_connector_sdk/runner/worker.py:180`. Add shared paper normalization, provider aggregation and document transfer behind the existing source port. Connector packages register their provider search and document operations through `register_tool_surface` at `agent_connector_sdk/mcp/tool_surface.py:121`. Use `create_async_http_client` at `agent_connector_sdk/http/client.py:97`; provider-specific APIs remain in connector packages. These paper operations and their registration are missing wiring. | SI-11 enters served connector operations, then the existing sync runner and generated SourceIngest boundary.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 12
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Closed reasons are `unauthorized`, `unknown_provider`, `invalid_query`, `provider_failed`, `rate_limited`, `deadline_exceeded`, `egress_denied`, `document_unavailable`, `unsupported_media`, `size_exceeded`, `integrity_failed`, `storage_denied` and `parse_failed`. Authentication, tenant and destination checks precede requests or file writes. Report per-provider failures; all-provider failure returns `failed`, never an empty successful search. A failed download exposes no complete artifact. Failed provider pages never advance their accepted checkpoint or imply deletion. | SI-12 checks every refusal class, no unauthorized effects and unchanged failed-stream checkpoints.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 13
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Record query digest, tenant, request, provider, canonical paper ID, revision, observed time, schema digest and provider outcome. Every merged field retains its provider or document digest and extraction location. Download evidence includes bytes, digest, quota waits, retry count and final artifact reference. Preserve conflicting values with provenance. Redact credentials, signed URL secrets and local absolute paths. | SI-13 checks provenance, conflict visibility, redaction and deterministic identity across retries.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 14
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** `tests/test_paper_source_served.py::test_served_search_download_and_sync` starts a real connector using the SDK server factory. Enter the `tools/call` wire method for search and document retrieval against controlled provider HTTP servers. Observe deduplicated metadata, partial failure and complete local bytes. Then run `connector-sync --once` through certified discovery and the generated SourceIngest client. Restart and read the durable checkpoint to prove no duplicate ingestion or skipped failed provider. | SI-14 requires served transport, real provider responses, filesystem bytes and a running graph receipt; helper-only tests are insufficient.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 15
    },
    {
      "id": "SDK-SOURCE-INGEST-R006",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK packs own vendor enrichment extraction and write-back",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "b55555566da2"
      ],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK packs own vendor enrichment extraction and write-back.** Vendor extractors become SDK manifest presets and adapters. The SDK moves write-back behind a module that calls the graph service's governed contract. The SDK moves repository history and source-adapter enrichment into its repository adapter. | Adapter tests confirm each vendor extractor runs as an SDK preset and that write-back calls route through the governed contract.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 16
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Uptime Kuma monitor extractor. Defines the typed vendor-extractor contract",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "10376b1e9728",
        "1cbd1de01d83",
        "36d2c92e439c",
        "3735e4434463",
        "9511ab38c04c"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_contract.py:30",
        "tests/test_vendor_extractors_contract.py:40",
        "tests/test_vendor_extractors_contract.py:51",
        "tests/test_vendor_extractors_uptime_kuma.py:23",
        "tests/test_vendor_extractors_uptime_kuma.py:53"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Uptime Kuma monitor extractor. Defines the typed vendor-extractor contract.** The connector SDK's `vendor_extractors` package defines `VendorExtractor`: a plain `extract(config) -> ChangeSet` function returning `agent_connector_sdk.ingest` `Entity`/`Relationship` records. The `uptime_kuma` extractor is the first ported from `agent_utilities.knowledge_graph.enrichment.extractors.uptime_kuma` onto this contract. | A unit test feeds a fake Uptime client through `extract` and asserts the returned `ChangeSet` carries the expected entities. A contract test registers and looks up the extractor by category.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 17
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Ansible Automation inventory and job extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "9511ab38c04c",
        "bd6e0d836c92"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_ansible.py:23",
        "tests/test_vendor_extractors_ansible.py:46",
        "tests/test_vendor_extractors_ansible.py:55",
        "tests/test_vendor_extractors_ansible.py:60",
        "tests/test_vendor_extractors_ansible.py:69"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Ansible Automation inventory and job extractor.** The `ansible` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.ansible` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1. It emits a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts the returned `ChangeSet` matches the agent-utilities extractor's node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 18
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Caddy reverse-proxy route extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "9511ab38c04c"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_caddy.py:38",
        "tests/test_vendor_extractors_caddy.py:56",
        "tests/test_vendor_extractors_caddy.py:61",
        "tests/test_vendor_extractors_caddy.py:66",
        "tests/test_vendor_extractors_caddy.py:75"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Caddy reverse-proxy route extractor.** The `caddy` extractor moves onto the `VendorExtractor` contract in SDK-SOURCE-INGEST-R006.1. It comes from `agent_utilities.knowledge_graph.enrichment.extractors.caddy`. It emits a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 19
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Home Assistant entity and scene extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "9511ab38c04c"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_home_assistant.py:23",
        "tests/test_vendor_extractors_home_assistant.py:53",
        "tests/test_vendor_extractors_home_assistant.py:60",
        "tests/test_vendor_extractors_home_assistant.py:65",
        "tests/test_vendor_extractors_home_assistant.py:74"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Home Assistant entity and scene extractor.** The `home_assistant` extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.home_assistant` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1. It emits a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 20
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the ArchiMate model element extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "36d2c92e439c",
        "3735e4434463"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_archimate.py:27",
        "tests/test_vendor_extractors_archimate.py:57",
        "tests/test_vendor_extractors_archimate.py:72",
        "tests/test_vendor_extractors_archimate.py:77",
        "tests/test_vendor_extractors_archimate.py:89"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the ArchiMate model element extractor.** The `archimate` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.archimate` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 21
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Kafka topic and cluster extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "36d2c92e439c",
        "3735e4434463"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_kafka.py:27",
        "tests/test_vendor_extractors_kafka.py:52",
        "tests/test_vendor_extractors_kafka.py:61",
        "tests/test_vendor_extractors_kafka.py:66",
        "tests/test_vendor_extractors_kafka.py:78"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Kafka topic and cluster extractor.** The `kafka` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.kafka` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 22
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.7",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Salesforce CRM record extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "36d2c92e439c",
        "3735e4434463"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_salesforce.py:26",
        "tests/test_vendor_extractors_salesforce.py:59",
        "tests/test_vendor_extractors_salesforce.py:64",
        "tests/test_vendor_extractors_salesforce.py:73"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Salesforce CRM record extractor.** The `salesforce` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.salesforce` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 23
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.8",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Grafana LGTM observability-stack extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "bbf11894fed5"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_lgtm.py:31",
        "tests/test_vendor_extractors_lgtm.py:57",
        "tests/test_vendor_extractors_lgtm.py:72",
        "tests/test_vendor_extractors_lgtm.py:77",
        "tests/test_vendor_extractors_lgtm.py:92"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Grafana LGTM observability-stack extractor.** The `lgtm` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.lgtm` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 24
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.9",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Microsoft 365 mail, calendar, and Teams extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "bbf11894fed5"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_microsoft.py:27",
        "tests/test_vendor_extractors_microsoft.py:60",
        "tests/test_vendor_extractors_microsoft.py:65",
        "tests/test_vendor_extractors_microsoft.py:77"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Microsoft 365 mail, calendar, and Teams extractor.** The `microsoft` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.microsoft` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 25
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.10",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Technitium DNS zone and record extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "bbf11894fed5"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_technitium_dns.py:27",
        "tests/test_vendor_extractors_technitium_dns.py:58",
        "tests/test_vendor_extractors_technitium_dns.py:63",
        "tests/test_vendor_extractors_technitium_dns.py:75"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Technitium DNS zone and record extractor.** The `technitium_dns` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.technitium_dns` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 26
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.11",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Portainer container and stack extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "e4f6426897ba"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_portainer.py:36",
        "tests/test_vendor_extractors_portainer.py:76",
        "tests/test_vendor_extractors_portainer.py:81",
        "tests/test_vendor_extractors_portainer.py:93"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Portainer container and stack extractor.** The `portainer` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.portainer` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 27
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.12",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Emerald Exchange market extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "e4f6426897ba"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_emerald.py:45",
        "tests/test_vendor_extractors_emerald.py:70",
        "tests/test_vendor_extractors_emerald.py:80",
        "tests/test_vendor_extractors_emerald.py:85"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Emerald Exchange market extractor.** The `emerald` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.emerald` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 28
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.13",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Mealie recipe and meal-plan extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "e4f6426897ba"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_mealie.py:33",
        "tests/test_vendor_extractors_mealie.py:63",
        "tests/test_vendor_extractors_mealie.py:78",
        "tests/test_vendor_extractors_mealie.py:83",
        "tests/test_vendor_extractors_mealie.py:98"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Mealie recipe and meal-plan extractor.** The `mealie` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.mealie` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 29
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.14",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Keycloak realm, client, and identity extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "bd6e0d836c92"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_keycloak.py:31",
        "tests/test_vendor_extractors_keycloak.py:58",
        "tests/test_vendor_extractors_keycloak.py:72",
        "tests/test_vendor_extractors_keycloak.py:77",
        "tests/test_vendor_extractors_keycloak.py:92"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Keycloak realm, client, and identity extractor.** The `keycloak` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.keycloak` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 30
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.15",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Odoo ERP record extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "bd6e0d836c92"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_odoo.py:27",
        "tests/test_vendor_extractors_odoo.py:55",
        "tests/test_vendor_extractors_odoo.py:60",
        "tests/test_vendor_extractors_odoo.py:72"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Odoo ERP record extractor.** The `odoo` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.odoo` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 31
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.16",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Nextcloud file and share extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "bd6e0d836c92"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_nextcloud.py:105",
        "tests/test_vendor_extractors_nextcloud.py:41",
        "tests/test_vendor_extractors_nextcloud.py:69",
        "tests/test_vendor_extractors_nextcloud.py:88",
        "tests/test_vendor_extractors_nextcloud.py:93"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Nextcloud file and share extractor.** The `nextcloud` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.nextcloud` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 32
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.17",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the wger workout and exercise extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "10376b1e9728",
        "3735e4434463",
        "a41cc47d27d3"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_wger_okta_twenty.py:63",
        "tests/test_vendor_extractors_wger_okta_twenty.py:90"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the wger workout and exercise extractor.** The `wger` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.wger` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 33
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.18",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Okta identity and directory extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "7f190c51f090",
        "a41cc47d27d3"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_wger_okta_twenty.py:122",
        "tests/test_vendor_extractors_wger_okta_twenty.py:98"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Okta identity and directory extractor.** The `okta` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.okta` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 34
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.19",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Twenty CRM record extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "7f190c51f090",
        "a41cc47d27d3"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_wger_okta_twenty.py:130",
        "tests/test_vendor_extractors_wger_okta_twenty.py:167"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Twenty CRM record extractor.** The `twenty` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.twenty` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 35
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.20",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the RSA Archer GRC record extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "e626b457bb1d"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_archer_infra_a2a.py:30",
        "tests/test_vendor_extractors_archer_infra_a2a.py:52"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the RSA Archer GRC record extractor.** The `archer` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.archer` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 36
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.21",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Infrastructure inventory extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "e626b457bb1d"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_archer_infra_a2a.py:60",
        "tests/test_vendor_extractors_archer_infra_a2a.py:84"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Infrastructure inventory extractor.** The `infra` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.infra` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 37
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.22",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the A2A agent-registry extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "e626b457bb1d"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_archer_infra_a2a.py:118",
        "tests/test_vendor_extractors_archer_infra_a2a.py:92"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the A2A agent-registry extractor.** The `a2a` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.a2a` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 38
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.23",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Grafana dashboard extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "1cbd1de01d83",
        "3735e4434463"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_grafana_leanix_erpnext.py:30",
        "tests/test_vendor_extractors_grafana_leanix_erpnext.py:63"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Grafana dashboard extractor.** The `grafana` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.grafana` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 39
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.24",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the LeanIX enterprise-architecture factsheet extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "1cbd1de01d83",
        "3735e4434463"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_grafana_leanix_erpnext.py:103",
        "tests/test_vendor_extractors_grafana_leanix_erpnext.py:71"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the LeanIX enterprise-architecture factsheet extractor.** The `leanix` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.leanix` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 40
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.25",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the ERPNext record extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "1cbd1de01d83",
        "3735e4434463"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_grafana_leanix_erpnext.py:111",
        "tests/test_vendor_extractors_grafana_leanix_erpnext.py:152"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the ERPNext record extractor.** The `erpnext` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.erpnext` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 41
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.26",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the ServiceNow ITSM record extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "9d8b3f7f89f1"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_servicenow_ciso_social.py:38",
        "tests/test_vendor_extractors_servicenow_ciso_social.py:68"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the ServiceNow ITSM record extractor.** The `servicenow` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.servicenow` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 42
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.27",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the CISO Assistant compliance extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "9d8b3f7f89f1"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_servicenow_ciso_social.py:111",
        "tests/test_vendor_extractors_servicenow_ciso_social.py:76"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the CISO Assistant compliance extractor.** The `ciso_assistant` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.ciso_assistant` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 43
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.28",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the social-platform extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "9d8b3f7f89f1"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_servicenow_ciso_social.py:119",
        "tests/test_vendor_extractors_servicenow_ciso_social.py:143",
        "tests/test_vendor_extractors_servicenow_ciso_social.py:152"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the social-platform extractor.** The `social` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.social` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 44
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.29",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the ARIS process-model extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "10376b1e9728",
        "3735e4434463"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_aris_egeria_camunda.py:30",
        "tests/test_vendor_extractors_aris_egeria_camunda.py:54"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the ARIS process-model extractor.** The `aris` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.aris` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 45
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.30",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Egeria governance and glossary extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "10376b1e9728",
        "3735e4434463"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_aris_egeria_camunda.py:62",
        "tests/test_vendor_extractors_aris_egeria_camunda.py:93"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Egeria governance and glossary extractor.** The `egeria` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.egeria` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 46
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.31",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ports the Camunda process extractor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "10376b1e9728",
        "3735e4434463"
      ],
      "verified_by": [
        "tests/test_vendor_extractors_aris_egeria_camunda.py:101",
        "tests/test_vendor_extractors_aris_egeria_camunda.py:122"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ports the Camunda process extractor.** The `camunda` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.camunda` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 47
    },
    {
      "id": "SDK-SOURCE-INGEST-R007",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Drift gate runs inside the SDK connector-sync runner",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ffb9260d7602"
      ],
      "verified_by": [
        "tests/test_schema_drift.py:206"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Drift gate runs inside the SDK connector-sync runner.** The schema-drift gate covers classification, shaping, and reporting. It runs inside the connector SDK's sync runner between draining and applying a page, not in agent-utilities. Candidate schema rendering, the contract store, and activation live in epistemic-graph, not the SDK. | Integration tests confirm the drift gate executes within the SDK runner's drain and apply sequence. Tests also confirm that no SHACL rendering or activation call originates from the SDK.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 48
    },
    {
      "id": "SDK-SOURCE-INGEST-R008",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Connectors ingest occurrence and weather observations",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "289aadb634d8",
        "3735e4434463",
        "83b7dd3f33eb"
      ],
      "verified_by": [
        "tests/test_earth_observation_records.py:38",
        "tests/test_earth_observation_records.py:54",
        "tests/test_earth_observation_records.py:66"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Connectors ingest occurrence and weather observations.** The connector SDK includes adapters that ingest GBIF and iNaturalist occurrence records as OrganismObservation, NOAA GHCN/ISD and Open-Meteo data as WeatherObservation, and NOAA storm events as WeatherEvent occurring in a WeatherSystem, with weather stations represented as Place located in a Region. | Adapter tests confirm each source produces the correct typed records and place/region relationships.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 49
    },
    {
      "id": "SDK-SOURCE-INGEST-R009",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Taxonomy connector ingests NCBI/GBIF taxa as kg:Taxon",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3735e4434463",
        "bfe88b9d8521",
        "ff4c1aaafc8a"
      ],
      "verified_by": [
        "tests/test_taxonomy_records.py:29",
        "tests/test_taxonomy_records.py:40",
        "tests/test_taxonomy_records.py:50"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Taxonomy connector ingests NCBI/GBIF taxa as kg:Taxon.** A taxonomy connector ingests NCBI Taxonomy and GBIF backbone taxa as kg:Taxon individuals. Each individual carries rank, parent, scientific name, NCBI and GBIF identifiers, and a term CURIE. The connector validates each individual against the world_model-v1 TaxonShape and synchronizes deltas within bounds. | Contract tests validate ingested taxa against TaxonShape and confirm delta synchronization stays within its configured bound.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 50
    },
    {
      "id": "SDK-SOURCE-INGEST-R010",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ships the ingest worker runner `run_ingest_worker` (unblocks `EG-INGEST-WORKER-R001.14`)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ships the ingest worker runner `run_ingest_worker` (unblocks `EG-INGEST-WORKER-R001.14`).** New module `agent_connector_sdk/runner/ingest_worker.py` holds one function `run_ingest_worker`. It asks the engine, through the generated client, for admission, lane floors and routing. It then claims a job and runs the job body with the existing source-effect runners. It acks success or failure and commits only after the ack (at-least-once). The worker holds no scheduling policy of its own. It has no priority, lane, concurrency or retry-schedule constants. Every such value comes from the engine reply. EG holds no source credentials. | `tests/runner/test_ingest_worker.py` uses a fake client. It asserts that the ack follows execution and that a killed body sends no ack. A refused admission or an absent lane floor makes the worker wait or exit rather than choose a value.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 51
    },
    {
      "id": "SDK-SOURCE-INGEST-R011",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "SDK ships the `ingest-worker` command (unblocks `EG-INGEST-WORKER-R001.15`)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**SDK ships the `ingest-worker` command (unblocks `EG-INGEST-WORKER-R001.15`).** `pyproject.toml` gains console script `ingest-worker = agent_connector_sdk.runner.ingest_worker_cli:main` with `--workers` and `--engine-endpoint`. The worker count is the engine's admitted answer (default autosize is requested from the engine, not computed in the SDK). The command exits 2 before claiming anything when the engine is unreachable or lacks the task-queue methods, and drains on SIGTERM. | `tests/runner/test_ingest_worker_cli.py` asserts exit code 2 against an unreachable engine, exit 2 on a missing task-queue method, and a clean drain on SIGTERM.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 52
    },
    {
      "id": "SDK-SOURCE-INGEST-R012",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Platform reads and searches use declared backend fallback chains",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Platform reads and searches use declared backend fallback chains.** Each platform capability exposes its ordered backend policy, selected backend and observed health. SDK applies mechanical fallback within that policy; EG retains semantic planning and decisions. R005 owns source ingestion and independent paper-provider aggregation. This row owns alternative backends for one equivalent read/search request. | SI-15 through SI-20 require typed contracts and served dispatcher acceptance.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 53
    },
    {
      "id": "SDK-SOURCE-INGEST-R012.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Closed `PlatformCapability` declares platform, channel, operation, schema revision, required scope and ordered `BackendPolicy` entries. `PlatformRequest` binds authenticated tenant, principal, connector, target or query, limits and request identity. `PlatformResult` contains outcome, records, selected backend, ordered attempts and channel status. Each attempt records backend, outcome, typed reason, timing and redacted provenance. The plan defines fields and bounds. | SI-15 validates inventory, request, result and separate read/search status.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 54
    },
    {
      "id": "SDK-SOURCE-INGEST-R012.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** `ordered_equivalent_fallback` tries only admitted, equivalent backends in declared order. Apply one total deadline and attempt budget across transport retries and fallback. Stop on the first valid response, including an empty successful search. Never convert a failed chain into empty success. Status identifies the actual winning backend and observed failures for that capability. | SI-16 proves bounded order, empty success, cancellation and backend status.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 55
    },
    {
      "id": "SDK-SOURCE-INGEST-R012.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Extend the existing adapter package with shared typed fallback composition. Connector registrars use `register_tool_surface` at `agent_connector_sdk/mcp/tool_surface.py:121`. Served read/search handlers call `dispatch_async` at `agent_connector_sdk/mcp/action_dispatch.py:194` against that composition. Reuse governed HTTP and `McpToolSourceAdapter.extract` at `agent_connector_sdk/adapters/mcp_tool.py:118`. The platform inventory, fallback client methods, typed response and connector registration remain missing wiring. | SI-17 traces tools/call through registration, actual dispatcher, backend HTTP and the receiving SDK client.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 56
    },
    {
      "id": "SDK-SOURCE-INGEST-R012.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Reasons are `invalid_request`, `unsupported_capability`, `unauthorized`, `no_backend`, `chain_exhausted`, `deadline_exceeded`, `cancelled`, `rate_limited`, `egress_denied`, `trust_failed`, `invalid_response` and `not_found`. No backend call occurs without authenticated scope and connector policy. Authorization or trust failures stop the chain; changing backend must never weaken access. Retain every attempted failure when all eligible backends fail. | SI-18 proves terminal reasons, zero denied dispatch and no failed-page checkpoint advance.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 57
    },
    {
      "id": "SDK-SOURCE-INGEST-R012.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Bind each result to request digest, tenant, connector, platform, operation, policy revision and schema digest. Record actual backend, attempt sequence, timestamps, health freshness and content provenance. Status is scoped to the capability and caller authority; it is never evidence that every platform works. Redact credentials, signed URL secrets, raw queries and private destinations. | SI-19 proves provenance, status isolation, freshness and secret redaction.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 58
    },
    {
      "id": "SDK-SOURCE-INGEST-R012.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** `tests/test_platform_fallback_served.py::test_served_dispatch_fallback_and_status` enters the `tools/call` wire method on an SDK server. Controlled local HTTP backends make the first backend fail and the second succeed. Observe dispatcher traversal, ordered attempts, selected backend and current channel status through the client. All-failed, unsupported and unauthorized cases return typed failures; unauthorized and unsupported requests dispatch nothing. | SI-20 requires real served dispatch and backend request evidence; helper-only tests cannot satisfy acceptance.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 59
    },
    {
      "id": "SDK-SOURCE-INGEST-R001.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Extend SyncTarget at `agent_connector_sdk/runner/syncing.py:40` with stage descriptors. Bind stage ID, tenant, source, manifest digest, dependencies and admitted concurrency. Keep generated SourceCheckpoint as the only progress token type. | Reject duplicate streams, cycles, missing authority and unbounded concurrency before extraction.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 65
    },
    {
      "id": "SDK-SOURCE-INGEST-R001.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Run independent admitted stages concurrently under admitted limits. Fetch strictly after each accepted stage progress token; dependent stages wait for required durable receipts. Only matching receipts advance that stage. Failed stages remain resumable. | Overlap two independent stages; preserve dependency order when one stage fails.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 66
    },
    {
      "id": "SDK-SOURCE-INGEST-R001.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Extend the sequential preset loop at `agent_connector_sdk/runner/worker.py:150`, called by ConnectorWorker.run_once. Attach stage execution to _sync at line 180 and sync_stream at `agent_connector_sdk/runner/syncing.py:200`. Concurrent stage composition has no production caller today. | Enter connector-sync --once; observe worker execution, generated status reads and accepted commits.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 67
    },
    {
      "id": "SDK-SOURCE-INGEST-R001.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Refuse identity collisions, cycles, absent limits and mismatched receipts before affected extraction or advancement. Cancellation stops new work. Ambiguous commits require durable readback before retry. Failed stages cannot inherit another stage's progress token. | Inject scope mismatch, timeout after commit, cancellation and failed dependencies; require no skipped or duplicate accepted records.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 68
    },
    {
      "id": "SDK-SOURCE-INGEST-R001.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Reports bind run, stage, dependency receipts, previous progress token, offered progress token and accepted receipt. Distinguish complete, failed, blocked and cancelled stages. Aggregate success requires all required stages. Logs contain no credentials or private payloads. | Compare reports with durable status after restart and check redaction.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 69
    },
    {
      "id": "SDK-SOURCE-INGEST-R001.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point test `tests/test_source_stages_served.py::test_concurrent_stage_restart` enters connector-sync --once with registered source tools and a running graph. Kill one stage after another commits, restart, and read accepted records through the generated client. Helper-only tests cannot establish acceptance. | Prove overlapping requests, exact resume boundaries, no refetch of accepted events and no duplicate durable effects.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 70
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Extend SourceAdapter at `agent_connector_sdk/ports/source_adapter.py:21` with a typed database execution boundary. Bind engine-approved relational operation or SQL, dialect, parameters, authority and snapshot identity. Results expose bounded chunks and mandatory terminal completion or typed failure. | Validate parameter types, dialect, limits, snapshot and authority before database calls.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 76
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Render approved operations into native parameterized SQL and execute through the driver. Stream under fixed row, byte and queue limits with backpressure. Never infer query semantics or buffer the whole result. Only terminal completion establishes query success. | Run parameterized native SQL; measure memory across increasing row counts under unchanged limits.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 77
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Create database methods in the existing adapter package behind connector registration. dispatch_async at `agent_connector_sdk/mcp/action_dispatch.py:194` calls them. McpToolSourceAdapter.extract at `agent_connector_sdk/adapters/mcp_tool.py:118` feeds sync_stream at `agent_connector_sdk/runner/syncing.py:200`. Native SQL execution is absent from this path. | Trace tools/call to the real driver and connector-sync to generated receipts without mocking dispatch.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 78
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Return typed unsupported_dialect, invalid_query, unauthorized, query_failed, limit_exceeded or cancelled outcomes. Failure after chunks remains failure with an incomplete query identity. Emit no successful terminal result or failed-chunk checkpoint. Previously accepted pages retain explicit durable receipts. | Inject failure after three chunks; require visible failure, closed database handle and no silent partial success.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 79
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Bind evidence to operation and parameter digests, dialect, schema, snapshot, chunk sequence and terminal outcome. Record rows, bytes, queue high-water mark and peak resident memory. Redact SQL literals, parameter values and credentials. | Match chunk bounds and receipts to the query; check redaction on success and failure.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 80
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point test `tests/test_sql_source_served.py::test_native_sql_stream_and_failure` calls a registered connector through tools/call with an actual local SQL database. Run certified sync and inject driver failure through the same connector. Measure memory in separate fixed-limit processes. | Require correct rows, native parameter binding, bounded memory, terminal failure and durable checkpoint agreement.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 81
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.7",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Reuse deterministic extraction at `agent_connector_sdk/vendor_extractors/social.py:160`. Add typed file requests and bookmark envelopes. Bind authorized file, digest, export revision, bookmark ID, text, hashtags, URLs, tool mentions and local domain category. | Validate identities, supported export shapes and local vocabulary revision.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 87
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.8",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Read bounded JSON records and extract metadata from stored content and a versioned local mapping. Preserve source offsets and raw values alongside normalization. Unknown tools and domains remain unknown. Identical bytes and bookmark identities produce stable records without external calls. | Import duplicate and unknown-domain fixtures; require stable IDs, deterministic metadata and zero network or model requests.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 88
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.9",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Create the JSON reader in the adapter package and register it through certified source discovery. Reuse social.extract at `agent_connector_sdk/vendor_extractors/social.py:160`. ConnectorWorker._sync at `agent_connector_sdk/runner/worker.py:180` calls it through sync_stream. The reader and domain categorizer have no production caller today. | Enter connector-sync --once with on-disk JSON; observe discovery, extraction and generated ingestion.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 89
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.10",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Refuse malformed JSON, unsupported exports, absent IDs, oversized records and unauthorized paths. Never fetch embedded URLs or execute source instructions. Report invalid records explicitly and retain the failed page progress token. An empty ChangeSet must not hide malformed input. | Prove visible failures, zero outbound calls and unchanged checkpoints for malformed input and path escapes.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 90
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.11",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Records bind file digest, record position, source identity and mapping revision. Each extracted field carries its source location or mapping key. Reports distinguish unknown metadata from rejected input and redact private paths. | Read accepted provenance from the graph and reproduce metadata from identical bytes.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 91
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.12",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point test `tests/test_bookmark_source_served.py::test_offline_bookmark_import` runs connector-sync --once with the registered file connector and running graph. Use JSON containing hashtags, URLs, tools and domains. Deny all network egress except test graph transport. | Assert exact metadata, zero external-service attempts, stable reimport and no advancement for rejected pages.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 92
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.13",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Extend EventFeedSourceAdapter at `agent_connector_sdk/adapters/event_feed.py:89` with a typed chain-log descriptor. Bind chain ID, contract, decoder revision, block range, transaction hash and log index. Trades carry exact asset identifiers, integer amounts, scales, side and block provenance. | Validate chain, contract, signature, decoder revision and exact numeric representation without float rounding.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 98
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.14",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Read bounded transaction logs through JSON-RPC and decode only the declared schema. Event identity uses chain, transaction and log index. Preserve block hash and raw-log digest. Source schema fixes field meanings; semantic joins and graph interpretation remain engine-owned. | Decode known logs into exact typed trades; preserve identity across duplicate delivery.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 99
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.15",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Create a connector-owned JSON-RPC log method behind dispatch_async at `agent_connector_sdk/mcp/action_dispatch.py:194`. Attach results to EventFeedSourceAdapter.extract at `agent_connector_sdk/adapters/event_feed.py:133`, called by ConnectorWorker._sync. The adapter lacks the chain decoder and registered node caller. | Trace registered tools/call through governed HTTP to a controlled JSON-RPC endpoint and generated ingestion.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 100
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.16",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Reject undecodable logs, unknown signatures, wrong chain or contract, malformed RPC replies and inconsistent block hashes. Report typed reasons and emit no invalid trades. The affected page never advances. Unresolved chain changes require engine reconciliation, never silent progress token rewriting. | Inject malformed logs, RPC errors, wrong identity and changed block hashes; require visible rejection and zero invalid durable trades.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 101
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.17",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Bind records to chain, contract, block number/hash, transaction, log index, decoder revision and raw-log digest. Rejection evidence retains safe identity and reason. Credentials, raw error bodies and private endpoints never enter receipts or logs. | Compare graph readback with RPC requests and decoder input digests; check redaction.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 102
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.18",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point test `tests/test_chain_source_served.py::test_rpc_decode_and_refuse` runs connector-sync --once through a registered connector and real local JSON-RPC server. Ingest valid trades into a running graph, then serve undecodable events through the same path. Decoder-only tests cannot establish acceptance. | Observe bounded ranges, exact trades, rejection reports and durable checkpoint refusal.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 103
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.19",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Extend SourceAdapter at `agent_connector_sdk/ports/source_adapter.py:21` with workspace requests and per-file outcomes. Bind authorized root, relative path, digest, format and parser revision. Support PDF, DOCX, XLSX, plain text and declared transcript formats with location-bearing text or cells. | Validate formats and bounds; visibly refuse unsupported legacy or undeclared formats.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 109
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.20",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Read independent files concurrently under admitted task, byte, page and deadline limits. Preserve deterministic path order independent of completion order. Read bytes without mutation and emit per-file success or failure. Run no macros, embedded instructions or external resource fetches. | Read all five format families from one folder; measure overlap and bounds while preserving bytes and locations.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 110
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.21",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Create the workspace reader in the adapter package behind a registered connector method. dispatch_async at `agent_connector_sdk/mcp/action_dispatch.py:194` invokes it. McpToolSourceAdapter.extract at `agent_connector_sdk/adapters/mcp_tool.py:118` attaches results to ConnectorWorker._sync. This reader and its caller are absent today. | Trace real tools/call into on-disk parsers and certified sync into generated ingestion.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 111
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.22",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Return typed unsupported_type, invalid_content, parser_unavailable, access_denied, limit_exceeded or cancelled outcomes per file. Mixed results report partial completion. Refuse traversal and symlink escape before opening. Unsupported files cannot become empty successful content or advance their progress token. | Test unsupported suffix, mismatched magic, broken documents, parser absence, escape and cancellation beside successful files.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 112
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.23",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Record relative identity, format, parser revision, digest, source locations, bytes and elapsed time per file. Aggregate evidence includes observed concurrency and failure reasons. Exclude private absolute paths and credentials. Content remains source material rather than executable instructions. | Compare before/after hashes; match graph provenance to successful files.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 113
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.24",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point test `tests/test_workspace_read_served.py::test_parallel_formats_and_refusals` calls the registered reader through tools/call with real on-disk fixtures. Run connector-sync with a running graph. Observe parallel reads, one success per format and visible unsupported-type failure through the client. | Require exact locations, bounded peak tasks, immutable inputs and independent checkpoint behavior for failed files.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 114
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.25",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Scheduled job carries six-hour period, durable clock identity, and execution receipt linkage. Job carries run timestamp, proposed paper set digest, relevance score ranges per goal, and admission threshold. Receipt binds run, ingested papers, exclusions and durable admission proof. | Contract tests validate job structure, timestamp monotonicity and receipt binding.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 115
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.26",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Each six-hour cycle claims owned papers against goal-weighted relevance scores and per-goal admission thresholds. Failures and misses remain visible. Retried runs deduplicate on run identity, restarting from the last accepted receipt. Relevance exclusions prevent re-scoring rejected papers. | SI-25 proves job cycles, deduplication and restart boundaries.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 116
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.27",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Clock fixture serves six-hour boundaries; Engine-approved durable scheduler publishes job runs. SDK claims runs, feeds proposed papers to relevance producer, receives scores and thresholds, applies selection, then links accepted ingestion receipts to job run before committing. | SI-26 enters scheduler service and proves job claim, decision and receipt linkage.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 117
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.28",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Refuse out-of-window jobs, missing relevance scores, failed relevance producer, absent admission thresholds and denied scheduler access. A failed proposal batch never advances job progress. Misaligned clock makes the six-hour boundary refuse. | SI-27 proves boundary enforcement, producer failure visibility and clock alignment.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 118
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.29",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Job receipts bind run identifier, cycle boundary, proposed digest and relevance producer. They also bind goal set, thresholds, accepted paper count, exclusion reasons and ingestion receipt. Record relevance decision provenance without claim-body details. Redact credentials and scheduler secrets. | SI-28 proves job identity stability, goal traceability and redacted relevance.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 119
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.30",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point test `tests/test_scheduled_job_serve` runs the six-hour clock and scheduled-job handler through actual engine dispatch. Observe job claim with proposed papers, score receipt, selection, and ingestion commitment. Restart the job after one cycle and prove deduplication. Deny scheduler access and prove typed refusal. | SI-29 requires real engine scheduler, paper proposal, relevance service and graph commitment.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 120
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.31",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** ResearchPaper carries exact canonical identifiers, revision digest, extracted-fact source provenance, and citation-edge declarations. CitationCount is marked as non-constructive reference; extraction edges are authoritatively ingested. Per-paper metadata-extraction refusal has no effect on healthy papers. Unidentified-paper identity allows missing metadata from unavailable documents. | SI-30 validates provenance binding, refusal specificity and identity bounds.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 121
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.32",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Extract research paper facts with source-attributed fields and citation edges through native EG assertion. An unidentified paper preserves available metadata without requiring document retrieval. Missing document produces per-paper refusal with visible reason, not empty successful import. Rejection of one paper never blocks healthy papers in the same run. | SI-31 proves citation-edge assertion, per-paper refusal and mixed outcomes.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 122
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.33",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Link `McpToolSourceAdapter.extract` at `agent_connector_sdk/adapters/mcp_tool.py:118` to generated SourceIngest citation-edge producer. Generate typed paper records with provenance fields. Connector papers feed assertion through the same source path, preserving unidentified-paper identity when metadata is incomplete. EG asserts facts; SDK transports metadata only. | SI-32 traces connector papers through SourceIngest to graph assertion.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 123
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.34",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Refuse malformed identities, missing canonical ID, impossible revisions and denied assertion scope before effects. Allow unidentified metadata when the document cannot be obtained. Return per-paper failure with typed reason. Never invent metadata or assert extracted facts without document-source provenance. | SI-33 proves identity validation, document-required assertion and visible per-paper refusal.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 124
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.35",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Each paper record binds provider, canonical ID, revision digest, extracted-field sources, citation-edge digest and assertion receipt. Unidentified papers carry available metadata with null or document-unavailable source markers. Rejection evidence includes identity and typed reason. Redact raw content and credentials. | SI-34 proves field provenance, edge assertion binding and fact sourcing.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 125
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.36",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point test `tests/test_citation_extraction_served.py::test_paper_facts_and_edges` calls registered connector through tools/call with paper metadata. Ingest typed papers with citation edges into a running graph, then read back assertions with field provenance. Include one unidentified-paper case and one per-paper refusal; prove zero fabricated facts and no effect on healthy papers. | SI-35 requires real connector papers, graph assertion and independent readback.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 126
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.37",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Git-markdown domain packs with lineage and diff-based re-ingest",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ed3b2f7f83d5"
      ],
      "verified_by": [
        "tests/test_document_sources.py:105",
        "tests/test_document_sources.py:143"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Git-markdown domain packs with lineage and diff-based re-ingest.** `agent_connector_sdk.adapters.document_sources.GitMarkdownDocumentSource` reads one `DomainPack` (name, globs, doc_type) from a git repository at `HEAD`. Each document carries `corpus`, `relpath`, `git_commit`, `doc_type`, a bare 64-hex `evidence_digest` and, from frontmatter, `conceptIds` as one string. Its source reference is `git-markdown://<namespace>/<relpath>?rev=<commit>`. Record ids are stable per pack and path. `ingest_documents` stores the commit as the provider cursor in epistemic-graph's durable checkpoint. The next run diffs from it, re-ingests only touched files and withdraws deleted ones. | `tests/test_document_sources.py::test_two_domain_packs_ingested_with_lineage`, `tests/test_document_sources.py::test_incremental_change_updates_only_the_touched_file`.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 127
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.38",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Filesystem document source with a live ingestion path",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ed3b2f7f83d5"
      ],
      "verified_by": [
        "tests/test_document_sources.py:179"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Filesystem document source with a live ingestion path.** `FilesystemDocumentSource` reads text files under one authorized root. It skips symlinks, escapes, hidden paths and other formats, and polls after the largest accepted modification time. `ingest_documents` commits the documents through `KnowledgeIngest` and the generated SourceIngest request. A re-run over an unchanged tree submits nothing. Persisted ids and references use a hashed namespace and the relative path, never the local root. | `tests/test_document_sources.py::test_filesystem_connector_ingestion_live_path`.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 128
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.39",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Governed document ingest applies the permission envelope before embedding",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ed3b2f7f83d5"
      ],
      "verified_by": [
        "tests/test_document_sources.py:258",
        "tests/test_document_sources.py:296",
        "tests/test_document_sources.py:313"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Governed document ingest applies the permission envelope before embedding.** `ingest_documents(..., governance=...)` stamps each document with the access the governance callable resolves before submission, so epistemic-graph embeds only enveloped records. A `GovernanceRefusedError` keeps that document out of the change set and holds the provider cursor. With no admitted document nothing is submitted and the durable checkpoint is unchanged. | `tests/test_document_sources.py::test_governed_connector_applies_envelope_before_embedding`, `tests/test_document_sources.py::test_governed_connector_failure_blocks_document_and_checkpoint`, `tests/test_document_sources.py::test_governance_failure_leaves_real_engine_checkpoint`.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 129
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.40",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Web-source fetch contract (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Web-source fetch contract (rollup).** The SDK must define one typed contract for a connector that fetches and extracts web pages. A connector implements it with the per-operation tools `web_fetch` and `web_extract`. The SDK must not fetch or extract a page itself. `fetch_page` and `WebFetchSourceAdapter` become consumers of a connector that implements the contract. The primary implementation is `CONN-WEBARCHIVER-WEB-SOURCE`. The secondary implementation is `CONN-ARCHIVEBOX-API-WEB-SOURCE`. Children `.40.1` to `.40.6` deliver it. | See each child.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 130
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.40.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a775ed2ea1ef",
        "e35075fa40ff"
      ],
      "verified_by": [
        "tests/test_web_source_contract.py:125",
        "tests/test_web_source_contract.py:181",
        "tests/test_web_source_contract.py:212"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** `agent_connector_sdk/ports/web_source.py` holds frozen `WebFetchRequest{url, max_bytes, accepted_types, timeout_s, job_ref}`. It also holds `WebPageResult{url, canonical_url, final_url, status, content_type, byte_count, content_digest, retrieved_at, title, author, published_at, outbound_links, text_markdown, backend}` and `WebFetchRefusal{reason, detail}`. A `kind` field tells a page from a refusal. Closed reasons are `robots_disallowed`, `rate_limited`, `size_exceeded`, `unsupported_type`, `egress_denied`, `policy_refused`, `extract_empty` and `upstream_failed`. The default `max_bytes` is 5 MiB. `register_web_source_tools(server, source)` serves `web_fetch` and `web_extract` over a connector's `WebSource`. A `WebSourceRefused` becomes a refusal result, and a digest that does not match the text refuses with `upstream_failed`. Proving test: `tests/test_web_source_contract.py::test_models_round_trip`. | A round trip keeps every field and rejects an unknown reason or a malformed digest.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 131
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.40.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "36bc3184a30e",
        "a775ed2ea1ef",
        "e202f57c928d"
      ],
      "verified_by": [
        "tests/test_web_source_contract.py:167"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** The contract states five connector obligations. The connector must obey `robots.txt` for its declared user agent. It must keep a per-domain rate limit, with a default of 1 request per second. It must stop reading at `max_bytes` and refuse an unlisted content type. `content_digest` must be the SHA-256 of the returned text. `RobotsRules` and `DomainRateLimiter` are the shared helpers for the first two; the connector provides the `robots.txt` loader. The conformance kit `agent_connector_sdk/testing/web_source_conformance.py` checks each obligation and the tool schemas against the `RoutedHttpServer` fixture site in `agent_connector_sdk/testing/http_server.py`. Each connector runs the kit against itself. Proving test: `tests/test_web_source_contract.py::test_conformance_kit_flags_each_obligation`. | The kit passes a conforming fixture connector and names each broken obligation of a broken one.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 132
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.40.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** `WebFetchSourceAdapter.extract` at `agent_connector_sdk/adapters/web_fetch.py:182` must call the connector `web_extract` tool through the MCP session, not `fetch_page`. `ConnectorWorker._sync` at `agent_connector_sdk/runner/worker.py:180` reaches it. The ingest worker runner of `SDK-SOURCE-INGEST-R010` runs the `WebPage` jobs of `EG-UNIFIED-DATA-PLANE-R651.7.1` through this adapter. The source sync runner `SourceSyncRunner.sync` submits the records. Certification reads the contract from `register_tool_surface` at `agent_connector_sdk/mcp/tool_surface.py:198`. Proving test: `tests/test_adapters_web_fetch_source_adapter.py::test_extract_calls_connector_tool`. | The adapter calls the connector tool once per page and makes no direct HTTP request.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 133
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.40.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** A connector refusal must reach the caller as `WebFetchRefusal` with its closed reason. The adapter must not return `None` or an empty page. A refused page must not advance the checkpoint. A connector without the certified contract must refuse with `contract_uncertified`. Proving test: `tests/test_adapters_web_fetch_source_adapter.py::test_refusal_keeps_checkpoint`. | Each case returns its reason and leaves the checkpoint unchanged.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 134
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.40.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Each `SourceRecord` must carry the URL, the canonical URL, the retrieval time, the content digest and the backend. It must carry the query text, the query digest and the rank when the job names them. The fields map one to one onto `WebDocumentProvenance` of `EG-UNIFIED-DATA-PLANE-R651.7.1`. Proving test: `tests/test_adapters_web_fetch_source_adapter.py::test_record_provenance_matches_engine_model`. | The record fields equal the engine model fields.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 135
    },
    {
      "id": "SDK-SOURCE-INGEST-R005.40.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The test starts two fixture connectors with the SDK server factory. Each connector implements the contract. The test runs `connector-sync --once` against a running engine for one page per connector. Proving test: `tests/test_web_source_served.py::test_two_backends_produce_equal_records`. | The engine holds equal records for both connectors, except for the `backend` field.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 136
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.32",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Extend vendor extraction with a shared typed enterprise operation contract. Existing readers are `agent_connector_sdk/vendor_extractors/odoo.py:74` and `agent_connector_sdk/vendor_extractors/erpnext.py:91`. Bind operation, contract revision, company scope, parameters and authority. Separate backend connectors advertise exact supported operations and schemas. | Validate common schemas and distinguish unsupported operations from empty successful reads.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 142
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.33",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** A workflow keeps the same operation and result contract when its configured backend connector changes. Map operations mechanically; preserve identifiers, amount scales, currencies and timestamps. Never select workflows or backends. Effects retain governed approval, preconditions and idempotency. | Swap two separately registered connectors without changing workflow requests or result handling; compare normalized outcomes.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 143
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.34",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Create the shared operation port beside vendor extractors. Registrars at `agent_connector_sdk/mcp/tool_surface.py:121` expose methods through dispatch_async at `agent_connector_sdk/mcp/action_dispatch.py:194`. Reads feed the existing runner; writes attach to governed write-back. The interchangeable operation caller is absent today. | Enter both connectors through tools/call; trace backend requests and governed effects.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 144
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.35",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Return unsupported_operation before source access when the selected connector lacks an operation. Refuse schema mismatch, missing company scope, denied authority and invalid units. Never silently switch connectors, emulate success or route writes through reads. | Request unsupported operations and denied writes; assert typed reasons and zero effects.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 145
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.36",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Bind responses to contract revision, operation digest, company scope, selected connector and backend receipt. Preserve approval and idempotency evidence for effects. Reports expose capability gaps without credentials or claims of universal backend equivalence. | Compare connector receipts against identical workflow contracts; check redacted failure evidence.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 146
    },
    {
      "id": "SDK-SOURCE-INGEST-R006.37",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point test `tests/test_enterprise_adapters_served.py::test_backend_swap_and_unsupported` serves two distinct connectors through real registration and dispatch. Local backend services record requests and effects. Identical workflow-shaped requests succeed on both; unsupported and unapproved operations refuse before effects. | Require wire calls, stable schema, backend identity evidence and zero refused-operation requests.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 147
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.7",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Planned SqlQuerySourceClient.execute_approved_query accepts the generated ApprovedSourceQuery and an optional bound continuation. It returns one SqlQueryPage. Import EG-FEDERATED-QUERY-R085 records unchanged; define only SDK delivery envelopes in `agent_connector_sdk/adapters/sql_source.py`. No copied approval DTO or local lease authority is permitted. | `tests/test_approved_sql_source.py::test_generated_descriptor_and_page_contract` checks exact producer fields, page invariants and continuation bindings.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 153
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.8",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** The client calls VerifySourceQueryApproval before opening the native driver, before each published chunk and before completion. Match tenant, owner, actor, source, schema, snapshot and all descriptor digests. Bind approved parameters natively without rewriting SQL. Enforce every approved resource bound with backpressure. | `tests/test_approved_sql_source.py::test_verification_boundaries_and_bounds` checks start/chunk/complete order, immutable parameters, read-only execution and bounded buffers.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 154
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.9",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Register execute_approved_query and cancel_approved_query through `agent_connector_sdk/mcp/tool_surface.py:121`. dispatch_async at `agent_connector_sdk/mcp/action_dispatch.py:194` calls the planned client. McpToolSourceAdapter.extract at `agent_connector_sdk/adapters/mcp_tool.py:118` consumes bounded pages through the existing worker. These receiving methods and generated approval methods are absent today. | `tests/test_approved_sql_source_served.py::test_registered_approval_receiver` traces the tools/call wire method through actual registration, verification and driver access.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 155
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.10",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Preserve EG-FEDERATED-QUERY-R085.7 error reasons after partial output. Expiry, revocation, changed bindings, unavailable verification, cancellation or driver failure closes the handle and forbids further chunks. No completion or failed-page checkpoint follows. Continuations cannot authorize new callers or hide lost execution state. | `tests/test_approved_sql_source_served.py::test_revocation_and_failure_after_chunks` proves explicit terminal failure after three chunks and zero unauthorized effects.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 156
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.11",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Each page binds approval/query identities, query digest, execution identity, sequence, source/schema/snapshot and cumulative rows/bytes. Record fresh verification receipts, queue peaks and resident memory. Preserve accepted SourceCheckpoint receipts. Redact SQL literals, parameter values and credentials; local execution handles establish no durable authority. | `tests/test_approved_sql_source.py::test_page_provenance_and_redaction` compares immutable bindings, verification receipts, terminal totals and redacted failures.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 157
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.12",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** `tests/test_approved_sql_source_served.py::test_engine_approval_to_native_driver` uses the real EG approval and verification entry points. It calls the registered SDK receiver against an actual SQL database and generated SourceIngest. Prove native parameters, bounded memory, revocation, cancellation, failure and checkpoint agreement. | Use real authenticated dispatch on both sides. Mocks of approval, driver, dispatcher or durable ingestion cannot close acceptance.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 158
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.13",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Repository delta index state includes changed-file set, semantic-type metadata per file or class, parser versions and storage layout revision. Index incremental state preserves sequence numbers and schema alignment. Peak memory budget and completion resource release are explicit fields. | Contract tests validate state structure, sequence monotonicity and type coverage.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 159
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.14",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Delta indexing reads unchanged files once and computes indexes only for changed files. Semantic type resolution binds declared language matrix and optional extended type analysis. Resource release completes all in-memory structures after indexing. Bounded peak memory prevents unbounded trees from growing. | SI-36 proves changed-file-only indexing, type handling and memory release.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 160
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.15",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Extend SourceAdapter at `agent_connector_sdk/ports/source_adapter.py:21` with incremental repository state and indexed-file results. McpToolSourceAdapter.extract at `agent_connector_sdk/adapters/mcp_tool.py:118` maps index pages. ConnectorWorker._sync at `agent_connector_sdk/runner/worker.py:180` calls sync_stream at `agent_connector_sdk/runner/syncing.py:200` with incremental state updates. Type resolution integrates existing type registries. | SI-37 enters real incremental flow and observed memory measurements.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 161
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.16",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Refuse unsupported languages, invalid type modes, stale sequence numbers and mismatched schema versions. Unchanged-file requests never trigger re-indexing. Failed indexing of one file blocks no other files. Refuse completion before all indexed files release resources. | SI-38 proves type-mode validation, single-file isolation and resource cleanup.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 162
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.17",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Each indexed page binds repository, sequence, changed-file set digest and parser versions. It also binds semantic-type mode, language coverage, peak resident bytes and resource release timestamp. Record which files were reindexed and type resolution outcome per file. Redact credentials and absolute paths. | SI-39 proves indexing decisions, per-file type binding and peak memory attribution.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 163
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.18",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point test `tests/test_incremental_index_served.py::test_delta_semantics_and_memory` registers a repository connector through tools/call. It runs connector-sync with a running graph. Index one state, commit it, and change a subset of files. Prove the incremental index contains only changed files, and measure peak memory within bounds. Swap the type mode and prove resolution changes. Complete the run and confirm resource release. | SI-40 requires real incremental flow, dual type modes, in-process memory measurement and post-completion validation.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 164
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.19",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "e877477e46b8"
      ],
      "verified_by": [
        "tests/test_source_sync.py:122"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** `IngestSourceSpec` in `agent_connector_sdk/ingest/sources.py` declares one ingestible source. It names the source ID, record type, read-only tools, records path, ID field, cursor field and incremental support. A connector declares each source with `source_meta` on the read tool (`SDK-CONNECTOR-CONTROL-R075.2`). An incremental source must name a cursor field. Source IDs must be unique. | `tests/test_source_sync.py::test_declaration_validates_sources` refuses a duplicate ID, an empty tool list and an incremental source without a cursor field.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 165
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.20",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "e877477e46b8"
      ],
      "verified_by": [
        "tests/test_source_sync.py:134"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** `SourceSyncRunner.sync` in `agent_connector_sdk/ingest/source_sync.py` calls the declared tools page by page through an MCP session. It maps each record to a typed entity with provenance. It submits batches to the engine `SourceIngest` method through `KnowledgeIngest`. It skips a record whose content digest is unchanged. An incremental run skips records at or before the stored cursor. | `tests/test_source_sync.py::test_runner_submits_typed_batches_once` runs twice over one fixture page set and submits each record once.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 166
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.21",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8853950ea5be",
        "e877477e46b8"
      ],
      "verified_by": [
        "tests/test_source_sync.py:159",
        "tests/test_source_sync.py:241"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** `register_tool_surface` (`agent_connector_sdk/mcp/tool_surface.py`) serves the declared sources at the resource `connector://resources`. `KvSourceCheckpoints` stores each source checkpoint through engine `KvGet` and `KvCas` with the shared scope. The key is `ingest-source/<connector>/<source>`. | `tests/test_source_sync.py::test_tool_surface_serves_declarations` reads the resource and returns the declared sources.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 167
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.22",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ce0f7eaf04e2",
        "e877477e46b8"
      ],
      "verified_by": [
        "tests/test_source_sync.py:184"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** The runner must refuse an undeclared source with `unknown_source`. It must refuse a tool that the session does not mark read-only with `not_read_only`. A tool failure retries with bounded exponential backoff. Page, record and time budgets end a run as `partial`. A checkpoint conflict ends the run without advancing the cursor. | `tests/test_source_sync.py::test_runner_refusals_and_budgets` covers each refusal, the retry limit and a partial run.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 168
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.23",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "6519a20529e9",
        "e877477e46b8"
      ],
      "verified_by": [
        "tests/test_source_sync.py:209"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** `SourceSyncReport` names the connector, source, mode, pages, records seen, records submitted and records unchanged. It names each batch receipt digest, the cursor before and after, and the final state. The report holds no credential and no record payload. | `tests/test_source_sync.py::test_report_binds_receipts` compares report batch digests with the engine receipts.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 169
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.24",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ce0f7eaf04e2"
      ],
      "verified_by": [
        "tests/test_source_sync_served.py:96"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** `tests/test_source_sync_served.py::test_sync_runner_against_real_engine` starts the engine server binary on a temporary store. It calls a fixture connector through a real MCP client session. The checkpoint lives in real shared-scope KV. The engine refuses a record type that no imported connector pack maps. The runner must report `ingest_refused` and store no record digest. A successful sync with node read-back is `ARBORA-OPS-R020.6.6`. | The test observes the refusal, the failed KV checkpoint and zero written nodes.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 170
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.25",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Pack mapping",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "6519a20529e9"
      ],
      "verified_by": [
        "tests/test_source_sync.py:265"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Pack mapping.** The engine admits a source record only under `connector:<connector>#mappings/<record type>` of an imported connector pack. A declared record type must name a `schema_mappings` entry of the declaration. The connector serves it at `connector://resources`, so fleet onboarding imports the mapping. | A connector test resolves each declared record type in the `schema_mappings` of its declaration.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 171
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.26",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Citable fields",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "5199756f499e",
        "865af0861030",
        "c4795a2e0d04"
      ],
      "verified_by": [
        "tests/test_ingest_citable_fields.py:36",
        "tests/test_ingest_citable_fields.py:55",
        "tests/test_ingest_citable_fields.py:75"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Citable fields.** `IngestBinding.citable_fields` names location fields whose value is a public `http(s)` URL the record cites, such as a public web page's `source_uri`. `PersistencePrivacyGuard(citable_fields=...)` keeps such a value: an absolute `http(s)` URL with no credentials whose host is public (`agent_connector_sdk.privacy.public_http_url`). Any other value of a citable field, and every other location field, is still redacted; redaction stays the default. Proving test: `tests/test_ingest_citable_fields.py::test_citable_fields_keep_public_urls_and_nothing_else`. | A cited public URL survives `build_request`; an uncited location field, a default binding, and a loopback, private, credentialed or non-HTTP URL are redacted.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 172
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.27",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Operator-approved mass withdrawal",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "c4795a2e0d04"
      ],
      "verified_by": [
        "tests/test_contracts_and_sink.py:593"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Operator-approved mass withdrawal.** `EpistemicGraphSink.import_pack` takes `allow_mass_withdrawal`, as does `SinkPort`. The sink passes it to the engine's `ConnectorPack` import. It lets a pack withdraw over half of its published surface. A connector moving to one tool per operation does that. The engine then requires `admin:connector-pack`. The default is false. Proving test: `tests/test_contracts_and_sink.py::test_sink_passes_the_mass_withdrawal_decision_to_the_engine`. | The engine import request carries `allow_mass_withdrawal` exactly as the caller passed it.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 173
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.28",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Per-parent fan-out",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2078ee0208c5",
        "531ffd4a90d4"
      ],
      "verified_by": [
        "tests/test_for_each.py:105",
        "tests/test_for_each.py:122",
        "tests/test_for_each.py:140",
        "tests/test_for_each.py:152",
        "tests/test_for_each.py:180"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Per-parent fan-out.** `IngestSourceSpec.for_each` (`agent_connector_sdk/ingest/for_each.py`) is `{source, argument, field}`. `source` names the parent source. `argument` names the tool argument that receives the value. `field` names the parent record field and defaults to `id`. `SourceSyncRunner.sync(spec, sources=...)` sweeps the parent source. It then runs the child once per distinct parent value with that argument filled in. A sync preset with `for_each` does the same in `McpToolSourceAdapter`. The checkpoint position holds the parent index (`__fan`) beside the page position. The watermark advances after the last parent. A fan-out covers at most `MAX_FAN_OUT` (200) parent values. `SyncBudget.max_fan_out` and the adapter's `max_fan_out` set the bound. More parent values end the run as `fan_out_exceeded`. A parent source that is not declared ends as `unknown_parent_source`. A chain that returns to itself ends as `for_each_cycle`. The declaration loader rejects both. A runner without the parent reports the same code. The JSON Schema of `connector://resources` carries `for_each`. | `tests/test_for_each.py` fans out over three parents. It rejects a missing parent and a cycle. It caps the fan-out. It serves `for_each` in the schema. It pages each parent through the preset adapter.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 174
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.29",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Declarations are data the SDK reads",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "aa58c5dd6858"
      ],
      "verified_by": [
        "tests/test_load_declaration.py:35",
        "tests/test_load_declaration.py:48",
        "tests/test_load_declaration.py:54",
        "tests/test_load_declaration.py:63",
        "tests/test_load_declaration.py:73"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Declarations are data the SDK reads.** `agent_connector_sdk.ingest.load_declaration(package)` returns the `IngestSourceDeclaration` of a package. It reads `SOURCES`, `SCHEMA_MAPPINGS`, `RESOURCES`, optional `FIELD_SETS` and optional `SCHEMA_VERSION` from `connector_sources`. The fleet name comes from the declared connector identity. A mapping lists shared `field_sets` by name, and its inline `fields` win. A field set appears once per file. The reader accepts `SCHEMA_VERSION` 1 (inline fields) and 2 (shared field sets). Any other version raises `DeclarationError`. An unknown field set, a duplicate `source_id` or a missing module raises it too. No connector holds a `declaration()` function. The conformance plugin fails a module that defines one. | `tests/test_load_declaration.py` expands shared sets and reads a version 1 file. It lets inline fields win. It refuses an unknown set, an unknown version and a missing module. `tests/test_conformance_plugin.py` rejects a module with `declaration()`.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 175
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.30",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "A connector declares its record mappers; the SDK owns the rest",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2487b614c171"
      ],
      "verified_by": [
        "tests/test_ingest_mapping.py:102",
        "tests/test_ingest_mapping.py:41",
        "tests/test_ingest_mapping.py:72",
        "tests/test_ingest_mapping.py:79",
        "tests/test_ingest_mapping.py:86"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**A connector declares its record mappers; the SDK owns the rest.** `agent_connector_sdk.ingest.RecordMap` declares one record kind as data: `node_type`, `id_template`, `id_keys`, `fields` (property to record key, dotted keys read nested maps), `external_id`, `constants` and `EdgeMap` relationships. An `EdgeMap` skips an empty target field and emits its target once as an entity when `target_type` is set. A mapper may instead be a function that fills `Mapped` (`entity`, `edge`, `document`; a repeated entity id is kept once). The SDK owns `entity_from_record`, `relationship_from_record`, `document_from_record`, `read_field` (raises `IngestError` for a missing, empty or mistyped required field), `records_of`, `ext_id` and `slug`. A connector `kg_ingest.py` holds only mappers and one `SourceStream`; it holds no `_to_entity`, `_to_relationship`, `ingest_entities` or `ingest_documents` body. | `tests/test_ingest_mapping.py` maps a declared kind with fields, external id and edges. It skips and, when strict, refuses a record with no id. It emits a shared edge target once. It refuses a missing required field and a wrong field type.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 176
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.31",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "One `SourceStream` is the ingest entry",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2487b614c171"
      ],
      "verified_by": [
        "tests/test_ingest_stream.py:110",
        "tests/test_ingest_stream.py:141",
        "tests/test_ingest_stream.py:72",
        "tests/test_ingest_stream.py:95"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**One `SourceStream` is the ingest entry.** `SourceStream(binding, mappers)` (or `SourceStream.for_package`) is the only ingest entry of a connector. `entities`, `documents`, `mapped` and `records(kind, records)` submit one change set through the process `KnowledgeIngest` (or the `ingest=` argument) and return `{\"nodes\": n, \"edges\": n}`. An empty input or an unknown record kind raises `IngestError`. `sync(kind, fetch_page)` walks `fetch_page(cursor) -> (records, next_cursor)`. It resumes from the stream's accepted cursor and commits each page with its next cursor. It stops on a missing or repeated cursor or at `max_pages`. `open_client(get_client)` opens the connector client, sync or async, and closes it. | `tests/test_ingest_stream.py` ingests entities, documents and kinds with counts. It refuses empty and unknown input. It pages three pages, commits each cursor and resumes a second run from the accepted cursor. `open_client` closes a sync and an async client.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 177
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.32",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "`SourceStream` covers best-effort, split-stream, media and mixed submissions",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "07aa2957dd25"
      ],
      "verified_by": [
        "tests/test_ingest_stream.py:178",
        "tests/test_ingest_stream.py:210",
        "tests/test_ingest_stream.py:227"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**`SourceStream` covers best-effort, split-stream, media and mixed submissions.** With `best_effort=True`, every method returns `None` instead of raising. It returns `None` for empty input, an unknown kind and an entity without an id. It also returns `None` for a document without an id or text. A refused commit and an unavailable engine return `None` too. `document_binding` (or `for_package(..., documents_stream=)`) sends documents to a second stream. A mapped result that holds both then commits as two change sets. `batch(entities, relationships, documents)` commits one mixed change set. `media(data, mime_type, id=, name=, properties=)` stores bytes and their asset record, and refuses empty bytes. `submit(change_set, binding=)` is the one commit path. Use it for a reconcile or any change set the other methods skip. | `tests/test_ingest_stream.py` covers best-effort refusal and filtering, the split document stream, `batch`, `media` and `submit` with another binding.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 178
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.33",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "`sync` takes a cursor strategy; `mapped` takes a batch size",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "840277a9b0a4"
      ],
      "verified_by": [
        "tests/test_ingest_strategies.py:105",
        "tests/test_ingest_strategies.py:198",
        "tests/test_ingest_strategies.py:299",
        "tests/test_ingest_strategies.py:79"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**`sync` takes a cursor strategy; `mapped` takes a batch size.** A `CursorStrategy` gives the first cursor and the cursor after each page. `OffsetCursor(page_size)` counts records read. `KeysetCursor(key, page_size)` continues from the last record's key, which fits primary-key paging and object-listing markers. `TimeWindowCursor(start, window, end)` walks fixed time windows, and an empty window still advances. `HighWaterCursor(key)` continues from the greatest `key` read, so a run reads only changes since the accepted mark. With a strategy, `fetch_page(cursor)` returns only the records. Each page commits with its next cursor, and a later run resumes from the accepted cursor. `SourceStream(batch_size=n)` commits a mapped result in batches of `n`: all entities first, then the relationships, each batch anchored to one entity. | `tests/test_ingest_strategies.py` walks offset pages and resumes from the accepted cursor. It checks key-set, window and refusal cases, and the batch order.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 179
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.34",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "A projection, a guard and a size limit run inside the one `submit` path",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "840277a9b0a4"
      ],
      "verified_by": [
        "tests/test_ingest_strategies.py:129",
        "tests/test_ingest_strategies.py:155",
        "tests/test_ingest_strategies.py:168"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**A projection, a guard and a size limit run inside the one `submit` path.** `SourceStream(projection=)` rewrites each change set before the commit. `Pseudonymizer(connector, prefix, key, redact)` is the standard projection. It replaces each entity and document id with `<prefix>:<type>:<digest>`. The digest is HMAC-SHA256 separated by connector and type. It rewrites relationship endpoints that name a record of the same change set. It drops the `redact` properties. It refuses a key under 32 bytes and an empty id. `before_submit(binding, change_set)` raises `IngestError` to stop a commit. `max_records` refuses an oversized change set. `scoped(suffix, **binding_fields)` gives a per-account stream. `submit_receipt` returns the engine receipt. | `tests/test_ingest_strategies.py` checks opaque ids, edges and redaction. It checks the key and id refusals. It checks the guard, the limit, the scoped binding and the receipt.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 180
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.35",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Ingest tools are declared as data and registered by the SDK",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "840277a9b0a4",
        "d0b3de5b772d"
      ],
      "verified_by": [
        "tests/test_ingest_strategies.py:212",
        "tests/test_ingest_strategies.py:290",
        "tests/test_ingest_strategies.py:321"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Ingest tools are declared as data and registered by the SDK.** `IngestTool(name, title, source, kind, paged, strategy)` declares one tool. `ingest_registration(stream, tools, get_client)` returns a registrar for `Connector(extra_registrations=)`. The registrar opens and closes the client, calls `source`, then maps and commits through the stream. It registers the tool with a title, `readOnlyHint` false, `idempotentHint`, `openWorldHint` true and the tags `ingest` and `mutating`. The tool arguments are the `source` parameters after the client. A source may return a `Mapped` or records for `kind`. A paged source walks `sync` with its strategy. A paged tool with no `kind` is refused. | `tests/test_ingest_strategies.py` lists the tools over MCP and reads annotations and schema. It runs a record tool, a mapped tool and a paged tool. It checks that each run closes the client.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 181
    },
    {
      "id": "SDK-SOURCE-INGEST-R004.36",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Declared sources carry edges to the records their reference fields name",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "08685a0f0cf8",
        "c116b5a621d3"
      ],
      "verified_by": [
        "tests/test_source_sync_edges.py:125",
        "tests/test_source_sync_edges.py:176",
        "tests/test_source_sync_edges.py:73",
        "tests/test_source_sync_edges.py:93"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Declared sources carry edges to the records their reference fields name.** `IngestSourceSpec.edges` holds `EdgeSpec` entries, the declarative form of `EdgeMap`. So `source_meta(edges=...)` declares owner, steward, assignment and membership references in `connector://resources`. `target_field` is a dotted path, and a list on the path is read element-wise. A mapping reference reads its id from `target_id_key`, for example a ServiceNow `value`. `target_id_template` forms the target id and defaults to `{type}:{id}`. `SourceSyncRunner` emits one `target_type` record per referenced id with its `target_fields`. It also emits one relationship from the record to that target. With `target_stream`, the edge names that source's own record and no stub is emitted. The relation reference is `connector:<connector>#relations/<record_type>/<relationship>`. So the pack ontology declares the object property with the record type as its domain. Every relationship carries the binding provenance. An empty reference emits nothing, and a real record wins over a stub with the same id. | `tests/test_source_sync_edges.py::test_source_meta_declares_edges_and_refuses_bad_ones`, `::test_runner_emits_reference_targets_and_relationships`, `::test_scalar_and_dotted_references_and_the_wire_reference` and `::test_target_stream_names_the_other_sources_record_without_a_stub`.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 182
    },
    {
      "id": "SDK-SOURCE-INGEST-R013",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Versioned harness-session sync",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Versioned harness-session sync.** The existing connector-sync --once entry discovers every source in the approved harness manifest. Each generated SourceIngest preserves harness, session, and tenant identity. It preserves source revision, cursor, coverage, and refusal state. Retries deduplicate, restarts resume, and failures remain visible. | HS-13.6 proves full-manifest discovery, SourceIngest receipts, EG readback, and WEBUI-APPS-R006.4 browsing.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 185
    },
    {
      "id": "SDK-SOURCE-INGEST-R013.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Define a closed, versioned manifest. Each entry names harness, owner repository, registered operation, revision, authority, identity schema, and cursor. Missing or unverified operations cannot run. Owners approve the complete supported list; examples do not establish completeness. | HS-13.1 rejects duplicate entries, unknown versions, missing owners, and unbound operations before source calls.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 186
    },
    {
      "id": "SDK-SOURCE-INGEST-R013.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** First run visits every manifest entry. Identity binds tenant, harness, and source session. Source revision and cursor make retries idempotent. Restart resumes accepted receipts. One source denial remains visible without hiding healthy sources. | HS-13.2 proves full coverage, deduplication, restart, and per-source progress.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 187
    },
    {
      "id": "SDK-SOURCE-INGEST-R013.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Reuse `connector-sync --once` and runner `agent_connector_sdk/runner/worker.py:180` (`_sync`). Route extraction through `agent_connector_sdk/adapters/mcp_tool.py:118` (`McpToolSourceAdapter.extract`) and receipt submission through `agent_connector_sdk/ingest/channel.py:46` (`SourceIngestChannel.submit`), also called by `agent_connector_sdk/sinks/epistemic_graph.py:105`. EG owns indexing; WEBUI-APPS-R006.4 consumes Arbora browse/search. No session-specific operation is claimed today. | HS-13.3 observes the real runner, adapter, and generated-client calls. Owners must publish exact EG and Arbora IDs before implementation.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 188
    },
    {
      "id": "SDK-SOURCE-INGEST-R013.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Refuse unknown operations, bad identity, stale cursors, missing tenant scope, and denied sources before unauthorized effects. Keep denied sources as typed partial outcomes. Do not advance their cursors or expose cross-tenant sessions. | HS-13.4 proves typed refusals, zero denied calls, no tenant leakage, and unchanged denied-source progress.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 189
    },
    {
      "id": "SDK-SOURCE-INGEST-R013.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Bind each receipt to manifest version and digest, source identity, tenant, revision, cursor, coverage, outcome, and graph receipt. Redact credentials and private source content. | HS-13.5 independently reads receipts after restart and compares every manifest entry and outcome.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 190
    },
    {
      "id": "SDK-SOURCE-INGEST-R013.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** Test first-run discovery and generated SourceIngest calls for every approved harness. Read the durable EG index and exercise WEBUI-APPS-R006.4. Two examples or mocked calls do not prove completeness. | HS-13.6 records served calls, full coverage, generated receipts, and independent index and browser readback.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 191
    },
    {
      "id": "SDK-SOURCE-INGEST-R014",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Meeting transcript and selected summary transport",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Meeting transcript and selected summary transport.** Carry bounded ordered transcript segments and corrections while partial. Finalize the current transcript only when its complete contiguous sequence is present, transitioning it to a finalized receipt. Dispatch summaries only after that exact receipt exists. Bind summaries to the user's admitted local or hosted provider. Preserve single-shot dictation. Refuse denied capture/egress, stale/conflicting input, gaps at finalization/summary dispatch, and unavailable providers. Never silently fall back. The meeting operation remains unresolved. | MT-14.6 proves partial delivery, correction, complete-sequence finalization, both provider classes, and zero premature summary calls.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 192
    },
    {
      "id": "SDK-SOURCE-INGEST-R014.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Define closed meeting/tenant identity, segment identity/sequence, correction revision, timestamps, and lifecycle fields. Include source/model identity and revision. Bind selected summary-provider identity and execution class to its invocation receipt. An exact replay uses its existing bound receipt. At the same meeting, sequence, and revision, a different payload digest conflicts. | MT-14.1 rejects missing identity, conflicting payload, invalid timestamps, and unsupported lifecycle/provider values. An identical bound replay returns its existing receipt.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 193
    },
    {
      "id": "SDK-SOURCE-INGEST-R014.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Accept bounded ordered partial segments. An identical replay for the same bound meeting, sequence, revision, and payload digest returns the existing receipt without another effect. A conflicting payload or invalid revision at that binding refuses. Corrections advance one segment to a newer revision and invalidate summaries for older transcript revisions. Gaps may remain pending during partial ingestion. When the current sequence is complete and contiguous, finalize the transcript and issue its bound receipt. Summary dispatch requires that exact receipt. Honor the user's admitted provider selection. | MT-14.2 proves exact-replay idempotence, conflicting-duplicate refusal, ordered corrections, completion before finalization, receipt-bound summary dispatch, and summary invalidation.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 194
    },
    {
      "id": "SDK-SOURCE-INGEST-R014.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** The current WebUI route posts to `/api/enhanced/voice/transcribe` after recording stops; it is single-shot dictation. The audio-transcriber repository registers `transcribe_audio` for files or microphone capture, not meeting segments or summary selection. Existing SDK transport entry points are `agent_connector_sdk/mcp/server.py:88` (`create_mcp_server`) and `agent_connector_sdk/mcp/action_dispatch.py:194` (`dispatch_async`). Do not invent a meeting registration. The owners have not assigned its operation or exact counterpart IDs. | MT-14.3 traces the owner-registered operation through SDK dispatch and Arbora after owners identify the exact operation and counterpart IDs.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 195
    },
    {
      "id": "SDK-SOURCE-INGEST-R014.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Refuse denied capture/egress, stale/conflicting updates, tenant denial, and unavailable selected providers. Allow finalization after the current sequence becomes complete and contiguous. The SDK rejects finalization when gaps, missing segments, stale revisions, or conflicting input remain. Refuse summary dispatch until the exact finalized receipt is available. Do not refuse a bounded partial segment solely because finalization is pending. Return distinct typed reasons before prohibited effects. Keep local provider selection from falling through to hosted execution. | MT-14.4 proves the SDK accepts bounded partial ingestion, rejects incomplete finalization, and blocks summary dispatch without the bound finalized receipt.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 196
    },
    {
      "id": "SDK-SOURCE-INGEST-R014.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Bind evidence to meeting, tenant, ordered segments, and corrections. Include final transcript, source/model and provider revisions, authorization, and invocation receipt. Redact raw audio, credentials, and private transcript text from diagnostics. | MT-14.5 compares receipts with persisted transcript and summary provenance. Corrections invalidate older summaries.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 197
    },
    {
      "id": "SDK-SOURCE-INGEST-R014.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** Use real served operations for partial, corrected, and final segments. Select local and hosted summaries separately. Test exact replay, conflicting duplicates, denied capture/egress, stale input, pending gaps, incomplete finalization, and unavailable providers. Single-shot dictation cannot substitute. | Proposed: `tests/test_meeting_transcript_served.py::test_partial_correction_complete_finalize_receipt_then_summary` proves zero summary calls before complete finalization and reads browser, SDK, EG, and Arbora receipts. Mocks do not prove acceptance; runtime evidence remains absent.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 198
    },
    {
      "id": "SDK-SOURCE-INGEST-R015",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Paper throughput decision and durable purge obligation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Paper throughput decision and durable purge obligation.** EG owns observed paper ingestion throughput numerator, denominator and observation window. EG decides whether ingestion meets declared goals and authorizes purge budget allocation per goal. SDK enforces throughput observations and maintenance dispatch. Purge authorization never overrides healthy paper identity or durable receipt. | EP-15.6 proves throughput measurement, below-threshold policy, budget allocation and maintenance dispatch.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 204
    },
    {
      "id": "SDK-SOURCE-INGEST-R015.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Throughput metric binds window (seconds), target numerator (papers) and target denominator (window units). It also binds observed numerator, observed denominator, measurement timestamp and EG decision identity. Purge authorization carries goal identity, purge candidates, safe-purge policy, maximum deletion count and authorization receipt. | EP-15.1 rejects invalid bounds, stale measurements and absent decision.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 205
    },
    {
      "id": "SDK-SOURCE-INGEST-R015.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** SDK observes papers committed per configured window. Record observed throughput each window. When below target, consult EG for purge authorization. Apply safe-purge policy to identify candidates. Never purge papers required for established graphs or locked by concurrent requests. Below-threshold purge is visible with distinct reason from healthy pruning. | EP-15.2 proves windowed observation, below-target detection and selective candidate application.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 206
    },
    {
      "id": "SDK-SOURCE-INGEST-R015.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Telemetry at `agent_connector_sdk/runner/telemetry.py` or equivalent records observations per window. EG decision-execution contract binds SDK dispatcher through `agent_connector_sdk/mcp/action_dispatch.py:194`. Purge candidates surface through query or direct service. Connector-sync maintenance reads EG authorization before deletion. Durable receipt updates checkpoint only after deletion acknowledgment. | EP-15.3 traces observation publication, EG decision fetch and delete-before-commit ordering.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 207
    },
    {
      "id": "SDK-SOURCE-INGEST-R015.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Refuse below-threshold purge without EG authorization. Refuse purge of locked papers or required dependencies. Refuse deletion when policy cannot identify safe candidates. Refuse out-of-window measurements and stale policy. Return typed reason before any deletion. Below-target status never triggers silent background deletion. | EP-15.4 proves authorization requirement, zero unauthorized deletes and visible below-threshold status.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 208
    },
    {
      "id": "SDK-SOURCE-INGEST-R015.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Throughput records bind window identity, target, observed numerator/denominator, measurement timestamp and trend. Purge records bind authorization identity, safe-purge policy, candidate count, deleted count and per-paper deletion receipt. Budget allocation evidence includes goal identity and authorized ceiling. Redact graph-internal paths and private criteria. | EP-15.5 proves throughput attribution, policy compliance and budget traceability.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 209
    },
    {
      "id": "SDK-SOURCE-INGEST-R015.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point test `tests/test_throughput_and_purge_served.py::test_window_measure_and_maintenance` observes paper throughput through real telemetry. It requests an EG decision with a below-threshold measurement. It applies purge authorization with safe candidates and commits the deletion. Measure above and at target in separate windows. Deny authorization and prove zero deletions. Attempt unauthorized candidate purge and prove refusal. | EP-15.6 requires real telemetry, EG authorization interaction and durable deletion receipts.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 210
    },
    {
      "id": "SDK-SOURCE-INGEST-R016",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Typed media enrichment with vision inference and attachment",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Typed media enrichment with vision inference and attachment.** A designated vision inference producer bounds model revision, image input types and derived object/context extraction. SDK transports vision results as typed media annotations and searchable tags through EG attachment. Media modality source provenance remains explicit. Unauthorized or fabricated media tags refuse before ingestion. | MV-16.6 proves model identity, single-shot inference, tag attachment and refusal without effects.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 216
    },
    {
      "id": "SDK-SOURCE-INGEST-R016.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** Vision producer identity, contract revision, input bounds (bytes, dimensions) and output types (object/context tags) are declared. Schema version and model revision are declared too. Media modality includes image, thumbnail, and supported alternate formats. Tag attachment carries provenance (inferred by model version, extracted by SDK) and authorization scope. Fabricated or model-insuffficient tags carry a typed refusal. | MV-16.1 rejects unknown producers, model/contract mismatch and unauthorized tag attachment.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 217
    },
    {
      "id": "SDK-SOURCE-INGEST-R016.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Vision producer receives bounded media bytes and declared modality. It infers object and context tags within declared bounds. SDK receives typed tags with model confidence and provenance. Only authorized tags attach to media records. Unsupported media or insufficient producer capability refuses. Identical media reimport with same producer returns stable tag set. | MV-16.2 proves single-pass inference, tag stability and fabrication refusal.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 218
    },
    {
      "id": "SDK-SOURCE-INGEST-R016.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** Register vision producer through connector tool registration at `agent_connector_sdk/mcp/tool_surface.py:121`. dispatch_async at `agent_connector_sdk/mcp/action_dispatch.py:194` invokes it. McpToolSourceAdapter.extract at `agent_connector_sdk/adapters/mcp_tool.py:118` feeds media to inference and maps returned tags to generated SourceIngest attachment. Authorization scope integrates governed policy. | MV-16.3 traces connector media through real inference service to generated tag attachment.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 219
    },
    {
      "id": "SDK-SOURCE-INGEST-R016.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Refuse unknown producers, unsupported modality and media exceeding byte/dimension bounds. Refuse unauthorized tag attachment and fabricated tags without inference evidence. Deny producer access and refuse before attachment or ingestion. Media without enough producer capability becomes untagged, not silently tagged or skipped. Return distinct typed reasons. | MV-16.4 proves modality validation, authorization enforcement and visible insufficient-capability refusal.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 220
    },
    {
      "id": "SDK-SOURCE-INGEST-R016.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Tag records bind media identity, producer identity, contract revision and model revision. They also bind input digest, output types, confidence scores, authorization scope and inference timestamp. Provenance indicates source (inferred vs extracted). Failed media attempts record typed reason and input digest. Redact raw bytes, credentials and private media content. | MV-16.5 proves producer tracking, model version binding and decision attribution.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 221
    },
    {
      "id": "SDK-SOURCE-INGEST-R016.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point test `tests/test_media_vision_served.py::test_image_inference_and_attachment` registers a real vision producer through connector tools and runs connector-sync with a running graph. Test image and thumbnail inferences with matching tags in both modalities. Check tag searchability through EG. Include one modality-unsupported and one authorization-denied case. Reingest identical media and prove stable tags. Attempt fabricated tags and prove refusal. | MV-16.6 requires real vision service, tag attachment persistence and independent graph readback.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 222
    },
    {
      "id": "SDK-SOURCE-INGEST-R600",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Vendor write-back sinks run through one governed, fail-closed, dry-run-first entry point (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "ec8d36a076f4"
      ],
      "verified_by": [
        "tests/test_writeback_sinks.py:26"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Vendor write-back sinks run through one governed, fail-closed, dry-run-first entry point (rollup).** Children `.1` to `.6`. | See each child.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 223
    },
    {
      "id": "SDK-SOURCE-INGEST-R600.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** ``agent_connector_sdk/writeback_sinks/core.py`` defines `WritebackResult`, `WritebackContext`, `WritebackInvocation`, the `WritebackSink` protocol and a sink registry keyed by domain. Fields are typed and every identifier is validated at construction. | `tests/test_writeback_sinks.py::test_change_set_is_canonical_and_drops_private_ops`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 224
    },
    {
      "id": "SDK-SOURCE-INGEST-R600.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** `run_writeback(target, dry_run=True, **ops)` resolves the sink. It refuses a live write when the sink's activation flag is unset. It runs an optional caller preflight. It executes every call through the governed path of `writeback_sinks/governed.py`. That path covers the change set, audit reservation and ledger. High-stakes sinks never auto-execute. A live request is previewed and handed to a caller-provided approval queue, or refused when none exists. Dry runs write no ledger. Thirty vendor sinks register by domain. Connector clients resolve from an injected client or the connector package's `auth.get_client`. | `tests/test_writeback_sinks.py::test_live_write_records_change_set_audit_and_receipt`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 225
    },
    {
      "id": "SDK-SOURCE-INGEST-R600.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** The package imports no agent harness. The graph engine provides the approval queue and the source-conflict preflight through the `_enqueue_proposal` and `_preflight` operands (EG-DECISION-ENGINE-R615). No other production caller may duplicate this behavior. | `tests/test_writeback_sinks.py::test_leanix_dry_run_proposes_then_live_writes`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 226
    },
    {
      "id": "SDK-SOURCE-INGEST-R600.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/test_writeback_sinks.py:125"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** A live write without its activation flag returns a `refused` manifest naming the flag, and no sink code runs. The stable code is `WRITE_DISABLED`. | `tests/test_writeback_sinks.py::test_live_write_refused_without_flag`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 227
    },
    {
      "id": "SDK-SOURCE-INGEST-R600.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Every manifest carries `governed_writeback` evidence: change-set id, authorization mode and effect status; sink failure records `outcome_uncertain` in the ledger. | `tests/test_writeback_sinks.py::test_sink_failure_is_recorded_uncertain_and_reported`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 228
    },
    {
      "id": "SDK-SOURCE-INGEST-R600.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** `tests/test_writeback_sinks.py` covers refusal, dry run, live ledger, uncertain outcome, high-stakes queue refusal and three vendor sinks. The file runs in under 1 s. The benchmark is `tests/test_writeback_sinks.py::test_live_write_records_change_set_audit_and_receipt` and gates a regression above 10 percent. | `tests/test_writeback_sinks.py::test_high_stakes_live_write_without_queue_is_refused`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 229
    },
    {
      "id": "SDK-SOURCE-INGEST-R800",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Document-source connector framework (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "11366ce437d5"
      ],
      "verified_by": [
        "tests/source_connectors/test_source_connectors.py:45"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Document-source connector framework (rollup).** `agent_connector_sdk.source_connectors` owns the load, poll and slim connector shapes, resumable checkpoints and the self-registering source registry with the web, rest, rss, arxiv and package-manifest sources. Activation is refused unless the host installs a certifying gate. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 230
    },
    {
      "id": "SDK-SOURCE-INGEST-R800.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** `BaseSourceConnector`, `LoadConnector`, `PollConnector`, `SlimConnector`, `SourceDocument`, `ExternalAccess` and `ConnectorCheckpoint` are the public records. | `tests/source_connectors/test_source_connectors.py::test_registry_lists_builtin_sources_and_rejects_unknown`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 231
    },
    {
      "id": "SDK-SOURCE-INGEST-R800.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/source_connectors/test_source_connectors.py:122",
        "tests/source_connectors/test_source_connectors.py:145"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** `poll(checkpoint)` returns only documents newer than the watermark and unseen ids; a dead feed yields nothing and never aborts a sweep. | `tests/source_connectors/test_source_connectors.py::test_rss_connector_parses_rss_and_atom_and_polls_by_watermark`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 232
    },
    {
      "id": "SDK-SOURCE-INGEST-R800.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** `build_connector` discovers the bundled sources and checks the installed activation gate before it instantiates any connector. | `tests/source_connectors/test_source_connectors.py::test_web_connector_crawls_to_depth_and_polls_incrementally`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 233
    },
    {
      "id": "SDK-SOURCE-INGEST-R800.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/source_connectors/test_source_connectors.py:51",
        "tests/source_connectors/test_source_connectors.py:58"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** With no gate installed, or a gate that returns false, `build_connector` raises `ConnectorGovernanceError`; an unknown source type raises `KeyError` listing the available types. | `tests/source_connectors/test_source_connectors.py::test_activation_is_refused_without_a_certifying_gate`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 234
    },
    {
      "id": "SDK-SOURCE-INGEST-R800.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Each moved behavior has a public-surface test. The tests cover registry listing, checkpoint round trip, web crawl depth and rest cursor following. They also cover feed parsing, watermark polling, dead-feed isolation and gate refusal. | `tests/source_connectors/test_source_connectors.py::test_checkpoint_round_trips_and_bad_input_is_none`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 235
    },
    {
      "id": "SDK-SOURCE-INGEST-R800.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/source_connectors/test_source_connectors.py:145"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point is `build_connector`. The proof constructs each source through it with injected fetch callables. It asserts that no network or sleep is used. | `tests/source_connectors/test_source_connectors.py::test_dead_feed_never_aborts_a_sweep`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 236
    },
    {
      "id": "SDK-SOURCE-INGEST-R803",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Typed, privacy-safe data preparation kernel (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "11366ce437d5"
      ],
      "verified_by": [
        "tests/data_prep/certification/test_job.py:28",
        "tests/data_prep/test_kernel.py:23",
        "tests/data_prep/test_profiling.py:29"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Typed, privacy-safe data preparation kernel (rollup).** `agent_connector_sdk.data_prep` is the allowlisted clean-plan kernel (safe cast, fill, dedupe, canonical names). It works over Arrow tables with bounded value-free profiles and an operator-only certification job. It advances no source checkpoint and holds no authority over native ingest. Arrow support is the `dataprep` extra. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 237
    },
    {
      "id": "SDK-SOURCE-INGEST-R803.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** `CleanPlan`, `CleanStep`, `LocalProfile`, `ProfileLimits`, `PrepEvidence` and the certification records are frozen, extra-forbidding models. | `tests/data_prep/test_kernel.py::test_plan_gate_is_strict_and_allowlisted`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 238
    },
    {
      "id": "SDK-SOURCE-INGEST-R803.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** A plan executes deterministically, replays to the same digest, retains original row ordinals across quarantine and redacts quarantined values. | `tests/data_prep/test_kernel.py::test_replay_is_deterministic_and_plan_is_not_mutated`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 239
    },
    {
      "id": "SDK-SOURCE-INGEST-R803.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** The base install imports no Arrow, dataframe or validation provider; the extra and the certification providers load lazily. | `tests/data_prep/certification/test_job.py::test_optional_provider_wrappers_are_lazy_and_do_not_run_without_provider`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 240
    },
    {
      "id": "SDK-SOURCE-INGEST-R803.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Lossy casts, canonical-name collisions, over-limit profiles and a failed disposition each return a typed refusal with no partial success. | `tests/data_prep/test_kernel.py::test_lossy_casts_are_denied_and_lossless_widening_uses_safe_cast`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 241
    },
    {
      "id": "SDK-SOURCE-INGEST-R803.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Tests cover the plan gate, redaction, dedupe, profile bounds and the signed certification summary. | `tests/data_prep/test_profiling.py::test_below_threshold_values_never_appear_in_top_k_or_serialized_profile`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 242
    },
    {
      "id": "SDK-SOURCE-INGEST-R803.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The proof runs a one-million-row plan under the declared profile limits and records elapsed time and peak memory. | `tests/data_prep/test_kernel.py::test_dedupe_requires_explicit_keys_and_preserves_first_input_row`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 243
    },
    {
      "id": "SDK-SOURCE-INGEST-R804",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Voice-model provenance manifest and license gate (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "11366ce437d5"
      ],
      "verified_by": [
        "tests/voice_supply_chain/test_voice_supply_chain.py:23"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Voice-model provenance manifest and license gate (rollup).** `agent_connector_sdk.voice_supply_chain` records each acquired voice model as an immutable, commit-pinned, digest-checked manifest. It gates promotion handoff on a reviewed license decision and a checked asset. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 244
    },
    {
      "id": "SDK-SOURCE-INGEST-R804.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** `VoiceModelManifest` and `VoiceLicenseDecision` are validated models whose defaults are quarantined and pending. | `tests/voice_supply_chain/test_voice_supply_chain.py::test_manifest_normalizes_digest_case_and_defaults_are_fail_closed`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 245
    },
    {
      "id": "SDK-SOURCE-INGEST-R804.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/voice_supply_chain/test_voice_supply_chain.py:69"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Promotion handoff is ready only for an approved decision with a named reviewer on a checked manifest. Copyleft flags never imply approval. | `tests/voice_supply_chain/test_voice_supply_chain.py::test_promotion_handoff_requires_approved_license_and_verified_asset`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 246
    },
    {
      "id": "SDK-SOURCE-INGEST-R804.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** The manifest index lives under the SDK data directory resolved by `agent_connector_sdk.paths`. | `tests/voice_supply_chain/test_voice_supply_chain.py::test_mark_verified_persists_and_refuses_rejected`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 247
    },
    {
      "id": "SDK-SOURCE-INGEST-R804.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/voice_supply_chain/test_voice_supply_chain.py:48"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** The module refuses a mutable or short revision, a malformed digest and an unknown counsel value. It also refuses to mark a rejected manifest as checked. | `tests/voice_supply_chain/test_voice_supply_chain.py::test_manifest_requires_immutable_pin_and_valid_digest`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 248
    },
    {
      "id": "SDK-SOURCE-INGEST-R804.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Tests cover each handoff outcome and the manifest validation errors. | `tests/voice_supply_chain/test_voice_supply_chain.py::test_promotion_handoff_requires_approved_license_and_verified_asset`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 249
    },
    {
      "id": "SDK-SOURCE-INGEST-R804.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The proof records and reads back one thousand decisions and asserts every lookup is a single file read. | `tests/voice_supply_chain/test_voice_supply_chain.py::test_mark_verified_persists_and_refuses_rejected`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 250
    },
    {
      "id": "SDK-SOURCE-INGEST-R900",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Read-only database source (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Read-only database source (rollup).** `agent_connector_sdk.source_connectors.universal.UniversalConnector` reads SQL and MongoDB through one bounded read-only call and returns the schema as a `ChangeSet`. The `database` source maps the rows of one query to documents and polls by a watermark column. The `db` and `mssql` extras provide the networked drivers. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 253
    },
    {
      "id": "SDK-SOURCE-INGEST-R900.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** `UniversalConnector`, `infer_kind` and `DatabaseConnector` are the public surface. Identifiers are irreversible persistence references. | `tests/source_connectors/test_universal.py::test_identity_is_an_irreversible_reference`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 254
    },
    {
      "id": "SDK-SOURCE-INGEST-R900.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** `read` returns at most `max_rows` rows. `poll` returns only rows past the watermark and advances it to the largest value seen. | `tests/source_connectors/test_database.py::test_poll_advances_the_watermark_and_is_idempotent`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 255
    },
    {
      "id": "SDK-SOURCE-INGEST-R900.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** The `database` source resolves its connection profile through `agent_connector_sdk.credentials.resolution` and opens networked connections with `agent_connector_sdk.tls.resolve.resolve_tls_profile`. | `tests/source_connectors/test_universal.py::test_networked_connection_uses_the_tls_profile`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 256
    },
    {
      "id": "SDK-SOURCE-INGEST-R900.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/source_connectors/test_database.py:48"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** Anything but one read-only `SELECT`, a literal connection value and a missing driver are refused. The `table` option raises `RowVersionEvidenceUnavailable`, because the graph service writes row-version evidence (`EG-INGEST-WORKER-R901`). | `tests/source_connectors/test_database.py::test_unsafe_or_unsupported_configuration_is_refused`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 257
    },
    {
      "id": "SDK-SOURCE-INGEST-R900.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Tests read a temporary SQLite database. They check row caps, the read-only gate, schema entities and that no identifier holds the database location. | `tests/source_connectors/test_universal.py::test_introspect_emits_schema_entities_without_the_location`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 258
    },
    {
      "id": "SDK-SOURCE-INGEST-R900.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/source_connectors/test_database.py:39"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point is `build_connector(\"database\", ...)`. The proof polls twice and the second poll returns no document. | `tests/source_connectors/test_database.py::test_poll_advances_the_watermark_and_is_idempotent`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 259
    },
    {
      "id": "SDK-SOURCE-INGEST-R901",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Governed GraphQL document source (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Governed GraphQL document source (rollup).** The `graphql_document` source runs one read-only GraphQL query from a secret-backed profile. It returns redacted documents and governed changes. An upsert is an `Entity` that carries the access, classification, retention and legal-hold properties, which the graph service enforces (`EG-INGEST-WORKER-R900`). A removal from an authoritative snapshot is a `Withdrawal`. The `graphql` extra provides the parser. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 260
    },
    {
      "id": "SDK-SOURCE-INGEST-R901.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** `GraphQLDocumentConnector`, `GraphQLDocumentError` and `GraphQLHierarchyBatch` are the public surface. A change is an `agent_connector_sdk.ingest.model.Entity` or `Withdrawal`. | `tests/source_connectors/test_graphql_document.py::test_hierarchy_poll_emits_governed_entities_and_is_idempotent`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 261
    },
    {
      "id": "SDK-SOURCE-INGEST-R901.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/source_connectors/test_graphql_document.py:355"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** The source follows typed pagination, maps entities, documents, applications and dependencies, and withdraws a record once when an authoritative snapshot no longer holds it. | `tests/source_connectors/test_graphql_document.py::test_authoritative_snapshot_withdraws_a_removed_record_once`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 262
    },
    {
      "id": "SDK-SOURCE-INGEST-R901.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** The profile resolves through `agent_connector_sdk.credentials.resolution`. Requests use `agent_connector_sdk.source_connectors.http_safety` and the TLS profile resolver. | `tests/source_connectors/test_graphql_document.py::test_document_is_redacted_and_carries_no_source_details`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 263
    },
    {
      "id": "SDK-SOURCE-INGEST-R901.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/source_connectors/test_graphql_document.py:283"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** A literal profile, a missing identity key, private egress, header injection, hop-by-hop headers, mutations, subscriptions, introspection, missing retention and an unapproved empty snapshot are refused. Upstream error text is never echoed. | `tests/source_connectors/test_graphql_document.py::test_unsafe_profiles_and_upstream_errors_are_refused`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 264
    },
    {
      "id": "SDK-SOURCE-INGEST-R901.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Tests use an injected transport. They assert that no endpoint, token, key, reference or query text reaches a document, change or plan. | `tests/source_connectors/test_graphql_document.py::test_dry_run_plan_reports_counts_only`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 265
    },
    {
      "id": "SDK-SOURCE-INGEST-R901.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/source_connectors/test_graphql_document.py:324"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point is `poll`. The proof polls two pages and then polls again from the checkpoint, and the second poll returns nothing. | `tests/source_connectors/test_graphql_document.py::test_hierarchy_poll_emits_governed_entities_and_is_idempotent`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 266
    },
    {
      "id": "SDK-SOURCE-INGEST-R902",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "MCP package document source (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**MCP package document source (rollup).** The `mcp` source calls one tool of a connector package and maps its records to documents. A preset from `package_manifest` fills the tool contract. Production calls open a stdio session through `agent_connector_sdk.transports.mcp.McpTransport` from the platform `mcp_config.json`. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 267
    },
    {
      "id": "SDK-SOURCE-INGEST-R902.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** `MCPPackageConnector`, `configured_mcp_server`, `load_mcp_servers`, `run_sync` and `McpStdioProhibitedError` are the public surface. | `tests/source_connectors/test_mcp_package.py::test_explicit_mapping_yields_documents_with_neutral_metadata`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 268
    },
    {
      "id": "SDK-SOURCE-INGEST-R902.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/source_connectors/test_mcp_package.py:63"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** `poll` follows a response cursor one page at a time and drops record IDs it has already seen. | `tests/source_connectors/test_mcp_package.py::test_cursor_poll_pages_then_dedups`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 269
    },
    {
      "id": "SDK-SOURCE-INGEST-R902.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** The server catalog comes from `MCP_CONFIG` or `agent_connector_sdk.paths.platform_config_file`. A preset comes from `package_manifest.get_preset`. | `tests/source_connectors/test_mcp_package.py::test_package_preset_fills_the_tool_contract`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 270
    },
    {
      "id": "SDK-SOURCE-INGEST-R902.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** A missing tool, an unconfigured server and stdio under `MCP_STDIO_PROHIBITED` are refused with a stated reason. | `tests/source_connectors/test_mcp_package.py::test_stdio_is_refused_when_prohibited`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 271
    },
    {
      "id": "SDK-SOURCE-INGEST-R902.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** Tests inject the tool caller. They assert neutral metadata, quarantined access and server-name resolution. | `tests/source_connectors/test_mcp_package.py::test_server_resolution_uses_declared_names_only`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 272
    },
    {
      "id": "SDK-SOURCE-INGEST-R902.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6dcfdd27e8"
      ],
      "verified_by": [
        "tests/source_connectors/test_mcp_package.py:135"
      ],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point is `build_connector(\"mcp\", ...)`. The proof runs the synchronous bridge inside a running event loop. | `tests/source_connectors/test_mcp_package.py::test_run_sync_works_inside_a_running_loop`",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 273
    },
    {
      "id": "SDK-SOURCE-INGEST-R017",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Source ingest runs only under an engine-accepted ingest contract (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Source ingest runs only under an engine-accepted ingest contract (rollup).** The runner binds every batch to the contract IRI and revision that the engine accepted. It refuses ingest when the engine has not accepted the local contract. Source values become native relationships, not nested properties. Children `.1` to `.6` deliver it. Engine owner: `EG-TYPED-PACKS-R101`. | Rollup closes when every child `.1` to `.6` passes its proving test.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 277
    },
    {
      "id": "SDK-SOURCE-INGEST-R017.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Model.** `IngestBinding` (`agent_connector_sdk/ingest/model.py:34`) gains `contract_iri` and `contract_revision`. Each record's mapping reference is a contract IRI of the form `contract:<connector>#<object>`. | `tests/test_ingest_contract_binding.py::test_binding_carries_contract_iri`.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 278
    },
    {
      "id": "SDK-SOURCE-INGEST-R017.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Behavior.** Before the first batch, the runner reads `ConnectorPack.Status` and compares the accepted contract digest with the local declaration digest. A nested dictionary value in entity properties becomes one entity and one relationship per its declared mapping. Access properties follow the declared access policy. The checkpoint names the declared cursor policy IRI. | `tests/test_ingest_contract_binding.py::test_nested_values_become_relationships`.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 279
    },
    {
      "id": "SDK-SOURCE-INGEST-R017.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** The digest check attaches in `submit` (`agent_connector_sdk/ingest/service.py:74`). Nested-value conversion attaches where the runner creates entity requests (`agent_connector_sdk/ingest/request.py:85`). Access stamping attaches in `access_properties` (`agent_connector_sdk/adapters/document_sources.py:82`). Document sync enters at `ingest_documents` (`agent_connector_sdk/adapters/document_sources.py:402`). | `tests/test_ingest_contract_binding.py::test_submit_checks_accepted_contract`.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 280
    },
    {
      "id": "SDK-SOURCE-INGEST-R017.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Refusal.** The runner must refuse a batch with `contract_not_accepted` when the digests differ or no contract exists. It must refuse a nested dictionary value without a declared mapping with `undeclared_nested_value`. It must surface `UNKNOWN_MAPPING_REFERENCE` and `CURSOR_POLICY_VIOLATION` from the engine unchanged. No refused batch advances the checkpoint. | `tests/test_ingest_contract_binding.py::test_refusals_keep_checkpoint`.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 281
    },
    {
      "id": "SDK-SOURCE-INGEST-R017.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Evidence.** The run report must name the contract IRI, revision and digest for each batch. The report must match the engine's `SourceMappingReceipt` for that batch. | `tests/test_ingest_contract_binding.py::test_report_matches_engine_receipt`.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 282
    },
    {
      "id": "SDK-SOURCE-INGEST-R017.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The entry point is the SDK sync runner against a running engine. The test certifies a connector, syncs one record with a nested value and reads it back through the served SPARQL method. It must observe `cp:governedBy` and a native relationship for the nested value. A changed local declaration without certification must refuse with `contract_not_accepted`. | `tests/test_ingest_contract_served.py::test_ingest_requires_accepted_contract`.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 283
    },
    {
      "id": "SDK-SOURCE-INGEST-R805",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Source access, enumeration and hierarchy contract (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Source access, enumeration and hierarchy contract (rollup).** A connector must report source access, the identifier set and the container tree as typed batches. The engine admits them through EG-INGEST-WORKER-R902 to R904. A connector of a read-time access source must also answer access lookups for EG-FEDERATED-QUERY-R703. Children `.1` to `.6` deliver it. | See each child.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 284
    },
    {
      "id": "SDK-SOURCE-INGEST-R805.1",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Permission and group sync",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Permission and group sync.** Add `PermissionSyncConnector` in `agent_connector_sdk/source_connectors/base.py`. It yields `AccessSnapshot` and `SourceGroup` records from a checkpoint. The records are the generated EG types. The runner sends them as batches of kind `access` and `groups`. | `tests/source_connectors/test_permission_sync.py::test_access_batch_carries_no_content` checks that a batch holds no document body.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 285
    },
    {
      "id": "SDK-SOURCE-INGEST-R805.2",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Identifier enumeration",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Identifier enumeration.** `SlimConnector.slim` at `agent_connector_sdk/source_connectors/base.py:208` feeds a batch of kind `enumeration`. The batch is complete only after the iterator ends without error. A partial run sends `complete: false`. | `tests/source_connectors/test_permission_sync.py::test_interrupted_enumeration_is_incomplete` breaks the iterator mid-run.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 286
    },
    {
      "id": "SDK-SOURCE-INGEST-R805.3",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Container hierarchy",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Container hierarchy.** Add `HierarchyConnector` in `agent_connector_sdk/source_connectors/base.py`. It yields `SourceContainer` records with parent identifiers. The runner sends them as a batch of kind `containers`. | `tests/source_connectors/test_permission_sync.py::test_container_batch_preserves_parents` reads a three-level tree.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 287
    },
    {
      "id": "SDK-SOURCE-INGEST-R805.4",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Wiring.** `sync_stream` at `agent_connector_sdk/runner/syncing.py:200` schedules the three batch kinds after content sync. The permission sync runs every 3,600 s by default. The connector declaration may lower it. | `tests/test_source_sync.py::test_runner_schedules_access_enumeration_and_containers` runs one sync and lists the batch kinds.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 288
    },
    {
      "id": "SDK-SOURCE-INGEST-R805.5",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Read-time access lookup port",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Read-time access lookup port.** Add `AccessCheckPort.check(principal, record_refs) -> AccessCheckAnswer` in `agent_connector_sdk/ports/access_check.py`. A connector declares `access_mode: checked_at_read` in its manifest. The port answers at most 200 records per call within 2 s. A timeout returns every record as denied. | `tests/test_access_check_port.py::test_timeout_denies_every_record` simulates a slow source.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 289
    },
    {
      "id": "SDK-SOURCE-INGEST-R805.6",
      "kind": "requirement",
      "parent": "SDK-SOURCE-INGEST",
      "source": "specs/SDK-SOURCE-INGEST/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-SOURCE-INGEST \u2014 SDK source sync, drift quarantine, and adapter migration",
      "definition": "**Hot-path proof.** The served test starts the engine server binary on a temporary store. It syncs a fixture connector, revokes one user at the source and runs the permission sync. A read by that user then refuses. Enumeration without one record prunes it after the grace window. | `tests/test_permission_sync_served.py::test_revocation_and_prune_against_real_engine` runs the full path.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 290
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES",
      "kind": "spec",
      "parent": null,
      "source": "specs/centralized-capabilities/status.json",
      "title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/centralized-capabilities/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/centralized-capabilities/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "spec.md",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/specs/centralized-capabilities/spec.md"
        },
        {
          "declared_in": "specs/centralized-capabilities/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/httpsupport/test_pagination_next_url.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/tests/httpsupport/test_pagination_next_url.py"
        },
        {
          "declared_in": "specs/centralized-capabilities/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/httpsupport/test_rate_limiter.py",
          "repository": "Knuckles-Team/scion-sdk",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/scion-sdk/blob/6437ebf4a3e4979f51429a4f79d054f6e270a35d/tests/httpsupport/test_rate_limiter.py"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R001",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Governed HTTP client and retry",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Governed HTTP client and retry.** Connectors build every outbound HTTP client with `create_http_client` or `create_async_http_client`, which wrap one transport in the shared retry policy. A connector must not ship its own session, retry loop, or backoff for HTTP calls. Owner: `SDK-CONNECTOR-CONTROL-RR780.3`, `SDK-CONNECTOR-CONTROL-RR028`. Module: `http/client.py`, `http/retry.py`, `http/transport.py`. | Conformance: pipelines `sdk-conformance` (`PIPE-GATES-R013`), warn by default, `--strict` blocks. Index test: `tests/test_centralized_capability_index.py::test_r001_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 9
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R002",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Egress guard and pinned addresses",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Egress guard and pinned addresses.** Connectors validate operator base URLs with `validate_base_url_resolved` and set `pin_egress` on the governed client. A connector must not ship its own URL, private-address, or redirect checks. Owner: `SDK-CONNECTOR-CONTROL-RR014.5`, `SDK-CONNECTOR-CONTROL-RR014.16`, `SDK-CONNECTOR-CONTROL-RR028.1`, `SDK-CONNECTOR-CONTROL-RR033`. Module: `http/egress.py`, `http/safe_post.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r002_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 10
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R003",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "API client base and auth strategies",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**API client base and auth strategies.** Connectors derive their API client from `BaseApiClient` in `http/support.py` and select an SDK auth strategy. A connector must not ship its own API client base class or header-auth strategy. Owner: `SDK-CONNECTOR-CONTROL-RR014.10`, `SDK-CONNECTOR-CONTROL-RR028.3`. Module: `http/support.py`, `httpsupport/auth.py`, `httpsupport/client_protocol.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r003_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 11
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R004",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Pagination helpers",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "c842d089626d"
      ],
      "verified_by": [
        "tests/httpsupport/test_pagination_next_url.py:15"
      ],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Pagination helpers.** Connectors page upstream lists with the SDK pagination helpers. The helpers cover the `cursor`, `page`, `offset`, `link`, `since_id`, and `next_url` modes. The `next_url` mode follows the next-page URL at a dotted body path, `next` by default. It resolves a relative URL against the request URL and stops on a null or empty value. Each followed URL must keep the scheme, host, and port of the first request. A mismatch raises `PaginationOriginError` and the helper does not follow it. A repeated URL ends the sweep and sets `truncated`. The `max_pages` cap also ends it. A connector must not ship its own page-walking loop for a mode the SDK covers. Owner: this spec. Module: `http/pagination.py`, `httpsupport/pagination.py`. | Conformance: unit tests in `tests/httpsupport/test_pagination_next_url.py` (relative and absolute next, null stop, cross-origin, scheme and port change, loop guard). Index test: `tests/test_centralized_capability_index.py::test_r004_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 12
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R005",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Rate-limit telemetry and concurrency",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "fb85cad4b0ba"
      ],
      "verified_by": [
        "tests/httpsupport/test_rate_limiter.py:13"
      ],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Rate-limit telemetry and concurrency.** Connectors read rate-limit headers and compute bounded 429 backoff with `parse_rate_limit` and `backoff_seconds`. Connectors pace requests to one upstream with `RateLimiter`, a minimum-interval limiter exported from `agent_connector_sdk.httpsupport`. Connectors bound tool concurrency with `mcp/concurrency.py`. A connector must not ship its own rate-limit header parser, backoff calculation, or minimum-interval request limiter. Owner: this spec. Module: `httpsupport/rate_limit.py`, `mcp/concurrency.py`. | Conformance: unit tests in `tests/httpsupport/test_rate_limiter.py` (fake clock, concurrent callers, async use). Index test: `tests/test_centralized_capability_index.py::test_r005_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 13
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R006",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Error redaction and typed problems",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Error redaction and typed problems.** Connectors return upstream failures as the SDK error types and pass text through the SDK redaction helpers. An error never carries a secret or a response body. A connector must not ship its own secret-redaction or error-sanitizing helper. Owner: `SDK-CONNECTOR-CONTROL-RR780.2`, `SDK-CONNECTOR-CONTROL-RR014.6`, `SDK-CONNECTOR-CONTROL-RR014.12`. Module: `exceptions.py`, `http/errors.py`, `http/problems.py`, `http/redaction.py`, `httpsupport/redaction.py`, `privacy_pii.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r006_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 14
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R007",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Payment challenge handling",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Payment challenge handling.** Connectors that meet an HTTP 402 challenge use the governed client budget and approval gate. A connector must not ship its own payment or 402 handling. Owner: `SDK-CONNECTOR-CONTROL-RR049`, `SDK-FINANCE-SOURCES-R900`. Module: `payments.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r007_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 15
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R008",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "TLS profiles",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**TLS profiles.** Connectors resolve TLS material with `resolve_tls_profile`. Every HTTPS call uses the resolved profile. A connector must not disable certificate verification, silence TLS warnings, or build its own SSL context. Owner: `SDK-CONNECTOR-CONTROL-RR017`, `SDK-CONNECTOR-CONTROL-RR780.4`. Module: `tls/resolve.py`, `tls/profile.py`, `tls/context.py`. | Conformance: pipelines `sdk-conformance` (`PIPE-GATES-R013`), warn by default, `--strict` blocks; the SDK static scan in the owner row. Index test: `tests/test_centralized_capability_index.py::test_r008_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 16
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R009",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Credential and secret-reference resolution",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Credential and secret-reference resolution.** Connectors accept only `env://` and `openbao://` references and resolve them with `credentials.resolver` and `credentials.runtime_references`. A connector must not parse secret references, call a secret store, or read a token from a plain environment variable. Owner: `SDK-CONNECTOR-CONTROL-RR014.4`, `SDK-CONNECTOR-CONTROL-RR035`, `SDK-CONNECTOR-CONTROL-RR900`. Module: `credentials/references.py`, `credentials/resolver.py`, `credentials/openbao.py`, `credentials/provider.py`. | Conformance: pipelines `sdk-conformance` (`PIPE-GATES-R013`), warn by default, `--strict` blocks. Index test: `tests/test_centralized_capability_index.py::test_r009_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 17
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R010",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Selected-provider credential profile",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Selected-provider credential profile.** Connectors with more than one backend select one with `credentials.provider_profile` and `PROVIDER_*` settings. A connector must not ship its own backend-selection or profile parser. Owner: `SDK-CONNECTOR-CONTROL-RR014.19`, `SDK-CONNECTOR-CONTROL-RR027`. Module: `credentials/provider_profile.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r010_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 18
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R011",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Token providers and source credentials",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Token providers and source credentials.** Connectors obtain bearer, API-key, cookie, basic, and refreshing OAuth2 credentials from `auth/` and `credentials/source.py`. A connector must not ship its own token cache, refresh loop, or client-credentials flow. Owner: `SDK-CONNECTOR-CONTROL-RR031`, `SDK-CONNECTOR-CONTROL-RR900`, `SDK-CONNECTOR-CONTROL-RR014.9`. Module: `auth/tokens.py`, `auth/client_credentials.py`, `auth/static.py`, `credentials/source.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r011_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 19
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R012",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "OIDC delegation and actor identity",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**OIDC delegation and actor identity.** Connectors read the delegated token with `auth.delegation` and the caller with `current_actor()`. The server factory handles the token. A connector must not decode, validate, or sign tokens for caller identity (the server factory does this). Owner: `SDK-CONNECTOR-CONTROL-RR014.8`, `SDK-CONNECTOR-CONTROL-RR902`, `SDK-CONNECTOR-CONTROL-RR780.1`. Module: `auth/delegation.py`, `auth/oidc.py`, `identity.py`, `mcp/auth/`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r012_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 20
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R013",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Browser OAuth with PKCE",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Browser OAuth with PKCE.** Connectors that need an interactive login use `auth.browser` and the PKCE auth manager. A connector must not ship its own authorization-code or PKCE flow. Owner: `SDK-CONNECTOR-CONTROL-RR014.11`, `SDK-CONNECTOR-CONTROL-RR046`. Module: `auth/browser.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r013_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 21
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R014",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "MCP server factory and served security",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**MCP server factory and served security.** Connectors build their server with the SDK server factory. The factory applies the fail-closed served security profile. The `mcp` extra carries the runtime. A connector must not hand-roll its own server, auth proxy, or security middleware. Owner: `SDK-CONNECTOR-CONTROL-RR014.17`, `SDK-CONNECTOR-CONTROL-RR014.18`. Module: `mcp/server.py`, `mcp/served_security.py`, `mcp/middleware.py`, extra `mcp`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r014_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 22
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R015",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Tool surface and tool context",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Tool surface and tool context.** Connectors register one typed tool per API operation with `register_tool_surface` or `register_method_tools`. Tools take the SDK context for progress and approval. A connector must not ship its own tool registry, action-dispatch wrapper, or progress channel. Owner: `SDK-CONNECTOR-CONTROL-RR020`, `SDK-CONNECTOR-CONTROL-RR026`, `SDK-CONNECTOR-CONTROL-RR032`, `SDK-CONNECTOR-CONTROL-RR050`. Module: `mcp/tool_surface.py`, `mcp/method_tools.py`, `mcp/context.py`, `mcp/action_dispatch.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r015_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 23
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R016",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "GraphQL",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**GraphQL.** Connectors send introspection through the SDK GraphQL helpers and read GraphQL sources through the `graphql_document` source. The `graphql` extra carries the parser. A connector must not ship its own GraphQL wrapper or pin a GraphQL client library itself. Another lane extends `SDK-CONNECTOR-CONTROL-R014.12`. Owner: `SDK-CONNECTOR-CONTROL-RR014.12`, `SDK-CONNECTOR-CONTROL-RR030`, `SDK-CONNECTOR-CONTROL-RR043`, `SDK-SOURCE-INGEST-RR901`. Module: `mcp/graphql.py`, `source_connectors/connectors/graphql_document.py`, extra `graphql`. | Conformance: pipelines `sdk-conformance` (`PIPE-GATES-R013`) for an own client and `connector-graphql` (`PIPE-GATES-R012`) for the extra declaration, warn by default, `--strict` blocks. Index test: `tests/test_centralized_capability_index.py::test_r016_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 24
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R017",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "A2A protocol",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**A2A protocol.** Connectors use `agent_connector_sdk.a2a` for agent cards, the client, and the server application. The `a2a` extra carries the server stack. A connector must not ship its own agent-card models, A2A client, or A2A application factory. Owner: `SDK-CONNECTOR-CONTROL-RR014.21`, `SDK-CONNECTOR-CONTROL-RR041`. Module: `a2a/models.py`, `a2a/client.py`, `a2a/app.py`, extra `a2a`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r017_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 25
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R018",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Engine client adapter and compute",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Engine client adapter and compute.** Connectors reach the engine through the SDK sink, the typed compute adapter, and engine settings read from the environment. A connector must not open its own engine client or hold its own engine audience setting. Owner: `SDK-CONNECTOR-CONTROL-RR014.23`, `SDK-CONNECTOR-CONTROL-RR014.24`, `SDK-CONNECTOR-CONTROL-RR005`. Module: `sinks/epistemic_graph.py`, `compute/engine.py`, `decide/`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r018_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 26
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R019",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Ingest bindings and source adapters",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Ingest bindings and source adapters.** Connectors declare an `IngestBinding` and run through the SDK source adapters and runner. Submission uses the generated source-ingest types. A connector must not ship its own checkpoint store, ingest loop, or hand-written ingest types. Owner: `SDK-SOURCE-INGEST-RR001`, `SDK-SOURCE-INGEST-RR005`, `SDK-SOURCE-INGEST-RR017`. Module: `ingest/`, `adapters/`, `runner/syncing.py`, `ports/source_adapter.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r019_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 27
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R020",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Database sources",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Database sources.** Connectors read relational and document databases through `UniversalConnector` and the `database` source. The `db` and `mssql` extras carry the drivers. A connector must not pin a database driver itself or ship its own read-only query gate. Owner: `SDK-SOURCE-INGEST-RR900`, `SDK-SOURCE-INGEST-RR004`, `SDK-CONNECTOR-CONTROL-RR901`. Module: `source_connectors/universal.py`, `identifiers.py`, extras `db`, `mssql`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r020_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 28
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R021",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Feed and document sources",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Feed and document sources.** Connectors poll feeds and documents with the SDK source connectors. The `feeds` extra carries the feed parser. A connector must not pin a feed parser itself or ship its own poll and watermark loop. Owner: `SDK-SOURCE-INGEST-RR800`, `SDK-SOURCE-INGEST-RR005`. Module: `source_connectors/connectors/rss.py`, `arxiv.py`, `web.py`, `rest.py`, extra `feeds`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r021_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 29
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R022",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Message streams",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Message streams.** Connectors read live streams through the SDK stream adapter and `streaming.StreamBus`. The `stream` extra carries the socket library. A connector must not pin a socket library itself or ship its own stream reconnect loop. Owner: `SDK-CONNECTOR-CONTROL-RR782`, `SDK-FINANCE-SOURCES-R900.1`. Module: `streaming.py`, `adapters/event_feed.py`, extra `stream`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r022_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 30
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R023",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Market data",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Market data.** Connectors read market data through `finance.market_data` provider chains. The `market` extra carries the table and quote libraries. A connector must not pin the market libraries itself or ship its own provider chain. Owner: `SDK-FINANCE-SOURCES-R001`, `SDK-FINANCE-SOURCES-R900`. Module: `finance/market_data.py`, `finance/`, extra `market`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r023_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 31
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R024",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Data preparation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Data preparation.** Connectors clean and profile tabular data with the `data_prep` kernel. The `dataprep` extra carries the columnar library. A connector must not pin the columnar library itself or ship its own dedupe and profiling code. Owner: `SDK-SOURCE-INGEST-RR803`. Module: `data_prep/`, extra `dataprep`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r024_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 32
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R025",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Embedding client",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "fb85cad4b0ba"
      ],
      "verified_by": [
        "tests/test_centralized_extras.py:36"
      ],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Embedding client.** Connectors that keep vectors in an external store embed text with `embeddings.create_embedding_model`. Connectors install vector-store clients through the `vector` extra and the embedded-index store through the `vector-chroma` extra. A connector must not ship its own embedding HTTP client or key handling. A connector must not pin a vector-store client that these extras carry. Owner: `SDK-CONNECTOR-CONTROL-RR014.22`. Module: `embeddings.py`, extras `vector`, `vector-chroma`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r025_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 33
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R026",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Vendor extractors",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Vendor extractors.** Connectors enrich entities with the SDK vendor extractors and the `VendorExtractor` contract. A connector must not ship a second extractor for a vendor the SDK already covers. Owner: `SDK-SOURCE-INGEST-RR006`. Module: `vendor_extractors/`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r026_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 34
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R027",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Ontology and content packs",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Ontology and content packs.** Connectors declare their ontology and access contract once. The SDK renders the pack, resources, and mappings. A connector must not hand-write Turtle, pack builders, or `owl:imports` scoping. Owner: `SDK-CONNECTOR-CONTROL-RR067`, `SDK-CONNECTOR-CONTROL-RR021`, `SDK-CONNECTOR-CONTROL-RR022`, `SDK-CONNECTOR-CONTROL-RR019`. Module: `ontology/`, `artifacts/pack.py`, `manifest/ontology_pack.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r027_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 35
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R028",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Connector declaration and fingerprints",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Connector declaration and fingerprints.** Connectors take the sync-preset model, schema normalization and tool fingerprints from `manifest/`. A connector declares its sources with `source_meta` and serves them at `connector://resources`. A connector must not define its own sync-preset model. Owner: `SDK-CONNECTOR-CONTROL-RR015`, `SDK-CONNECTOR-CONTROL-RR015.1`, `SDK-CONNECTOR-CONTROL-RR650`, `SDK-CONNECTOR-CONTROL-RR045.11`. Module: `manifest/`, extra `integrity`. | Conformance: SDK duplicate-definition scan in the owner row (`testing/duplicate_symbol_scan.py`). No pipelines gate runs it.. Index test: `tests/test_centralized_capability_index.py::test_r028_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 36
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R029",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Certification and fingerprints",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Certification and fingerprints.** Connectors certify with `connector-certify`. The command writes tool pins and schema fingerprints. A connector must not define `CertificationReport` or compute its own fingerprints. Owner: `SDK-CONNECTOR-CONTROL-RR003`, `SDK-CONNECTOR-CONTROL-RR007`, `SDK-CONNECTOR-CONTROL-RR015`, `SDK-CONNECTOR-CONTROL-RR045.11`. Module: `certify/`, script `connector-certify`. | Conformance: `connector-certify` check run by the connector. Pipelines gate runs none.. Index test: `tests/test_centralized_capability_index.py::test_r029_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 37
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R030",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Connector identity",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Connector identity.** Connectors declare the fleet name once, in the `agent_connector_sdk.connector` entry point. A connector must not repeat the name as a literal in the pack, manifest, or ingest binding. The owner row is `SDK-CONNECTOR-CONTROL-R071`. Owner: `SDK-CONNECTOR-CONTROL-RR071`. Module: `connector_identity.py`. | Conformance: Owner-row check `ConnectorIdentityError`. Pipelines name gate named in the owner row.. Index test: `tests/test_centralized_capability_index.py::test_r030_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 38
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R031",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Governed write-back",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Governed write-back.** Connectors send every write through the SDK write-back port, sinks, and durable ledger. A connector must not ship its own write path, approval check, or retry ledger. Owner: `SDK-GOVERNED-WRITEBACK-R002`, `SDK-GOVERNED-WRITEBACK-R003`. Module: `writeback/`, `writeback_sinks/`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r031_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 39
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R032",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Runner and CLI bootstrap",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Runner and CLI bootstrap.** Connectors start through the SDK runner and `connector-sync` command. The runner also reads the environment drift check. A connector must not ship its own sync worker, supervisor, or env-drift check. Owner: `SDK-CONNECTOR-CONTROL-RR014.14`, `SDK-SOURCE-INGEST-RR805`. Module: `runner/`, `mcp/env_drift.py`, script `connector-sync`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r032_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 40
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R033",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Health and observability",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Health and observability.** Connectors report health through the SDK health state and server. Logs and progress use the SDK helpers. A connector must not ship its own health endpoint, health states, or log formatter. Owner: `SDK-CONNECTOR-CONTROL-RR065`, `SDK-CONNECTOR-CONTROL-RR050`. Module: `runner/health_state.py`, `runner/health_server.py`, `runner/logs.py`, `progress.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r033_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 41
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R034",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Configuration, paths, and locks",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Configuration, paths, and locks.** Connectors read settings from `config.py` and `utilities.py`, state paths from `paths.py`, and locks from `file_lock.py`. A connector must not ship its own settings loader, state-directory resolver, or file lock. Owner: `SDK-CONNECTOR-CONTROL-RR016`, `SDK-CONNECTOR-CONTROL-RR029`, `SDK-CONNECTOR-CONTROL-RR014.7`, `SDK-CONNECTOR-CONTROL-RR014.2`, `SDK-CONNECTOR-CONTROL-RR034`, `SDK-CONNECTOR-CONTROL-RR780.5`. Module: `config.py`, `utilities.py`, `paths.py`, `file_lock.py`, `library_state.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r034_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 42
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R035",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Privacy, entitlements, and external access",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Privacy, entitlements, and external access.** Connectors apply the SDK privacy rules, entitlement resolution, and per-record external-access descriptors. A connector must not ship its own PII rules, entitlement lookup, or ACL mapping. Owner: `SDK-CONNECTOR-CONTROL-RR014.6`, `SDK-CONNECTOR-CONTROL-RR014.13`, `SDK-CONNECTOR-CONTROL-RR014.15`, `SDK-CONNECTOR-CONTROL-RR025`, `SDK-CONNECTOR-CONTROL-RR036`. Module: `privacy*.py`, `entitlements.py`, `contracts.py`, `access_contract.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r035_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 43
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R036",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Source client and repository transport",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Source client and repository transport.** Connectors read repositories through the SDK source client and repository transport. A connector must not ship its own Git, tree, or blob reader. Owner: `SDK-SCM-R001`, `SDK-REPOSITORY-TRANSPORT-R001`. Module: `repository/`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r036_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 44
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R037",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Plugin entry-point groups",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Plugin entry-point groups.** Connectors register skills, ontologies, sources, and artifact kinds in the `agent_connector_sdk.*` entry-point groups. A connector must not register a plugin group outside the SDK namespace. Owner: `SDK-CONNECTOR-CONTROL-RR014.20`. Module: `pyproject.toml` entry-point groups. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r037_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 45
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R038",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Connector test kit",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Connector test kit.** Connectors prove conformance with the SDK `testing/` kit, including fake servers, sinks, and fleet scans. A connector must not ship its own fake MCP session, fake sink, or import scan. Owner: `SDK-CONNECTOR-CONTROL-RR004`, `SDK-CONNECTOR-CONTROL-RR014.1`. Module: `testing/`. | Conformance: SDK import scan `scan_many_packages`. No pipelines gate runs it.. Index test: `tests/test_centralized_capability_index.py::test_r038_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 46
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R039",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Domain record models",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Domain record models.** Connectors emit taxonomy, earth-observation, and voice-supply-chain records with the SDK record models. A connector must not ship its own record model for these domains. Owner: `SDK-SOURCE-INGEST-RR009`, `SDK-SOURCE-INGEST-RR804`, this spec. Module: `taxonomy/`, `earth_observations/`, `voice_supply_chain/`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r039_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 47
    },
    {
      "id": "SDK-CENTRALIZED-CAPABILITIES-R040",
      "kind": "requirement",
      "parent": "SDK-CENTRALIZED-CAPABILITIES",
      "source": "specs/centralized-capabilities/status.json",
      "title": "Optional dependencies come from SDK extras",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "fb85cad4b0ba"
      ],
      "verified_by": [
        "tests/test_centralized_extras.py:27",
        "tests/test_centralized_extras.py:37"
      ],
      "parent_title": "SDK-CENTRALIZED-CAPABILITIES \u2014 Centralized connector capabilities",
      "definition": "**Optional dependencies come from SDK extras.** Connectors install optional drivers through `agent-connector-sdk[<extra>]`. The extras are `integrity`, `mcp`, `a2a`, `feeds`, `dataprep`, `db`, `mssql`, `graphql`, `market`, `stream`, `vector`, and `vector-chroma`. A connector must not pin a package that an SDK extra already pins. A connector must not pin `requests`, because the SDK base install carries `httpx`. Owner: this spec. Module: `pyproject.toml` `[project.optional-dependencies]`. | Conformance: pipelines `sdk-conformance` (`PIPE-GATES-R013`), warn by default, `--strict` blocks. SDK test: `tests/test_centralized_extras.py::test_every_extra_has_a_row`. Index test: `tests/test_centralized_capability_index.py::test_r040_module_and_owner_exist`.",
      "definition_source": "specs/centralized-capabilities/requirements.md",
      "definition_line": 48
    }
  ],
  "github": {
    "issues": {
      "available": true,
      "items": []
    },
    "pull_requests": {
      "available": true,
      "items": []
    }
  },
  "spec_edges": [
    [
      "SDK-CONNECTOR-CONTROL",
      "depends on",
      "SDK-CONNECTOR-CONTROL"
    ],
    [
      "SDK-CONNECTOR-CONTROL",
      "depends on",
      "https://github.com/Knuckles-Team/arbora/blob/7af96428d92ffbdd963515f7b129d1ad4132e462/specs/host-composition-boundary/spec.md"
    ],
    [
      "SDK-CONNECTOR-CONTROL",
      "references",
      "SDK-CONNECTOR-CONTROL"
    ],
    [
      "SDK-CONNECTOR-CONTROL",
      "references",
      "https://github.com/Knuckles-Team/arbora/blob/main/specs/fleet-catalog-and-tools/spec.md"
    ],
    [
      "SDK-CONNECTOR-CONTROL",
      "references",
      "https://github.com/Knuckles-Team/epistemic-graph/blob/main/specs/federated-query-and-reasoning/spec.md"
    ],
    [
      "SDK-CONNECTOR-CONTROL",
      "references",
      "https://github.com/Knuckles-Team/epistemic-graph/blob/main/specs/typed-packs-and-catalog/spec.md"
    ],
    [
      "SDK-GOVERNED-WRITEBACK",
      "references",
      "RFC 8785"
    ],
    [
      "SDK-SOURCE-INGEST",
      "depends on",
      "SDK-CONNECTOR-CONTROL"
    ],
    [
      "SDK-SOURCE-INGEST",
      "depends on",
      "SDK-GOVERNED-WRITEBACK"
    ],
    [
      "SDK-SOURCE-INGEST",
      "depends on",
      "https://github.com/Knuckles-Team/epistemic-graph/blob/c67bad3d6326da3b7c161c21fbd6cf78fec4cc6d/specs/federated-query-and-reasoning/requirements.md"
    ],
    [
      "SDK-SOURCE-INGEST",
      "depends on",
      "https://github.com/Knuckles-Team/epistemic-graph/blob/fe6982b29d0b60ad2a10092c959c238eeb74e919/specs/federated-query-and-reasoning/requirements.md"
    ],
    [
      "SDK-SOURCE-INGEST",
      "depends on",
      "https://github.com/Knuckles-Team/epistemic-graph/blob/fe6982b29d0b60ad2a10092c959c238eeb74e919/specs/repository-index-and-ingestion/requirements.md"
    ]
  ]
}
