{
  "version": 1,
  "repository": "Knuckles-Team/agent-connector-sdk",
  "revision": "b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c",
  "captured_at": "2026-10-13T16:19:36.690785+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": "Unassigned",
      "code_refs": [
        {
          "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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/tools.py:25",
          "repository": "Knuckles-Team/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/certify/pins.py:111",
          "repository": "Knuckles-Team/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/agent_connector_sdk/certify/pins.py#L111"
        },
        {
          "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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/mcp/action_dispatch.py:194",
          "repository": "Knuckles-Team/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/method_tools.py:133",
          "repository": "Knuckles-Team/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/server.py:88",
          "repository": "Knuckles-Team/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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:121",
          "repository": "Knuckles-Team/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/mcp/tool_surface.py:97",
          "repository": "Knuckles-Team/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/vendor_extractors/a2a.py:34",
          "repository": "Knuckles-Team/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/tests/test_mcp_confirmation_roundtrip.py"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "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 by normalizing tool input and output schemas through manifest/tool_schema.py and passes it to the graph service as a claim attribute; the graph service stores that value without independently recomputing 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": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0f826d4ca6db",
        "93afc6b075df"
      ],
      "verified_by": [
        "tests/test_certify_pins.py:109"
      ],
      "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, because that normalization is SDK-specific logic the graph service cannot reproduce 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:79"
      ],
      "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": [
        "tests/test_fleet_recertification.py:54"
      ],
      "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 of 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. | A per-package import scan and test run across the K-O batch confirming no agent_utilities import remains and 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, including the repository-manager package's own agent_utilities imports, import agent_connector_sdk modules for server construction, configuration, exceptions, and transport security instead, and call the generated EG client instead of a local ingestion helper. | A per-package import scan and test run across the P-S batch confirming no agent_utilities import remains and 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": "VERIFIED",
      "state": "verified",
      "done": true,
      "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.** Once every connector package imports the SDK's equivalents, the duplicated connector toolkit (server factory, action dispatch, concurrency, transport security, credentials, and related helpers) kept elsewhere becomes safe to delete, with no compatibility alias retained. Rollup: delivered once the fleet-wide census (R014.1) reports every connector migrated. | Tests confirming the SDK modules provide complete replacements for each listed toolkit area, plus a cross-repository import scan showing 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": [
        "5e1bd9257555"
      ],
      "verified_by": [],
      "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",
        "d9c0db1b19cf",
        "fad5328aee62"
      ],
      "verified_by": [
        "tests/test_registry_visibility_content.py:276",
        "tests/test_registry_visibility_content.py:293",
        "tests/test_schema_disclosure_provider.py:142",
        "tests/test_schema_disclosure_provider.py:63"
      ],
      "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 `ontology://<connector>/<file>.ttl` and `shapes://<connector>/<file>.ttl` resources from one ontology directory. `register_connector_content` reuses the same builder. A missing directory yields no resources. | MCP client tests list and read the resources, prove that no prompt registers, and prove the empty result for a missing directory.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 25
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R020",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "One condensed intent contract: `MCP_TOOL_MODE` retired",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d3617301012c",
        "ffb9260d7602"
      ],
      "verified_by": [
        "tests/test_tool_surface.py:167"
      ],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**One condensed intent contract: `MCP_TOOL_MODE` retired.** `register_tool_surface` always registers the condensed, action-routed tool surface, each tool tagged `gated`; no `MCP_TOOL_MODE` setting, mode branch, or separate verbose 1:1 tool surface remains in the SDK, matching agent-utilities' one condensed intent contract (agent-utilities#54). | Tests asserting `register_tool_surface` registers and gates condensed tools with no mode parameter, and a repository-wide scan confirming no `tool_mode`/`MCP_TOOL_MODE`/verbose-tool-surface module or reference remains.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 26
    },
    {
      "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": 27
    },
    {
      "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": 28
    },
    {
      "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": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "713782e7901c",
        "b9a9652c0135"
      ],
      "verified_by": [],
      "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": 29
    },
    {
      "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": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "713782e7901c"
      ],
      "verified_by": [],
      "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": 30
    },
    {
      "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": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5a476653a386"
      ],
      "verified_by": [],
      "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, generalizing \"what may I do\" to \"what may I reach\" over `agent_connector_sdk.identity.ActorContext`, so a connector 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 prove a namespaced capability, a namespace wildcard, a bare zero-config capability, and a super-capability (`admin`/`system`) each resolve the documented entitled subset against a fake available-resource catalog, that no matching capability resolves empty, and that an unauthenticated or tenant-less actor raises before a catalog is read.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 31
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R026",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK provides opt-in per-client-method MCP tool derivation",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d3617301012c"
      ],
      "verified_by": [],
      "parent_title": "SDK-CONNECTOR-CONTROL \u2014 SDK connector control, certification, and pack publication",
      "definition": "**SDK provides opt-in per-client-method MCP tool derivation.** `agent_connector_sdk.mcp.method_tools.register_method_tools` registers one directly invocable, `params_json`-dispatched tool per public method of a connector's API-client class, named `<prefix>_<method>` with no doubled prefix, tagged by a domain derived from the method's defining class, for a connector whose served tool surface genuinely depends on that one-tool-per-method derivation instead of only the condensed intent contract (SDK-CONNECTOR-CONTROL-R020 retired the implicit, env-toggled verbose surface; this is an explicit opt-in primitive, not its return). A method classified destructive is gated behind a live caller's confirmation before it dispatches. A method defined only on a base-infrastructure class (auth, pagination, retry) is excluded. | Tests prove one tool registers per public client-class method across two domain classes with no doubled prefix, that a base-infrastructure method is excluded, that a destructive method is confirmed before it calls the client, that a declined or unattended confirmation never dispatches, and that an asynchronous `get_client` is awaited.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 32
    },
    {
      "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": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "284fb12a19ed",
        "584fb45cdf24",
        "602215e2ddd8"
      ],
      "verified_by": [],
      "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": 33
    },
    {
      "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 whose destination is checked against an SSRF policy, with explicit `pin_egress`, `allowed_private_hosts`, and `allow_loopback` parameters, and `pinned_egress_transport` returns a transport pinned to a resolved, policy-checked address so a later DNS change cannot redirect an already-approved request, for connectors that call self-hosted or private-network targets (vaultwarden-mcp, gitlab-api, pulselink-mcp). Rollup: delivered once the governed egress children and API-key cookie isolation (R028.1-R028.3) are specified, wired, and verified. | Unit tests asserting a disallowed private or loopback destination is rejected by default, an explicitly allowed private host or loopback passes, and a pinned transport reuses the originally resolved address rather than re-resolving DNS.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 34
    },
    {
      "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": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "284fb12a19ed"
      ],
      "verified_by": [],
      "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": 35
    },
    {
      "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, gitlab-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": 36
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R028.3",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "API-key identity remains header-based and stateless",
      "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 remains header-based and stateless.** 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; login, redirect, error, and success responses; concurrent calls through one client; and a Bearer behavior control. 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": 37
    },
    {
      "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": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "284fb12a19ed"
      ],
      "verified_by": [],
      "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": 38
    },
    {
      "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": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "284fb12a19ed"
      ],
      "verified_by": [],
      "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": 39
    },
    {
      "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": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "284fb12a19ed"
      ],
      "verified_by": [],
      "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, gitlab-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": 40
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R032",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK provides opt-in verbose, one-tool-per-method surface derivation via `register_tool_surface`",
      "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 provides opt-in verbose, one-tool-per-method surface derivation via `register_tool_surface`.** Beyond the condensed intent contract (SDK-CONNECTOR-CONTROL-R020), `register_tool_surface` can derive and register a verbose, per-method tool surface for a connector whose callers depend on individually named tools rather than the condensed action-routed surface, for connectors still migrating their serving surface off a verbose predecessor (data-science-mcp, vector-mcp, twenty-mcp). | Tests asserting `register_tool_surface` in verbose mode registers one tool per targeted method with no doubled prefix, and that the condensed surface remains available and unaffected when verbose derivation is also requested.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 41
    },
    {
      "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": "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 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": 42
    },
    {
      "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": "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 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": 43
    },
    {
      "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": [
        "629ef53c29f0",
        "bac65b612ced"
      ],
      "verified_by": [],
      "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). | Unit tests asserting resolution for both reference schemes, a denial for a reference outside the caller's scope, and a logging-inspection test asserting no resolved secret value appears in any log record.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 44
    },
    {
      "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": 45
    },
    {
      "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": 46
    },
    {
      "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": 47
    },
    {
      "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": 48
    },
    {
      "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": 49
    },
    {
      "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": 50
    },
    {
      "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": 51
    },
    {
      "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 is a contract and typing row: pin the field list (supplier name, status, key field) and 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": 52
    },
    {
      "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": 53
    },
    {
      "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` 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, so add one with a contract for the deployed workload class carrying its image reference, plus 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": 54
    },
    {
      "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": 55
    },
    {
      "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": 56
    },
    {
      "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": 57
    },
    {
      "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": 58
    },
    {
      "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": 59
    },
    {
      "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": 60
    },
    {
      "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": 61
    },
    {
      "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": 62
    },
    {
      "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": 63
    },
    {
      "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": 64
    },
    {
      "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": 65
    },
    {
      "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": 66
    },
    {
      "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": 67
    },
    {
      "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": 68
    },
    {
      "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": 69
    },
    {
      "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": 70
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R045.11",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "Generate the manifest facts and prove the path end to end",
      "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": "**Generate the manifest facts and prove the path end to end.** `write_certified_pins` (`agent_connector_sdk/certify/pins.py:111`) must write each tool's facts into `connector_manifest.yml`. No person edits the file by hand. A fixture connector run through certification and `build_content_pack` must show equal facts in the manifest and the pack. | `tests/test_certify_read_only.py::test_manifest_and_pack_carry_equal_facts`",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 71
    },
    {
      "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": 72
    },
    {
      "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": 73
    },
    {
      "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": 74
    },
    {
      "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": 75
    },
    {
      "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": 76
    },
    {
      "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": 77
    },
    {
      "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": 78
    },
    {
      "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": 79
    },
    {
      "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": 80
    },
    {
      "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": 81
    },
    {
      "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": 82
    },
    {
      "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": 83
    },
    {
      "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, so a delegation decision can 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": 84
    },
    {
      "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, runs the extractor with a base URL, and 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": 85
    },
    {
      "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": 86
    },
    {
      "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": 87
    },
    {
      "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": 88
    },
    {
      "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": 89
    },
    {
      "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": 90
    },
    {
      "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": 91
    },
    {
      "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": 92
    },
    {
      "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": 93
    },
    {
      "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": 94
    },
    {
      "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": 95
    },
    {
      "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": 96
    },
    {
      "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": 97
    },
    {
      "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": 98
    },
    {
      "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": 99
    },
    {
      "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 GraphOS 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": 100
    },
    {
      "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": 101
    },
    {
      "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": 102
    },
    {
      "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": 103
    },
    {
      "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": 104
    },
    {
      "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": 105
    },
    {
      "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": 106
    },
    {
      "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": 109
    },
    {
      "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": 110
    },
    {
      "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": 111
    },
    {
      "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": 112
    },
    {
      "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": 113
    },
    {
      "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": 114
    },
    {
      "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. GraphOS 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": 118
    },
    {
      "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 GraphOS 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": 119
    },
    {
      "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": 120
    },
    {
      "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 GraphOS `graph_os/api/ops/agents.py:97` (`agents.run`) and `graph_os/control_plane/runs/admission.py:108` (`NativeWorkItemAdmissionProtocol`) / `graph_os/control_plane/runs/capacity.py:53` (`CapacityLedger`); return the SDK adapter receipt to GraphOS. 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": 121
    },
    {
      "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": 122
    },
    {
      "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": 123
    },
    {
      "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 GraphOS 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": 124
    },
    {
      "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": 125
    },
    {
      "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": 126
    },
    {
      "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": 127
    },
    {
      "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": 128
    },
    {
      "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": 129
    },
    {
      "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": 130
    },
    {
      "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": 131
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R053",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "SDK environment declarations for GRAPHOS:9",
      "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 declarations for GRAPHOS:9.** The SDK declares environment inputs used by enabled SDK components, including indirect reads. GraphOS owns startup validation; AU owns AU declarations. Source trace: `GRAPHOS:9 cfd8f1270b5ec1f19d8c78f50e5a833695573763a691584e8c74d8fa5f1cb225`. | Served producer/consumer acceptance and independent readback; runtime remains unclaimed.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 132
    },
    {
      "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.** Define versioned EnvironmentDeclaration records. Include component/distribution, schema revision, input name, required state, type constraints, and direct/indirect read source. Store no values. | Reject duplicate declarations, literals, and unknown components.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 133
    },
    {
      "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.** Plan an SDK declaration export for every enabled component and transitive setting; the export is absent. Current readers include `CONNECTOR_CONFIG_FILE` and `XDG_CONFIG_HOME` in `agent_connector_sdk/config.py:112-148`, `CONNECTOR_AUTH_TOKEN_URL`, `CONNECTOR_AUTH_CLIENT_ID`, `CONNECTOR_TRANSPORT_TIMEOUT_SECONDS`, `CONNECTOR_TRANSPORT_ALLOW_PLAINTEXT`, `CONNECTOR_LIMITS_MAX_CONNECTIONS`, and `CONNECTOR_LIMITS_MAX_KEEPALIVE_CONNECTIONS` in `agent_connector_sdk/config.py:258-271`; `MCP_ENABLED_TOOLS`, `MCP_DISABLED_TOOLS`, `MCP_ENABLED_TAGS`, and `MCP_DISABLED_TAGS` are read in `agent_connector_sdk/mcp/visibility_policy.py:71-76`. `agent_connector_sdk/config_git.py:8-20` filters inherited Git selectors and is not a declaration producer. | Undeclared reads and missing required declarations block startup.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 134
    },
    {
      "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.** The SDK owner must assign the declaration export path before implementation; the SDK currently has no declaration producer. Bind that export to the GraphOS `HostEnvironmentManifest` producer `GRAPHOS-HOST-R010.2` and startup consumer `GRAPHOS-HOST-R010.4`. GraphOS owns the schema and validator; do not duplicate them. AU declarations remain AU-owned. | The served launcher consumes the SDK declaration set.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 135
    },
    {
      "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 startup before serving on missing, malformed, or undeclared inputs. Name the input where required. Never reveal its value. | A secret canary is absent from every refusal diagnostic.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 136
    },
    {
      "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.** Bind declaration digest, component versions, enabled set, schema revision, validation outcome, and host decision. Persist names and constraints, never values. | Independent readback reproduces the declaration set and decision.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 137
    },
    {
      "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.** Future served tests cover enabled components and indirect reads. Test missing, malformed, and undeclared inputs. Confirm no route admission and redact secret values. | The healthy case serves; each negative case refuses before admission.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 138
    },
    {
      "id": "SDK-CONNECTOR-CONTROL-R054",
      "kind": "requirement",
      "parent": "SDK-CONNECTOR-CONTROL",
      "source": "specs/SDK-CONNECTOR-CONTROL/status.json",
      "title": "JSON tag-loader migration for AU:89",
      "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 for AU:89.** Inventory each JSON tag loader and migrate it to Python registration with served parity. Preserve the condensed default and R026/R032 opt-ins. Source trace: `AU:89 3916d50003442e91ad490706e9c9cd0d77211af4998baa3ad98220457e4c7d1a`. | Served producer/consumer acceptance and independent readback; runtime remains unclaimed.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 139
    },
    {
      "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.** Bind each entry to package, repository, JSON digest, target, and operation IDs. Also record schemas, tags, mode, authorization reference, and refusal cases. | The inventory covers every loader before migration.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 140
    },
    {
      "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.** Migrate entries through register_tool_surface or register_method_tools. Keep condensed routing as the default. Preserve R026 and R032 opt-ins. R020 retires verbose mode, but R032 permits explicit verbose opt-in. This conflict remains unresolved for AU:89. Obtain the owner's normative decision before implementation or parity closure. | Served operations and schemas remain equivalent.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 141
    },
    {
      "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.** Current Python registration and dispatch paths are `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`). `agent_connector_sdk/testing/fleet_migration.py:32` (`PackageScanResult`) and `agent_connector_sdk/testing/fleet_migration.py:90` (`scan_many_packages`) currently provide import scanning only. The complete JSON tag-loader census and served parity gate are absent. | Tests reach real registration, dispatch, and backend.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 142
    },
    {
      "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.** Preserve denied, malformed, unknown, unsupported, and schema-mismatch refusals. Any unclassified loader or unexplained difference blocks completion. | Negative calls retain typed refusal and zero backend effects.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 143
    },
    {
      "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.** Record revisions, inventory digest, operation/schema/tag parity, mode, authorization/refusal comparison, and served receipt. Do not claim completion before readback. | Reconstruct the parity decision from recorded digests and results.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 144
    },
    {
      "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.** Future served tests list every package with tools/list. Then call each operation. Include denied and malformed calls. Test condensed default and supported opt-ins. | The acceptance proves dispatch parity and no opt-in regression.",
      "definition_source": "specs/SDK-CONNECTOR-CONTROL/requirements.md",
      "definition_line": 145
    },
    {
      "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:138",
        "tests/test_mcp_confirmation_roundtrip.py:182",
        "tests/test_mcp_confirmation_roundtrip.py:202",
        "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": 149
    },
    {
      "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": "LANDED",
      "state": "landed",
      "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/agent-connector-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "6ef04661acc2"
      ],
      "verified_by": [],
      "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-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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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; GraphOS 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": "LANDED",
      "state": "landed",
      "done": false,
      "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/agent-connector-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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:158",
        "tests/test_release_quality_r001_r005.py:48",
        "tests/test_release_quality_r001_r005.py:55",
        "tests/test_release_quality_r001_r005.py:61",
        "tests/test_release_quality_r001_r005.py:79"
      ],
      "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. | 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:133",
        "tests/gates/test_workflow_contract.py:98"
      ],
      "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": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "cbbf859a5c38",
        "fad5328aee62"
      ],
      "verified_by": [],
      "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 with source and wheel evidence",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0c1f49ced769",
        "42b930057c3e",
        "6856dbff0136",
        "851969957034",
        "bdd3916109d0"
      ],
      "verified_by": [
        "tests/gates/test_workflow_contract.py:86",
        "tests/test_release_quality_r001_r005.py:104",
        "tests/test_release_quality_r001_r005.py:123",
        "tests/test_release_quality_r001_r005.py:130",
        "tests/test_release_quality_r001_r005.py:142"
      ],
      "parent_title": "SDK-QUALITY-RELEASE \u2014 Portable SDK quality, Pages, and release",
      "definition": "**Hosted CI reproduces the pinned dependency graph with source and wheel evidence.** The frozen lock reproduces the hosted graph, including requested extras and transitive dependencies. For `epistemic-graph`, `pyproject.toml`, `uv.lock`, and the bootstrap checkout pin the engine-main commit named in `scripts/epistemic_graph_release.json`. That record binds the official wheel filename, version, and SHA-256 to the same commit. Bootstrap installs the wheel only when its digest matches the record. Installation uses `--no-deps` and cannot change locked dependencies. It performs no native build. Installed PEP 610 origin, metadata, native engine, and package files must match the archive. SDK-consumed contract modules resolve from the exact source checkout. Only the release wheel directory may overlay that checkout on the import path. Source declarations match metadata snapshots and locked package edges. Active dependencies match locked versions and installed metadata. The installer rejects synthetic distribution metadata. Keep source and wheel evidence separate. Reject mismatched source commit, remote, origin, version, metadata, asset digest, package file, dependency, or graph. | Positive and adversarial tests prove source, lock, bootstrap, and release commit alignment. They verify archive and installed-file identity, import origins, Cargo version, declarations, dependency resolution, and extras closure. Negative cases reject wrong commits or wheel digests, unreceipted overlays, wrong origins or versions, missing dependencies, or graph drift. The graph digest binds a provenance sidecar with separate source and wheel evidence.",
      "definition_source": "specs/SDK-QUALITY-RELEASE/requirements.md",
      "definition_line": 9
    },
    {
      "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/agent-connector-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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-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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/event_feed.py:133",
          "repository": "Knuckles-Team/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/mcp/tool_surface.py:121",
          "repository": "Knuckles-Team/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/cli.py:153",
          "repository": "Knuckles-Team/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/vendor_extractors/erpnext.py:91",
          "repository": "Knuckles-Team/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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/agent-connector-sdk",
          "url": "https://github.com/Knuckles-Team/agent-connector-sdk/blob/b9ee9ed0a82f6ecd5ed23d6226ca5ab503f74f9c/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; no arXiv derivation is claimed."
        }
      ]
    },
    {
      "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:177",
        "tests/test_ingest.py:194",
        "tests/test_ingest.py:222"
      ],
      "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 manifest presets, and owns connection profiling and data-preparation for enterprise sources that agent-utilities no longer implements 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, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract` and 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` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.caddy` 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` and 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": 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` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.home_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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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` and 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": 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, covering classification, shaping, and reporting, runs inside the connector SDK's sync runner between draining and applying a page, rather than 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 carrying rank, parent, scientific name, NCBI and GBIF identifiers, and a term CURIE, validated against the world_model-v1 TaxonShape, with bounded delta synchronization. | 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, claims a job, runs the job body with the existing source-effect runners, acks success or failure, and commits only after the ack (at-least-once). The worker holds no scheduling policy of its own: 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` with a fake client asserts ack follows execution, no ack when the body is killed, and that 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-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": 120
    },
    {
      "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": 121
    },
    {
      "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": 122
    },
    {
      "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": 123
    },
    {
      "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": 124
    },
    {
      "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": 125
    },
    {
      "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": 131
    },
    {
      "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": 132
    },
    {
      "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": 133
    },
    {
      "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": 134
    },
    {
      "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": 135
    },
    {
      "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": 136
    },
    {
      "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": 139
    },
    {
      "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": 140
    },
    {
      "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": 141
    },
    {
      "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 GraphOS 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 GraphOS IDs before implementation.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 142
    },
    {
      "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": 143
    },
    {
      "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": 144
    },
    {
      "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": 145
    },
    {
      "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": 146
    },
    {
      "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": 147
    },
    {
      "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": 148
    },
    {
      "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 GraphOS after owners identify the exact operation and counterpart IDs.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 149
    },
    {
      "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": 150
    },
    {
      "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": 151
    },
    {
      "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 GraphOS receipts. Mocks do not prove acceptance; runtime evidence remains absent.",
      "definition_source": "specs/SDK-SOURCE-INGEST/requirements.md",
      "definition_line": 152
    }
  ],
  "github": {
    "issues": {
      "available": true,
      "items": []
    },
    "pull_requests": {
      "available": true,
      "items": []
    }
  },
  "spec_edges": [
    [
      "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"
    ]
  ]
}
