A

Delivery structure

9 specs, 635 requirements, 4 with no code mapped
Knuckles-Team/scion-sdkSpec delivery
Specs (9)
  • SDK-CONNECTOR-CONTROL300
  • SDK-FINANCE-SOURCES12
  • SDK-GOVERNED-WRITEBACK23
  • SDK-OBSERVABILITY-FEEDS1
  • SDK-QUALITY-RELEASE6
  • SDK-REPOSITORY-TRANSPORT5
  • SDK-SCM14
  • SDK-SOURCE-INGEST234
  • SDK-CENTRALIZED-CAPABILITIES40
Records not done
  • Requirementsall slices in all specs635
  • Requirements not donenot VERIFIED453
  • Specs not donewhole specs only7

Each spec shows its requirement count. Panel J lists every record.

B

Delivery states

count of total

Requirements (635)

SPECIFIED (specified)443 of 635 requirements
LANDED (landed)10 of 635 requirements
VERIFIED (verified)182 of 635 requirements

Specs (9)

SPECIFIED (specified)7 of 9 specs
VERIFIED (verified)2 of 9 specs

Each bar shows one state against all records of the same kind.

Percentages count current rows. Done means VERIFIED.

C

State definitions

delivery_state
StateDefinition
SPECIFIEDThe requirement is written. No code for it is on the default branch.
LANDEDA commit that carries its ID in a Spec trailer is on the default branch.
VERIFIEDIt is LANDED and a test bound to its ID exists.

A spec state is the lowest state of its rows. Done means VERIFIED.

Invalid state: 0

D

Specifications

specs/*/status.json
Spec / titleReq.LandedDoneSpec stateCode references
SDK-CONNECTOR-CONTROLSDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publication30095/30086SPECIFIED../../agent_connector_sdk/config.py:35 implementation: file exists; coverage not verified
../../agent_connector_sdk/config.py:75 implementation: file exists; coverage not verified
../../agent_connector_sdk/config_git.py:8 implementation: file exists; coverage not verified
../../agent_connector_sdk/credentials/resolver.py:36 implementation: file exists; coverage not verified
../../agent_connector_sdk/mcp/action_dispatch.py:196 implementation: file exists; coverage not verified
../../agent_connector_sdk/mcp/method_tools.py:157 implementation: file exists; coverage not verified
../../agent_connector_sdk/mcp/server.py:88 implementation: file exists; coverage not verified
../../agent_connector_sdk/mcp/tool_surface.py:102 implementation: file exists; coverage not verified
../../agent_connector_sdk/mcp/tool_surface.py:121 implementation: file exists; coverage not verified
../../agent_connector_sdk/testing/fleet_migration.py:90 implementation: file exists; coverage not verified
agent_connector_sdk/adapters/event_feed.py implementation: file exists; coverage not verified
agent_connector_sdk/adapters/mcp_tool.py implementation: file exists; coverage not verified
agent_connector_sdk/artifacts/annotations.py:94 implementation: file exists; coverage not verified
agent_connector_sdk/artifacts/pack.py:127 implementation: file exists; coverage not verified
agent_connector_sdk/artifacts/pack.py:159 implementation: file exists; coverage not verified
agent_connector_sdk/artifacts/tools.py:25 implementation: file exists; coverage not verified
agent_connector_sdk/artifacts/tools.py:34 implementation: file exists; coverage not verified
agent_connector_sdk/artifacts/tools.py:64 implementation: file exists; coverage not verified
agent_connector_sdk/certify/certification.py:75 implementation: file exists; coverage not verified
agent_connector_sdk/certify/cli.py:124 implementation: file exists; coverage not verified
agent_connector_sdk/certify/options.py:26 implementation: file exists; coverage not verified
agent_connector_sdk/credentials/provider.py:33 implementation: file exists; coverage not verified
agent_connector_sdk/credentials/resolution.py:43 implementation: file exists; coverage not verified
agent_connector_sdk/http/client.py:84 implementation: file exists; coverage not verified
agent_connector_sdk/manifest/tool_schema.py:31 implementation: file exists; coverage not verified
agent_connector_sdk/mcp/action_dispatch.py:194 implementation: file exists; coverage not verified
agent_connector_sdk/mcp/action_dispatch.py:88 implementation: file exists; coverage not verified
agent_connector_sdk/mcp/context.py:49 implementation: file exists; coverage not verified
agent_connector_sdk/mcp/graphql.py implementation: file exists; coverage not verified
agent_connector_sdk/mcp/method_tools.py:133 implementation: file exists; coverage not verified
agent_connector_sdk/mcp/tool_surface.py:97 implementation: file exists; coverage not verified
agent_connector_sdk/ports/transport.py implementation: file exists; coverage not verified
agent_connector_sdk/transports/mcp.py implementation: file exists; coverage not verified
agent_connector_sdk/vendor_extractors/a2a.py:34 implementation: file exists; coverage not verified
agent_connector_sdk/vendor_extractors/a2a.py:98 implementation: file exists; coverage not verified
agent_connector_sdk/vendor_extractors/a2a_helpers.py:79 implementation: file exists; coverage not verified
agent_connector_sdk/writeback/connector.py:75 implementation: file exists; coverage not verified
agent_connector_sdk/writeback/epistemic_graph.py:43 implementation: file exists; coverage not verified
tests/test_mcp_native_primitives.py test: file exists; coverage not verified
agent_connector_sdk/config.py implementation: file exists; coverage not verified
agent_connector_sdk/ontology/access_contract.ttl implementation: file exists; coverage not verified
requirements.md documentation: file exists; coverage not verified
tests/test_mcp_confirmation_roundtrip.py test: file exists; coverage not verified
SDK-FINANCE-SOURCESSDK-FINANCE-SOURCES — Qualified finance source adapters127/126SPECIFIEDrequirements.md documentation: file exists; coverage not verified
SDK-GOVERNED-WRITEBACKSDK-GOVERNED-WRITEBACK — Governed write-back to attached sources233/233SPECIFIEDagent_connector_sdk/ports/writeback.py implementation: file exists; coverage not verified
agent_connector_sdk/ports/writeback_transport.py implementation: file exists; coverage not verified
agent_connector_sdk/writeback/connector.py implementation: file exists; coverage not verified
agent_connector_sdk/writeback/connector.py:75 implementation: file exists; coverage not verified
agent_connector_sdk/writeback/service.py implementation: file exists; coverage not verified
agent_connector_sdk/writeback/service.py:74 implementation: file exists; coverage not verified
requirements.md documentation: file exists; coverage not verified
SDK-OBSERVABILITY-FEEDSSDK-OBSERVABILITY-FEEDS — Operational event feeds through the source adapter contract11/11✓ VERIFIEDNot mapped
SDK-QUALITY-RELEASESDK-QUALITY-RELEASE — Portable SDK quality, Pages, and release66/66✓ VERIFIEDrequirements.md documentation: file exists; coverage not verified
scripts/epistemic_graph_release.json implementation: file exists; coverage not verified
SDK-REPOSITORY-TRANSPORTSDK-REPOSITORY-TRANSPORT — Authenticated immutable repository transport54/54SPECIFIEDrequirements.md documentation: file exists; coverage not verified
SDK-SCMSDK-SCM — SDK source client and virtual workspace140/140SPECIFIEDagent_connector_sdk/http/client.py:117 implementation: file exists; coverage not verified
agent_connector_sdk/http/client.py:92 implementation: file exists; coverage not verified
agent_connector_sdk/mcp/action_dispatch.py:196 implementation: file exists; coverage not verified
agent_connector_sdk/mcp/tool_surface.py:305 implementation: file exists; coverage not verified
agent_connector_sdk/ports/source_adapter.py:21 implementation: file exists; coverage not verified
requirements.md documentation: file exists; coverage not verified
SDK-SOURCE-INGESTSDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migration23472/23472SPECIFIEDApproved query execution documentation: external declaration; not verified
EG-FEDERATED-QUERY-R015 documentation: external declaration; not verified
EG-FEDERATED-QUERY-R085 documentation: external declaration; not verified
EG-REPO-INGEST-R002 documentation: external declaration; not verified
Source ingestion authority documentation: external declaration; not verified
../../agent_connector_sdk/mcp/action_dispatch.py:194 implementation: file exists; coverage not verified
../../agent_connector_sdk/ports/source_adapter.py:21 implementation: file exists; coverage not verified
../../agent_connector_sdk/runner/syncing.py:200 implementation: file exists; coverage not verified
../../agent_connector_sdk/runner/worker.py:150 implementation: file exists; coverage not verified
SDK-CONNECTOR-CONTROL-R021 documentation: file exists; coverage not verified
SDK-GOVERNED-WRITEBACK-R001 documentation: file exists; coverage not verified
agent_connector_sdk/adapters/document_sources.py:402 implementation: file exists; coverage not verified
agent_connector_sdk/adapters/event_feed.py:133 implementation: file exists; coverage not verified
agent_connector_sdk/adapters/mcp_tool.py:107 implementation: file exists; coverage not verified
agent_connector_sdk/adapters/mcp_tool.py:118 implementation: file exists; coverage not verified
agent_connector_sdk/adapters/web_fetch.py:182 implementation: file exists; coverage not verified
agent_connector_sdk/adapters/web_fetch.py:86 implementation: file exists; coverage not verified
agent_connector_sdk/http/client.py:97 implementation: file exists; coverage not verified
agent_connector_sdk/http/retry.py:71 implementation: file exists; coverage not verified
agent_connector_sdk/ingest/request.py:85 implementation: file exists; coverage not verified
agent_connector_sdk/ingest/service.py implementation: file exists; coverage not verified
agent_connector_sdk/ingest/service.py:74 implementation: file exists; coverage not verified
agent_connector_sdk/mcp/tool_surface.py:121 implementation: file exists; coverage not verified
agent_connector_sdk/runner/backoff.py implementation: file exists; coverage not verified
agent_connector_sdk/runner/cli.py:153 implementation: file exists; coverage not verified
agent_connector_sdk/runner/supervisor.py:62 implementation: file exists; coverage not verified
agent_connector_sdk/runner/syncing.py:106 implementation: file exists; coverage not verified
agent_connector_sdk/runner/worker.py:180 implementation: file exists; coverage not verified
agent_connector_sdk/sinks/epistemic_graph.py:91 implementation: file exists; coverage not verified
agent_connector_sdk/testing/http_server.py implementation: file exists; coverage not verified
agent_connector_sdk/vendor_extractors/erpnext.py:91 implementation: file exists; coverage not verified
agent_connector_sdk/vendor_extractors/odoo.py:74 implementation: file exists; coverage not verified
agent_connector_sdk/vendor_extractors/social.py:160 implementation: file exists; coverage not verified
requirements.md documentation: file exists; coverage not verified
SDK-CENTRALIZED-CAPABILITIESSDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilities404/404SPECIFIEDspec.md documentation: file exists; coverage not verified
tests/httpsupport/test_pagination_next_url.py test: file exists; coverage not verified
tests/httpsupport/test_rate_limiter.py test: file exists; coverage not verified

Landed counts LANDED and VERIFIED requirements. Done counts VERIFIED requirements only.

The spec state comes from the spec status file only.

U

Spec architecture

repository / component packages

Packages group specs by repository and declared component. Unassigned means no component was declared. Code links do not prove coverage. Mermaid source.

Knuckles-Team/scion-sdk / Connector registration (1)
Knuckles-Team/scion-sdk / Connector registration (1)SDK-CONNECTOR-CONTROL
SDK-CONNECTOR-CONTROL: source plan diagrams (Mermaid)
flowchart LR
  S[SDK source census and owner bindings] --> E[Public environment_declarations]
  E --> D[SDK declaration rows and receipt]
  D --> H[Planned Arbora manifest composer]
  A[Separate AU declaration producer] --> H
  H --> V[Host condition resolution and validation]
  V --> L[Launcher before listeners or children]
flowchart LR
  S["Pinned connector sources"] --> I["SDK loader census"]
  I --> G["SDK served parity gate"]
  G --> O["Source server fixture"]
  G --> P["Declared Python registration"]
  P --> D["Existing authorization and dispatch"]
  D --> B["Controlled connector backend"]
  O --> E["Independent parity receipt"]
  B --> E
Knuckles-Team/scion-sdk / Source ingestion (1)
Knuckles-Team/scion-sdk / Source ingestion (1)SDK-SOURCE-INGEST
SDK-SOURCE-INGEST: source plan diagrams (Mermaid)
flowchart LR
    Caller[Authenticated caller] --> Registry[Connector tool registration]
    Registry --> Dispatch[SDK dispatch_async]
    Dispatch --> Source[Connector source method]
    Source --> Backend[Database / node / local file / enterprise API]
    Runner[connector-sync worker] --> Adapter[Certified SourceAdapter]
    Adapter --> Source
    Adapter --> Sync[sync_stream receipt validation]
    Sync --> EG[Generated SourceIngest]
    EG --> Progress[Durable checkpoint]
    Progress --> Runner
Knuckles-Team/scion-sdk / Unassigned (7)

SDK-CENTRALIZED-CAPABILITIES: no plan diagram declared.

SDK-FINANCE-SOURCES: no plan diagram declared.

SDK-GOVERNED-WRITEBACK: no plan diagram declared.

SDK-OBSERVABILITY-FEEDS: no plan diagram declared.

SDK-QUALITY-RELEASE: no plan diagram declared.

SDK-REPOSITORY-TRANSPORT: no plan diagram declared.

SDK-SCM: no plan diagram declared.

R

Spec relationships

declared dependencies and references

Depends on means a declared prerequisite. Extends and references do not imply prerequisite order. Shared code never creates dependencies. External targets are source declarations, not verified delivery.

Knuckles-Team/scion-sdk / Connector registration
SpecRelationshipTargetEvidence
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

depends onArbora host contractKnuckles-Team/arbora: external declaration; not verified; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

referencesARBORA-FLEET-R036Knuckles-Team/arbora: external declaration; not verified; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

referencesARBORA-FLEET-R038Knuckles-Team/arbora: external declaration; not verified; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

referencesEG-FEDERATED-QUERY-R073.2Knuckles-Team/epistemic-graph: external declaration; not verified; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

referencesEG-TYPED-PACKS-R104Knuckles-Team/epistemic-graph: external declaration; not verified; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

depends onSDK-CONNECTOR-CONTROL-R016Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

depends onSDK-CONNECTOR-CONTROL-R020Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

depends onSDK-CONNECTOR-CONTROL-R026Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

depends onSDK-CONNECTOR-CONTROL-R026.1Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

depends onSDK-CONNECTOR-CONTROL-R029Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

depends onSDK-CONNECTOR-CONTROL-R032Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

referencesSDK-CONNECTOR-CONTROL-R014.17Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

referencesSDK-CONNECTOR-CONTROL-R019Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

referencesSDK-CONNECTOR-CONTROL-R040Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

referencesSDK-CONNECTOR-CONTROL-R041Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

referencesSDK-CONNECTOR-CONTROL-R042Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

referencesSDK-CONNECTOR-CONTROL-R043Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

referencesSDK-CONNECTOR-CONTROL-R044Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
SDK-CONNECTOR-CONTROL

Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md

referencesSDK-CONNECTOR-CONTROL-R067Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md
Knuckles-Team/scion-sdk / Source ingestion
SpecRelationshipTargetEvidence
SDK-SOURCE-INGEST

Unparsed reference declaration: no research-paper derivation is claimed for these six contracts.; source: specs/SDK-SOURCE-INGEST/plan.md

Unparsed reference declaration: no research-paper derivation is claimed for this contract.; source: specs/SDK-SOURCE-INGEST/plan.md

Unparsed reference declaration: the source motivates ordered per-channel backends and observed status.; source: specs/SDK-SOURCE-INGEST/plan.md

depends onApproved query executionKnuckles-Team/epistemic-graph: external declaration; not verified; source: specs/SDK-SOURCE-INGEST/plan.md
SDK-SOURCE-INGEST

Unparsed reference declaration: no research-paper derivation is claimed for these six contracts.; source: specs/SDK-SOURCE-INGEST/plan.md

Unparsed reference declaration: no research-paper derivation is claimed for this contract.; source: specs/SDK-SOURCE-INGEST/plan.md

Unparsed reference declaration: the source motivates ordered per-channel backends and observed status.; source: specs/SDK-SOURCE-INGEST/plan.md

depends onEG-FEDERATED-QUERY-R085Knuckles-Team/epistemic-graph: external declaration; not verified; source: specs/SDK-SOURCE-INGEST/plan.md
SDK-SOURCE-INGEST

Unparsed reference declaration: no research-paper derivation is claimed for these six contracts.; source: specs/SDK-SOURCE-INGEST/plan.md

Unparsed reference declaration: no research-paper derivation is claimed for this contract.; source: specs/SDK-SOURCE-INGEST/plan.md

Unparsed reference declaration: the source motivates ordered per-channel backends and observed status.; source: specs/SDK-SOURCE-INGEST/plan.md

depends onSource ingestion authorityKnuckles-Team/epistemic-graph: external declaration; not verified; source: specs/SDK-SOURCE-INGEST/plan.md
SDK-SOURCE-INGEST

Unparsed reference declaration: no research-paper derivation is claimed for these six contracts.; source: specs/SDK-SOURCE-INGEST/plan.md

Unparsed reference declaration: no research-paper derivation is claimed for this contract.; source: specs/SDK-SOURCE-INGEST/plan.md

Unparsed reference declaration: the source motivates ordered per-channel backends and observed status.; source: specs/SDK-SOURCE-INGEST/plan.md

depends onSDK-CONNECTOR-CONTROL-R021Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-SOURCE-INGEST/plan.md
SDK-SOURCE-INGEST

Unparsed reference declaration: no research-paper derivation is claimed for these six contracts.; source: specs/SDK-SOURCE-INGEST/plan.md

Unparsed reference declaration: no research-paper derivation is claimed for this contract.; source: specs/SDK-SOURCE-INGEST/plan.md

Unparsed reference declaration: the source motivates ordered per-channel backends and observed status.; source: specs/SDK-SOURCE-INGEST/plan.md

depends onSDK-GOVERNED-WRITEBACK-R001Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-SOURCE-INGEST/plan.md
Knuckles-Team/scion-sdk / Unassigned
SpecRelationshipTargetEvidence
SDK-CENTRALIZED-CAPABILITIESNo relationships declared; dependencies unknown
SDK-FINANCE-SOURCESNo relationships declared; dependencies unknown
SDK-GOVERNED-WRITEBACK

Unparsed reference declaration: [RFC 8785](https://www.rfc-editor.org/rfc/rfc8785) defines canonical JSON;; source: specs/SDK-GOVERNED-WRITEBACK/plan.md

referencesRFC 8785Unresolved: unresolved; source: specs/SDK-GOVERNED-WRITEBACK/plan.md
SDK-OBSERVABILITY-FEEDSNo relationships declared; dependencies unknown
SDK-QUALITY-RELEASENo relationships declared; dependencies unknown
SDK-REPOSITORY-TRANSPORTNo relationships declared; dependencies unknown
SDK-SCMNo relationships declared; dependencies unknown
G

Open issues and pull requests

open at capture

Issues

0 open at capture.

    Pull Requests

    0 open at capture.

      The build reads GitHub one time. This page makes no live API requests.

      J

      Record inventory

      644 records

      Each status file gives one spec row. Each requirement gives one more row. A record without a valid state shows INVALID. Expand a Definition to read the canonical requirement and verification text.

      All documented records (644 rows)
      ID / sourceKindParentStateCommit / test evidence
      SDK-CONNECTOR-CONTROL
      SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publication
      specNoneSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R001
      Pack retries reuse one key
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDdcc7d285ccc9
      tests/test_contracts_and_sink.py:511
      SDK-CONNECTOR-CONTROL-R002
      Contract pin travels as a claim attribute, not recomputed downstream
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Contract pin travels as a claim attribute, not recomputed downstream.** The SDK computes the contract pin. It normalizes tool input and output schemas through manifest/tool_schema.py. It passes the pin to the graph service as a claim attribute. The graph service stores that value. It does not recompute the SDK's schema normalization. | Conformance tests asserting the pin calculation lives in the SDK and that a stored claim attribute matches the SDK-computed value unchanged.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDdcc7d285ccc9
      tests/test_artifacts_discovery.py:102
      SDK-CONNECTOR-CONTROL-R003
      Canonical output-schema digest on every certified tool pin
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLLANDED0f826d4ca6db
      93afc6b075df
      SDK-CONNECTOR-CONTROL-R004
      Contract-pin verification owned by the SDK's own test kit
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Contract-pin verification owned by the SDK's own test kit.** The SDK's own conformance test kit computes and checks the contract pin from its tool schema normalization. That normalization is SDK-specific logic, and the graph service cannot reproduce it independently. | A conformance suite that recomputes the contract pin from a sample manifest and asserts it matches the certified value.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDdcc7d285ccc9
      tests/test_artifacts_discovery.py:111
      SDK-CONNECTOR-CONTROL-R005
      Pack publisher and source submission use generated graph-client types
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED584fb45cdf24
      602215e2ddd8
      tests/test_contracts_and_sink.py:54
      tests/test_mcp_native_primitives.py:47
      tests/test_mcp_native_primitives.py:78
      SDK-CONNECTOR-CONTROL-R006
      Decision-service proposals for tool choice and triage stay observational
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED077a14c9f3d3
      0f826d4ca6db
      91801315ccaf
      daeb199f91c0
      fad5328aee62
      tests/test_decide_consumers.py:158
      SDK-CONNECTOR-CONTROL-R007
      Fleet-wide re-certification yields nonempty schema fingerprints
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIED0f826d4ca6db
      93afc6b075df
      SDK-CONNECTOR-CONTROL-R008
      Closed, canonical pack annotation map across the connector fleet
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Closed, canonical pack annotation map across the connector fleet.** Every connector pack entry carries a closed, canonical annotation map. The map holds capability names, input and output schema digests, modality, and bounded cost and latency estimates with units. A missing estimate is recorded as unknown, never zero. | Conformance tests that validate the annotation map's types and units and assert a semantic annotation change shifts the pack digest.
      requirementSDK-CONNECTOR-CONTROLVERIFIED077a14c9f3d3
      e444b35a4c21
      fad5328aee62
      tests/test_artifacts_discovery.py:350
      tests/test_artifacts_discovery.py:367
      tests/test_artifacts_discovery.py:383
      SDK-CONNECTOR-CONTROL-R009
      Connector batch A-E migrates fully onto the SDK client
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLLANDED5e1bd9257555
      7a38ee433346
      d3617301012c
      SDK-CONNECTOR-CONTROL-R010
      Connector batch F-J migrates fully onto the SDK client
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLLANDED5e1bd9257555
      7a38ee433346
      SDK-CONNECTOR-CONTROL-R011
      Connector batch K-O migrates fully onto the SDK client
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Connector batch K-O migrates fully onto the SDK client.** Packages in batch K-O use agent_connector_sdk for server construction, configuration, exceptions, and transport security. They replace prior agent_utilities imports and call the generated EG client for ingestion. | An import scan and test run cover each package in the K-O batch. They confirm that no agent_utilities import remains. Ingestion runs through the EG client.
      requirementSDK-CONNECTOR-CONTROLLANDED5e1bd9257555
      7a38ee433346
      SDK-CONNECTOR-CONTROL-R012
      Connector batch P-S migrates fully onto the SDK client
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Connector batch P-S migrates fully onto the SDK client.** Connector packages in the P-S range import agent_connector_sdk modules for server construction, configuration, exceptions, and transport security. This includes the repository-manager package's own agent_utilities imports. These packages call the generated EG client instead of a local ingestion helper. | An import scan and test run cover each package in the P-S batch. They confirm that no agent_utilities import remains. Ingestion runs through the EG client.
      requirementSDK-CONNECTOR-CONTROLLANDED5e1bd9257555
      7a38ee433346
      SDK-CONNECTOR-CONTROL-R013
      Connector batch T-Z migrates fully onto the SDK client
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLLANDED5e1bd9257555
      7a38ee433346
      SDK-CONNECTOR-CONTROL-R014
      SDK fully supersedes the duplicated connector toolkit
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **SDK fully supersedes the duplicated connector toolkit.** The duplicated connector toolkit kept elsewhere covers the server factory, action dispatch, concurrency, transport security, credentials and related helpers. Once every connector package imports the SDK's equivalents, that toolkit becomes safe to delete. No compatibility alias is retained. Rollup: delivered once the fleet-wide census (R014.1) reports every connector migrated. | Tests confirm that the SDK modules fully replace each listed toolkit area. A cross-repository import scan shows that no connector still depends on the superseded implementation.
      requirementSDK-CONNECTOR-CONTROLSPECIFIED5e1bd9257555
      SDK-CONNECTOR-CONTROL-R014.1
      One reusable cross-repository import-scan call site
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED077a14c9f3d3
      ab73ea5005a0
      fad5328aee62
      tests/test_fleet_migration_scan.py:90
      SDK-CONNECTOR-CONTROL-R015
      SDK is sole owner of connector source lifecycle and certification
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED061f9b58abb2
      077a14c9f3d3
      5e1bd9257555
      9cec9cea7d37
      fad5328aee62
      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
      SDK-CONNECTOR-CONTROL-R015.1
      A duplicate-definition scan for the manifest/certify surface
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED061f9b58abb2
      077a14c9f3d3
      9cec9cea7d37
      fad5328aee62
      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
      SDK-CONNECTOR-CONTROL-R016
      Connector base settings live in the SDK's own config module
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED584fb45cdf24
      602215e2ddd8
      tests/test_foundation.py:139
      SDK-CONNECTOR-CONTROL-R017
      Every connector uses the shared TLS profile, no bare verify bypass
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDfad5328aee62
      tests/test_tls_profiles.py:200
      SDK-CONNECTOR-CONTROL-R018
      SDK source and test suite build cleanly from a fresh checkout
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLLANDEDb0c376748245
      SDK-CONNECTOR-CONTROL-R019
      Host servers register ontology resources without duplicate skills or prompts
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Host servers register ontology resources without duplicate skills or prompts.** `ontology_resources` and `register_ontology_resources` build resources from one ontology directory. These are `ontology://<connector>/<file>.ttl` and `shapes://<connector>/<file>.ttl`. `register_connector_content` reuses the same builder. A missing directory yields no resources. | MCP client tests list and read the resources. They prove that no prompt registers and that a missing directory yields an empty result.
      requirementSDK-CONNECTOR-CONTROLVERIFIED045ba48df230
      077a14c9f3d3
      3ddd773fb6dc
      434185d3a820
      8f36880f39a7
      tests/test_connector_hooks.py:108
      tests/test_connector_hooks.py:121
      tests/test_connector_hooks.py:133
      tests/test_connector_hooks.py:139
      tests/test_connector_hooks.py:160
      SDK-CONNECTOR-CONTROL-R019.1
      The SDK runs the connector server from its declared identity
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **The SDK runs the connector server from its declared identity.** `agent_connector_sdk.run()` and the `agent_connector_sdk.cli:serve` console target resolve the `agent_connector_sdk.connector` entry point to a `Connector` value. The value holds the client class, the client factory, the tool module, the instructions, extra registrations and the offered transports. It also holds `tool_prefix`, `verbose_targets`, `verbose_register`, `result_coercer` and `action_dispatch`, which `run()` forwards to the tool surface. `run()` and `build_server()` name the server by the fleet name. They set its version from package metadata. They serve skills, prompts, ontology, shapes and `connector://resources` through `register_connector_content`. They register the tool surface, add the middleware and parse the transport and authentication flags. They print the standard banner, serve the chosen transport and refuse an unknown one. A connector package holds no bootstrap function, no health route, no transport dispatch and no banner. Its `__main__` module calls `run()` and nothing else. | `tests/test_connector_run.py` builds a fixture connector from its declaration. It lists the tools, skills, prompts, ontology and `connector://resources`. It reads the metadata version from the server. It serves stdio, streamable-http and sse, and refuses an unknown transport. `run()` with no argument serves the calling package.
      requirementSDK-CONNECTOR-CONTROLVERIFIED8f36880f39a7
      aa58c5dd6858
      tests/test_connector_run.py:104
      tests/test_connector_run.py:113
      tests/test_connector_run.py:126
      tests/test_connector_run.py:132
      tests/test_connector_run.py:189
      SDK-CONNECTOR-CONTROL-R019.2
      A connector declares its bootstrap extras as typed hooks
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **A connector declares its bootstrap extras as typed hooks.** `Connector` carries every registration a connector server makes beyond the plain bootstrap, and `build_server` applies each one through fastmcp's own API. `tool_registry` holds explicit `(tag, toggle_setting, registrar)` entries and replaces the `tools` module. Declaring both raises `ValueError`. `action_tools` holds entries in the same form. The SDK splits their action-routed tools into one typed tool per action, with or without a client. `action_prefixes` maps a routed tool name to the prefix of its per-action tools, which defaults to the routed name. `inline_tools` holds tool functions or fastmcp `Tool` values, added with `FastMCP.add_tool` before the tool surface. `routes` holds `Route(path, handler, methods, name)` values, added with `FastMCP.custom_route`. `Route` raises `ValueError` for `/health`, `/ready` or a relative path. `build_server` raises it for a repeated path and method. `readiness` is an async probe that returns `Readiness(ready, detail)`. The SDK serves it at `/ready` with 200 when ready and 503 otherwise. For a probe exception the SDK answers 503 with only the exception class name. `/health` stays liveness-only. Each `extra_registrations` callable receives a `RegistrationContext`. It holds the server, the fleet name, the metadata version and the parsed settings. It also holds the declared client factory and the authentication provider. `content_root` names a package-relative directory that holds the content kinds. An absolute or escaping path raises `ValueError`. The connector name in content URIs stays the declared fleet name (`SDK-CONNECTOR-CONTROL-R071`). | `tests/test_connector_hooks.py` builds the fixture connector with each hook and lists the served tools. It checks the explicit tags and toggles, the per-action tools and the inline tools. It requests the declared route and `/ready` for a ready, a down and a failing probe. No probe message leaks. It reads the registration context fields and the content from `content_root`. The SDK refuses each malformed declaration. `tests/test_ingest_strategies.py` runs `ingest_registration` with a context.
      requirementSDK-CONNECTOR-CONTROLVERIFIED434185d3a820
      f5707824fa51
      tests/test_connector_hooks.py:108
      tests/test_connector_hooks.py:121
      tests/test_connector_hooks.py:133
      tests/test_connector_hooks.py:139
      tests/test_connector_hooks.py:160
      SDK-CONNECTOR-CONTROL-R019.3
      Container config mounts are declared once with an SDK schema
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Container config mounts are declared once with an SDK schema.** A connector that reads a reference-only configuration directory declares the mount in `pyproject.toml`. The table is `[[tool.pipelines.container.config_mounts]]` with `source` and `target`. The shared container renderer reads that declaration. `agent_connector_sdk.config_mounts.CONFIG_MOUNTS_SCHEMA` is the field's JSON Schema. `config_mounts(pyproject)` returns `ConfigMount(source, target)` values. Every config mount is a read-only bind mount. `source` is an absolute host path or one `${VAR}` compose interpolation. `target` is a normalized container directory under `/etc`. An unknown key, an escaping path or a repeated target raises `ConfigMountError`. The conformance plugin runs the `config_mounts` check for every connector repository. | `tests/test_connector_hooks.py` parses interpolated and absolute sources and refuses each malformed or unsafe entry. It reads the schema's required keys. It fails the conformance check for a mount on `/`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED434185d3a820
      f5707824fa51
      tests/test_connector_hooks.py:310
      tests/test_connector_hooks.py:327
      tests/test_connector_hooks.py:348
      tests/test_connector_hooks.py:357
      SDK-CONNECTOR-CONTROL-R020
      One tool per API operation is the default
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **One tool per API operation is the default.** `register_tool_surface` registers one MCP tool for each public operation of the client class. The client class is client_cls with get_client, plus each verbose_targets entry. register_method_tools builds each tool. The tool name is `<prefix>_<operation>` in stable snake_case. The prefix is tool_prefix, else the service name without its `-mcp`, `-agent`, `-api` or `-server` suffix. The input schema keeps required and optional fields apart. It comes from the OpenAPI operation manifest when the connector ships one. Otherwise it comes from the client method signature and type hints. The description comes from the manifest summary or the docstring. The HTTP verb sets the annotations. GET sets readOnlyHint=true. DELETE sets destructiveHint=true. PUT and DELETE set idempotentHint=true. Every non-GET verb sets readOnlyHint=false. The SDK splits each registrar tool that routes an `action` string into one typed `<tool>_<action>` tool. It skips an action that a per-operation tool already serves (SDK-CONNECTOR-CONTROL-R020.2). action_dispatch=True keeps those tools whole as an opt-in compatibility mode, off by default. Registrar tools that do not wrap client methods keep registering, such as ingest and GraphQL tools. No MCP_TOOL_MODE or other environment mode selects the surface. | A test serves a sample client with GET, POST, PUT and DELETE operations through tools/list. It checks the tool count, names, typed required fields, descriptions and annotations. Tests prove the default splits action-dispatch tools and the opt-in keeps them. Tests prove manifest entries give the schema, name, description and verb. A source scan rejects MCP_TOOL_MODE reads.
      requirementSDK-CONNECTOR-CONTROLSPECIFIED0bc459ee7335
      38b66f26f32a
      6ccbf6e01d12
      c9a2cf7b23cc
      d3617301012c
      tests/test_action_split.py:39
      tests/test_action_split.py:44
      tests/test_operation_tools.py:100
      tests/test_operation_tools.py:130
      tests/test_operation_tools.py:141
      SDK-CONNECTOR-CONTROL-R021
      Connector ontologies declare access contracts for virtual reads
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED0a10559775ea
      fad5328aee62
      tests/test_access_contract.py:55
      SDK-CONNECTOR-CONTROL-R022
      The pack builder scopes `owl:imports` to the pack
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED077a14c9f3d3
      e6b835dcad49
      fad5328aee62
      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
      SDK-CONNECTOR-CONTROL-R023
      A prompt with a required argument becomes a template
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED1cbd6f28d13d
      713782e7901c
      b9a9652c0135
      tests/test_prompt_content.py:130
      tests/test_prompt_content.py:28
      SDK-CONNECTOR-CONTROL-R024
      A prompt the server rejects for its bound placeholder still captures as a template
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED713782e7901c
      830a844c6c51
      tests/test_prompt_content.py:166
      tests/test_prompt_content.py:209
      tests/test_prompt_content.py:225
      SDK-CONNECTOR-CONTROL-R025
      SDK provides identity-scoped resource entitlement resolution
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **SDK provides identity-scoped resource entitlement resolution.** `agent_connector_sdk.entitlements` resolves which backend resources (kube contexts, SSH hosts, database connections, mounts) a caller's roles and groups entitle. This generalizes "what may I do" to "what may I reach" over `agent_connector_sdk.identity.ActorContext`. A connector then auto-loads only the resources its caller's identity grants without importing `agent_utilities.security.entitlements`. A caller with no matching capability resolves an empty set. An unauthenticated or tenant-less actor is rejected before any resource catalog is exposed. | Tests use a fake available-resource catalog. A namespaced capability, a namespace wildcard, a bare zero-config capability, and a super-capability (`admin`/`system`) each resolve the documented entitled subset. No matching capability resolves empty. An unauthenticated or tenant-less actor raises before a catalog is read.
      requirementSDK-CONNECTOR-CONTROLVERIFIED5a476653a386
      e266bf988bb9
      tests/test_entitlements.py:34
      tests/test_entitlements.py:39
      tests/test_entitlements.py:44
      tests/test_entitlements.py:52
      tests/test_entitlements.py:61
      SDK-CONNECTOR-CONTROL-R020.1
      JSON tag-loader migration inventory and parity gate
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **JSON tag-loader migration inventory and parity gate.** Define `JsonTagLoaderEntry` in `agent_connector_sdk/testing/fleet_migration.py` with package, source revision, loader path, JSON path, JSON digest and target operation mapping. Each mapping binds source and target operation IDs with identical input/output schemas, tags and authorization. Classify registration as operation, explicit callback or action dispatch. Extend `scan_many_packages` to cover existing loader paths and compare parity before replacement. Preserve R026 and R032 opt-ins. | Tests prove loader inventory completeness, parity comparison rejects schema/tag differences, and explicit opt-ins survive migration. Served acceptance exercises the scanner and migration gate.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R020.2
      A split action never duplicates or collides with an operation tool
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **A split action never duplicates or collides with an operation tool.** The splitter skips a split `<tool>_<action>` tool when a served tool already has its name. It also skips the split when the action resolves to a served client method. An action resolves through its own name, a branch that returns one operation's result, or an action-table entry. A table entry may be a handler lambda that calls one operation. A router that hands its `action` to one served client's method lookup is covered by that client's operation tools. The splitter reads actions from an `action` Literal, enum, branch tests, quoted names or a `One of: a, b` list in the description. The per-operation tool wins. The splitter logs each skip at debug level. The registration report `action_split_report(mcp)` names the tool that serves every action. Such a collision never raises. Only two different tools with one name raise. Every action stays served, by its split tool or by the operation tool it duplicates. | Tests reproduce a branch collision, a closure-table collision and a reused router name. In each case the operation tool serves the action and the report holds a `covered` entry. Tests cover dict-literal, selector and lambda table actions and a listed description. A generic router over one served client is covered by that client's tools. A computed branch stays split. A registrar tool that takes an operation tool's name still raises.
      requirementSDK-CONNECTOR-CONTROLVERIFIED3fd28fa8b883
      ae05eddb4588
      tests/test_action_split_dedupe.py:128
      tests/test_action_split_dedupe.py:191
      tests/test_action_split_dedupe.py:263
      tests/test_action_split_dedupe.py:290
      tests/test_action_split_dedupe.py:342
      SDK-CONNECTOR-CONTROL-R020.3
      A router tool is split, never dropped
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **A router tool is split, never dropped.** `register_tool_surface` must split each action-routed tool into one `<tool>_<action>` tool per listed action. `action_split_report` in `agent_connector_sdk/mcp/action_split.py:100` must list each split. A router whose actions cannot be listed keeps its router tool and records the reason. No served tool disappears. | `tests/test_action_split.py` registers a router with three actions and a router with unlistable actions. It asserts three split tools, one kept router and no lost tool.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R020.5
      A split tool inherits its parent's risk class and never gains read-only by inheritance
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **A split tool inherits its parent's risk class and never gains read-only by inheritance.** `agent_connector_sdk/mcp/action_split.py` offers `split_tool_classes`, `unclassified_tools` and `assert_tools_classified`. A connector declares risk classes by tool name, or per action. Each split `<tool>_<action>` takes its own action's declared class, else its parent's single class. A parent class the connector lists as read-only passes only to an action whose verb reads. A mutating or unrecognised action stays unclassified. A tool with no declared parent stays unclassified. `assert_tools_classified` raises `Unclassified MCP tools prevent startup` for any remaining name. | `tests/test_action_split.py` splits a router and asserts parent and per-action inheritance. A purge action never inherits a read class and still raises. A stray tool is unclassified.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDd0d04813b42e
      tests/test_action_split.py:113
      tests/test_action_split.py:63
      tests/test_action_split.py:79
      tests/test_action_split.py:93
      SDK-CONNECTOR-CONTROL-R020.4
      A successor release keeps every predecessor tool
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **A successor release keeps every predecessor tool.** A connector release must serve each tool of its predecessor release. Each old tool must keep its name or split into `<tool>_<action>` tools. Otherwise a per-operation tool must cover the same API call. An action-dispatch tool that remains served fails this rule. The release check must refuse a release with a lost tool. | `tests/test_successor_tool_parity.py` compares a predecessor and a successor tool list. It asserts kept, split and covered outcomes, and a refusal for one lost tool.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R026
      SDK derives one typed tool per client method
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **SDK derives one typed tool per client method.** `agent_connector_sdk.mcp.method_tools.register_method_tools` registers one directly invocable tool per public method of a client class. Each tool name is `<prefix>_<method>`, with no doubled prefix. Its tags are `operation`, `granular`, `gated` and the domain of the method's defining class. The input schema mirrors the method's typed parameters. A bare `**kwargs` method uses the fields of the one Pydantic model it validates through. A method with no typed surface takes one `params_json` object. The server records that tool as untyped debt. The verb comes from the manifest, an `__http_method__` attribute, or a `VERB /path` docstring line. Otherwise it is the single verb the method body sends. Without a verb, name tokens classify the operation. A result coercer makes every result JSON-ready. A destructive method needs a live caller's confirmation before it dispatches. DELETE methods and destructive names are destructive. The SDK excludes a method that only a base-infrastructure class defines, such as auth, pagination or retry. A name collision fails registration. | Tests prove one tool per public method across two domain classes, with no doubled prefix. Tests prove typed arguments reach the client. Tests prove the SDK excludes base-infrastructure methods. Tests prove a destructive method asks for confirmation before it calls the client. A declined or unattended confirmation never dispatches. Tests prove the SDK awaits an asynchronous `get_client`. Tests prove a bare `**kwargs` method falls back visibly, and a collision fails.
      requirementSDK-CONNECTOR-CONTROLVERIFIED38b66f26f32a
      851969957034
      c529b133556b
      c65195236264
      d3617301012c
      tests/test_mcp_confirmation_roundtrip.py:134
      tests/test_mcp_confirmation_roundtrip.py:178
      tests/test_mcp_confirmation_roundtrip.py:198
      tests/test_mcp_confirmation_roundtrip.py:36
      tests/test_method_tools.py:27
      SDK-CONNECTOR-CONTROL-R027
      SDK resolves the selected provider-runtime profile for a multi-backend connector
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED284fb12a19ed
      584fb45cdf24
      602215e2ddd8
      9e35fb93e960
      tests/test_provider_runtime.py:27
      tests/test_provider_runtime.py:35
      tests/test_provider_runtime.py:42
      tests/test_provider_runtime.py:48
      SDK-CONNECTOR-CONTROL-R028
      SDK's governed HTTP client controls egress with named escape hatches, not ad hoc trust
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **SDK's governed HTTP client controls egress with named escape hatches, not ad hoc trust.** `create_http_client` builds an outbound client. It checks each destination against an SSRF policy. It takes explicit `pin_egress`, `allowed_private_hosts` and `allow_loopback` parameters. `pinned_egress_transport` returns a transport pinned to a resolved, policy-checked address. A later DNS change cannot redirect an approved request. Connectors that call self-hosted or private-network targets use it (vaultwarden-mcp, searxng-api, pulselink-mcp). Rollup: delivered once R028.1 to R028.4 are specified, wired, and verified. | Unit tests assert three cases. A disallowed private or loopback destination is rejected by default. An explicitly allowed private host or loopback passes. A pinned transport reuses the resolved address and does not resolve DNS again.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R028.1
      A standalone, typed SSRF egress-destination check and pinned-address transport
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED284fb12a19ed
      54744d32428a
      tests/test_http_egress.py:17
      tests/test_http_egress.py:24
      tests/test_http_egress.py:31
      tests/test_http_egress.py:36
      tests/test_http_egress.py:41
      SDK-CONNECTOR-CONTROL-R028.2
      `create_http_client` wires the SSRF egress policy into construction
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **`create_http_client` wires the SSRF egress policy into construction.** `create_http_client` takes `pin_egress`, `allowed_private_hosts`, and `allow_loopback` parameters, builds one `EgressOptions` from them, calls `check_egress_destination` (R028.1) with it before opening a connection, and uses `pinned_egress_transport` to hold the resolved address, for connectors that call self-hosted or private-network targets (vaultwarden-mcp, searxng-api, pulselink-mcp). | Integration tests building a client against a disallowed private destination and asserting construction is rejected before any request, and a client against an explicitly allowed private host completing a request through the pinned transport.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R028.3
      API-key identity stays header-based
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **API-key identity stays header-based.** A shared API-key client's HTTPX cookie jar is not an identity source. Do not add cookie-session auth or store a provider session. For sync and async governed clients, strip outbound Cookie after HTTPX injects jar cookies. Strip inbound Set-Cookie before HTTPX receives each response, for all statuses. Preserve configured auth, destination, TLS, redirect, retry, status, body, and Location behavior. Scope the change only to ApiKeyAuth; preserve other auth strategies. | Local MockTransport tests cover explicit and seeded cookies. They cover login, redirect, error and success responses. They cover concurrent calls through one client. A Bearer control checks other auth. Downstream served acceptance pins the immutable SDK revision and checks login/finishOAuth followed by protected calls from two MCP clients.
      requirementSDK-CONNECTOR-CONTROLVERIFIED64bcd00be5ef
      c991698b90bf
      d791b8cb5ca5
      e40ff88a9bbc
      tests/test_http_client.py:351
      tests/test_http_client.py:373
      tests/test_http_client.py:395
      tests/test_http_client.py:426
      SDK-CONNECTOR-CONTROL-R028.4
      A connector declares its outbound auth in one line and the SDK builds the governed client
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **A connector declares its outbound auth in one line and the SDK builds the governed client.** `agent_connector_sdk.auth.declare` offers `Bearer`, `ApiKey`, `Basic`, `ClientCredentials`, `RefreshToken`, `SessionLogin` and `NoAuth`. A declaration names a secret by `env=` or by an `env://` or `openbao://` `ref=`; it never holds a value. `client_factory` and `open_client` resolve the named TLS profile (CA bundle, client certificate, minimum version) and return one governed client. When delegation is on, they exchange the caller token instead. A static credential re-reads its secret after a 401 and retries once only when the value changed. An OAuth token refreshes 30 seconds before expiry and re-mints once on a 401. A rotated refresh token stays in memory. A session login logs in again once on a 401 or 403. A repr, log record or error never shows a secret. An incomplete declaration raises `AuthConfigurationError`. | Stub-server tests per scheme cover header shapes, the 401 retry after rotation, no retry when the secret is unchanged, refresh before expiry, refresh-token rotation, session re-login, and a CA bundle that works only through the declared TLS name. They also cover redaction in repr, logs and errors, and typed configuration errors.
      requirementSDK-CONNECTOR-CONTROLVERIFIED19ca24046d12
      tests/test_auth_declarations.py:106
      tests/test_auth_declarations.py:114
      tests/test_auth_declarations.py:145
      tests/test_auth_declarations.py:165
      tests/test_auth_declarations.py:192
      SDK-CONNECTOR-CONTROL-R029
      SDK exposes a structured configuration singleton, not only a flat `setting()` lookup
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED284fb12a19ed
      7aad77a0eb66
      tests/test_agent_config.py:17
      tests/test_agent_config.py:34
      tests/test_agent_config.py:50
      SDK-CONNECTOR-CONTROL-R030
      SDK provides GraphQL introspection context helpers for connector tools
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED284fb12a19ed
      e4ffa1a49677
      f5de79afc1e0
      tests/test_graphql_client.py:20
      tests/test_mcp_graphql_context.py:67
      tests/test_mcp_graphql_context.py:74
      tests/test_mcp_graphql_context.py:90
      SDK-CONNECTOR-CONTROL-R030.1
      SDK owns the one GraphQL client for connectors
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **SDK owns the one GraphQL client for connectors.** The SDK class `GraphQLClient` lives in `agent_connector_sdk.transports.graphql`. It takes the endpoint and one auth header strategy: bearer, token or basic. It applies the TLS profile from `resolve_tls_profile` and a request timeout. It retries HTTP 429 and 5xx with exponential backoff, up to a fixed bound. It offers a sync and an async call, opt-in partial data, and bounded cursor pagination. A failure raises `GraphQLExecutionError`, which names only the exception class. Its payload matches `graphql_failure_payload` and holds no server error text, request or credential. The `graphql` extra installs the protocol client and the query-language core. A connector declares GraphQL through this extra only. The R030 introspection helpers stay. | Tests in `tests/test_graphql_client.py` cover each auth header and the retry bound. They cover retry on 429 and 503, and no retry on 400 or a query error. They cover the redacted payload, partial data, pagination over nodes and edges, and the async call. They check the TLS, timeout and schema flags on the built client.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDf5de79afc1e0
      tests/test_graphql_client.py:20
      SDK-CONNECTOR-CONTROL-R031
      SDK's client-credentials token provider accepts a literal client secret, matching the signature connectors already call
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **SDK's client-credentials token provider accepts a literal client secret, matching the signature connectors already call.** `ClientCredentialsTokenProvider` accepts a literal `client_secret` string argument, in addition to any credential-reference form, so a connector migrating from its prior client-credentials helper keeps the same construction call shape, for connectors using OAuth2 client-credentials against an identity provider (keycloak-agent, searxng-api). | A signature-compatibility test constructing `ClientCredentialsTokenProvider` with a literal `client_secret` string and asserting a token fetch call is made with that secret, plus a negative test asserting the secret is never logged or serialized.
      requirementSDK-CONNECTOR-CONTROLVERIFIED284fb12a19ed
      eed8dd9a117e
      tests/test_client_credentials_literal_secret.py:29
      tests/test_client_credentials_literal_secret.py:49
      tests/test_client_credentials_literal_secret.py:68
      SDK-CONNECTOR-CONTROL-R032
      Explicit additional registration
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Explicit additional registration.** register_tool_surface must invoke an explicit verbose_register callback after the operation and registrar tools register. No callback means no additional surface. Additional names must not replace or duplicate registered names. | Tests must prove callback-last ordering, availability of the added tools, and collision refusal.
      requirementSDK-CONNECTOR-CONTROLVERIFIED38b66f26f32a
      629ef53c29f0
      bac65b612ced
      tests/test_tool_surface.py:124
      tests/test_tool_surface.py:147
      SDK-CONNECTOR-CONTROL-R033
      SDK's governed HTTP layer provides a `safe_post_json` helper with the same private-host allowance as its GET path
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED629ef53c29f0
      67802528f518
      bac65b612ced
      tests/test_safe_post.py:19
      tests/test_safe_post.py:29
      tests/test_safe_post.py:45
      SDK-CONNECTOR-CONTROL-R034
      SDK provides shared library-file-path resolution and cross-process file locking utilities
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED2c4e8ae0f172
      629ef53c29f0
      bac65b612ced
      tests/test_library_state.py:14
      tests/test_library_state.py:24
      SDK-CONNECTOR-CONTROL-R035
      SDK provides a CredentialProvider/SecretsClient abstraction for connectors, not only a credential-reference string
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **SDK provides a CredentialProvider/SecretsClient abstraction for connectors, not only a credential-reference string.** A `CredentialProvider` (or `SecretsClient`) resolves an `env://` or `openbao://` reference to its secret value on demand, scoped to the requesting connector's identity, and never returns or logs the resolved value in a reusable form, for connectors with multiple credential-bearing calls per request (vaultwarden-mcp, keycloak-agent, repository-manager). `default_credential_resolver()` resolves `env://` references from the process environment when the host sets no OpenBao token reference. With `OPENBAO_ADDR` set and `OPENBAO_TOKEN_REF` unset or blank, it adds no OpenBao resolver and never raises for an `env://` reference. A non-`env://` `OPENBAO_TOKEN_REF` stays a refusal. | Unit tests asserting resolution for both reference schemes, a denial for a reference outside the caller's scope, a logging-inspection test asserting no resolved secret value appears in any log record, and a test that `env://` resolves with `OPENBAO_ADDR` set and `OPENBAO_TOKEN_REF` unset or blank.
      requirementSDK-CONNECTOR-CONTROLSPECIFIED39fdd8f06293
      629ef53c29f0
      9374f2c50a6e
      bac65b612ced
      tests/test_credentials.py:124
      SDK-CONNECTOR-CONTROL-R035.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R035.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R035.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R035.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R035.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R035.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R036
      SDK's identity-scoped resource entitlements cover the backend-resource catalogs these connectors manage
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`.
      requirementSDK-CONNECTOR-CONTROLLANDED629ef53c29f0
      bac65b612ced
      SDK-CONNECTOR-CONTROL-R037
      erpnext supplier and purchase-order operation contract is typed and recorded (unblocks `EG-CQ-XSRC-R002.7`)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **erpnext supplier and purchase-order operation contract is typed and recorded (unblocks `EG-CQ-XSRC-R002.7`).** CONFIRMED-exists: `agents/erpnext-agent/erpnext_agent/ontology/access_contracts.ttl` already declares `erp:Supplier` and `erp:PurchaseOrder` on operation `erpnext_agent_resource`, and `kg_ingest.py` reads both doctypes. This row types the contract. Pin the field list (supplier name, status, key field). Publish one recorded response fixture in `agents/erpnext-agent/tests/fixtures/`. | `tests/test_access_contracts.py` in erpnext-agent parses the ttl through `parse_access_contracts` and asserts the Supplier and PurchaseOrder fields match the recorded fixture.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R038
      uptime service-health operation contract is declared (unblocks `EG-CQ-XSRC-R003.4`)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R039
      container-manager deployed-workload operation contract is declared (unblocks `EG-CQ-XSRC-R003.5`)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **container-manager deployed-workload operation contract is declared (unblocks `EG-CQ-XSRC-R003.5`).** Operation exists (CONFIRMED-exists): `cm_k8s_workloads` has actions such as `list_pods` in `agents/container-manager-mcp/container_manager_mcp/mcp/mcp_k8s_workloads.py`. `kg_ingest.py` has `ingest_deployments`. No `access_contracts.ttl` exists. Add one with a contract for the deployed workload class that carries its image reference. Add a recorded response fixture. | `tests/test_access_contracts.py` in container-manager-mcp parses the ttl and asserts the workload name, status and image fields against the recorded fixture.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R040
      SDK declares an MCP source's access contract (unblocks `EG-CQ-CONN-R067.1`)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R041
      SDK declares an A2A source's access contract (unblocks `EG-CQ-CONN-R067.2`)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R042
      SDK declares an API (REST) source's access contract (unblocks `EG-CQ-CONN-R067.3`)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R043
      SDK declares a GraphQL source's access contract (unblocks `EG-CQ-CONN-R067.4`)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R044
      SDK declares a virtual-graph access contract
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R045
      Tool contract facts for the run loop and the tool-subset decision
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIED3ddd773fb6dc
      910c1a8859ca
      f06d1600bb90
      tests/test_schema_disclosure_artifacts.py:22
      tests/test_schema_disclosure_provider.py:64
      SDK-CONNECTOR-CONTROL-R045.1
      Type `ToolContractFacts`
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R045.2
      Close the `SideEffect` set
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R045.3
      Compute `schema_tokens` from the existing canonical tool body
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R045.4
      Default to the safe value when a connector declares nothing
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R045.5
      Map MCP annotations as self-declared hints
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R045.6
      Read `side_effects` from `eg.annotations`, and gate on the generated type
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R045.7
      Reuse the destructive classification
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R045.8
      Attach the facts to the captured tool entry
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R045.9
      Certify that a `read_only` tool wrote nothing in its recorded fixture
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R045.10
      Refuse an unproven self-declared `read_only`
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R045.11
      Certify checks the live declared tools and writes no file
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Certify checks the live declared tools and writes no file.** `connector-certify` reads `connector://resources`, lists the tools and checks each declared preset tool against its live definition. It writes no manifest and no pin file. | `tests/test_single_declaration.py::test_certify_reads_the_declaration_and_checks_tools_live`
      requirementSDK-CONNECTOR-CONTROLVERIFIED92d09c57796b
      tests/test_single_declaration.py:169
      SDK-CONNECTOR-CONTROL-R046
      Browser authorization-code flow with PKCE as a reusable auth manager
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R046.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R046.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R046.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R046.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R046.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R046.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R047
      Agent-card discovery from the standard well-known path
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R047.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R047.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R047.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R047.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R047.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Each discovered card adds `fetched_at`, `etag` and the source URL to its `A2AAgentCard` entity. A delegation decision can then cite the card version it used. | `tests/test_a2a_discovery.py::test_entity_carries_fetch_provenance`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R047.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** The entry point is the `a2a` vendor extractor run, `extract`. The integration test serves a card from a fake host and runs the extractor with a base URL. It observes the card and skill entities in the change set. | `tests/test_vendor_extractors_archer_infra_a2a.py::test_extract_discovers_card_from_base_url`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R048
      Agent-readable text form in tool contracts
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R048.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R048.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R048.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R048.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R048.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R048.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R049
      Budget-limited, approval-gated payment challenge handling
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R049.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R049.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R049.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R049.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R049.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R049.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R050
      Caller-scoped tool context and ordered progress
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Caller-scoped tool context and ordered progress.** Every registered MCP tool receives a typed context for state, redacted logging and incremental progress. Destructive operations consume EG approval decisions through authenticated Arbora serving and governed effect contracts. | Served acceptance CC-50 through CC-55 covers both registration paths.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R050.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R050.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R050.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R050.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R050.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R050.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R050.7
      Visual observation transport integration
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Visual observation transport integration.** The SDK transports visual observations and provenance between ordered steps within a single run. Observations carry source operation ID, frame provenance, capture time, schema revision and content reference. The next authorized step reads the same-run committed reference only. EG owns durable state storage and retention; AU owns next-step conditioning; SDK request_cache remains request-scoped only. | Integration tests prove ordered same-run observation reuse, cross-run isolation, and stale-reference refusal. Served multi-step test observes matching observation IDs and content at source, state, and consumer.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R007.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R007.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R007.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R007.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R007.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R007.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R055
      Arbora producer-consumer handoff for AU disclosure-set gate
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Arbora producer-consumer handoff for AU disclosure-set gate.** The SDK provisions the real served producer/consumer handoff for disclosed and undisclosed tools. Arbora authorized find (registry/discovery; intent find) returns tool facts. EG Decide ToolRelevance consumes them at stat_decide.rs:134. AU execute_agent dispatches through factory.py:973 DisclosureSet. The current AU plan acknowledges this ownership; exact served cross-owner positive/negative acceptance proves the handoff. The real Arbora find and EG ToolRelevance must be wired and tested. | Served acceptance tests bind Arbora find, EG ToolRelevance, and AU DisclosureSet gate. Prove that disclosed tools pass the gate and undisclosed tools are refused before reaching the tool-call gate.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R056
      EG prompt and SDK tool producer-specific compatibility decisions and receipts
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **EG prompt and SDK tool producer-specific compatibility decisions and receipts.** The SDK tool schema authority and EG prompt authority must decide nested incremental producer compatibility and evolution together. Declared contract-version pin equality and source-ingest drift classification do not define that contract alone. Both producers must emit compatibility decision receipts bound to host admission. | Served acceptance tests bind EG prompt version, SDK tool schema, and compatibility decision receipts at schema-fingerprint/FleetOnboarding.onboard. Prove version conflicts and breaking changes are refused.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R057
      Replaceable search-grounding provider independent of reasoning model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Replaceable search-grounding provider independent of reasoning model.** The search grounding provider is independently selected from the reasoning model and bound to a committed route. Unavailable committed provider must refuse rather than substitute. EG produces the committed provider binding. SDK/Arbora consumer must execute that exact provider. | Served tests prove provider/model independence. Zero alternate-provider calls occur; unavailable committed provider is refused. Test provider selection, model selection, and exact execution of the committed provider.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R058
      Request durability boundary correction for durable versus ephemeral storage
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Request durability boundary correction for durable versus ephemeral storage.** The literal universal in-memory-default request conflicts with current explicit durability boundaries. Identify the exact deployment/profile default and explicit ephemeral versus durable behavior. Embedded transport/no external service and configurable served mode are distinct requirements. Preserve sync/redb authority and test no-external-service embedded startup plus configured served mode. | Tests prove embedded/in-process client defaults, explicit ephemeral mode, and explicit durable mode with external storage. No conflation of transport selection with durability class.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R059
      EG capability-to-existing-method operation bindings for analogy search, blast radius, memory recall, ontology validation and design
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **EG capability-to-existing-method operation bindings for analogy search, blast radius, memory recall, ontology validation and design.** Existing EG public capabilities map to existing EG methods without new engine code. AU legacy action mappings identify the five capability-to-EG-method-to-served-operation bindings. The reuse constraint preserves R023 transport and refusal obligations. | Served tests bind analogy search, blast radius, memory recall, ontology validation and design operations through existing EG methods. Prove each operation is served end-to-end.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R060
      Native desktop operation port and no-cursor/no-focus invariant
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Native desktop operation port and no-cursor/no-focus invariant.** Arbora grants host execution. SDK native desktop adapter handles background click/type/verification without cursor or focus capture. Grant-bound refusal is enforced. The operation port defines the boundary. | Served tests prove background operation under granted sandbox scope, verify grant-bound refusal for out-of-scope requests, and test click/type/verification without cursor capture.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R650
      Connector manifest release integrity
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Connector manifest release integrity.** `agent_connector_sdk.manifest.integrity` computes the canonical, serialization-order-invariant hash of a compiled ontology graph and of a complete connector manifest (signature field excluded). It signs and verifies releases with Ed25519 under an injected, versioned secret reference (`vault://` or `secret://`; an `env://` reference is refused for publication). It reads and writes the lock file that pins signer public keys. A signer whose key disagrees with the locks requires a declared rotation. The rotation ledger path comes from `CONNECTOR_RELEASE_ROTATION_RECORD`. Graph hashing needs the optional `integrity` extra; the base install stays light. | `tests/test_manifest_integrity.py` covers lock-key agreement, rotation, canonical base64url refusal and the env-reference refusal.
      requirementSDK-CONNECTOR-CONTROLLANDEDad6af590e63c
      SDK-CONNECTOR-CONTROL-R051
      Sandbox allocation producer for AU:29
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Sandbox allocation producer for AU:29.** The SDK provisions and reconciles admitted sandbox requests through one typed port. Arbora owns host admission and the certified support matrix. Source trace: `AU:29 49df21c60c947240d4f02b1424b1de29183f10a69c76bd885f19d13e7237061c`. | Served producer/consumer acceptance and independent readback; runtime remains unclaimed.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R051.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Define SandboxProvisioner. It consumes Arbora ProvisionRequest. It returns ProvisionResult with allocation ID, actual instances, observed image/platform, state, timestamps, and provider receipt. | Validate all identity fields and actual instance IDs.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R051.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R051.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** The SDK does not yet provide the planned `agent_connector_sdk.ports.sandbox.SandboxProvisioner` producer or adapter binding. Existing generic SDK entry points are `agent_connector_sdk/mcp/server.py:88` (`create_mcp_server`), `agent_connector_sdk/mcp/tool_surface.py:121` (`register_tool_surface`), `agent_connector_sdk/mcp/method_tools.py:150` (`register_method_tools`), and `agent_connector_sdk/mcp/action_dispatch.py:194` (`dispatch_async`). Route AU sandbox access through Arbora `arbora/api/ops/agents.py:97` (`agents.run`) and `arbora/control_plane/runs/admission.py:108` (`NativeWorkItemAdmissionProtocol`) / `arbora/control_plane/runs/capacity.py:53` (`CapacityLedger`); return the SDK adapter receipt to Arbora. The sandbox-specific producer/wiring remains absent. | Exercise the served route, adapter, and result consumer.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R051.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R051.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R051.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** Future served tests enter Arbora agents.run. Use a disposable certified adapter. Observe instances and independent readback. Test unsupported profiles and response loss without duplicates. | The served acceptance proves actual allocation and zero duplicate effects.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R052
      Visual observation transport for AU:35
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R052.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R052.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R052.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R052.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R052.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R052.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R053
      SDK environment declaration export
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **SDK environment declaration export.** The SDK must export value-free declarations for all SDK-owned environment reads. Arbora owns composition, configuration validation and startup admission. AU owns its separate declarations. | All six children and the served host acceptance must pass. SDK declarations alone cannot establish complete host coverage.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R053.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** The SDK must define immutable EnvironmentDeclaration rows in agent_connector_sdk.config. Match the declaration fields in the Arbora R010.2 manifest: name, component, source_revision, type, required_when, default, sensitive and call_sites. Use component agent-connector-sdk and an immutable package source revision. Types and constraints must follow the host contract. Defaults must be declared safe constants or null, never resolved settings or credential references. Sort call_sites by repository-relative path and line. Sort rows by component and name. The SDK must not define another HostEnvironmentManifest schema. | Planned `tests/test_environment_manifest_served.py::test_manifest_rejects_duplicate_literal_and_unknown_entries`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R053.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** Add the public environment_declarations operation with keyword arguments source_revision and dynamic_bindings. Return an immutable EnvironmentDeclarationExport containing declarations and a census receipt. The export must read no live environment values and perform no network or subprocess work. Census every tracked SDK setting call, direct environment read and inherited-environment forwarding path. Resolve literal names and module constants. Combine compatible call sites under one declaration; reject conflicting declarations. Dynamic names require explicit EnvironmentReadBinding entries matching source call site, owning distribution and exact input name. Bind required condition, type, default and sensitivity to the declared owner contract. Unclassified reads and unresolved forwarding dependencies make the export unavailable; a wildcard cannot establish completeness. | Planned `tests/test_environment_manifest_served.py::test_missing_and_undeclared_inputs_block_startup`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R053.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** Add environment_declarations and its types to the existing public config module at agent_connector_sdk/config.py:35. Existing setting at config.py:75 and AgentConfig are reader binding points, not declaration producers. The export is absent today. The planned Arbora R010.2 composer must import this public operation and wrap its declaration rows in the host version-1 manifest. R010.4 resolves enabled conditions; R010.3 validates before runtime._build_server in arbora/mcp_server/server.py. The host composer and AU declaration producer remain unimplemented prerequisites. SDK export failure must never become an empty passing fragment. | Planned `tests/test_environment_manifest_served.py::test_host_startup_consumes_sdk_declaration_set`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R053.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** Refuse export for absent or mismatched source revision, unknown components, conflicting duplicate names, unresolved dynamic reads and unsupported schema constraints. Refuse unsafe defaults, unresolved condition bindings and sensitive literal values. The host must reject missing enabled-component exports before opening listeners or starting children. Disabled unrelated components must not require credentials. Report component, input name or call site and typed reason only. Never report resolved values, credential references or configuration file contents. Preserve existing setting coercion and precedence; this definition grants no host admission authority to the SDK. | Planned `tests/test_environment_manifest_served.py::test_refusal_diagnostics_redact_secret_values`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R053.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Emit an EnvironmentDeclarationReceipt containing outcome, component, immutable source_revision and schema_version. Include declaration_count, declaration_digest, census_digest and unresolved_call_sites. Canonicalize UTF-8 JSON with sorted keys and no insignificant whitespace. Hash the sorted declarations and source census separately. Record source file digests and reviewed dynamic bindings without live values. An independent reader must reproduce both digests from pinned inputs. The host separately records its composed manifest digest, selected conditions and startup decision. An SDK receipt must not claim that the host admitted startup. Available exports require outcome available and no unresolved call sites. Refusal must raise EnvironmentDeclarationError carrying only a receipt, never a declaration fragment. Refusal receipts use outcome refused and null for unavailable revisions or digests. | Planned `tests/test_environment_manifest_served.py::test_readback_matches_manifest_and_decision`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R053.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** Planned tests/test_environment_manifest_served.py must call the public SDK export from the installed package. Compare its declarations with an independently extracted complete source census. Test every dynamic reader family with valid, absent and conflicting bindings. Shuffle source enumeration and binding order; require identical declarations and digests. Enter the real Arbora launcher entry point with the SDK fragment and controlled remaining owner manifests. Valid settings must serve a probe. Invalid, missing or unresolved declarations must open zero listeners and start zero children. A helper-only check cannot establish launcher ordering. Missing host or AU producer implementations keep served acceptance pending. | Planned `tests/test_environment_manifest_served.py::test_served_startup_accepts_declared_and_refuses_invalid`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R054
      JSON tag-loader migration
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **JSON tag-loader migration.** The SDK must inventory JSON tag loaders and bind each loader to declared Python registration. Migration must preserve operations, schemas, tags, dispatch, authorization and typed refusals. One tool per API operation is the default under R020; R026 derives those tools and R032 adds explicit callbacks. | All six children require the same pinned inventory and served comparison. Planned tests do not establish runtime delivery.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R054.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Define immutable JsonTagLoaderEntry in `agent_connector_sdk/testing/fleet_migration.py`. Fields must include package, public_repository, source_revision, loader_path, json_path, json_sha256 and python_target. Each entry must include operation_mappings sorted by source_operation_id. Each mapping must bind source_operation_id, target_operation_id and target_registration. It must pair source and target input/output schemas, tags, authorization_ref and refusal_cases. Reject duplicate source IDs, duplicate targets and missing pairs. registration_kind must equal operation, explicit_callback or action_dispatch. Paths must be repository-relative. Revisions and JSON bytes must have immutable digests. Sort entries by package, loader_path and json_path. Reject duplicate keys and incomplete fields. | Planned `tests/test_json_tag_loader_migration_served.py::test_inventory_finds_every_source_loader` validates complete entries, ordering, duplicate rejection and changed source digests.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R054.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** The migration gate must scan each pinned package snapshot before replacement. List tracked Python files and JSON assets, including package data and declared startup entrypoints. Classify every registration path that reads JSON as migrated or unresolved. Dynamic paths and unreadable files remain unresolved until an explicit binding explains them. Each source operation must map to one Python operation with identical schemas, tags, authorization and refusal semantics. R020 serves one tool per operation and forbids environment mode selection. R032 preserves explicit callbacks; R026 derives the operation tools. An unexplained difference blocks replacement. | Planned `tests/test_json_tag_loader_migration_served.py::test_registered_operations_match_source_schemas` detects missing loaders, hidden dynamic paths, unmapped operations and every schema/tag difference.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R054.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** Extend `agent_connector_sdk/testing/fleet_migration.py:90` with the inventory and parity gate; retain its existing import scan. Start both source and replacement servers through `agent_connector_sdk/mcp/server.py:88`. Reuse register_tool_surface at `agent_connector_sdk/mcp/tool_surface.py:121` and register_method_tools at `agent_connector_sdk/mcp/method_tools.py:157`. Exercise dispatch_async at `agent_connector_sdk/mcp/action_dispatch.py:196`. The gate must drive tools/list and tools/call through authenticated server transport. Each connector provides its declared startup and controlled backend fixture. A direct helper call cannot establish served parity. | Planned `tests/test_json_tag_loader_migration_served.py::test_tools_list_and_call_reach_backend` enters the served wire methods and observes the controlled backend.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R054.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** The gate must reject unknown loaders, unresolved bindings, malformed inventory, operation mismatches and unexplained schema or tag differences. Denied, malformed, unknown and unsupported served calls must preserve their typed refusal and make zero backend calls. Destructive calls must retain SDK-CONNECTOR-CONTROL-R026.1 confirmation on both dispatch paths. A declined, cancelled or invalid confirmation must make zero backend calls. Missing old-server evidence blocks parity; it must not become an empty passing baseline. | Planned `tests/test_json_tag_loader_migration_served.py::test_denied_malformed_and_unknown_calls_have_zero_effects` covers each refusal on both source and replacement servers.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R054.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Emit a canonical UTF-8 JSON receipt with sorted keys and no insignificant whitespace. Bind ordered inventory digest, package revisions, SDK revision, protocol version, fixture seed and source/replacement server receipts. Record operation, schema, tag, registration-kind, authorization and refusal comparisons. Include backend call counts and unresolved entries. Record references rather than credentials or secret values. An independent reader must reconstruct every comparison from the pinned inputs and receipt. | Planned `tests/test_json_tag_loader_migration_served.py::test_parity_receipt_reconstructs_from_digests` repeats the fixture and compares canonical receipts after excluding declared observation timestamps.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R054.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** Planned `tests/test_json_tag_loader_migration_served.py::test_default_and_opt_ins_preserve_dispatch_parity` must enter served tools/list and tools/call wire methods. Run every inventory operation against isolated source and replacement fixtures. Compare normalized catalogs, output schemas, results, backend calls and refusal codes. Exercise the operation default, explicit_callback and action_dispatch independently. Cover denied, malformed, unknown, unsupported, collision and schema-mismatch cases. Each permitted fixture call must reach its backend once. Each refused call must reach its backend zero times. Repeat destructive acceptance and decline on both existing dispatch paths. | The served transport, registration, authorization, dispatch and controlled backend must all participate. Helper-only or import-scan-only checks cannot satisfy this row.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R061
      Shared typed provider interface for host OS service and log operations
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Shared typed provider interface for host OS service and log operations.** A single interface maps service start, stop, restart, and log-read operations to each supported operating system. Native tooling operations on Linux, Windows and macOS are enumerated with unified parameter and return schemas. Parity acceptance criteria document equivalence across platforms. | Rows R055.1 to R055.6 bind.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R061.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Define immutable ProviderPlatformInterface with fields service_name, operation, parameters, return_schema, native_command and documented_refusals. List supported platforms: linux, windows, macos. Each operation maps to its native tooling (systemctl, sc.exe, launchctl). Parity criteria list semantic equivalence across platforms. | Validate all platform values. Reject unknown platforms or operations.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R061.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** Provide one read-only registry of platform interfaces keyed by (service, operation, platform). Return the matching native command and documented refusals. An unsupported platform or operation returns zero matches. A missing interface is not an error. | List operations query all platforms or filter by requested set.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R061.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** Add the interface definition and registry to agent_connector_sdk.host.provider_platform at module root. Arbora host-management consumer imports platform_interface and queries the registry. Connect the registry to existing service lifecycle calls in agent_connector_sdk.host modules. | Served query returns the correct platform-native command for documented cases.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R061.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** Unsupported platform, unknown operation or missing registry entry returns zero results. Refuse undeclared refusal types in operation metadata. Never include secret material in refusal reasons. | Unsupported platform returns empty, never error.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R061.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Record queried service, operation, platform and matched interface digest. Bind parity criteria revision and documented native command. Record cached vs. recomputed registry state. Join Arbora host lifecycle receipts. | Independent registry audit reproduces all parity checksums.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R061.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** `tests/test_provider_platform_interface_served.py::test_host_lifecycle_queries_platform_native_commands` enters the Arbora host-management consumer entry point. Observe service start/stop/restart and log-read commands for each platform. Verify native commands match documented parity criteria and match field schemas. Exercise unsupported platform and missing operation with zero effects. | Served verification calls the real host consumer and observes matched platform commands.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R062
      Define minimal EG certification producer and AU orchestration consumer with identity bindings
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Define minimal EG certification producer and AU orchestration consumer with identity bindings.** EG produces final attestation decisions tied to decision request digests. AU orchestration consumes those decisions and acts on agent authorization. Existing ARBORA-FLEET-R034.7-.12 identity bindings carry tenant and actor facts. New rows link certification inputs and outputs to those bindings. | Rows R056.1 to R056.6 bind.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R062.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Define immutable CertificationAttestation with fields decision_request_digest, outcome, decision_timestamp, decision_reference and au_consumer_binding. Outcome values: accepted, rejected, deferred. AU consumer binding carries actor, tenant and operation scope. Include decision trace reference and optional refusal reason. | Validate outcome enum. Reject missing digests or actor identity.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R062.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** EG issues one attestation per decision request. AU consumes and acts only on accepted attestations. Deferred outcomes require retry with fresh request. A rejected outcome documents reason and rejects without retry authority. EG decision trace remains sealed from AU. AU orchestration never reissues old attestations. | Reuse produces same attestation. Retry after deferred succeeds or fails anew.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R062.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** EG producer is planned at agent_connector_sdk.certify.attestation_producer. AU consumer entry is agent_connector_sdk.au_orchestration.consume_attestation at agent_connector_sdk/au_orchestration/execution.py:112. Reuse existing identity bindings from agent_connector_sdk.identity.ActorContext. Connect AU broker receipt tracking to decision trace reference. EG tracing remains sealed. | Served AU orchestration observes decision trace reference in receipt.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R062.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** Refuse unknown outcome values, missing request digests or actor identity bindings. AU refuses accepted attestations with mismatched tenant or actor scope. EG seals its decision trace from AU refusals. Never include trace details in AU rejection output. | Missing identity refuses before AU acts.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R062.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Record decision request digest, attestation outcome, timestamp and trace reference. Record AU actor, tenant, operation and acceptance binding. Join decision reference to broker receipt. Record refusal reason and typed cause. Exclude trace details and decision internals. | AU receipt references the exact decision digest. Independent audit matches attestations.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R062.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** `tests/test_eg_certification_attestation_served.py::test_au_accepts_and_rejects_attestations` enters the real AU orchestration entry point with certified EG attestations. Observe accepted decisions permitting AU action, rejected decisions blocking action, and deferred decisions triggering retry. Verify actor and tenant bindings are checked before AU acts. A mismatched actor or tenant refuses without effect. | Served path exercises decision request, attestation issuance, AU consumption and trace sealing.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R063
      SDK and AU produce versioned environment-manifest declarations covering enabled components
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **SDK and AU produce versioned environment-manifest declarations covering enabled components.** Public SDK and AU operations export immutable EnvironmentDeclaration rows listing every setting, secret and indirect read their components require. Arbora composes declared sets and validates startup configuration. Declarations cover all SDK-owned and AU-owned component requirements only. | Rows R057.1 to R057.6 bind.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R063.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Define immutable EnvironmentDeclaration with fields name, component, source_revision, type, required_when, default, sensitive, call_sites and schema_version. Component is sdk or au. Source_revision is immutable source digest. Type is string, int, bool, secret_reference or enum. Call_sites is sorted list of (file, line) tuples. Default is null or a safe constant, never credential reference. | Validate all enum values. Reject credential references in defaults.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R063.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** SDK and AU each export one unversioned public operation returning immutable EnvironmentDeclarationSet with declarations and export receipt. Each declaration lists all call sites. No live environment read occurs. No network or subprocess invocation occurs. Dynamic environment reads require explicit binding entries matching source call site and input name. Unresolved or conflicting declarations block export. | Repeated calls return identical declarations.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R063.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** SDK operation is agent_connector_sdk.config.environment_declarations at agent_connector_sdk/config.py:35. AU operation is planned at agent_utilities.config.environment_declarations. Arbora composer imports both and merges rows. Reuse existing setting and environment-read call sites from agent_connector_sdk.config.py:75 and agent_utilities configuration. No new SDK or AU configuration module required. | Served Arbora composer observes both SDK and AU declaration sets.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R063.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** Refuse absent or mismatched source revision, conflicting duplicate declarations, unresolved dynamic reads, unsupported schema constraints and unsafe defaults. Never report resolved environment values or credential references in refusal output. Record component, declaration name and typed reason only. | Mismatched source revision blocks export completely.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R063.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Emit EnvironmentDeclarationExport with outcome, component_digest, source_revision and schema_version. Include declaration_count, sorted declaration digest and unresolved call-site count. Record source census digest covering all tracked reads and forwarding paths. Hash canonical UTF-8 JSON. An independent reader reproduces both digests from sealed inputs. | Reproducible digest validates declaration completeness without runtime values.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R063.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** `tests/test_environment_declaration_served.py::test_sdk_and_au_export_and_compose` calls the real SDK and AU environment_declarations operations and feeds both exports to the Arbora launcher startup validation. Observe declarations cover all tracked settings and indirect reads. Missing or conflicting declarations block startup with refusal, not partial acceptance. Verify no live environment value appears in export. | Served composer accepts valid declarations and rejects incomplete or conflicting sets.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R064
      Default vault storage and enterprise root-bundle propagation across deployed components
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Default vault storage and enterprise root-bundle propagation across deployed components.** Arbora guided deployment selects default vault storage and enterprise root certificate bundle. The bundle propagates and verifies at every touched component during startup. Certificate verification is mandatory, never bypassed. Guided setup documents the complete propagation matrix. | Rows R058.1 to R058.6 bind.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R064.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Define immutable VaultStorageConfig with fields vault_endpoint, storage_backend, and auth_mode. Define RootBundleManifest with component, bundle_digest, verification_status and deployment_revision. Each component lists verified issuer names and rejection criteria. Propagation matrix lists touched systems by component and root-bundle status. | Validate backend names and auth modes. Reject duplicate components in matrix.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R064.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** Guided deployment offers default vault endpoint and bundle location. SDK components and deployable services receive the bundle before initialization. Each component verifies every upstream peer and backend certificate chain against the bundle. Certificate verification never silences or bypasses unverified chains. Mismatch causes startup refusal. The propagation matrix must name all touched systems before deployment execution. | Once deployed, no certificate bypasses are reachable.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R064.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** Agent_connector_sdk.http.tls provides default bundle loader and verification. Agent_connector_sdk.http.egress applies verification in check_egress_destination (R028.1) and pinned_egress_transport (R028.1). Arbora launcher loads bundle at startup. Arbora guided-deployment command builds and documents the propagation matrix. Existing TLS and HTTPS client calls reuse the loaded bundle. | Served startup and certificate chain validation with the default bundle.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R064.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** Startup refuses missing vault endpoint or root bundle before any component initializes. Refusal occurs when bundle verification fails, issuer is unknown, or certificate chain is broken. Report component and verification result only. Never include certificate details or secret material in refusal. | Each refusal preserves zero startup state.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R064.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Record vault endpoint, storage backend, bundle digest and verification status per component. Record propagation matrix revision and all touched systems. Record deployment decision timestamp and bundle load source. Join Arbora deployment receipt. | Independent bundle audit reproduces digest without secret material.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R064.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** `tests/test_vault_bundle_propagation_served.py::test_guided_deployment_and_verified_startup` uses the real Arbora guided-deployment command with default vault and bundle options. Observe bundle propagation to all touched components. Verify every component verifies the bundle on startup. Try a certificate chain mismatch and verify startup refusal without partial initialization. | Served deployment command, bundle loading and chain verification exercise the full matrix.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R065
      Component health endpoint distinguishes not-configured from configured-but-unavailable. Alerts fire only for enabled components
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Component health endpoint distinguishes not-configured from configured-but-unavailable. Alerts fire only for enabled components.** Health endpoint states explicitly separate unconfigured components from degraded or failing enabled ones. Alert evaluation checks component enabled flag before issuing alert. Configuration state and alert gating are served in the host health response. | Rows R059.1 to R059.6 bind.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R065.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Define immutable ComponentHealthState with fields component_id, state, configuration_status, enabled, last_check_time and optional availability_reason. State enum: healthy, degraded, unavailable, not_configured. Configuration_status: disabled, not_initialized, initialized. Enabled is boolean. Include alert_suppression_reason when applicable. | Validate state and configuration_status enums. Reject contradictory state and configuration pairs.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R065.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** Unconfigured components report state not_configured and configuration_status not_initialized. Alerts suppress automatically for unconfigured components without alert_suppression_reason required. Configured but disabled components suppress alerts and must show disabled reason. Only enabled and initialized components trigger alerts on degraded or unavailable state. Alert evaluation checks enabled flag before alert generation. | Alerts never fire for unconfigured or disabled components.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R065.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** Agent_connector_sdk.host.component_health provides state classification and alert suppression. Agent_connector_sdk.host.messaging integrates health state into supervisor backend. Arbora /health endpoint queries component_health.list_states and applies enabled-only alert filter before evaluation. Existing messaging component definitions remain. | Served /health endpoint distinguishes all health states and alert eligibility.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R065.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** Unknown state or configuration_status values are rejected. Contradictory pairs (unavailable and disabled, not_configured and initialized) cause refusal. Alert generation refuses for unconfigured or disabled components. Missing component_id or enabled flag blocks health response. | Invalid state values block health report.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R065.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Record component_id, state, configuration_status, enabled flag and last_check_time. Record alert_suppression_reason and applicable alert evaluation decision. Join supervisor backend receipt and alert sink notification. | Health audit confirms correct suppression for all non-enabled components.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R065.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** `tests/test_component_health_served.py::test_unconfigured_and_disabled_suppress_alerts` queries the real Arbora /health endpoint with configured and unconfigured components. Observe unconfigured components report not_configured state. Observe alerts suppress for both unconfigured and disabled components. Enable a component, degrade it and verify alert fires only then. Verify alert evaluation checks enabled flag independently. | Served health endpoint and alert evaluation exercise all component states.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R066
      EG defines closed-loop load and headroom scaling proposals to Arbora with applied-state receipt
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **EG defines closed-loop load and headroom scaling proposals to Arbora with applied-state receipt.** EG provides scaled-hosting proposals based on load and headroom premises. Arbora applies the proposal and confirms accepted scaling in hosted application state. Scaling actuation loop closes when applied state is recorded and acknowledged. | Rows R060.1 to R060.6 bind.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R066.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Define the immutable ScalingProposal. Its fields are operation_id, load_premise_digest, headroom_premise_digest, proposed_instance_count, proposed_strategy and proposal_timestamp. Define AppliedScalingState with fields proposal_digest, accepted_instance_count, applied_timestamp and applied_strategy. Strategy enum: minimal, standard, burst. | Validate strategy enum. Reject missing digests or timestamps.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R066.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** EG generates one proposal per load and headroom evaluation using existing ARBORA-CAPACITY definitions. Proposal includes strategy choice. Arbora accepts or rejects the proposal. If accepted, Arbora applies the new instance count and records the applied state. The applied state digest is returned to EG. EG acknowledges receipt and closes the loop. A rejected proposal triggers no scaling. | Reuse of same premises produces identical proposal.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R066.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** EG producer is planned at agent_connector_sdk.scaling.propose_scaling. Arbora capacity consumer is arbora/control_plane/runs/capacity.py:53 (CapacityLedger.apply_proposal). Arbora returns applied state to EG loop. Reuse existing ARBORA-CAPACITY-R001 and R002 premise definitions. Connect EG decision reference to applied state receipt. | Served scaling loop observes proposal generation, acceptance and applied-state receipt.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R066.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** EG refuses proposal generation for missing or invalid premises. Arbora refuses accepted proposals with incompatible strategies or zero or negative instance counts. Refusal blocks scaling without partial application. Refused proposals permit retry with adjusted premises. Record refusal reason and typed cause. | Arbora refusal preserves current instance count.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R066.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Record proposal load_premise_digest, headroom_premise_digest and strategy. Record Arbora acceptance decision and applied instance count. Record EG acknowledgment and loop closure. Join decision reference and applied-state receipt digest. | Applied-state audit confirms proposal acceptance and instance count alignment.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R066.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** `tests/test_eg_scaling_served.py::test_closed_loop_scaling_proposal_and_application` enters the real EG scaling producer and Arbora capacity consumer. Provide test load and headroom premises. Observe proposal generation, Arbora application decision and applied-state receipt. Verify EG acknowledgment closes the loop. Try a refused proposal and verify no scaling occurs but retry is permitted. | Served path exercises proposal generation, acceptance, application and loop closure.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R026.1
      Require explicit destructive confirmation across both supported MCP eras
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **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.
      requirementSDK-CONNECTOR-CONTROLVERIFIED851969957034
      c529b133556b
      d76f26e0e5fa
      tests/test_mcp_confirmation_roundtrip.py:134
      tests/test_mcp_confirmation_roundtrip.py:178
      tests/test_mcp_confirmation_roundtrip.py:198
      tests/test_mcp_confirmation_roundtrip.py:36
      SDK-CONNECTOR-CONTROL-R026.2
      A manifest field named after a Python keyword keeps its wire name in the schema
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **A manifest field named after a Python keyword keeps its wire name in the schema.** Some manifest parameter names are Python keywords, such as `from` or `in`. Such a parameter declares a different `python_name`, such as `from_`. The generated tool declares the parameter under `python_name`. A pydantic field alias carries the wire `name`. The input schema shows `name`, and a call validates `name`. The client method receives `python_name`. | `tests/test_operation_tools.py::test_keyword_field_is_exposed_under_its_wire_name`
      requirementSDK-CONNECTOR-CONTROLVERIFIEDec63e38e9b5d
      tests/test_operation_tools.py:380
      SDK-CONNECTOR-CONTROL-R014.2
      Cross-platform advisory file locks
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Cross-platform advisory file locks.** `agent_connector_sdk.file_lock` provides `lock_exclusive`, `lock_exclusive_nb`, `lock_shared`, `lock_shared_nb` and `unlock` with POSIX `flock` and Win32 `LockFileEx` parity. A lost non-blocking acquire raises `LockUnavailable`, an `OSError`. | `tests/test_connector_runtime_from_au.py::test_r014_2_file_lock_exclusive_and_nonblocking` holds a lock, proves a second descriptor is refused, then acquires it after release.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      b1a75903b188
      tests/test_connector_runtime_from_au.py:34
      SDK-CONNECTOR-CONTROL-R014.3
      Tool version metadata
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Tool version metadata.** `agent_connector_sdk.mcp.versioning.tool_version` stamps `__agentic_version__` and a `Version:` docstring line on an async MCP tool without changing its result. | `test_r014_3_tool_version_stamps_async_tool`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      b1a75903b188
      tests/test_connector_runtime_from_au.py:53
      SDK-CONNECTOR-CONTROL-R014.4
      Reference-only CLI secrets
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Reference-only CLI secrets.** `agent_connector_sdk.credentials.runtime_references` accepts only bounded `env://`, `vault://` or `secret://` references. `env://` reads SDK configuration. The vault schemes resolve through the SDK credential resolver as `openbao://`. No error names the reference or the value. | `test_r014_4_runtime_secret_references` covers resolution, refusal, non-disclosure and the argparse action.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      b1a75903b188
      tests/test_connector_runtime_from_au.py:65
      SDK-CONNECTOR-CONTROL-R014.5
      Operator base-URL egress guard
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Operator base-URL egress guard.** `agent_connector_sdk.http.egress.validate_base_url` and `validate_base_url_resolved` refuse unsupported schemes, embedded credentials, and private, reserved or metadata addresses. They return the resolved addresses so the transport can pin them. `agent_connector_sdk.source_connectors.http_safety` is a second outbound read boundary for document sources. It reuses this classification, and it must fold into the governed client of R014.16. This row owns the capability that `SDK-SOURCE-INGEST-R801` named. | `test_r014_5_validate_base_url` covers literal and resolved refusal and loopback control.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      4f377bf3e39a
      b1a75903b188
      tests/source_connectors/test_source_connectors.py:46
      tests/test_connector_runtime_from_au.py:83
      SDK-CONNECTOR-CONTROL-R014.6
      PII sanitizer
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **PII sanitizer.** `agent_connector_sdk.privacy_pii.PiiSanitizer` redacts PII patterns from text, dictionaries and nested payloads before a connector returns or persists them. | `test_r014_6_pii_sanitizer_redacts`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      b1a75903b188
      tests/test_connector_runtime_from_au.py:104
      SDK-CONNECTOR-CONTROL-R014.7
      Connector state directories
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Connector state directories.** `agent_connector_sdk.paths` resolves `config_dir`, `data_dir`, `cache_dir`, `log_dir` and `research_dir` under XDG `agent-connectors`. Each directory has one `CONNECTOR_*_DIR` override. It holds no harness paths. | `test_r014_7_paths_honour_overrides`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      b1a75903b188
      tests/test_connector_runtime_from_au.py:111
      SDK-CONNECTOR-CONTROL-R014.8
      Delegated-token helpers
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Delegated-token helpers.** `agent_connector_sdk.auth.delegation.is_delegation_enabled` and `get_delegated_token` wrap `DelegationSettings` and `exchange_token` for the served caller. Without a caller token they raise `LoginRequiredError`. | `test_r014_8_delegation_helpers`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      b1a75903b188
      tests/test_connector_runtime_from_au.py:122
      SDK-CONNECTOR-CONTROL-R014.9
      Keyless credential sentinel
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Keyless credential sentinel.** `agent_connector_sdk.credentials.provider.NoCredential` is present and contributes no auth material. | `test_r014_9_no_credential`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      b1a75903b188
      tests/test_connector_runtime_from_au.py:131
      SDK-CONNECTOR-CONTROL-R014.10
      Class-based API client base and auth strategies
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Class-based API client base and auth strategies.** `agent_connector_sdk.http.support` provides `BaseApiClient`, `AuthHeaderInjector`, `TokenAuth`, `BasicAuth` and `QueryApiKeyAuth`. The client joins relative endpoints under its base URL and returns a `status_code`/`data`/`rate_limit` envelope. It backs off a bounded number of times on HTTP 429 and retries once after HTTP 401 when the strategy can invalidate. It maps error statuses to the SDK exception types and redacts the strategy's secrets from raised messages. TLS comes from the runtime TLS profile, and `verify`/`cert`/`proxy`/`trust_env` overrides are refused. `agent_connector_sdk.httpsupport` is a second copy of these auth strategies, with pagination, rate-limit parsing and redaction. It must fold into `http.support` and the existing `http/pagination.py`, `redaction.py` and `retry.py`. This row owns the capability that `SDK-SOURCE-INGEST-R802` named. | `tests/test_connector_runtime_adds.py::test_r014_10_token_auth_envelope_and_error_mapping` and `test_r014_10_auth_strategies_and_retries` cover the header token, envelope, error mapping, redaction, destructive gate, 429 backoff, 401 refresh and TLS-override refusal.
      requirementSDK-CONNECTOR-CONTROLVERIFIED4f377bf3e39a
      afc686a65836
      tests/httpsupport/test_httpsupport.py:27
      tests/httpsupport/test_pagination.py:17
      tests/test_connector_runtime_adds.py:50
      tests/test_connector_runtime_adds.py:79
      SDK-CONNECTOR-CONTROL-R014.11
      Browser OAuth (PKCE) login
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Browser OAuth (PKCE) login.** `agent_connector_sdk.auth.browser` provides `generate_pkce` (S256) and `BaseBrowserAuthManager`. The manager runs the loopback authorization-code flow and refreshes tokens inside a skew window. It keeps tokens in a `TokenStore`. The default `FileTokenStore` writes owner-only (0600) files under the connector config directory. A configured direct API key takes precedence. The callback handler never logs the request line. | `tests/test_connector_runtime_adds.py::test_r014_11_browser_auth_pkce_store_and_refresh` covers the S256 challenge, the 0600 store, the proactive refresh and the API-key override.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDafc686a65836
      tests/test_connector_runtime_adds.py:129
      SDK-CONNECTOR-CONTROL-R014.12
      GraphQL schema discovery over a connector executor
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **GraphQL schema discovery over a connector executor.** `agent_connector_sdk.mcp.graphql.ctx_graphql_list_types` and `ctx_graphql_get_type_details` send standard introspection queries through a sync or async connector executor and return its response. A failure returns a fixed `operation_failed` payload with the exception class and a correlation id. It never returns the exception message. | `tests/test_connector_runtime_adds.py::test_r014_12_graphql_helpers_sync_async_and_failure`.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDafc686a65836
      tests/test_connector_runtime_adds.py:179
      SDK-CONNECTOR-CONTROL-R014.13
      Per-record external access descriptor
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Per-record external access descriptor.** `agent_connector_sdk.contracts.ExternalAccess` carries `is_public`, `user_emails`, `group_ids`, `read_roles` and `markings` for one record and refuses unknown fields. `ExternalAccess.public()` is world-readable. `default_external_access()` is quarantined under `CONNECTOR_UNCONFIGURED_MARKING` and is never public. | `tests/test_connector_runtime_adds.py::test_r014_13_external_access_descriptor`.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDafc686a65836
      tests/test_connector_runtime_adds.py:205
      SDK-CONNECTOR-CONTROL-R014.14
      Connector env-var drift check
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Connector env-var drift check.** `agent_connector_sdk.mcp.env_drift` diffs the variables a connector declares in `.env.example`, `mcp_config*.json` and `docker/*compose*.yml` against the variables its code reads. The read set covers literal reads, aliased constants, `Field(alias=...)`, `register_<tag>_tools` toggles, compose substitutions and declared dynamic families. It reports `DEAD` and `UNDOCUMENTED` findings. `scripts/` reads and the SDK's own reads only suppress `DEAD`. `python -m agent_connector_sdk.mcp.env_drift --check` exits 1 on drift. The module imports nothing from agent-utilities. | `tests/test_connector_runtime_adds.py::test_r014_14_env_drift_against_declarations` builds a connector with each read and declaration kind and checks the exact findings and the `--check` exit.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDafc686a65836
      tests/test_connector_runtime_adds.py:222
      SDK-CONNECTOR-CONTROL-R014.15
      External ACL sync into ingested documents
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **External ACL sync into ingested documents.** `agent_connector_sdk.adapters.document_sources.access_properties` maps a source's `ExternalAccess` onto record properties: `access_public`, `access_read_roles` (`group:<id>`, `user:<email>` and provider-neutral roles) and `access_markings`. Every document a document source emits carries them. A source without a configured ACL emits the quarantined descriptor, never public. | `tests/test_document_sources.py::test_connector_ingestion_syncs_external_acl`.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDed3b2f7f83d5
      tests/test_document_sources.py:216
      SDK-CONNECTOR-CONTROL-R014.16
      DNS-pinned egress on the governed client
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **DNS-pinned egress on the governed client.** `HttpClientOptions` carries `pin_egress`, `allowed_private_hosts`, `allow_loopback` and `verify_pinned_peer`, with the semantics of the agent-utilities `create_http_client`. With `pin_egress`, each request is resolved once and refused unless every address is public, or the host is named in `allowed_private_hosts` and resolves only into RFC 1918, RFC 6598, ULA or loopback space. The client dials only the pinned address, keeps `Host` and SNI, refuses plaintext public egress, URL credentials and a peer that differs from the pin. The allow-list takes exact hostnames only and needs `pin_egress`; a proxy is refused. | `tests/test_http_dns_pinned_egress.py` proves each refusal and the pinned request for sync and async clients.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      tests/test_http_dns_pinned_egress.py:103
      tests/test_http_dns_pinned_egress.py:115
      tests/test_http_dns_pinned_egress.py:122
      tests/test_http_dns_pinned_egress.py:135
      tests/test_http_dns_pinned_egress.py:143
      SDK-CONNECTOR-CONTROL-R014.17
      MCP-free base install
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **MCP-free base install.** `pip install agent-connector-sdk` carries the protocol types (`mcp-types`) and no MCP runtime: `fastmcp` and `mcp` are the `mcp` extra, installed as `agent-connector-sdk[mcp]`. The ports, pack builder, runner, sinks, delegation helpers and `exposure` import without the extra. `agent_connector_sdk.mcp` and `agent_connector_sdk.transports.mcp` raise `ImportError` that names `agent-connector-sdk[mcp]`. Connectors depend on `agent-connector-sdk[mcp]`. | `tests/test_base_install_mcp_free.py` blocks `fastmcp` and `mcp` and imports the base modules, then the refusal for the MCP surface.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      81ea3e4bedac
      tests/test_base_install_mcp_free.py:35
      tests/test_base_install_mcp_free.py:58
      tests/test_base_install_mcp_free.py:75
      SDK-CONNECTOR-CONTROL-R014.18
      Default fail-closed served security profile
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Default fail-closed served security profile.** `agent_connector_sdk.mcp.served_security.apply_served_security_profile` ports the agent-utilities served profile into the `mcp` extra. For `streamable-http` and `sse` it refuses to start without a constructed auth provider and a token audience, and installs `ServedSecurityMiddleware`. The middleware refuses every MCP request without a verified subject, a tenant claim (`tenant_id`, `tenant`, `org_id`, `tid`, `org`), an active session and every scope in `CONNECTOR_REQUIRED_SCOPES`. `create_mcp_server` applies it to every server. The only opt-out is an explicit `ServedSecurityOverride` with a written reason, logged at warning level. `stdio` is untouched. Static tokens may carry `tenant_id`. | `tests/test_served_security_and_provider_profile.py::test_r014_18_*` prove each refusal, the default application by `create_mcp_server`, the logged override and the static tenant claim.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      81ea3e4bedac
      tests/test_served_security_and_provider_profile.py:116
      tests/test_served_security_and_provider_profile.py:140
      tests/test_served_security_and_provider_profile.py:150
      tests/test_served_security_and_provider_profile.py:42
      tests/test_served_security_and_provider_profile.py:50
      SDK-CONNECTOR-CONTROL-R014.19
      Selected-provider credential profile
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Selected-provider credential profile.** `agent_connector_sdk.credentials.provider_profile` parses `PROVIDER_CONFIGS` into reference-only profiles (`env://`, `vault://`, `secret://` only; unique keys; bounded; an endpoint requires one TLS selector). `resolve_selected_provider_profile` resolves the profile named by `AGENT_PROVIDER_PROFILE` into an in-memory endpoint (HTTPS, or loopback HTTP), credentials, selectors and TLS profile. `close` drops the values and removes materialized TLS files. Failures are stable codes that never carry a reference or value. | `tests/test_served_security_and_provider_profile.py::test_r014_19_*` cover resolution and close, each failure code and each invalid document.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      tests/test_served_security_and_provider_profile.py:185
      tests/test_served_security_and_provider_profile.py:211
      tests/test_served_security_and_provider_profile.py:258
      tests/test_served_security_and_provider_profile.py:264
      SDK-CONNECTOR-CONTROL-R014.20
      Plugin entry-point groups use the SDK namespace
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Plugin entry-point groups use the SDK namespace.** Every entry-point group the SDK declares, reads or documents is `agent_connector_sdk.<x>`: `source_adapters`, `artifact_kinds`, `transports`, `sinks` and `skill_providers`. No `agent_utilities.<x>_providers` group remains. | `tests/test_served_security_and_provider_profile.py::test_r014_20_entry_point_groups_use_the_sdk_namespace` checks the declared groups and scans the package for the old names.
      requirementSDK-CONNECTOR-CONTROLVERIFIED15b099abed9d
      tests/test_served_security_and_provider_profile.py:273
      SDK-CONNECTOR-CONTROL-R014.22
      External embedding API client
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **External embedding API client.** `agent_connector_sdk.embeddings.create_embedding_model` returns a cached `EmbeddingModel`. It serves a connector that keeps vectors in its own external store. The endpoint is a `/v1/embeddings` wire endpoint or a local model server (`openai` or `ollama` provider). `EMBEDDING_*` settings select provider, model, base URL, key reference, private hosts and plaintext. The key is a runtime secret reference sent as bearer auth. Requests are DNS-pinned, never redirected, and errors never echo the response body. Content epistemic-graph ingests is embedded by epistemic-graph. | `tests/test_embeddings.py`.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDda3aa0ab05a4
      tests/test_embeddings.py:17
      SDK-CONNECTOR-CONTROL-R014.23
      Typed epistemic-graph compute adapter
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Typed epistemic-graph compute adapter.** `agent_connector_sdk.compute.EngineCompute` gives a connector one typed path to epistemic-graph compute. `select_algorithms` reads, by SPARQL over the connector's imported ontology pack, the algorithms bound to an analysis (`appliesAlgorithm`) and the served method (`servedBy`, `servedOp`) for each. `run` calls that method. An unbound analysis, a missing client method, or `METHOD_NOT_YET_SERVED` raises `MethodNotServedError`; the connector keeps no local re-implementation. `connect_compute` connects from `EngineSettings` with only `compute:finance` and `sparql:read` scopes. | `tests/test_compute_adapter.py`.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDda3aa0ab05a4
      tests/test_compute_adapter.py:19
      SDK-CONNECTOR-CONTROL-R014.24
      Engine audience from the environment
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Engine audience from the environment.** `EngineSettings.from_settings` reads the token audience from `EPISTEMIC_GRAPH_AUDIENCE`. The default is `epistemic-graph`. `verified_context` signs that audience into its claims. A deployed engine can then expect another audience, such as `agent-services`. | `tests/test_compute_adapter.py::test_r014_24_audience_from_environment`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED16cb53774404
      tests/test_compute_adapter.py:128
      SDK-CONNECTOR-CONTROL-R014.25
      SDK-consumed env vars are never drift
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **SDK-consumed env vars are never drift.** `agent_connector_sdk.tls.selection` exports `SDK_CONSUMED_ENV` (the global TLS profile and CA settings) and `SDK_CONSUMED_ENV_PATTERNS` (the per-service `<SERVICE>_TLS_PROFILE`, `<SERVICE>_TLS_PROFILE_REF` and `<SERVICE>_<TLS setting>` names), both derived from the settings the TLS selection reads. `env_drift` never reports a declared variable in that set as `DEAD`, so a connector may declare them in `.env.example` without reading them in its own code. | `tests/test_connector_runtime_adds.py::test_r014_25_sdk_consumed_env_not_dead` declares the TLS profile variables for a connector that reads none and checks no finding, and checks a non-SDK variable is still `DEAD`.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDeb0b3b299f31
      tests/test_connector_runtime_adds.py:269
      SDK-CONNECTOR-CONTROL-R014.26
      Server parser settings are never drift
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Server parser settings are never drift.** `agent_connector_sdk.mcp.parser` exports `PARSER_ENV`, the settings behind its flag defaults, such as `MCP_ALLOWED_HOSTS` and `MCP_TRUSTED_PROXY_CIDRS`. `env_drift.SDK_CONSUMED_ENV` includes them. A connector may declare them without reading them in its own code. | `tests/test_connector_runtime_adds.py::test_r014_26_parser_settings_not_dead` declares parser settings for a connector that reads none and checks no finding.
      requirementSDK-CONNECTOR-CONTROLVERIFIED682810f22bdd
      tests/test_connector_runtime_adds.py:286
      SDK-CONNECTOR-CONTROL-R068
      Each connector serves its seed graph and contract resources for first connect (rollup)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Each connector serves its seed graph and contract resources for first connect (rollup).** Each connector serves its seed graph as a native MCP resource beside `connector://resources` and the `ontology://` resources (`SDK-CONNECTOR-CONTROL-R019`). The seed graph holds instance identity, the object catalog and references only. The connector emits `notifications/resources/list_changed` when a served digest changes. The engine import is `EG-TYPED-PACKS-R104`. Pack authoring is `SDK-CONNECTOR-CONTROL-R067`. Children `.1` to `.6` deliver it. | See each child.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R068.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Add `SeedGraphDeclaration{instance_iri, identity, catalog, references}` in `agent_connector_sdk/manifest/seed_graph.py`. Add `SEED_RESOURCE_URI` as `seed://<connector>/seed.ttl` in `agent_connector_sdk/mcp/content.py` beside `MANIFEST_RESOURCE_URI` (line 46). Proving test: `tests/test_seed_graph.py::test_seed_declaration_round_trips`. | A round trip keeps every field and refuses a blank instance IRI.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R068.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** `emit_seed_turtle` writes deterministic, sorted Turtle in three parts: identity, catalog and references. Each part carries its SHA-256 digest. The catalog comes from connector discovery (`agent_connector_sdk/discovery.py`). The seed graph must stay under 50,000 triples and 8 MiB. Proving test: `tests/test_seed_graph.py::test_seed_turtle_is_deterministic`. | Two emissions of one declaration are byte-identical, with one digest per part.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R068.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** `register_connector_content` (`agent_connector_sdk/mcp/content.py:163`) registers the seed resource. A digest change sends `notifications/resources/list_changed` through the server session. Proving test: `tests/test_seed_graph.py::test_server_registers_seed_and_notifies`. | A served connector lists the seed resource, and a digest change sends one notification.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R068.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** Emission must refuse a row-valued property with `seed_bulk_data`. It must refuse a seed graph over the limit with `seed_too_large`. A connector without a seed declaration must serve no seed resource. Proving test: `tests/test_seed_graph.py::test_seed_refusals`. | Each case raises its code, and no seed resource is served.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R068.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Each served contract resource must carry its digest in the resource metadata. Certification must record the digests the engine accepted. Proving test: `tests/test_seed_graph.py::test_resource_metadata_carries_digest`. | The resource metadata digest equals the digest of the body.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R068.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** The entry point is a real connector server over MCP. An MCP client lists and reads the manifest, ontology and seed resources. The test changes the catalog and observes `list_changed`. Proving test: `tests/test_seed_graph_served.py::test_connector_serves_contract_resources_and_notifies`. | The client reads all three resource kinds, and the change sends one notification with a new seed digest.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R069
      Connector transports are declared contracts per connection protocol (rollup)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Connector transports are declared contracts per connection protocol (rollup).** Each connection protocol has one SDK transport and one access-contract term. The pack states the protocol, the authentication model, the paging or streaming form and the pushdown capabilities. Certification refuses a declared protocol without a transport. Engine planning over each protocol is `EG-FEDERATED-QUERY-R073.2`. The protocol table is in `plan.md`. Children `.1` to `.6` deliver it. | See each child.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R069.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Extend `ACCESS_KINDS`, `PAGINATION_MODES` and `PUSHDOWN_OPS` (`agent_connector_sdk/_contract_fields.py:9`) with every protocol of the table. Add `STREAM_MODES`, `AUTH_MODELS` and the pushdown values `aggregate`, `join` and `time_range`. Add `TransportContract{protocol, auth_model, paging, streaming, pushdown}` in `agent_connector_sdk/transports/contract.py`. Proving test: `tests/test_transport_contract.py::test_transport_contract_round_trips`. | A round trip keeps every field and refuses an unknown protocol or pushdown value.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R069.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** Each transport registers its protocol in one registry in `agent_connector_sdk/transports/__init__.py`. A stream protocol must declare `time_range` as its only pushdown. The access-contract parser reads the transport terms from the pack Turtle. Proving test: `tests/test_transport_contract.py::test_registry_one_transport_per_protocol`. | The registry holds one transport per protocol, and a stream contract with a filter refuses.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R069.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** The access-contract parser (`SDK-CONNECTOR-CONTROL-R021`) reads the transport terms. Certification checks each declared protocol against the registry before it records a pack. Proving test: `tests/test_transport_contract.py::test_certification_checks_registry`. | Certification of a pack reaches the registry check.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R069.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** Certification must refuse a protocol without a transport with `transport_unimplemented`. It must refuse a pushdown value that the transport does not support with `pushdown_unsupported`. It must refuse a second transport for one protocol with `duplicate_transport`. Proving test: `tests/test_transport_contract.py::test_transport_refusals`. | Each case refuses with its code.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R069.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Certification must write the protocol matrix of the connector into `ontology/certification.json`. Each entry names the transport module and its version. Proving test: `tests/test_transport_contract.py::test_certification_records_matrix`. | The certification file lists every declared protocol with its transport module.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R069.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** The entry point is the SDK certification command against a running engine. The test certifies a connector with REST, GraphQL and MCP consuming contracts. It then runs one virtual read through each transport. Proving test: `tests/test_transport_contract_served.py::test_declared_transports_serve_virtual_reads`. | Each read returns rows through its declared transport, and the engine records the protocol.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R014.21
      Reusable A2A protocol module
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Reusable A2A protocol module.** `agent_connector_sdk.a2a` carries the A2A agent card and skill models and the message and task types in the base install. It also carries a bounded JSON-RPC client: `message/send` then `tasks/get` polling, fixed failure messages and no remote error echo. `create_a2a_app` builds the server-side fasta2a app from a broker and storage that the caller passes in. It needs the optional `a2a` extra (fasta2a, starlette). The SDK holds no task store. A2A is one connection protocol of the transport matrix, `SDK-CONNECTOR-CONTROL-R069`. Received from agent-utilities, which no longer serves A2A; arbora mounts the app behind its admission and auth. | `tests/test_a2a_protocol.py::test_r014_21_*` cover the card and task wire forms, send-then-poll, error redaction, card validation and the extra's import error.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R700
      Declared semantic coverage refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Declared semantic coverage refusal.** `agent_connector_sdk.certify.declared_coverage` parses the SHACL target classes and property paths a connector declares into a frozen `DeclaredSemanticCoverage` in one linear pass over the shapes text, and `require_covers` refuses with `DeclaredSemanticCoverageError` unless every declared record type is a target class and all four provenance paths (`sourceRecordRef`, `tenantReference`, `accessPolicyReference`, `provenanceReference`) are present. Budget: p50 under 1 ms and p99 under 5 ms for a 100 KiB shapes text, memory under 2 MiB. | `tests/test_certify_declared_coverage.py` asserts acceptance and both refusal causes.
      requirementSDK-CONNECTOR-CONTROLVERIFIED91301b15d255
      tests/test_certify_declared_coverage.py:15
      SDK-CONNECTOR-CONTROL-R701
      Bundle-based lifecycle certification (definition only, awaiting implementation)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Bundle-based lifecycle certification (definition only, awaiting implementation).** The SDK owns governed connector lifecycle certification over a capability bundle. The bundle holds a policy with limits, a reference driver and a live driver. It also holds a source attestation that claims structure only and never live success, and an installed command-line entry point. The attestation declares compatibility bands for the SDK and the engine only; no agent-harness band. Manifest to ontology compilation is the engine's (`EG-TYPED-PACKS-R097`), not an SDK emitter. Budget: certification of one bundle under 2 s p99 with memory under 128 MiB. | Rows `.1` onward add the implementation and its tests; until then this row is verified by none.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R900
      Source credentials by source name (rollup)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Source credentials by source name (rollup).** `agent_connector_sdk.credentials.source` builds typed credentials (keyless, API key, cookie session, basic and refreshing OAuth2) from descriptors that hold only secret references. `SourceCredentials` looks them up by source name from `SOURCE_CREDENTIALS`. `agent_connector_sdk.credentials.sensitivity` decides which configuration keys a tool surface must redact. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R900.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** `AuthMaterial`, `SourceCredential`, its five kinds, `build_credential` and `SourceCredentials` are the public surface. | `tests/test_source_credentials.py::test_descriptor_materializes_request_auth`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R900.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** An OAuth2 credential refreshes inside a 30-second expiry skew. A failed refresh sends no header. | `tests/test_source_credentials.py::test_oauth2_refreshes_inside_the_expiry_skew_with_an_injected_clock`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R900.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** References resolve through `agent_connector_sdk.credentials.resolution.resolve_secret_reference`. Token refresh uses `agent_connector_sdk.tls.resolve`. | `tests/test_source_credentials.py::test_registry_caches_degrades_and_reports_status_without_values`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R900.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** A literal secret, a non-SDK reference scheme, inline cookie or refresh-token material and a TLS verification override are refused. An unbuildable descriptor degrades to keyless. | `tests/test_source_credentials.py::test_inline_material_and_non_reference_secrets_are_refused`
      requirementSDK-CONNECTOR-CONTROLVERIFIED8c6dcfdd27e8
      tests/test_source_credentials.py:77
      SDK-CONNECTOR-CONTROL-R900.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Tests use an in-memory resolver and an injected clock. `status` never returns a secret value. | `tests/test_credential_sensitivity.py::test_key_sensitivity`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R900.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** The entry point is `SourceCredentials.get`. The proof gets one source twice and receives the same cached credential. | `tests/test_source_credentials.py::test_registry_caches_degrades_and_reports_status_without_values`
      requirementSDK-CONNECTOR-CONTROLVERIFIED8c6dcfdd27e8
      tests/test_source_credentials.py:137
      SDK-CONNECTOR-CONTROL-R901
      Identifier gate and datapoint signing (rollup)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Identifier gate and datapoint signing (rollup).** `agent_connector_sdk.identifiers` validates graph and SQL names before they are written into query text. `agent_connector_sdk.signing` signs and verifies catalog datapoints with Ed25519 over canonical JSON. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R901.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** `InvalidIdentifierError`, `validate_identifier`, `validate_sql_identifier`, `quote_sql_identifier`, `sign_datapoint`, `verify_datapoint` and `public_key_b64` are the public surface. | `tests/test_identifiers.py::test_quote_sql_identifier_returns_a_quoted_name`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R901.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** A graph name has at most 128 characters and a SQL name at most 63. A signature verifies for any key order of the same datapoint. | `tests/test_signing.py::test_signature_round_trips_over_canonical_json`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R901.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** `UniversalConnector` quotes every introspected table name with `quote_sql_identifier`. The signing seed comes from `ARD_SIGNING_PRIVATE_KEY` through `agent_connector_sdk.config.setting`. | `tests/test_signing.py::test_configured_seed_is_used_and_malformed_seed_is_refused`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R901.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** A hostile name raises `InvalidIdentifierError` and the message never holds the name. Verification fails closed on any mismatch. A malformed seed raises `SigningKeyError`. | `tests/test_identifiers.py::test_hostile_names_are_refused_without_echo`
      requirementSDK-CONNECTOR-CONTROLVERIFIED8c6dcfdd27e8
      tests/test_identifiers.py:27
      tests/test_signing.py:21
      tests/test_signing.py:42
      SDK-CONNECTOR-CONTROL-R901.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** Tests cover hostile names, length limits, tampered datapoints, wrong keys and malformed signatures. | `tests/test_signing.py::test_any_mismatch_fails_closed`
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R901.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** The entry point is `verify_datapoint`. The proof verifies a datapoint signed with a configured seed. | `tests/test_signing.py::test_configured_seed_is_used_and_malformed_seed_is_refused`
      requirementSDK-CONNECTOR-CONTROLVERIFIED8c6dcfdd27e8
      tests/test_signing.py:42
      SDK-CONNECTOR-CONTROL-R902
      Connector tools declare and receive an acting user (rollup)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Connector tools declare and receive an acting user (rollup).** A connector tool may require an acting user. The SDK must declare that need and bind the forwarded user for each call. Children `.1` to `.6` deliver it. | Satisfied only when `.1` to `.6` are verified.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R902.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Add `requires_actor: bool` to the tool declaration in the connector manifest. The default is false. `ActorContext` in `agent_connector_sdk/identity.py:40` holds the bound user. | A unit test reads the flag from a fixture manifest.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R902.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** For each call, the MCP transport must verify the forwarded delegated token and bind its subject with `use_actor`. A tool without the flag runs under the process actor. | Tests cover one actor-required call and one ordinary call.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R902.3
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** The MCP server factory binds the actor before the tool body runs. `current_actor()` in `agent_connector_sdk/identity.py:68` then returns the user. ARBORA-IDENTITY-R028 sends the token. | A served test calls an actor-required tool with a forwarded token and reads the subject.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R902.4
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** An actor-required call without a valid delegated token must raise `IdentityRequiredError`. A token for another audience must refuse with `IDENTITY_AUDIENCE_MISMATCH`. | A served test asserts each refusal and no upstream call.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R902.5
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** The connector trace event must name the actor subject and the audience. It must hold no token text. | A test reads the trace event and asserts no token.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R902.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** The entry point is a served MCP tool call with a forwarded token. Token verification must add under 5 ms p99. | `tests/test_actor_forwarding_served.py::test_actor_required_tool_binds_forwarded_user` passes.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R067
      The SDK authors each connector pack as Turtle from typed declarations (rollup)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **The SDK authors each connector pack as Turtle from typed declarations (rollup).** One typed declaration per connector is the single source of truth. The SDK emits its domain ontology, ingest contract and surface as Turtle under the engine's connector-pack vocabulary. The SDK imports the pack into the engine. Manifests and mapping files become generated views. Children `.1` to `.9` deliver it. Engine owners: `EG-TYPED-PACKS-R101`, `EG-TYPED-PACKS-R102`, `EG-TYPED-PACKS-R103`. | Rollup closes when every child `.1` to `.8` passes its proving test.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R067.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Add `ConnectorPackDeclaration` in new file `agent_connector_sdk/manifest/pack_declaration.py`. It holds connector identity, contract version and source objects with ontology class IRIs. It also holds field mappings, key rules, cursor policy, access policy, privacy classes and provenance requirements. It lists features, tools, prompts, skills and their domain classes. Each nested source value is a typed relationship to a declared node. The declaration admits no nested dictionary property, such as a `sourceProperties` map. | `tests/test_pack_declaration.py::test_declaration_round_trip_and_nested_property_refusal`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R067.2
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** Add `emit_pack_turtle(declaration)` in new file `agent_connector_sdk/manifest/pack_turtle.py`. It emits deterministic, sorted Turtle with absolute IRIs and no blank nodes. It uses only `cp:` and `vg:` terms from the engine's `connector_pack-v1` module. It replaces `compile_manifest_ontology` (`agent_connector_sdk/manifest/ontology_pack.py:190`). The SDK retires its own `ac:` vocabulary (`agent_connector_sdk/ontology/access_contract.ttl`). | `tests/test_pack_turtle.py::test_emit_is_deterministic_and_uses_engine_terms`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R067.3
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** The SDK renders `ontology/mappings/source.yaml` from the declaration as a generated view. Certification compares the view with a fresh render. A hand edit fails certification. The tool-schema fingerprint domain at `agent_connector_sdk/manifest/tool_schema.py:31` must use an SDK-owned algorithm id. That id must not name another package. Every fingerprint the SDK computes uses the new id. | `tests/test_pack_declaration.py::test_views_render_and_fingerprint_id_is_sdk_owned`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R067.4
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** The SDK must validate the emitted Turtle before import. It calls the engine's `ShaclValidate` method with inline triples (`EG-TYPED-PACKS-R098`). The SDK does not hold its own SHACL engine. A runtime domain ontology revision uses the engine's `ImportOntology` operation (`EG-TYPED-PACKS-R103`). | `tests/test_pack_turtle.py::test_preflight_uses_engine_validation`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R067.5
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** `build_connector_content_pack` (`agent_connector_sdk/artifacts/pack.py:159`) adds one `contract://<connector>` entry from `emit_pack_turtle`. The certification command publishes it through the generated `ConnectorPackClient`. Every connector calls the same path; no connector writes Turtle by hand. | `tests/test_pack_turtle.py::test_content_pack_carries_contract_entry`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R067.6
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** Declaration loading must refuse an unresolved ontology class and a nested dictionary property. It must also refuse a duplicate mapping and a source object without a key rule. Each refusal names the field. An engine import refusal must reach the caller with its typed code unchanged. | `tests/test_pack_declaration.py::test_declaration_refusals_name_the_field`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R067.7
      Evidence
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Evidence.** The pack must carry the declaration digest. `ontology/certification.json` must record the contract digest that the engine accepted. A reader can tell whether a connector's views and pack come from one declaration. | `tests/test_pack_declaration.py::test_certification_records_accepted_contract_digest`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R067.8
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** The entry point is the SDK certification command against a running engine. The test declares a connector with one source object, one tool and one skill. It certifies the connector and reads the contract and surface through the engine's served SPARQL method. A changed declaration must produce a new contract revision. A hand-edited view must fail certification. | `tests/test_pack_rdf_served.py::test_declaration_to_engine_pack_end_to_end`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R780
      SDK helpers replace the retired agent-utilities harness modules
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **SDK helpers replace the retired agent-utilities harness modules.** Connectors import actor identity, exceptions, the governed HTTP client, TLS profiles and value helpers from the SDK. Seven agent-utilities modules had SDK replacements. Five children prove the delivered part. `SDK-CONNECTOR-CONTROL-R780.6` holds the remainder. | Closes when every child closes.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R780.1
      Actor type
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Actor type.** `agent_connector_sdk.identity.ActorType` has the five members `human`, `ai_agent`, `automated_service`, `hybrid_team` and `system`. The value never grants authorization. It replaces `agent_utilities.security.actor_identity`. | `tests/test_au_helper_parity.py::test_actor_type_members_match_the_retired_enum`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED889be6e354c7
      tests/test_au_helper_parity.py:15
      SDK-CONNECTOR-CONTROL-R780.2
      Exceptions
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Exceptions.** `agent_connector_sdk.exceptions` defines `AuthError`, `ApiError`, `UnauthorizedError`, `MissingParameterError`, `ParameterError` and `LoginRequiredError`. `UnauthorizedError` is an `AuthError`. It replaces `agent_utilities.core.exceptions`. | `tests/test_au_helper_parity.py::test_all_six_exceptions_keep_their_hierarchy`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED889be6e354c7
      tests/test_au_helper_parity.py:27
      SDK-CONNECTOR-CONTROL-R780.3
      Governed HTTP client and retry
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Governed HTTP client and retry.** `create_http_client` and `create_async_http_client` wrap one transport in the retry policy. `RetryPolicy` rejects an attempt count outside 1 to 10. A 503 on an idempotent request retries. Pinned egress is `SDK-CONNECTOR-CONTROL-R014.16`. | `tests/test_au_helper_parity.py::test_governed_client_retries_an_idempotent_request`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED889be6e354c7
      tests/test_au_helper_parity.py:42
      SDK-CONNECTOR-CONTROL-R780.4
      TLS profile resolution
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **TLS profile resolution.** `agent_connector_sdk.tls.resolve.resolve_tls_profile` resolves a selected profile to a `ResolvedTLSProfile`. `SDK-CONNECTOR-CONTROL-R017` owns the rules. It replaces the profile part of `agent_utilities.core.transport_security`. | `tests/test_au_helper_parity.py::test_tls_profile_resolver_is_exported` with `tests/test_tls_profiles.py` (R017).
      requirementSDK-CONNECTOR-CONTROLVERIFIED889be6e354c7
      tests/test_au_helper_parity.py:61
      SDK-CONNECTOR-CONTROL-R780.5
      Value helpers and configuration projection
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Value helpers and configuration projection.** `agent_connector_sdk.utilities` provides `to_boolean`, `to_integer`, `to_float`, `to_list`, `to_dict` and `get_logger`. `load_config` projects one JSON document into the environment without overriding it (`SDK-CONNECTOR-CONTROL-R016`). | `tests/test_au_helper_parity.py::test_value_coercions_and_logger` with `tests/test_foundation.py` (R016).
      requirementSDK-CONNECTOR-CONTROLVERIFIED889be6e354c7
      tests/test_au_helper_parity.py:66
      SDK-CONNECTOR-CONTROL-R780.6
      Remainder with no SDK equivalent
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Remainder with no SDK equivalent.** Six helpers have no SDK equivalent. They are environment-variable expansion in value helpers, the air-gap transport guard, the `requests` session factory and standard request headers. The others are TLS resolution from configuration keys and the generic retry, fallback and timeout runner. The SDK has no generic callable retry runner. The one agents importer of the runner moves to `RetryPolicy` or to this row. The 7,903-line `AgentConfig` stays in agent-utilities as harness plumbing. | A conformance case for each helper before agent-utilities deletes the module.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R781
      Training-trajectory recorder helper
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Training-trajectory recorder helper.** `agent_connector_sdk.writeback` gains a helper that records one trajectory through `eg.graph.StartTrajectory` and `eg.graph.AppendStep`. It reads returns through `eg.graph.DiscountedReturn` and `eg.graph.BestTrajectory`. It passes training samples to `eg.compute.DsGrpoSurrogate`, `eg.compute.DsDpoLoss` and `eg.compute.MineText`. It adds no engine method. Consumers: the data-science connector training-data and task-corpus tools; arbora training signals. Parity row: `EG-DECISION-ENGINE-R751`. | `tests/test_trajectory_recorder.py` runs the helper against a fake engine client. It asserts the call order, that a failed step leaves no open trajectory, and the typed unavailable result.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R782
      Message-stream adapters normalize into change envelopes
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Message-stream adapters normalize into change envelopes.** A stream adapter reads through `eg.messaging.StreamRead` and `eg.messaging.CdcRead`. It maps each record to an `EventEnvelope` and then to change-envelope drafts for `eg.transactions.ApplyChangeEnvelopeDrafts`. It commits the offset through `eg.messaging.StreamCommitOffset` only after the engine accepts the batch. A rejected batch leaves the offset unchanged. Consumer: the stream-broker connector. Parity rows: `EG-UNIFIED-DATA-PLANE-R710` and `EG-UNIFIED-DATA-PLANE-R711`. Those rows are absent from the engine main branch. | `tests/test_stream_adapter.py` asserts the record mapping, the offset commit after acceptance, an unchanged offset after rejection, and a replay that adds nothing.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R070
      Current-plan boundary models
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Current-plan boundary models.** `agent_connector_sdk.current_plan` exports strict frozen `CurrentPlanRequest`, `PlanItem`, `CurrentPlanSnapshot` and `CurrentPlanRead`. The request has only nonempty `run_id` (maximum 512 characters). A snapshot has that run ID, nonnegative integer revision, UTC observation and strictly later UTC expiry, and immutable ordered items with nonempty text and pending/in_progress/done status. Available requires a snapshot; unavailable requires null. Unknown fields, coerced values and malformed nested model instances are refused. JSON round trips preserve fields and order. | `tests/test_current_plan.py` covers valid empty and populated reads, round trips, immutability, malformed input and nested validation. No authority or current-time claim comes from constructing a DTO.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDea6e90065040
      tests/test_current_plan.py:16
      SDK-CONNECTOR-CONTROL-R071
      One declared connector identity
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **One declared connector identity.** A connector declares its fleet name once, in its package metadata. The fleet name is the name arbora and epistemic-graph use, for example `searxng-mcp`. The declaration is the single entry point of the `agent_connector_sdk.connector` group. Its value is the connector's top-level package, or `<package>:<attribute>` naming its `Connector` value (`SDK-CONNECTOR-CONTROL-R019.1`). `agent_connector_sdk.connector_identity.connector_name(package)` resolves the installed name. An uninstalled source checkout falls back to the declaration in the `pyproject.toml` beside its package. `declared_connector_name(pyproject)` reads the name without an install, for manifest generators and the pipelines name gate. The SDK raises `ConnectorIdentityError` for zero names, two or more names, or an invalid name. `ConnectorContent.for_package` and `IngestBinding.for_package` take the name from this declaration, so a connector passes no name literal. `ConnectorContent` raises `ContentError` when its connector disagrees with its manifest's `connector`. | Pack, manifest and ingest binding resolve to the one declared name. A disagreeing content name raises `ContentError`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED8ec791033514
      aa58c5dd6858
      e94990c8a480
      tests/test_connector_identity.py:20
      tests/test_connector_run.py:140
      tests/test_connector_run.py:152
      tests/test_connector_run.py:161
      tests/test_connector_run.py:172
      SDK-CONNECTOR-CONTROL-R071.1
      Content is found by convention
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Content is found by convention.** The SDK discovers `skills/`, `prompts/`, `ontology/`, `connectors/` and `connector_sources` under the package named by the connector entry point. `content_dirs(package)` returns the directories, and `installed_connectors()` lists every installed declaration with its directories. The `skill_providers`, `ontology_providers` and `source_connector_providers` entry-point groups are not read, and the conformance plugin rejects a connector that declares them. | `tests/test_connector_run.py::test_content_is_found_by_convention_with_one_entry_point` serves every content kind from a fixture with only the connector entry point. `tests/test_conformance_plugin.py` fails a fixture that declares a provider group.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDaa58c5dd6858
      tests/test_connector_run.py:140
      tests/test_connector_run.py:152
      tests/test_connector_run.py:172
      SDK-CONNECTOR-CONTROL-R071.2
      The version is read from package metadata only
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **The version is read from package metadata only.** `pyproject.toml` is the one file that spells a version. `agent_connector_sdk.connector_identity.distribution_version(distribution)` and `connector_version(package)` read it with `importlib.metadata`. The SDK's own `__version__`, the server version and the startup banner come from them. The release version bump edits `pyproject.toml` alone. A connector module that assigns a string to `__version__` fails the conformance plugin. | `tests/test_connector_run.py::test_versions_come_from_package_metadata` and `::test_server_version_is_the_metadata_version`. `tests/test_conformance_plugin.py` fails a fixture that spells `__version__`.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDaa58c5dd6858
      tests/test_connector_run.py:161
      SDK-CONNECTOR-CONTROL-R072
      Certify names the connector from its declaration
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Certify names the connector from its declaration.** `connector-certify` takes the connector name from `connector://resources`. A server that declares no preset, or presets for more than one MCP server, fails certification. | `tests/test_single_declaration.py::test_checkout_names_exactly_one_server`
      requirementSDK-CONNECTOR-CONTROLVERIFIED85fafc5b02ad
      92d09c57796b
      tests/test_single_declaration.py:184
      SDK-CONNECTOR-CONTROL-R073
      The server factory serves all five connector surfaces and keeps the parent link
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **The server factory serves all five connector surfaces and keeps the parent link.** `run()` and `build_server` pass `ConnectorContent` from `content_dirs(package)` to `create_mcp_server`, under the declared identity of `SDK-CONNECTOR-CONTROL-R071`. The factory registers the content it receives and does no lookup of its own. A call with no `content=` serves tools only. It serves each `prompts/<name>.json` as an MCP prompt. It serves each `skills/<name>/SKILL.md` as a `skill://` resource. It serves `ontology/*.ttl` as `ontology://` resources and `ontology/shapes/*.ttl` as `shapes://` resources. It also serves `connector://resources`. A connector with no packaged content serves only its tools. Each packaged domain ontology must declare `owl:Ontology`. It must import the parent IRI `http://knuckles.team/kg`. Each class it declares must reach a parent class by a direct or transitive `rdfs:subClassOf`. The pack builder keeps the parent import as the `ontology-import:` requirement of `SDK-CONNECTOR-CONTROL-R022`. The engine then resolves the link. | A test builds a connector with each content kind through `build_server`. Another test shows the factory serves tools only without `content=`. It lists each kind over MCP. It captures a pack that holds each entry kind. A test refuses a packaged ontology with no parent import. A test refuses an unlinked class. The pipelines `connector-surface-audit` (`PIPE-GATES-R014`) reports the fleet against this row.
      requirementSDK-CONNECTOR-CONTROLVERIFIED268d030fffad
      57d0997107dd
      8f36880f39a7
      cf3d6e92c008
      tests/test_default_content.py:12
      SDK-CONNECTOR-CONTROL-R074
      A connector pack declares every surface and the source contracts for virtual access (rollup)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **A connector pack declares every surface and the source contracts for virtual access (rollup).** Builds on `SDK-CONNECTOR-CONTROL-R073` (surfaces served by default) and the access kinds of `SDK-CONNECTOR-CONTROL-R040` to `R044`. The pack lists tools, prompts, skills, ontology, shapes and data resources. It adds one source contract that maps each data resource to ontology terms, an access method and a pagination form. EG federates the data at query time from that contract. The SDK never copies source rows. Children `.1` to `.7` deliver it. | See each child.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R074.1
      Model
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Model.** Add `ResourceDescriptor{uri, kind, ontology_class, fields, access_kind, key_field, pagination, read_only, owner, credential_ref}` in `agent_connector_sdk/artifacts/resource_descriptor.py`. `kind` is `data`, `ontology`, `shapes`, `skill`, `seed` or `manifest`. `access_kind` is a member of `ACCESS_KINDS`. `fields` lists `{name, ontology_property}` pairs, so EG catalogs each field and the contract binds it to an ontology property. `owner` names the accountable team. `pagination` is `cursor`, `page`, `offset` or `none`. `credential_ref` names a reference only, never a secret. | `tests/test_resource_descriptor.py::test_descriptor_round_trips_and_names_only_a_credential_reference` builds a descriptor, serialises it and reads it back.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R074.2
      Prompt role
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Prompt role.** Each `prompts/<name>.json` declares `role` (`system`, `task` or `template`) and the `ontology_class` or capability IRIs it serves. A prompt with no `role` is `task`. The pack carries both fields on the `mcp_prompt` entry so EG can select a system prompt for dynamic agent creation (`EG-DECISION-ENGINE-R814`). | `tests/test_prompt_role.py::test_prompt_role_and_concepts_reach_the_pack_entry` packs a `system` prompt and reads `role` and the class IRIs from the entry.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R074.3
      Behavior
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Behavior.** `build_content_pack` (`agent_connector_sdk/artifacts/pack.py:125`) emits one descriptor entry per data resource and a `contract://<connector>` Turtle body. The body maps each descriptor to an ontology class, an access method, a key field and a pagination form. `connector://resources` lists the count and digest of each of the six surfaces. The pack builder keeps the parent import of `SDK-CONNECTOR-CONTROL-R073`. | `tests/test_pack_surfaces.py::test_pack_lists_all_surfaces_and_contract` builds a fixture pack and reads six counts and one contract from the manifest.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R074.4
      Wiring
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Wiring.** The factory `create_mcp_server` (`agent_connector_sdk/mcp/server.py:93`) registers each data resource as an MCP resource through `register_connector_content` (`agent_connector_sdk/mcp/content.py:212`). `build_content_pack` reads the same descriptors. One declaration feeds both the live listing and the pack. | `tests/test_pack_surfaces.py::test_live_resource_listing_equals_pack_descriptors` compares `resources/list` with the pack entries.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R074.5
      Refusal
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Refusal.** The build refuses a data resource whose `ontology_class` is not declared in the connector ontology with `RESOURCE_UNMAPPED`. It refuses an unknown `access_kind` with `ACCESS_KIND_UNKNOWN`. It refuses a list operation with no `pagination` with `PAGINATION_UNDECLARED`. It refuses a literal secret in a descriptor with `SECRET_IN_CONTRACT`. | `tests/test_resource_descriptor.py::test_build_refuses_unmapped_unknown_unpaged_and_secret_descriptors` asserts each of the four codes.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R074.6
      Hot-path proof
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Hot-path proof.** The entry point is `create_mcp_server` for a fixture connector with all six surfaces. The test lists every surface over MCP. It builds the pack with `build_content_pack` and compares the two views. It also parses the contract with the access-contract parser of `SDK-CONNECTOR-CONTROL-R044`. | `tests/test_pack_surfaces_served.py::test_factory_serves_and_packs_every_surface_with_a_parseable_contract`.
      requirementSDK-CONNECTOR-CONTROLSPECIFIEDNo recorded commit/test evidence
      SDK-CONNECTOR-CONTROL-R074.7
      Default declarations
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Default declarations.** A connector writes no data-resource code. `agent_connector_sdk.artifacts.resource_derivation.derive_descriptors` turns each read-only tool that returns records into a default `ResourceDescriptor`. The tool name gives the resource name and the access method. The response schema gives the fields. The parameters give the pagination form: `cursor`, `page`, `offset` or `none`. A `next_url` parameter counts as `cursor`. The field names give the identity. A destructive tool, a tool without `readOnlyHint`, and a schema without record fields yield nothing. The SDK matches field and record names to the connector ontology and marks each match `proposed`. A name with no match stays `unmapped`. The SDK never marks a mapping approved. A steward approves it in EG. A source declared with `source_meta` (`R075.2`) overrides the default of its tool and marks the mapping `declared`. The codes of `.5` refuse a bad declaration. `create_mcp_server` serves the result inside `connector://resources`. It derives the defaults from the tools registered at read time. The pack carries the result as a `resource` entry. | `tests/test_resource_declarations.py` derives github-agent's repository list: page pagination, `id` key, proposed `Repository` class and `fullName` property. It serves a scaffolded connector's resource over MCP and refuses the four codes.
      requirementSDK-CONNECTOR-CONTROLVERIFIED9571c94146e2
      tests/test_resource_declarations.py:32
      SDK-CONNECTOR-CONTROL-R075
      The connector's MCP server is the only place its metadata is read from (rollup)
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **The connector's MCP server is the only place its metadata is read from (rollup).** A connector ships no `connector_manifest.yml`, presets file, fingerprints file, `ingest_sources.json` or `data_resources.json`, and the SDK reads none of them. The SDK runner, arbora, epistemic-graph and the pipelines gates read the live server. The gates start it over stdio. The name comes from the `agent_connector_sdk.connector` entry point (`R071`) and `serverInfo`. Tool fingerprints come from the handshake. Actions come from tool annotations and `split_tool_classes`. Data sources come from code (`R075.2`). Ontology and shapes are authored as TTL and read only through `ontology://` and `shapes://` (`R073`). The server serves one declaration resource, `connector://resources`. Children `.1` to `.6` deliver it. | See each child.
      requirementSDK-CONNECTOR-CONTROLVERIFIED0d150cf96fd8
      2078ee0208c5
      2487b614c171
      647f3de98067
      95f251043be1
      tests/test_eg_pack_entry_kinds.py:45
      tests/test_eg_pack_entry_kinds.py:54
      tests/test_eg_pack_entry_kinds.py:68
      tests/test_eg_pack_entry_kinds.py:81
      tests/test_eg_pack_entry_kinds.py:95
      SDK-CONNECTOR-CONTROL-R075.1
      No file fallback
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **No file fallback.** The SDK has no loader for the manifest, the presets, the fingerprints, `ingest_sources.json` or `data_resources.json`. A connector converts its files to `source_meta(...)` declarations on its read tools. | `tests/test_single_declaration.py::test_server_serves_declaration_live_and_runner_reads_only_that` lists `connector://resources` as the only resource of a declared server.
      requirementSDK-CONNECTOR-CONTROLVERIFIED0d150cf96fd8
      f0b9e7f4f535
      tests/test_single_declaration.py:85
      SDK-CONNECTOR-CONTROL-R075.2
      Data sources are declared in code and served live
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Data sources are declared in code and served live.** `source_meta(source_id, record_type, id_field, ontology_class, fields, ...)` in `agent_connector_sdk/ingest/live_declaration.py` returns the `meta` of a read tool. `register_live_declaration` serves the assembled declaration as the JSON resource `connector://resources`, computed when read. It carries the sources, the record-type mappings onto the ontology, the resources and the data-resource descriptors of `R074`. A package that generates its tools from client methods declares them by tool name instead: `<package>/connector_sources.py` holds `SOURCES` (`source_meta(tool=..., ...)`), `SCHEMA_MAPPINGS` and `RESOURCES`, and `register_tool_surface` and `register_connector_content` load it. A source that reads per parent record adds `for_each={source, argument, field}` to `source_meta` (`SDK-SOURCE-INGEST-R004.28`). A name that matches no registered tool raises `ValueError`. A server that already serves the URI keeps its own resource. | `tests/test_single_declaration.py::test_build_declaration_maps_meta_without_any_file`, `::test_connector_sources_module_declares_by_tool_name`, `tests/test_source_sync.py::test_tool_surface_serves_declarations` and `tests/test_for_each.py::test_for_each_is_in_the_served_schema`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED2078ee0208c5
      f0b9e7f4f535
      tests/test_single_declaration.py:86
      SDK-CONNECTOR-CONTROL-R075.3
      The runner and certification read the live declaration
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **The runner and certification read the live declaration.** `load_sync_adapters(descriptor, session)` reads `connector://resources` through the open session and builds one adapter per source that carries a `preset`. The tool fingerprint is the live compatibility fingerprint taken at discovery. A declaration that names another connector, or declares no preset, raises `RunnerConfigurationError`. `connector-certify` reads the same resource, checks each declared preset tool against its live definition and writes no file. | `tests/test_single_declaration.py::test_declared_connector_must_match_descriptor`, `::test_server_without_a_sync_preset_is_refused` and `::test_certify_reads_the_declaration_and_checks_tools_live`.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDf0b9e7f4f535
      tests/test_single_declaration.py:102
      tests/test_single_declaration.py:112
      tests/test_single_declaration.py:87
      SDK-CONNECTOR-CONTROL-R075.4
      Prompts serve their own directive and carry their metadata over native MCP
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Prompts serve their own directive and carry their metadata over native MCP.** `prompts/get` returns the prompt's `instructions.core_directive` as written. `prompts/list` carries the fastmcp fields `title` (the prompt JSON `title`, else the identity role), `description`, `tags` and `meta`. `tags` are the prompt JSON `tags` plus `prompt`, and `system` when the prompt declares a system-prompt target. `meta` sits under the key `team.knuckles/prompt` with role, goal, topic, tone, style, version, `useCase` (JSON `useCase`, `metadata.useCase` or `use_case`) and `systemPromptFor` (JSON `systemPromptFor`, `serves` or `ontology_class`). Any other scalar key under the prompt's `metadata` is carried under its own name. arbora and epistemic-graph capture system-prompt candidates (`EG-DECISION-ENGINE-R814`) from `prompts/list` and `prompts/get` alone. A prompt that takes input declares fastmcp `arguments`. The SDK gives `extends` and `compose` no meaning. | `tests/test_single_declaration.py::test_prompt_serves_its_directive_and_carries_metadata_over_mcp`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED2487b614c171
      f0b9e7f4f535
      tests/test_single_declaration.py:192
      tests/test_single_declaration.py:230
      SDK-CONNECTOR-CONTROL-R075.5
      Skills, ontology and shapes stay on fastmcp
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Skills, ontology and shapes stay on fastmcp.** The server serves `skills/<name>/SKILL.md` through the fastmcp `SkillsDirectoryProvider` as `skill://` resources. It serves `ontology/*.ttl` and `ontology/shapes/*.ttl` as fastmcp resources with `mime_type="text/turtle"`. A `SKILL.md` `name` equals its directory name. Where fastmcp and the MCP specification differ, fastmcp wins. | `tests/test_single_declaration.py::test_skill_directory_name_matches_frontmatter_name`.
      requirementSDK-CONNECTOR-CONTROLVERIFIEDf0b9e7f4f535
      tests/test_single_declaration.py:294
      SDK-CONNECTOR-CONTROL-R075.6
      Mapping references name the declaration
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **Mapping references name the declaration.** An ingest request refers to a declared mapping as `connector:<connector>#mappings/<record type>` and to a declared relation as `connector:<connector>#relations/<resource>/<relation>`. The bare `connector:<connector>` form names the connector's only mapping. No other scheme is built or accepted. The engine resolves a mapping reference against the pack's `connector://resources` declaration. It resolves a relation reference against the pack ontology's object properties (`EG-TYPED-PACKS-R101.10`). Child slice of `SDK-CONNECTOR-CONTROL-R075`. | `tests/test_ingest.py::test_change_set_maps_to_exact_declared_references`.
      requirementSDK-CONNECTOR-CONTROLVERIFIED95f251043be1
      tests/test_ingest.py:95
      SDK-CONNECTOR-CONTROL-R075.7
      The declaration entry carries its content schema
      Definition — SDK-CONNECTOR-CONTROL / SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publicationCanonical requirement and verification source
      **The declaration entry carries its content schema.** `build_content_pack` emits `connector://resources` as a `resource` entry whose `output_schema` is the JSON Schema of `IngestSourceDeclaration`, generated from the model. The engine refuses a resource entry with no content schema. Ontology, shapes, skill, prompt and tool entries have their own entry kinds and need no declaration schema. The resource URI scheme picks the entry kind. The `ontology`, `shapes`, `model-profile` and `a2a-card` schemes map to their own kinds. `connector://resources` is the one `resource` entry. A pack carries no manifest entry: a `manifest://` resource has no entry kind, so `build_content_pack` refuses it with `MalformedArtifactError`. The declared engine floor is `epistemic-graph>=2.27.6`. Its generated `PackEntryKind` holds every mapped kind. Every SDK module imports against it. The packs are assembled by the SDK library inside arbora, so a connector needs no new release. Child slice of `SDK-CONNECTOR-CONTROL-R075`. | `tests/test_pack_resource_schema.py::test_pack_satisfies_engine_resource_schema_rule`. `tests/test_eg_pack_entry_kinds.py` imports every SDK module and checks each mapped kind. It refuses a `manifest://` resource. It builds a pack on the locked engine.
      requirementSDK-CONNECTOR-CONTROLVERIFIED647f3de98067
      bbc715bc3431
      tests/test_eg_pack_entry_kinds.py:45
      tests/test_eg_pack_entry_kinds.py:54
      tests/test_eg_pack_entry_kinds.py:68
      tests/test_eg_pack_entry_kinds.py:81
      tests/test_eg_pack_entry_kinds.py:95
      SDK-FINANCE-SOURCES
      SDK-FINANCE-SOURCES — Qualified finance source adapters
      specNoneSPECIFIEDNo recorded commit/test evidence
      SDK-FINANCE-SOURCES-R001
      Market-data adapters: exchange history fix, CoinMarketCap, FRED/ALFRED
      Definition — SDK-FINANCE-SOURCES / SDK-FINANCE-SOURCES — Qualified finance source adaptersCanonical requirement and verification source
      **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.
      requirementSDK-FINANCE-SOURCESLANDED840bd894c581
      SDK-FINANCE-SOURCES-R002
      Alpaca stocks adapter: history, quotes, fundamentals, calendars
      Definition — SDK-FINANCE-SOURCES / SDK-FINANCE-SOURCES — Qualified finance source adaptersCanonical requirement and verification source
      **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.
      requirementSDK-FINANCE-SOURCESVERIFIED077a14c9f3d3
      823197633ebb
      fad5328aee62
      tests/test_finance_alpaca_stocks.py:56
      tests/test_finance_alpaca_stocks.py:69
      tests/test_finance_alpaca_stocks.py:75
      SDK-FINANCE-SOURCES-R003
      FX, commodities, and real-estate adapters with roll and staleness rules
      Definition — SDK-FINANCE-SOURCES / SDK-FINANCE-SOURCES — Qualified finance source adaptersCanonical requirement and verification source
      **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.
      requirementSDK-FINANCE-SOURCESVERIFIED13fcdacb3ff1
      6ef04661acc2
      tests/test_finance_records.py:101
      tests/test_finance_records.py:113
      tests/test_finance_records.py:119
      tests/test_finance_records.py:130
      tests/test_finance_records.py:142
      SDK-FINANCE-SOURCES-R004
      Alpaca account reads and idempotent CSV activity import
      Definition — SDK-FINANCE-SOURCES / SDK-FINANCE-SOURCES — Qualified finance source adaptersCanonical requirement and verification source
      **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.
      requirementSDK-FINANCE-SOURCESVERIFIED077a14c9f3d3
      2ef7ca88d676
      6ef04661acc2
      fad5328aee62
      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
      SDK-FINANCE-SOURCES-R005
      Macro and liquidity panels: FRED series, ETF flows, sentiment, on-chain
      Definition — SDK-FINANCE-SOURCES / SDK-FINANCE-SOURCES — Qualified finance source adaptersCanonical requirement and verification source
      **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.
      requirementSDK-FINANCE-SOURCESVERIFIED077a14c9f3d3
      36f3c76a370c
      840bd894c581
      887c201cbff5
      fad5328aee62
      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
      SDK-FINANCE-SOURCES-R900
      Venue and API connector helpers (rollup)
      Definition — SDK-FINANCE-SOURCES / SDK-FINANCE-SOURCES — Qualified finance source adaptersCanonical requirement and verification source
      **Venue and API connector helpers (rollup).** The SDK provides venue and API helpers only. `finance.market_data` chains market-data providers. `finance.crypto` reads DEX volume, TVL and funding rates. `finance.feeds` builds live bars on `streaming.StreamBus`. `payments` runs the HTTP 402 payment flow. `finance.strategy_export` renders strategy source. `finance.banking` builds ISO 20022 messages. The graph service owns finance calculations and decisions (`EG-FINANCE-PRIMITIVES-R900`, `EG-FINANCE-PRIMITIVES-R901`). The `market` and `stream` extras provide the provider and WebSocket clients. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.
      requirementSDK-FINANCE-SOURCESSPECIFIEDNo recorded commit/test evidence
      SDK-FINANCE-SOURCES-R900.1
      Model
      Definition — SDK-FINANCE-SOURCES / SDK-FINANCE-SOURCES — Qualified finance source adaptersCanonical requirement and verification source
      **Model.** `DataRegistry`, `OnChainAnalytics`, `CryptoDerivatives`, `MarketFeedBus`, `StreamBus`, `X402PaymentClient`, `StrategyExporter` and `ISO20022MessageFactory` are the public surface. | `tests/test_finance_strategy_export.py::test_exporter_dispatches_by_platform_and_exports_all`
      requirementSDK-FINANCE-SOURCESSPECIFIEDNo recorded commit/test evidence
      SDK-FINANCE-SOURCES-R900.2
      Behavior
      Definition — SDK-FINANCE-SOURCES / SDK-FINANCE-SOURCES — Qualified finance source adaptersCanonical requirement and verification source
      **Behavior.** The registry returns the first non-empty provider result and never fabricates data. A price alert fires once when its threshold is crossed. | `tests/test_finance_market_data.py::test_first_non_empty_provider_wins_and_failures_become_warnings`
      requirementSDK-FINANCE-SOURCESSPECIFIEDNo recorded commit/test evidence
      SDK-FINANCE-SOURCES-R900.3
      Wiring
      Definition — SDK-FINANCE-SOURCES / SDK-FINANCE-SOURCES — Qualified finance source adaptersCanonical requirement and verification source
      **Wiring.** Crypto reads use `agent_connector_sdk.source_connectors.http_safety`. Feeds publish through `agent_connector_sdk.streaming`. | `tests/test_finance_feeds.py::test_ticks_fan_out_by_symbol`
      requirementSDK-FINANCE-SOURCESSPECIFIEDNo recorded commit/test evidence
      SDK-FINANCE-SOURCES-R900.4
      Refusal
      Definition — SDK-FINANCE-SOURCES / SDK-FINANCE-SOURCES — Qualified finance source adaptersCanonical requirement and verification source
      **Refusal.** A malformed upstream answer raises `ProviderRequestError`. The payment guard refuses a payment outside any budget, currency or chain limit. | `tests/test_payments.py::test_guard_approves_only_within_every_limit`
      requirementSDK-FINANCE-SOURCESVERIFIED8c6dcfdd27e8
      tests/test_finance_crypto.py:48
      tests/test_payments.py:38
      SDK-FINANCE-SOURCES-R900.5
      Evidence
      Definition — SDK-FINANCE-SOURCES / SDK-FINANCE-SOURCES — Qualified finance source adaptersCanonical requirement and verification source
      **Evidence.** Tests inject fetch callables and in-memory providers. They use no network and no sleep. | `tests/test_finance_crypto.py::test_malformed_answers_raise_provider_request_error`
      requirementSDK-FINANCE-SOURCESSPECIFIEDNo recorded commit/test evidence
      SDK-FINANCE-SOURCES-R900.6
      Hot-path proof
      Definition — SDK-FINANCE-SOURCES / SDK-FINANCE-SOURCES — Qualified finance source adaptersCanonical requirement and verification source
      **Hot-path proof.** The entry point is `X402PaymentClient`. The proof parses a 402 challenge, makes a proof, records the payment and verifies the remaining budget. | `tests/test_payments.py::test_client_parses_402_proves_and_records_spend`
      requirementSDK-FINANCE-SOURCESVERIFIED8c6dcfdd27e8
      tests/test_payments.py:93
      SDK-GOVERNED-WRITEBACK
      SDK-GOVERNED-WRITEBACK — Governed write-back to attached sources
      specNoneSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R001
      Write-back proposals route through governed authorization, not direct action
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDdaeb199f91c0
      fad5328aee62
      tests/test_decide_consumers.py:169
      tests/test_decide_consumers.py:176
      SDK-GOVERNED-WRITEBACK-R001.1
      Model
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R001.2
      Behavior
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R001.3
      Wiring
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R001.4
      Refusal
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R001.5
      Evidence
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R001.6
      Hot-path proof
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R002
      Source-side WriteBackPort composes a durable graph write-back adapter
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKVERIFIED2d39be956d8d
      tests/test_writeback_durable.py:143
      SDK-GOVERNED-WRITEBACK-R003
      Full write-back requires an authorization resolver and restart recovery
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKVERIFIED2d39be956d8d
      tests/test_writeback_durable.py:254
      tests/test_writeback_process_restart.py:105
      SDK-GOVERNED-WRITEBACK-R004
      Governed write-back: approval, idempotency, and an audit reservation
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIED6ef04661acc2
      fad5328aee62
      tests/test_writeback_audit_reservation.py:13
      tests/test_writeback_audit_reservation.py:27
      SDK-GOVERNED-WRITEBACK-R004.1
      Generic approval residual
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R004.2
      Generic deterministic replay residual
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R004.3
      Generic audit reservation residual
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R004.4
      Business-rule API residual
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R004.5
      Typed repository effect request
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R004.6
      Repository path and scope resolution
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R004.7
      Approval binds the complete source effect
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R004.8
      Conditional provider mutation
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R004.9
      Actual immutable effect receipt
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R004.10
      Independent revision readback
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R004.11
      Repository restart reconciliation
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R004.12
      Served repository producer composition
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **Served repository producer composition.** Model: An admitted repository connector exposes the typed request and receipt through the existing governed write-back operations. Behavior: Run preview, recorded approval, apply, independent readback and replay through the real connector entrypoint. Wiring: Compose its real provider transport with DurableWritableConnector and the generated graph ledger; Arbora remains a separate consumer prerequisite. Refusal: Missing production composition, provider capability, durable authority or trusted configuration leaves the operation unavailable. Evidence: WB-26 traces one real served effect and zero-effect negatives at the provider boundary. After restart it reads the identical durable result. | Proposed test: `tests/test_repository_source_effect_served.py::test_served_journey`. WB-26 traces one real served effect and zero-effect negatives at the provider boundary. After restart it reads the identical durable result.
      requirementSDK-GOVERNED-WRITEBACKSPECIFIEDNo recorded commit/test evidence
      SDK-GOVERNED-WRITEBACK-R005
      Write-back implementation passes its full durable test suite together
      Definition — SDK-GOVERNED-WRITEBACK / SDK-GOVERNED-WRITEBACK — Governed write-back to attached sourcesCanonical requirement and verification source
      **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.
      requirementSDK-GOVERNED-WRITEBACKVERIFIED2d39be956d8d
      tests/test_writeback_durable.py:218
      tests/test_writeback_durable.py:238
      SDK-OBSERVABILITY-FEEDS
      SDK-OBSERVABILITY-FEEDS — Operational event feeds through the source adapter contract
      specNoneVERIFIEDNo recorded commit/test evidence
      SDK-OBSERVABILITY-FEEDS-R001
      RUM, security-audit, and CI/CD events join the durable source pipeline
      Definition — SDK-OBSERVABILITY-FEEDS / SDK-OBSERVABILITY-FEEDS — Operational event feeds through the source adapter contractCanonical requirement and verification source
      **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.
      requirementSDK-OBSERVABILITY-FEEDSVERIFIED077a14c9f3d3
      c44284a671b3
      tests/test_event_feeds.py:266
      tests/test_event_feeds.py:284
      tests/test_event_feeds.py:300
      SDK-QUALITY-RELEASE
      SDK-QUALITY-RELEASE — Portable SDK quality, Pages, and release
      specNoneVERIFIEDNo recorded commit/test evidence
      SDK-QUALITY-RELEASE-R001
      SDK release builds against a published compatible graph-client wheel
      Definition — SDK-QUALITY-RELEASE / SDK-QUALITY-RELEASE — Portable SDK quality, Pages, and releaseCanonical requirement and verification source
      **SDK release builds against a published compatible graph-client wheel.** The SDK release pipeline builds and publishes an installed wheel verified against a published, version-compatible graph-client wheel, confirming generated-type and native-kernel compatibility in an isolated installed consumer rather than a source overlay. The release uploads the wheel and the source distribution together. | A release job that installs the published wheel in an isolated environment and verifies generated-type and kernel compatibility against the graph-client release.
      requirementSDK-QUALITY-RELEASEVERIFIED3edcf05bc64a
      42b930057c3e
      5b53e943e468
      tests/gates/test_workflow_contract.py:213
      tests/test_release_quality_r001_r005.py:46
      tests/test_release_quality_r001_r005.py:53
      tests/test_release_quality_r001_r005.py:59
      tests/test_release_quality_r001_r005.py:77
      SDK-QUALITY-RELEASE-R002
      Public-documentation scanner catches private addresses and hosts
      Definition — SDK-QUALITY-RELEASE / SDK-QUALITY-RELEASE — Portable SDK quality, Pages, and releaseCanonical requirement and verification source
      **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.
      requirementSDK-QUALITY-RELEASEVERIFIEDfad5328aee62
      ffb9260d7602
      tests/test_doc_privacy_scanner.py:28
      SDK-QUALITY-RELEASE-R003
      Release workflow builds with the pinned managed Python, not the system one
      Definition — SDK-QUALITY-RELEASE / SDK-QUALITY-RELEASE — Portable SDK quality, Pages, and releaseCanonical requirement and verification source
      **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.
      requirementSDK-QUALITY-RELEASEVERIFIED42b930057c3e
      tests/gates/test_workflow_contract.py:155
      tests/gates/test_workflow_contract.py:190
      SDK-QUALITY-RELEASE-R004
      Public documentation follows a task-first README and site structure
      Definition — SDK-QUALITY-RELEASE / SDK-QUALITY-RELEASE — Portable SDK quality, Pages, and releaseCanonical requirement and verification source
      **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.
      requirementSDK-QUALITY-RELEASEVERIFIED010681764371
      cbbf859a5c38
      fad5328aee62
      tests/test_public_docs_structure.py:21
      tests/test_public_docs_structure.py:40
      SDK-QUALITY-RELEASE-R005
      Hosted CI reproduces the pinned dependency graph from published wheels
      Definition — SDK-QUALITY-RELEASE / SDK-QUALITY-RELEASE — Portable SDK quality, Pages, and releaseCanonical requirement and verification source
      **Hosted CI reproduces the pinned dependency graph from published wheels.** The frozen lock reproduces the hosted graph, including requested extras and transitive dependencies. The SDK installs `epistemic-graph` from PyPI only. `uv.lock` pins its registry wheels by SHA-256 and carries no source distribution. `pyproject.toml` lists it in `[tool.uv] no-build-package` and declares no other source for it. So a native build cannot occur. `scripts/epistemic_graph_release.json` names one of the locked wheels, with its version and SHA-256. The installed version matches the lock. SDK-consumed contract modules resolve only from the installed wheel package. No other path may overlay that package on the import path. Active dependencies match locked versions and installed metadata. The graph check rejects synthetic distribution metadata. Reject a Git or source pin, a source distribution, an unhashed wheel, an overlay, a wrong version, or graph drift. | Positive and adversarial tests prove that the lock, the build policy and the release record agree. They verify import origins inside the installed wheel, dependency resolution and extras closure. Negative cases reject Git sources, source distributions, unhashed wheels, overlays, outside origins or graph drift. The graph digest binds a provenance sidecar with the registry declaration and the installed-distribution evidence.
      requirementSDK-QUALITY-RELEASEVERIFIED096f27ee29e5
      0c1f49ced769
      42b930057c3e
      6856dbff0136
      851969957034
      tests/gates/test_workflow_contract.py:132
      tests/test_conformance_plugin.py:102
      tests/test_conformance_plugin.py:109
      tests/test_conformance_plugin.py:119
      tests/test_conformance_plugin.py:134
      SDK-QUALITY-RELEASE-R005.1
      The SDK ships connector conformance as a test plugin
      Definition — SDK-QUALITY-RELEASE / SDK-QUALITY-RELEASE — Portable SDK quality, Pages, and releaseCanonical requirement and verification source
      **The SDK ships connector conformance as a test plugin.** The `pytest11` entry point loads `agent_connector_sdk.testing.plugin`. The plugin acts when the repository declares an `agent_connector_sdk.connector` entry point. It adds one test per conformance check, derived from the declared `Connector`. The checks cover the fleet name, the metadata version, startup, content surfaces and prompts. They also cover declared sources, ontology roll-up, ingest binding names and the absence of provider entry points. Each test carries the `spec` marker of this row. A run that names explicit node ids adds no test. A repository without the declaration adds none either. A connector repository holds no copy of these tests. | `tests/test_conformance_plugin.py` passes a conforming fixture. It breaks one property per check and expects the named check to fail. A subprocess run in a fixture repository reports one passing test per check.
      requirementSDK-QUALITY-RELEASEVERIFIED8baf6d9167cd
      8f36880f39a7
      9a7af09b0f2c
      aa58c5dd6858
      tests/test_conformance_plugin.py:102
      tests/test_conformance_plugin.py:109
      tests/test_conformance_plugin.py:119
      tests/test_conformance_plugin.py:134
      tests/test_conformance_plugin.py:145
      SDK-REPOSITORY-TRANSPORT
      SDK-REPOSITORY-TRANSPORT — Authenticated immutable repository transport
      specNoneSPECIFIEDNo recorded commit/test evidence
      SDK-REPOSITORY-TRANSPORT-R001
      Repository transport hydrates code and specification sources from Git
      Definition — SDK-REPOSITORY-TRANSPORT / SDK-REPOSITORY-TRANSPORT — Authenticated immutable repository transportCanonical requirement and verification source
      **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.
      requirementSDK-REPOSITORY-TRANSPORTVERIFIEDacf470ac4906
      tests/test_repository_transport.py:117
      SDK-REPOSITORY-TRANSPORT-R002
      SDK is the sole path for repository-native codebase hydration
      Definition — SDK-REPOSITORY-TRANSPORT / SDK-REPOSITORY-TRANSPORT — Authenticated immutable repository transportCanonical requirement and verification source
      **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.
      requirementSDK-REPOSITORY-TRANSPORTSPECIFIEDNo recorded commit/test evidence
      SDK-REPOSITORY-TRANSPORT-R003
      Repository ref walk traverses each Git tree once with batched reads
      Definition — SDK-REPOSITORY-TRANSPORT / SDK-REPOSITORY-TRANSPORT — Authenticated immutable repository transportCanonical requirement and verification source
      **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.
      requirementSDK-REPOSITORY-TRANSPORTVERIFIED077a14c9f3d3
      9a6fe1ddcf26
      fad5328aee62
      tests/test_repository_refwalk_fastpath.py:39
      tests/test_repository_refwalk_fastpath.py:78
      SDK-REPOSITORY-TRANSPORT-R004
      Repository transport submits bounded, outcome-complete index batches
      Definition — SDK-REPOSITORY-TRANSPORT / SDK-REPOSITORY-TRANSPORT — Authenticated immutable repository transportCanonical requirement and verification source
      **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.
      requirementSDK-REPOSITORY-TRANSPORTVERIFIEDacf470ac4906
      tests/test_repository_transport.py:179
      tests/test_repository_transport.py:200
      tests/test_repository_transport.py:257
      SDK-REPOSITORY-TRANSPORT-R005
      Branch-aware transport batches indexing into one call per batch
      Definition — SDK-REPOSITORY-TRANSPORT / SDK-REPOSITORY-TRANSPORT — Authenticated immutable repository transportCanonical requirement and verification source
      **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.
      requirementSDK-REPOSITORY-TRANSPORTVERIFIEDacf470ac4906
      tests/test_repository_transport.py:180
      SDK-SCM
      SDK-SCM — SDK source client and virtual workspace
      specNoneSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R001
      Source client
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Source client.** The SDK provides one typed client for the served `source.*` operations. It covers tree, blob, diff, history, blame, commit, land, and revert. A local bounded blob cache keyed by content digest backs blob reads. The connector or host composes the client; the SDK serves nothing itself. | Child rows R001.1 through R001.6 bind; `tests/test_source_client_served.py` proves the served path.
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R001.1
      Model
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Model.** The client exposes one frozen typed method per `source.*` operation. A request binds repository identity, revision or branch reference, a path prefix where the operation takes one, and typed parameters. A result is a typed page or receipt with a stable continuation token. No method accepts or returns an untyped payload. | `tests/test_source_client.py::test_request_and_page_models_are_typed_and_frozen`
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R001.2
      Behavior
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Behavior.** Read operations return bounded pages with continuations. A blob read consults the local cache first and serves cached bytes only while the stored digest matches. A write submits through its operation with one stable operation identity per logical change. An identical retry reuses that identity and returns the same receipt. The cache is bounded by entry count and byte count and evicts least-recently-used entries. | `tests/test_source_client.py::test_cache_is_bounded_and_digest_checked` and `tests/test_source_client.py::test_retry_reuses_operation_identity`
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R001.3
      Wiring
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Wiring.** The repository-manager connector composes the client behind its served development tools inside arbora MCP. A host may compose the same client directly. The client is a planned new module under `agent_connector_sdk/`. The connector's served operations build it with the authenticated caller and the served endpoint. They reach the SDK through `register_tool_surface` at `agent_connector_sdk/mcp/tool_surface.py:305` and `dispatch_async` at `agent_connector_sdk/mcp/action_dispatch.py:196`. The SDK owns no serving, registry, or admission code. | `tests/test_source_client_served.py::test_connector_tool_composes_the_client`
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R001.4
      Refusal
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Refusal.** A refused or failed operation returns a typed refusal with a closed reason code: `unauthorized`, `not_found`, `conflict`, `path_denied`, `oversized`, `deadline_exceeded`, `transport_unavailable`. A refused write produces no effect and advances no revision. A cache read whose digest does not match evicts the entry and re-reads through the served operation. | `tests/test_source_client.py::test_refusals_are_typed_and_zero_effect`
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R001.5
      Evidence
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Evidence.** Each result binds repository identity, revision, operation identity, request digest, page bounds, and the receipt reference where one exists. Cache events record digest, hit or miss, and eviction count without content. Diagnostics never contain credentials, resolved secret values, or private paths. | `tests/test_source_client.py::test_results_bind_provenance_without_secrets`
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R001.6
      Hot-path proof
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Hot-path proof.** The served test enters through a registered repository-manager development tool inside arbora MCP. It calls a `source.*` operation through the SDK client against a controlled served backend. It observes the typed page. A warm and a cold blob read agree on digest and bytes. A conflicting commit returns the stable `conflict` code with zero write effect. | `tests/test_source_client_served.py::test_served_client_pages_and_conflict_refusal`
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R002
      Virtual workspace mount
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Virtual workspace mount.** The SDK provides a FUSE or overlay mount that materializes files on read and records writes as a pending changeset. The mount is sparse by declared path prefix. It performs no repository clone. | Child rows R002.1 through R002.6 bind; `tests/test_source_mount_served.py` proves the served path.
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R002.1
      Model
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Model.** The mount exposes a directory tree over the source client for declared path prefixes only. An entry carries path, mode, and blob digest. Mount state binds repository identity, base revision, prefix set, and pending changeset identity. A write produces one pending changeset entry with path, operation, and new blob reference. | `tests/test_source_mount.py::test_mount_state_and_entry_models_are_typed`
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R002.2
      Behavior
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Behavior.** Directory entries resolve lazily from the served tree operation. A file read materializes content through the client's blob path, using the local cache where the digest matches. A write appends one entry to the pending changeset and never mutates the mounted revision. A repeated write to one path replaces the earlier entry. A flush submits the pending changeset as one commit through the client. | `tests/test_source_mount.py::test_reads_materialize_and_writes_accumulate`
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R002.3
      Wiring
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Wiring.** The mount is a planned new module under `agent_connector_sdk/`. The connector or host composes it for tools that need files on a filesystem. FUSE is the default backend on hosts that provide it; an overlay copy-up backend covers hosts without FUSE. The SDK keeps no clone, object database, or full checkout behind the mount. | `tests/test_source_mount.py::test_mount_composes_the_source_client`
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R002.4
      Refusal
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Refusal.** The mount refuses to start without an admitted source client or with an unknown prefix. Path traversal and symlink escape outside the mount root refuse on every read and write. A flush whose base revision has changed returns the stable `conflict` code. A failed flush leaves the pending changeset intact and visible. | `tests/test_source_mount.py::test_refusals_preserve_pending_changeset`
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R002.5
      Evidence
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Evidence.** Mount events record repository identity, base revision, prefix set, read count, cache hit count, and pending changeset digest. A flush event binds the commit receipt and per-path outcomes. Diagnostics exclude credentials and private absolute paths. | `tests/test_source_mount.py::test_mount_events_bind_receipts_without_secrets`
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SCM-R002.6
      Hot-path proof
      Definition — SDK-SCM / SDK-SCM — SDK source client and virtual workspaceCanonical requirement and verification source
      **Hot-path proof.** The served test mounts the workspace over the source client against a controlled served `source.*` backend. Reads return exact bytes for declared prefixes and refuse outside them. A write followed by a flush submits exactly one changeset. A second flush after a conflicting change returns `conflict` and keeps the pending changeset intact. | `tests/test_source_mount_served.py::test_served_mount_read_write_and_conflicting_flush`
      requirementSDK-SCMSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST
      SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migration
      specNoneSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R001
      SDK runner completes on generated ConnectorPack and SourceIngest contracts
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R002
      SDK drift classifier quarantines incompatible schema changes
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTVERIFIEDffb9260d7602
      tests/test_schema_drift.py:181
      SDK-SOURCE-INGEST-R003
      SDK records and pauses on proposed schema repairs
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTVERIFIED23f241b07560
      ffb9260d7602
      tests/test_schema_repair.py:138
      SDK-SOURCE-INGEST-R004
      SDK runner performs enterprise source synchronization
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK runner performs enterprise source synchronization.** The connector SDK's runner performs enterprise source synchronization through the generated SourceIngest client and the presets the server declares. It also owns connection profiling and data preparation for enterprise sources. Agent-utilities no longer implements these directly. | Integration tests exercise full, delta, and reconcile enterprise sync paths through the SDK runner and confirm receipt parity.
      requirementSDK-SOURCE-INGESTSPECIFIED23f241b07560
      3735e4434463
      4ce2308afe64
      55bab2b23000
      tests/test_ingest.py:176
      tests/test_ingest.py:193
      tests/test_ingest.py:221
      SDK-SOURCE-INGEST-R005
      SDK adapters cover document, conversation, and feed sources
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIED3735e4434463
      45c6c7c1fd37
      8e87ef9675f0
      db3659c92a3b
      tests/test_adapters_web_fetch_source_adapter.py:54
      tests/test_adapters_web_fetch_source_adapter.py:66
      SDK-SOURCE-INGEST-R005.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R006
      SDK packs own vendor enrichment extraction and write-back
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDb55555566da2
      SDK-SOURCE-INGEST-R006.1
      SDK ports the Uptime Kuma monitor extractor. Defines the typed vendor-extractor contract
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTVERIFIED10376b1e9728
      1cbd1de01d83
      36d2c92e439c
      3735e4434463
      9511ab38c04c
      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
      SDK-SOURCE-INGEST-R006.2
      SDK ports the Ansible Automation inventory and job extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Ansible Automation inventory and job extractor.** The `ansible` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.ansible` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1. It emits a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts the returned `ChangeSet` matches the agent-utilities extractor's node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      9511ab38c04c
      bd6e0d836c92
      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
      SDK-SOURCE-INGEST-R006.3
      SDK ports the Caddy reverse-proxy route extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Caddy reverse-proxy route extractor.** The `caddy` extractor moves onto the `VendorExtractor` contract in SDK-SOURCE-INGEST-R006.1. It comes from `agent_utilities.knowledge_graph.enrichment.extractors.caddy`. It emits a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      9511ab38c04c
      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
      SDK-SOURCE-INGEST-R006.4
      SDK ports the Home Assistant entity and scene extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Home Assistant entity and scene extractor.** The `home_assistant` extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.home_assistant` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1. It emits a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      9511ab38c04c
      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
      SDK-SOURCE-INGEST-R006.5
      SDK ports the ArchiMate model element extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the ArchiMate model element extractor.** The `archimate` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.archimate` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED36d2c92e439c
      3735e4434463
      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
      SDK-SOURCE-INGEST-R006.6
      SDK ports the Kafka topic and cluster extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Kafka topic and cluster extractor.** The `kafka` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.kafka` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED36d2c92e439c
      3735e4434463
      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
      SDK-SOURCE-INGEST-R006.7
      SDK ports the Salesforce CRM record extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Salesforce CRM record extractor.** The `salesforce` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.salesforce` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED36d2c92e439c
      3735e4434463
      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
      SDK-SOURCE-INGEST-R006.8
      SDK ports the Grafana LGTM observability-stack extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Grafana LGTM observability-stack extractor.** The `lgtm` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.lgtm` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      bbf11894fed5
      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
      SDK-SOURCE-INGEST-R006.9
      SDK ports the Microsoft 365 mail, calendar, and Teams extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Microsoft 365 mail, calendar, and Teams extractor.** The `microsoft` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.microsoft` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      bbf11894fed5
      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
      SDK-SOURCE-INGEST-R006.10
      SDK ports the Technitium DNS zone and record extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Technitium DNS zone and record extractor.** The `technitium_dns` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.technitium_dns` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      bbf11894fed5
      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
      SDK-SOURCE-INGEST-R006.11
      SDK ports the Portainer container and stack extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Portainer container and stack extractor.** The `portainer` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.portainer` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      e4f6426897ba
      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
      SDK-SOURCE-INGEST-R006.12
      SDK ports the Emerald Exchange market extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Emerald Exchange market extractor.** The `emerald` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.emerald` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      e4f6426897ba
      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
      SDK-SOURCE-INGEST-R006.13
      SDK ports the Mealie recipe and meal-plan extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Mealie recipe and meal-plan extractor.** The `mealie` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.mealie` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      e4f6426897ba
      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
      SDK-SOURCE-INGEST-R006.14
      SDK ports the Keycloak realm, client, and identity extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Keycloak realm, client, and identity extractor.** The `keycloak` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.keycloak` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      bd6e0d836c92
      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
      SDK-SOURCE-INGEST-R006.15
      SDK ports the Odoo ERP record extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Odoo ERP record extractor.** The `odoo` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.odoo` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      bd6e0d836c92
      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
      SDK-SOURCE-INGEST-R006.16
      SDK ports the Nextcloud file and share extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Nextcloud file and share extractor.** The `nextcloud` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.nextcloud` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      bd6e0d836c92
      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
      SDK-SOURCE-INGEST-R006.17
      SDK ports the wger workout and exercise extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the wger workout and exercise extractor.** The `wger` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.wger` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED10376b1e9728
      3735e4434463
      a41cc47d27d3
      tests/test_vendor_extractors_wger_okta_twenty.py:63
      tests/test_vendor_extractors_wger_okta_twenty.py:90
      SDK-SOURCE-INGEST-R006.18
      SDK ports the Okta identity and directory extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Okta identity and directory extractor.** The `okta` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.okta` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      7f190c51f090
      a41cc47d27d3
      tests/test_vendor_extractors_wger_okta_twenty.py:122
      tests/test_vendor_extractors_wger_okta_twenty.py:98
      SDK-SOURCE-INGEST-R006.19
      SDK ports the Twenty CRM record extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Twenty CRM record extractor.** The `twenty` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.twenty` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      7f190c51f090
      a41cc47d27d3
      tests/test_vendor_extractors_wger_okta_twenty.py:130
      tests/test_vendor_extractors_wger_okta_twenty.py:167
      SDK-SOURCE-INGEST-R006.20
      SDK ports the RSA Archer GRC record extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the RSA Archer GRC record extractor.** The `archer` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.archer` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      e626b457bb1d
      tests/test_vendor_extractors_archer_infra_a2a.py:30
      tests/test_vendor_extractors_archer_infra_a2a.py:52
      SDK-SOURCE-INGEST-R006.21
      SDK ports the Infrastructure inventory extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Infrastructure inventory extractor.** The `infra` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.infra` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      e626b457bb1d
      tests/test_vendor_extractors_archer_infra_a2a.py:60
      tests/test_vendor_extractors_archer_infra_a2a.py:84
      SDK-SOURCE-INGEST-R006.22
      SDK ports the A2A agent-registry extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the A2A agent-registry extractor.** The `a2a` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.a2a` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      e626b457bb1d
      tests/test_vendor_extractors_archer_infra_a2a.py:118
      tests/test_vendor_extractors_archer_infra_a2a.py:92
      SDK-SOURCE-INGEST-R006.23
      SDK ports the Grafana dashboard extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Grafana dashboard extractor.** The `grafana` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.grafana` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED1cbd1de01d83
      3735e4434463
      tests/test_vendor_extractors_grafana_leanix_erpnext.py:30
      tests/test_vendor_extractors_grafana_leanix_erpnext.py:63
      SDK-SOURCE-INGEST-R006.24
      SDK ports the LeanIX enterprise-architecture factsheet extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the LeanIX enterprise-architecture factsheet extractor.** The `leanix` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.leanix` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED1cbd1de01d83
      3735e4434463
      tests/test_vendor_extractors_grafana_leanix_erpnext.py:103
      tests/test_vendor_extractors_grafana_leanix_erpnext.py:71
      SDK-SOURCE-INGEST-R006.25
      SDK ports the ERPNext record extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the ERPNext record extractor.** The `erpnext` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.erpnext` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED1cbd1de01d83
      3735e4434463
      tests/test_vendor_extractors_grafana_leanix_erpnext.py:111
      tests/test_vendor_extractors_grafana_leanix_erpnext.py:152
      SDK-SOURCE-INGEST-R006.26
      SDK ports the ServiceNow ITSM record extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the ServiceNow ITSM record extractor.** The `servicenow` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.servicenow` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      9d8b3f7f89f1
      tests/test_vendor_extractors_servicenow_ciso_social.py:38
      tests/test_vendor_extractors_servicenow_ciso_social.py:68
      SDK-SOURCE-INGEST-R006.27
      SDK ports the CISO Assistant compliance extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the CISO Assistant compliance extractor.** The `ciso_assistant` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.ciso_assistant` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      9d8b3f7f89f1
      tests/test_vendor_extractors_servicenow_ciso_social.py:111
      tests/test_vendor_extractors_servicenow_ciso_social.py:76
      SDK-SOURCE-INGEST-R006.28
      SDK ports the social-platform extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the social-platform extractor.** The `social` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.social` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      9d8b3f7f89f1
      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
      SDK-SOURCE-INGEST-R006.29
      SDK ports the ARIS process-model extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the ARIS process-model extractor.** The `aris` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.aris` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED10376b1e9728
      3735e4434463
      tests/test_vendor_extractors_aris_egeria_camunda.py:30
      tests/test_vendor_extractors_aris_egeria_camunda.py:54
      SDK-SOURCE-INGEST-R006.30
      SDK ports the Egeria governance and glossary extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Egeria governance and glossary extractor.** The `egeria` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.egeria` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED10376b1e9728
      3735e4434463
      tests/test_vendor_extractors_aris_egeria_camunda.py:62
      tests/test_vendor_extractors_aris_egeria_camunda.py:93
      SDK-SOURCE-INGEST-R006.31
      SDK ports the Camunda process extractor
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ports the Camunda process extractor.** The `camunda` vendor enrichment extractor moves from `agent_utilities.knowledge_graph.enrichment.extractors.camunda` onto the `VendorExtractor` contract defined in SDK-SOURCE-INGEST-R006.1, emitting a `ChangeSet` of `Entity`/`Relationship` records instead of agent-utilities' `ExtractionBatch`. | A unit test feeds a fake client through the ported `extract`. It asserts that the returned `ChangeSet` matches the agent-utilities node/edge shape for representative input.
      requirementSDK-SOURCE-INGESTVERIFIED10376b1e9728
      3735e4434463
      tests/test_vendor_extractors_aris_egeria_camunda.py:101
      tests/test_vendor_extractors_aris_egeria_camunda.py:122
      SDK-SOURCE-INGEST-R007
      Drift gate runs inside the SDK connector-sync runner
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Drift gate runs inside the SDK connector-sync runner.** The schema-drift gate covers classification, shaping, and reporting. It runs inside the connector SDK's sync runner between draining and applying a page, not in agent-utilities. Candidate schema rendering, the contract store, and activation live in epistemic-graph, not the SDK. | Integration tests confirm the drift gate executes within the SDK runner's drain and apply sequence. Tests also confirm that no SHACL rendering or activation call originates from the SDK.
      requirementSDK-SOURCE-INGESTVERIFIEDffb9260d7602
      tests/test_schema_drift.py:206
      SDK-SOURCE-INGEST-R008
      Connectors ingest occurrence and weather observations
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTVERIFIED289aadb634d8
      3735e4434463
      83b7dd3f33eb
      tests/test_earth_observation_records.py:38
      tests/test_earth_observation_records.py:54
      tests/test_earth_observation_records.py:66
      SDK-SOURCE-INGEST-R009
      Taxonomy connector ingests NCBI/GBIF taxa as kg:Taxon
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Taxonomy connector ingests NCBI/GBIF taxa as kg:Taxon.** A taxonomy connector ingests NCBI Taxonomy and GBIF backbone taxa as kg:Taxon individuals. Each individual carries rank, parent, scientific name, NCBI and GBIF identifiers, and a term CURIE. The connector validates each individual against the world_model-v1 TaxonShape and synchronizes deltas within bounds. | Contract tests validate ingested taxa against TaxonShape and confirm delta synchronization stays within its configured bound.
      requirementSDK-SOURCE-INGESTVERIFIED3735e4434463
      bfe88b9d8521
      ff4c1aaafc8a
      tests/test_taxonomy_records.py:29
      tests/test_taxonomy_records.py:40
      tests/test_taxonomy_records.py:50
      SDK-SOURCE-INGEST-R010
      SDK ships the ingest worker runner `run_ingest_worker` (unblocks `EG-INGEST-WORKER-R001.14`)
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **SDK ships the ingest worker runner `run_ingest_worker` (unblocks `EG-INGEST-WORKER-R001.14`).** New module `agent_connector_sdk/runner/ingest_worker.py` holds one function `run_ingest_worker`. It asks the engine, through the generated client, for admission, lane floors and routing. It then claims a job and runs the job body with the existing source-effect runners. It acks success or failure and commits only after the ack (at-least-once). The worker holds no scheduling policy of its own. It has no priority, lane, concurrency or retry-schedule constants. Every such value comes from the engine reply. EG holds no source credentials. | `tests/runner/test_ingest_worker.py` uses a fake client. It asserts that the ack follows execution and that a killed body sends no ack. A refused admission or an absent lane floor makes the worker wait or exit rather than choose a value.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R011
      SDK ships the `ingest-worker` command (unblocks `EG-INGEST-WORKER-R001.15`)
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R012
      Platform reads and searches use declared backend fallback chains
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R012.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R012.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R012.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R012.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R012.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R012.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R001.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R001.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R001.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R001.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R001.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R001.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.7
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.8
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.9
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.10
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.11
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.12
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.13
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.14
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.15
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.16
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.17
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.18
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.19
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.20
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.21
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.22
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.23
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.24
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.25
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** Scheduled job carries six-hour period, durable clock identity, and execution receipt linkage. Job carries run timestamp, proposed paper set digest, relevance score ranges per goal, and admission threshold. Receipt binds run, ingested papers, exclusions and durable admission proof. | Contract tests validate job structure, timestamp monotonicity and receipt binding.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.26
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** Each six-hour cycle claims owned papers against goal-weighted relevance scores and per-goal admission thresholds. Failures and misses remain visible. Retried runs deduplicate on run identity, restarting from the last accepted receipt. Relevance exclusions prevent re-scoring rejected papers. | SI-25 proves job cycles, deduplication and restart boundaries.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.27
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** Clock fixture serves six-hour boundaries; Engine-approved durable scheduler publishes job runs. SDK claims runs, feeds proposed papers to relevance producer, receives scores and thresholds, applies selection, then links accepted ingestion receipts to job run before committing. | SI-26 enters scheduler service and proves job claim, decision and receipt linkage.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.28
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** Refuse out-of-window jobs, missing relevance scores, failed relevance producer, absent admission thresholds and denied scheduler access. A failed proposal batch never advances job progress. Misaligned clock makes the six-hour boundary refuse. | SI-27 proves boundary enforcement, producer failure visibility and clock alignment.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.29
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Job receipts bind run identifier, cycle boundary, proposed digest and relevance producer. They also bind goal set, thresholds, accepted paper count, exclusion reasons and ingestion receipt. Record relevance decision provenance without claim-body details. Redact credentials and scheduler secrets. | SI-28 proves job identity stability, goal traceability and redacted relevance.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.30
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The entry point test `tests/test_scheduled_job_serve` runs the six-hour clock and scheduled-job handler through actual engine dispatch. Observe job claim with proposed papers, score receipt, selection, and ingestion commitment. Restart the job after one cycle and prove deduplication. Deny scheduler access and prove typed refusal. | SI-29 requires real engine scheduler, paper proposal, relevance service and graph commitment.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.31
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** ResearchPaper carries exact canonical identifiers, revision digest, extracted-fact source provenance, and citation-edge declarations. CitationCount is marked as non-constructive reference; extraction edges are authoritatively ingested. Per-paper metadata-extraction refusal has no effect on healthy papers. Unidentified-paper identity allows missing metadata from unavailable documents. | SI-30 validates provenance binding, refusal specificity and identity bounds.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.32
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** Extract research paper facts with source-attributed fields and citation edges through native EG assertion. An unidentified paper preserves available metadata without requiring document retrieval. Missing document produces per-paper refusal with visible reason, not empty successful import. Rejection of one paper never blocks healthy papers in the same run. | SI-31 proves citation-edge assertion, per-paper refusal and mixed outcomes.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.33
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** Link `McpToolSourceAdapter.extract` at `agent_connector_sdk/adapters/mcp_tool.py:118` to generated SourceIngest citation-edge producer. Generate typed paper records with provenance fields. Connector papers feed assertion through the same source path, preserving unidentified-paper identity when metadata is incomplete. EG asserts facts; SDK transports metadata only. | SI-32 traces connector papers through SourceIngest to graph assertion.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.34
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** Refuse malformed identities, missing canonical ID, impossible revisions and denied assertion scope before effects. Allow unidentified metadata when the document cannot be obtained. Return per-paper failure with typed reason. Never invent metadata or assert extracted facts without document-source provenance. | SI-33 proves identity validation, document-required assertion and visible per-paper refusal.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.35
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Each paper record binds provider, canonical ID, revision digest, extracted-field sources, citation-edge digest and assertion receipt. Unidentified papers carry available metadata with null or document-unavailable source markers. Rejection evidence includes identity and typed reason. Redact raw content and credentials. | SI-34 proves field provenance, edge assertion binding and fact sourcing.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.36
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The entry point test `tests/test_citation_extraction_served.py::test_paper_facts_and_edges` calls registered connector through tools/call with paper metadata. Ingest typed papers with citation edges into a running graph, then read back assertions with field provenance. Include one unidentified-paper case and one per-paper refusal; prove zero fabricated facts and no effect on healthy papers. | SI-35 requires real connector papers, graph assertion and independent readback.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.37
      Git-markdown domain packs with lineage and diff-based re-ingest
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Git-markdown domain packs with lineage and diff-based re-ingest.** `agent_connector_sdk.adapters.document_sources.GitMarkdownDocumentSource` reads one `DomainPack` (name, globs, doc_type) from a git repository at `HEAD`. Each document carries `corpus`, `relpath`, `git_commit`, `doc_type`, a bare 64-hex `evidence_digest` and, from frontmatter, `conceptIds` as one string. Its source reference is `git-markdown://<namespace>/<relpath>?rev=<commit>`. Record ids are stable per pack and path. `ingest_documents` stores the commit as the provider cursor in epistemic-graph's durable checkpoint. The next run diffs from it, re-ingests only touched files and withdraws deleted ones. | `tests/test_document_sources.py::test_two_domain_packs_ingested_with_lineage`, `tests/test_document_sources.py::test_incremental_change_updates_only_the_touched_file`.
      requirementSDK-SOURCE-INGESTVERIFIEDed3b2f7f83d5
      tests/test_document_sources.py:105
      tests/test_document_sources.py:143
      SDK-SOURCE-INGEST-R005.38
      Filesystem document source with a live ingestion path
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Filesystem document source with a live ingestion path.** `FilesystemDocumentSource` reads text files under one authorized root. It skips symlinks, escapes, hidden paths and other formats, and polls after the largest accepted modification time. `ingest_documents` commits the documents through `KnowledgeIngest` and the generated SourceIngest request. A re-run over an unchanged tree submits nothing. Persisted ids and references use a hashed namespace and the relative path, never the local root. | `tests/test_document_sources.py::test_filesystem_connector_ingestion_live_path`.
      requirementSDK-SOURCE-INGESTVERIFIEDed3b2f7f83d5
      tests/test_document_sources.py:179
      SDK-SOURCE-INGEST-R005.39
      Governed document ingest applies the permission envelope before embedding
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Governed document ingest applies the permission envelope before embedding.** `ingest_documents(..., governance=...)` stamps each document with the access the governance callable resolves before submission, so epistemic-graph embeds only enveloped records. A `GovernanceRefusedError` keeps that document out of the change set and holds the provider cursor. With no admitted document nothing is submitted and the durable checkpoint is unchanged. | `tests/test_document_sources.py::test_governed_connector_applies_envelope_before_embedding`, `tests/test_document_sources.py::test_governed_connector_failure_blocks_document_and_checkpoint`, `tests/test_document_sources.py::test_governance_failure_leaves_real_engine_checkpoint`.
      requirementSDK-SOURCE-INGESTVERIFIEDed3b2f7f83d5
      tests/test_document_sources.py:258
      tests/test_document_sources.py:296
      tests/test_document_sources.py:313
      SDK-SOURCE-INGEST-R005.40
      Web-source fetch contract (rollup)
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Web-source fetch contract (rollup).** The SDK must define one typed contract for a connector that fetches and extracts web pages. A connector implements it with the per-operation tools `web_fetch` and `web_extract`. The SDK must not fetch or extract a page itself. `fetch_page` and `WebFetchSourceAdapter` become consumers of a connector that implements the contract. The primary implementation is `CONN-WEBARCHIVER-WEB-SOURCE`. The secondary implementation is `CONN-ARCHIVEBOX-API-WEB-SOURCE`. Children `.40.1` to `.40.6` deliver it. | See each child.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.40.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** `agent_connector_sdk/ports/web_source.py` holds frozen `WebFetchRequest{url, max_bytes, accepted_types, timeout_s, job_ref}`. It also holds `WebPageResult{url, canonical_url, final_url, status, content_type, byte_count, content_digest, retrieved_at, title, author, published_at, outbound_links, text_markdown, backend}` and `WebFetchRefusal{reason, detail}`. A `kind` field tells a page from a refusal. Closed reasons are `robots_disallowed`, `rate_limited`, `size_exceeded`, `unsupported_type`, `egress_denied`, `policy_refused`, `extract_empty` and `upstream_failed`. The default `max_bytes` is 5 MiB. `register_web_source_tools(server, source)` serves `web_fetch` and `web_extract` over a connector's `WebSource`. A `WebSourceRefused` becomes a refusal result, and a digest that does not match the text refuses with `upstream_failed`. Proving test: `tests/test_web_source_contract.py::test_models_round_trip`. | A round trip keeps every field and rejects an unknown reason or a malformed digest.
      requirementSDK-SOURCE-INGESTVERIFIEDa775ed2ea1ef
      e35075fa40ff
      tests/test_web_source_contract.py:125
      tests/test_web_source_contract.py:181
      tests/test_web_source_contract.py:212
      SDK-SOURCE-INGEST-R005.40.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** The contract states five connector obligations. The connector must obey `robots.txt` for its declared user agent. It must keep a per-domain rate limit, with a default of 1 request per second. It must stop reading at `max_bytes` and refuse an unlisted content type. `content_digest` must be the SHA-256 of the returned text. `RobotsRules` and `DomainRateLimiter` are the shared helpers for the first two; the connector provides the `robots.txt` loader. The conformance kit `agent_connector_sdk/testing/web_source_conformance.py` checks each obligation and the tool schemas against the `RoutedHttpServer` fixture site in `agent_connector_sdk/testing/http_server.py`. Each connector runs the kit against itself. Proving test: `tests/test_web_source_contract.py::test_conformance_kit_flags_each_obligation`. | The kit passes a conforming fixture connector and names each broken obligation of a broken one.
      requirementSDK-SOURCE-INGESTVERIFIED36bc3184a30e
      a775ed2ea1ef
      e202f57c928d
      tests/test_web_source_contract.py:167
      SDK-SOURCE-INGEST-R005.40.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** `WebFetchSourceAdapter.extract` at `agent_connector_sdk/adapters/web_fetch.py:182` must call the connector `web_extract` tool through the MCP session, not `fetch_page`. `ConnectorWorker._sync` at `agent_connector_sdk/runner/worker.py:180` reaches it. The ingest worker runner of `SDK-SOURCE-INGEST-R010` runs the `WebPage` jobs of `EG-UNIFIED-DATA-PLANE-R651.7.1` through this adapter. The source sync runner `SourceSyncRunner.sync` submits the records. Certification reads the contract from `register_tool_surface` at `agent_connector_sdk/mcp/tool_surface.py:198`. Proving test: `tests/test_adapters_web_fetch_source_adapter.py::test_extract_calls_connector_tool`. | The adapter calls the connector tool once per page and makes no direct HTTP request.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.40.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** A connector refusal must reach the caller as `WebFetchRefusal` with its closed reason. The adapter must not return `None` or an empty page. A refused page must not advance the checkpoint. A connector without the certified contract must refuse with `contract_uncertified`. Proving test: `tests/test_adapters_web_fetch_source_adapter.py::test_refusal_keeps_checkpoint`. | Each case returns its reason and leaves the checkpoint unchanged.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.40.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Each `SourceRecord` must carry the URL, the canonical URL, the retrieval time, the content digest and the backend. It must carry the query text, the query digest and the rank when the job names them. The fields map one to one onto `WebDocumentProvenance` of `EG-UNIFIED-DATA-PLANE-R651.7.1`. Proving test: `tests/test_adapters_web_fetch_source_adapter.py::test_record_provenance_matches_engine_model`. | The record fields equal the engine model fields.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R005.40.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The test starts two fixture connectors with the SDK server factory. Each connector implements the contract. The test runs `connector-sync --once` against a running engine for one page per connector. Proving test: `tests/test_web_source_served.py::test_two_backends_produce_equal_records`. | The engine holds equal records for both connectors, except for the `backend` field.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R006.32
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R006.33
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R006.34
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R006.35
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R006.36
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R006.37
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.7
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.8
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.9
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.10
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.11
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.12
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.13
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** Repository delta index state includes changed-file set, semantic-type metadata per file or class, parser versions and storage layout revision. Index incremental state preserves sequence numbers and schema alignment. Peak memory budget and completion resource release are explicit fields. | Contract tests validate state structure, sequence monotonicity and type coverage.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.14
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** Delta indexing reads unchanged files once and computes indexes only for changed files. Semantic type resolution binds declared language matrix and optional extended type analysis. Resource release completes all in-memory structures after indexing. Bounded peak memory prevents unbounded trees from growing. | SI-36 proves changed-file-only indexing, type handling and memory release.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.15
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** Extend SourceAdapter at `agent_connector_sdk/ports/source_adapter.py:21` with incremental repository state and indexed-file results. McpToolSourceAdapter.extract at `agent_connector_sdk/adapters/mcp_tool.py:118` maps index pages. ConnectorWorker._sync at `agent_connector_sdk/runner/worker.py:180` calls sync_stream at `agent_connector_sdk/runner/syncing.py:200` with incremental state updates. Type resolution integrates existing type registries. | SI-37 enters real incremental flow and observed memory measurements.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.16
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** Refuse unsupported languages, invalid type modes, stale sequence numbers and mismatched schema versions. Unchanged-file requests never trigger re-indexing. Failed indexing of one file blocks no other files. Refuse completion before all indexed files release resources. | SI-38 proves type-mode validation, single-file isolation and resource cleanup.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.17
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Each indexed page binds repository, sequence, changed-file set digest and parser versions. It also binds semantic-type mode, language coverage, peak resident bytes and resource release timestamp. Record which files were reindexed and type resolution outcome per file. Redact credentials and absolute paths. | SI-39 proves indexing decisions, per-file type binding and peak memory attribution.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.18
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The entry point test `tests/test_incremental_index_served.py::test_delta_semantics_and_memory` registers a repository connector through tools/call. It runs connector-sync with a running graph. Index one state, commit it, and change a subset of files. Prove the incremental index contains only changed files, and measure peak memory within bounds. Swap the type mode and prove resolution changes. Complete the run and confirm resource release. | SI-40 requires real incremental flow, dual type modes, in-process memory measurement and post-completion validation.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R004.19
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** `IngestSourceSpec` in `agent_connector_sdk/ingest/sources.py` declares one ingestible source. It names the source ID, record type, read-only tools, records path, ID field, cursor field and incremental support. A connector declares each source with `source_meta` on the read tool (`SDK-CONNECTOR-CONTROL-R075.2`). An incremental source must name a cursor field. Source IDs must be unique. | `tests/test_source_sync.py::test_declaration_validates_sources` refuses a duplicate ID, an empty tool list and an incremental source without a cursor field.
      requirementSDK-SOURCE-INGESTVERIFIEDe877477e46b8
      tests/test_source_sync.py:122
      SDK-SOURCE-INGEST-R004.20
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** `SourceSyncRunner.sync` in `agent_connector_sdk/ingest/source_sync.py` calls the declared tools page by page through an MCP session. It maps each record to a typed entity with provenance. It submits batches to the engine `SourceIngest` method through `KnowledgeIngest`. It skips a record whose content digest is unchanged. An incremental run skips records at or before the stored cursor. | `tests/test_source_sync.py::test_runner_submits_typed_batches_once` runs twice over one fixture page set and submits each record once.
      requirementSDK-SOURCE-INGESTVERIFIEDe877477e46b8
      tests/test_source_sync.py:134
      SDK-SOURCE-INGEST-R004.21
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** `register_tool_surface` (`agent_connector_sdk/mcp/tool_surface.py`) serves the declared sources at the resource `connector://resources`. `KvSourceCheckpoints` stores each source checkpoint through engine `KvGet` and `KvCas` with the shared scope. The key is `ingest-source/<connector>/<source>`. | `tests/test_source_sync.py::test_tool_surface_serves_declarations` reads the resource and returns the declared sources.
      requirementSDK-SOURCE-INGESTVERIFIED8853950ea5be
      e877477e46b8
      tests/test_source_sync.py:159
      tests/test_source_sync.py:241
      SDK-SOURCE-INGEST-R004.22
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** The runner must refuse an undeclared source with `unknown_source`. It must refuse a tool that the session does not mark read-only with `not_read_only`. A tool failure retries with bounded exponential backoff. Page, record and time budgets end a run as `partial`. A checkpoint conflict ends the run without advancing the cursor. | `tests/test_source_sync.py::test_runner_refusals_and_budgets` covers each refusal, the retry limit and a partial run.
      requirementSDK-SOURCE-INGESTVERIFIEDce0f7eaf04e2
      e877477e46b8
      tests/test_source_sync.py:184
      SDK-SOURCE-INGEST-R004.23
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** `SourceSyncReport` names the connector, source, mode, pages, records seen, records submitted and records unchanged. It names each batch receipt digest, the cursor before and after, and the final state. The report holds no credential and no record payload. | `tests/test_source_sync.py::test_report_binds_receipts` compares report batch digests with the engine receipts.
      requirementSDK-SOURCE-INGESTVERIFIED6519a20529e9
      e877477e46b8
      tests/test_source_sync.py:209
      SDK-SOURCE-INGEST-R004.24
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** `tests/test_source_sync_served.py::test_sync_runner_against_real_engine` starts the engine server binary on a temporary store. It calls a fixture connector through a real MCP client session. The checkpoint lives in real shared-scope KV. The engine refuses a record type that no imported connector pack maps. The runner must report `ingest_refused` and store no record digest. A successful sync with node read-back is `ARBORA-OPS-R020.6.6`. | The test observes the refusal, the failed KV checkpoint and zero written nodes.
      requirementSDK-SOURCE-INGESTVERIFIEDce0f7eaf04e2
      tests/test_source_sync_served.py:96
      SDK-SOURCE-INGEST-R004.25
      Pack mapping
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Pack mapping.** The engine admits a source record only under `connector:<connector>#mappings/<record type>` of an imported connector pack. A declared record type must name a `schema_mappings` entry of the declaration. The connector serves it at `connector://resources`, so fleet onboarding imports the mapping. | A connector test resolves each declared record type in the `schema_mappings` of its declaration.
      requirementSDK-SOURCE-INGESTVERIFIED6519a20529e9
      tests/test_source_sync.py:265
      SDK-SOURCE-INGEST-R004.26
      Citable fields
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Citable fields.** `IngestBinding.citable_fields` names location fields whose value is a public `http(s)` URL the record cites, such as a public web page's `source_uri`. `PersistencePrivacyGuard(citable_fields=...)` keeps such a value: an absolute `http(s)` URL with no credentials whose host is public (`agent_connector_sdk.privacy.public_http_url`). Any other value of a citable field, and every other location field, is still redacted; redaction stays the default. Proving test: `tests/test_ingest_citable_fields.py::test_citable_fields_keep_public_urls_and_nothing_else`. | A cited public URL survives `build_request`; an uncited location field, a default binding, and a loopback, private, credentialed or non-HTTP URL are redacted.
      requirementSDK-SOURCE-INGESTVERIFIED5199756f499e
      865af0861030
      c4795a2e0d04
      tests/test_ingest_citable_fields.py:36
      tests/test_ingest_citable_fields.py:55
      tests/test_ingest_citable_fields.py:75
      SDK-SOURCE-INGEST-R004.27
      Operator-approved mass withdrawal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Operator-approved mass withdrawal.** `EpistemicGraphSink.import_pack` takes `allow_mass_withdrawal`, as does `SinkPort`. The sink passes it to the engine's `ConnectorPack` import. It lets a pack withdraw over half of its published surface. A connector moving to one tool per operation does that. The engine then requires `admin:connector-pack`. The default is false. Proving test: `tests/test_contracts_and_sink.py::test_sink_passes_the_mass_withdrawal_decision_to_the_engine`. | The engine import request carries `allow_mass_withdrawal` exactly as the caller passed it.
      requirementSDK-SOURCE-INGESTVERIFIEDc4795a2e0d04
      tests/test_contracts_and_sink.py:593
      SDK-SOURCE-INGEST-R004.28
      Per-parent fan-out
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Per-parent fan-out.** `IngestSourceSpec.for_each` (`agent_connector_sdk/ingest/for_each.py`) is `{source, argument, field}`. `source` names the parent source. `argument` names the tool argument that receives the value. `field` names the parent record field and defaults to `id`. `SourceSyncRunner.sync(spec, sources=...)` sweeps the parent source. It then runs the child once per distinct parent value with that argument filled in. A sync preset with `for_each` does the same in `McpToolSourceAdapter`. The checkpoint position holds the parent index (`__fan`) beside the page position. The watermark advances after the last parent. A fan-out covers at most `MAX_FAN_OUT` (200) parent values. `SyncBudget.max_fan_out` and the adapter's `max_fan_out` set the bound. More parent values end the run as `fan_out_exceeded`. A parent source that is not declared ends as `unknown_parent_source`. A chain that returns to itself ends as `for_each_cycle`. The declaration loader rejects both. A runner without the parent reports the same code. The JSON Schema of `connector://resources` carries `for_each`. | `tests/test_for_each.py` fans out over three parents. It rejects a missing parent and a cycle. It caps the fan-out. It serves `for_each` in the schema. It pages each parent through the preset adapter.
      requirementSDK-SOURCE-INGESTVERIFIED2078ee0208c5
      531ffd4a90d4
      tests/test_for_each.py:105
      tests/test_for_each.py:122
      tests/test_for_each.py:140
      tests/test_for_each.py:152
      tests/test_for_each.py:180
      SDK-SOURCE-INGEST-R004.29
      Declarations are data the SDK reads
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Declarations are data the SDK reads.** `agent_connector_sdk.ingest.load_declaration(package)` returns the `IngestSourceDeclaration` of a package. It reads `SOURCES`, `SCHEMA_MAPPINGS`, `RESOURCES`, optional `FIELD_SETS` and optional `SCHEMA_VERSION` from `connector_sources`. The fleet name comes from the declared connector identity. A mapping lists shared `field_sets` by name, and its inline `fields` win. A field set appears once per file. The reader accepts `SCHEMA_VERSION` 1 (inline fields) and 2 (shared field sets). Any other version raises `DeclarationError`. An unknown field set, a duplicate `source_id` or a missing module raises it too. No connector holds a `declaration()` function. The conformance plugin fails a module that defines one. | `tests/test_load_declaration.py` expands shared sets and reads a version 1 file. It lets inline fields win. It refuses an unknown set, an unknown version and a missing module. `tests/test_conformance_plugin.py` rejects a module with `declaration()`.
      requirementSDK-SOURCE-INGESTVERIFIEDaa58c5dd6858
      tests/test_load_declaration.py:35
      tests/test_load_declaration.py:48
      tests/test_load_declaration.py:54
      tests/test_load_declaration.py:63
      tests/test_load_declaration.py:73
      SDK-SOURCE-INGEST-R004.30
      A connector declares its record mappers; the SDK owns the rest
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **A connector declares its record mappers; the SDK owns the rest.** `agent_connector_sdk.ingest.RecordMap` declares one record kind as data: `node_type`, `id_template`, `id_keys`, `fields` (property to record key, dotted keys read nested maps), `external_id`, `constants` and `EdgeMap` relationships. An `EdgeMap` skips an empty target field and emits its target once as an entity when `target_type` is set. A mapper may instead be a function that fills `Mapped` (`entity`, `edge`, `document`; a repeated entity id is kept once). The SDK owns `entity_from_record`, `relationship_from_record`, `document_from_record`, `read_field` (raises `IngestError` for a missing, empty or mistyped required field), `records_of`, `ext_id` and `slug`. A connector `kg_ingest.py` holds only mappers and one `SourceStream`; it holds no `_to_entity`, `_to_relationship`, `ingest_entities` or `ingest_documents` body. | `tests/test_ingest_mapping.py` maps a declared kind with fields, external id and edges. It skips and, when strict, refuses a record with no id. It emits a shared edge target once. It refuses a missing required field and a wrong field type.
      requirementSDK-SOURCE-INGESTVERIFIED2487b614c171
      tests/test_ingest_mapping.py:102
      tests/test_ingest_mapping.py:41
      tests/test_ingest_mapping.py:72
      tests/test_ingest_mapping.py:79
      tests/test_ingest_mapping.py:86
      SDK-SOURCE-INGEST-R004.31
      One `SourceStream` is the ingest entry
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **One `SourceStream` is the ingest entry.** `SourceStream(binding, mappers)` (or `SourceStream.for_package`) is the only ingest entry of a connector. `entities`, `documents`, `mapped` and `records(kind, records)` submit one change set through the process `KnowledgeIngest` (or the `ingest=` argument) and return `{"nodes": n, "edges": n}`. An empty input or an unknown record kind raises `IngestError`. `sync(kind, fetch_page)` walks `fetch_page(cursor) -> (records, next_cursor)`. It resumes from the stream's accepted cursor and commits each page with its next cursor. It stops on a missing or repeated cursor or at `max_pages`. `open_client(get_client)` opens the connector client, sync or async, and closes it. | `tests/test_ingest_stream.py` ingests entities, documents and kinds with counts. It refuses empty and unknown input. It pages three pages, commits each cursor and resumes a second run from the accepted cursor. `open_client` closes a sync and an async client.
      requirementSDK-SOURCE-INGESTVERIFIED2487b614c171
      tests/test_ingest_stream.py:110
      tests/test_ingest_stream.py:141
      tests/test_ingest_stream.py:72
      tests/test_ingest_stream.py:95
      SDK-SOURCE-INGEST-R004.32
      `SourceStream` covers best-effort, split-stream, media and mixed submissions
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **`SourceStream` covers best-effort, split-stream, media and mixed submissions.** With `best_effort=True`, every method returns `None` instead of raising. It returns `None` for empty input, an unknown kind and an entity without an id. It also returns `None` for a document without an id or text. A refused commit and an unavailable engine return `None` too. `document_binding` (or `for_package(..., documents_stream=)`) sends documents to a second stream. A mapped result that holds both then commits as two change sets. `batch(entities, relationships, documents)` commits one mixed change set. `media(data, mime_type, id=, name=, properties=)` stores bytes and their asset record, and refuses empty bytes. `submit(change_set, binding=)` is the one commit path. Use it for a reconcile or any change set the other methods skip. | `tests/test_ingest_stream.py` covers best-effort refusal and filtering, the split document stream, `batch`, `media` and `submit` with another binding.
      requirementSDK-SOURCE-INGESTVERIFIED07aa2957dd25
      tests/test_ingest_stream.py:178
      tests/test_ingest_stream.py:210
      tests/test_ingest_stream.py:227
      SDK-SOURCE-INGEST-R004.33
      `sync` takes a cursor strategy; `mapped` takes a batch size
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **`sync` takes a cursor strategy; `mapped` takes a batch size.** A `CursorStrategy` gives the first cursor and the cursor after each page. `OffsetCursor(page_size)` counts records read. `KeysetCursor(key, page_size)` continues from the last record's key, which fits primary-key paging and object-listing markers. `TimeWindowCursor(start, window, end)` walks fixed time windows, and an empty window still advances. `HighWaterCursor(key)` continues from the greatest `key` read, so a run reads only changes since the accepted mark. With a strategy, `fetch_page(cursor)` returns only the records. Each page commits with its next cursor, and a later run resumes from the accepted cursor. `SourceStream(batch_size=n)` commits a mapped result in batches of `n`: all entities first, then the relationships, each batch anchored to one entity. | `tests/test_ingest_strategies.py` walks offset pages and resumes from the accepted cursor. It checks key-set, window and refusal cases, and the batch order.
      requirementSDK-SOURCE-INGESTVERIFIED840277a9b0a4
      tests/test_ingest_strategies.py:105
      tests/test_ingest_strategies.py:198
      tests/test_ingest_strategies.py:299
      tests/test_ingest_strategies.py:79
      SDK-SOURCE-INGEST-R004.34
      A projection, a guard and a size limit run inside the one `submit` path
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **A projection, a guard and a size limit run inside the one `submit` path.** `SourceStream(projection=)` rewrites each change set before the commit. `Pseudonymizer(connector, prefix, key, redact)` is the standard projection. It replaces each entity and document id with `<prefix>:<type>:<digest>`. The digest is HMAC-SHA256 separated by connector and type. It rewrites relationship endpoints that name a record of the same change set. It drops the `redact` properties. It refuses a key under 32 bytes and an empty id. `before_submit(binding, change_set)` raises `IngestError` to stop a commit. `max_records` refuses an oversized change set. `scoped(suffix, **binding_fields)` gives a per-account stream. `submit_receipt` returns the engine receipt. | `tests/test_ingest_strategies.py` checks opaque ids, edges and redaction. It checks the key and id refusals. It checks the guard, the limit, the scoped binding and the receipt.
      requirementSDK-SOURCE-INGESTVERIFIED840277a9b0a4
      tests/test_ingest_strategies.py:129
      tests/test_ingest_strategies.py:155
      tests/test_ingest_strategies.py:168
      SDK-SOURCE-INGEST-R004.35
      Ingest tools are declared as data and registered by the SDK
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Ingest tools are declared as data and registered by the SDK.** `IngestTool(name, title, source, kind, paged, strategy)` declares one tool. `ingest_registration(stream, tools, get_client)` returns a registrar for `Connector(extra_registrations=)`. The registrar opens and closes the client, calls `source`, then maps and commits through the stream. It registers the tool with a title, `readOnlyHint` false, `idempotentHint`, `openWorldHint` true and the tags `ingest` and `mutating`. The tool arguments are the `source` parameters after the client. A source may return a `Mapped` or records for `kind`. A paged source walks `sync` with its strategy. A paged tool with no `kind` is refused. | `tests/test_ingest_strategies.py` lists the tools over MCP and reads annotations and schema. It runs a record tool, a mapped tool and a paged tool. It checks that each run closes the client.
      requirementSDK-SOURCE-INGESTVERIFIED840277a9b0a4
      d0b3de5b772d
      tests/test_ingest_strategies.py:212
      tests/test_ingest_strategies.py:290
      tests/test_ingest_strategies.py:321
      SDK-SOURCE-INGEST-R004.36
      Declared sources carry edges to the records their reference fields name
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Declared sources carry edges to the records their reference fields name.** `IngestSourceSpec.edges` holds `EdgeSpec` entries, the declarative form of `EdgeMap`. So `source_meta(edges=...)` declares owner, steward, assignment and membership references in `connector://resources`. `target_field` is a dotted path, and a list on the path is read element-wise. A mapping reference reads its id from `target_id_key`, for example a ServiceNow `value`. `target_id_template` forms the target id and defaults to `{type}:{id}`. `SourceSyncRunner` emits one `target_type` record per referenced id with its `target_fields`. It also emits one relationship from the record to that target. With `target_stream`, the edge names that source's own record and no stub is emitted. The relation reference is `connector:<connector>#relations/<record_type>/<relationship>`. So the pack ontology declares the object property with the record type as its domain. Every relationship carries the binding provenance. An empty reference emits nothing, and a real record wins over a stub with the same id. | `tests/test_source_sync_edges.py::test_source_meta_declares_edges_and_refuses_bad_ones`, `::test_runner_emits_reference_targets_and_relationships`, `::test_scalar_and_dotted_references_and_the_wire_reference` and `::test_target_stream_names_the_other_sources_record_without_a_stub`.
      requirementSDK-SOURCE-INGESTVERIFIED08685a0f0cf8
      c116b5a621d3
      tests/test_source_sync_edges.py:125
      tests/test_source_sync_edges.py:176
      tests/test_source_sync_edges.py:73
      tests/test_source_sync_edges.py:93
      SDK-SOURCE-INGEST-R013
      Versioned harness-session sync
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R013.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R013.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R013.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** Reuse `connector-sync --once` and runner `agent_connector_sdk/runner/worker.py:180` (`_sync`). Route extraction through `agent_connector_sdk/adapters/mcp_tool.py:118` (`McpToolSourceAdapter.extract`) and receipt submission through `agent_connector_sdk/ingest/channel.py:46` (`SourceIngestChannel.submit`), also called by `agent_connector_sdk/sinks/epistemic_graph.py:105`. EG owns indexing; WEBUI-APPS-R006.4 consumes Arbora browse/search. No session-specific operation is claimed today. | HS-13.3 observes the real runner, adapter, and generated-client calls. Owners must publish exact EG and Arbora IDs before implementation.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R013.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R013.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R013.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R014
      Meeting transcript and selected summary transport
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R014.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R014.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R014.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** The current WebUI route posts to `/api/enhanced/voice/transcribe` after recording stops; it is single-shot dictation. The audio-transcriber repository registers `transcribe_audio` for files or microphone capture, not meeting segments or summary selection. Existing SDK transport entry points are `agent_connector_sdk/mcp/server.py:88` (`create_mcp_server`) and `agent_connector_sdk/mcp/action_dispatch.py:194` (`dispatch_async`). Do not invent a meeting registration. The owners have not assigned its operation or exact counterpart IDs. | MT-14.3 traces the owner-registered operation through SDK dispatch and Arbora after owners identify the exact operation and counterpart IDs.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R014.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R014.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **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.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R014.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** Use real served operations for partial, corrected, and final segments. Select local and hosted summaries separately. Test exact replay, conflicting duplicates, denied capture/egress, stale input, pending gaps, incomplete finalization, and unavailable providers. Single-shot dictation cannot substitute. | Proposed: `tests/test_meeting_transcript_served.py::test_partial_correction_complete_finalize_receipt_then_summary` proves zero summary calls before complete finalization and reads browser, SDK, EG, and Arbora receipts. Mocks do not prove acceptance; runtime evidence remains absent.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R015
      Paper throughput decision and durable purge obligation
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Paper throughput decision and durable purge obligation.** EG owns observed paper ingestion throughput numerator, denominator and observation window. EG decides whether ingestion meets declared goals and authorizes purge budget allocation per goal. SDK enforces throughput observations and maintenance dispatch. Purge authorization never overrides healthy paper identity or durable receipt. | EP-15.6 proves throughput measurement, below-threshold policy, budget allocation and maintenance dispatch.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R015.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** Throughput metric binds window (seconds), target numerator (papers) and target denominator (window units). It also binds observed numerator, observed denominator, measurement timestamp and EG decision identity. Purge authorization carries goal identity, purge candidates, safe-purge policy, maximum deletion count and authorization receipt. | EP-15.1 rejects invalid bounds, stale measurements and absent decision.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R015.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** SDK observes papers committed per configured window. Record observed throughput each window. When below target, consult EG for purge authorization. Apply safe-purge policy to identify candidates. Never purge papers required for established graphs or locked by concurrent requests. Below-threshold purge is visible with distinct reason from healthy pruning. | EP-15.2 proves windowed observation, below-target detection and selective candidate application.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R015.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** Telemetry at `agent_connector_sdk/runner/telemetry.py` or equivalent records observations per window. EG decision-execution contract binds SDK dispatcher through `agent_connector_sdk/mcp/action_dispatch.py:194`. Purge candidates surface through query or direct service. Connector-sync maintenance reads EG authorization before deletion. Durable receipt updates checkpoint only after deletion acknowledgment. | EP-15.3 traces observation publication, EG decision fetch and delete-before-commit ordering.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R015.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** Refuse below-threshold purge without EG authorization. Refuse purge of locked papers or required dependencies. Refuse deletion when policy cannot identify safe candidates. Refuse out-of-window measurements and stale policy. Return typed reason before any deletion. Below-target status never triggers silent background deletion. | EP-15.4 proves authorization requirement, zero unauthorized deletes and visible below-threshold status.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R015.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Throughput records bind window identity, target, observed numerator/denominator, measurement timestamp and trend. Purge records bind authorization identity, safe-purge policy, candidate count, deleted count and per-paper deletion receipt. Budget allocation evidence includes goal identity and authorized ceiling. Redact graph-internal paths and private criteria. | EP-15.5 proves throughput attribution, policy compliance and budget traceability.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R015.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The entry point test `tests/test_throughput_and_purge_served.py::test_window_measure_and_maintenance` observes paper throughput through real telemetry. It requests an EG decision with a below-threshold measurement. It applies purge authorization with safe candidates and commits the deletion. Measure above and at target in separate windows. Deny authorization and prove zero deletions. Attempt unauthorized candidate purge and prove refusal. | EP-15.6 requires real telemetry, EG authorization interaction and durable deletion receipts.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R016
      Typed media enrichment with vision inference and attachment
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Typed media enrichment with vision inference and attachment.** A designated vision inference producer bounds model revision, image input types and derived object/context extraction. SDK transports vision results as typed media annotations and searchable tags through EG attachment. Media modality source provenance remains explicit. Unauthorized or fabricated media tags refuse before ingestion. | MV-16.6 proves model identity, single-shot inference, tag attachment and refusal without effects.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R016.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** Vision producer identity, contract revision, input bounds (bytes, dimensions) and output types (object/context tags) are declared. Schema version and model revision are declared too. Media modality includes image, thumbnail, and supported alternate formats. Tag attachment carries provenance (inferred by model version, extracted by SDK) and authorization scope. Fabricated or model-insuffficient tags carry a typed refusal. | MV-16.1 rejects unknown producers, model/contract mismatch and unauthorized tag attachment.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R016.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** Vision producer receives bounded media bytes and declared modality. It infers object and context tags within declared bounds. SDK receives typed tags with model confidence and provenance. Only authorized tags attach to media records. Unsupported media or insufficient producer capability refuses. Identical media reimport with same producer returns stable tag set. | MV-16.2 proves single-pass inference, tag stability and fabrication refusal.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R016.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** Register vision producer through connector tool registration at `agent_connector_sdk/mcp/tool_surface.py:121`. dispatch_async at `agent_connector_sdk/mcp/action_dispatch.py:194` invokes it. McpToolSourceAdapter.extract at `agent_connector_sdk/adapters/mcp_tool.py:118` feeds media to inference and maps returned tags to generated SourceIngest attachment. Authorization scope integrates governed policy. | MV-16.3 traces connector media through real inference service to generated tag attachment.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R016.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** Refuse unknown producers, unsupported modality and media exceeding byte/dimension bounds. Refuse unauthorized tag attachment and fabricated tags without inference evidence. Deny producer access and refuse before attachment or ingestion. Media without enough producer capability becomes untagged, not silently tagged or skipped. Return distinct typed reasons. | MV-16.4 proves modality validation, authorization enforcement and visible insufficient-capability refusal.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R016.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Tag records bind media identity, producer identity, contract revision and model revision. They also bind input digest, output types, confidence scores, authorization scope and inference timestamp. Provenance indicates source (inferred vs extracted). Failed media attempts record typed reason and input digest. Redact raw bytes, credentials and private media content. | MV-16.5 proves producer tracking, model version binding and decision attribution.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R016.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The entry point test `tests/test_media_vision_served.py::test_image_inference_and_attachment` registers a real vision producer through connector tools and runs connector-sync with a running graph. Test image and thumbnail inferences with matching tags in both modalities. Check tag searchability through EG. Include one modality-unsupported and one authorization-denied case. Reingest identical media and prove stable tags. Attempt fabricated tags and prove refusal. | MV-16.6 requires real vision service, tag attachment persistence and independent graph readback.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R600
      Vendor write-back sinks run through one governed, fail-closed, dry-run-first entry point (rollup)
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Vendor write-back sinks run through one governed, fail-closed, dry-run-first entry point (rollup).** Children `.1` to `.6`. | See each child.
      requirementSDK-SOURCE-INGESTSPECIFIEDec8d36a076f4
      tests/test_writeback_sinks.py:26
      SDK-SOURCE-INGEST-R600.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** ``agent_connector_sdk/writeback_sinks/core.py`` defines `WritebackResult`, `WritebackContext`, `WritebackInvocation`, the `WritebackSink` protocol and a sink registry keyed by domain. Fields are typed and every identifier is validated at construction. | `tests/test_writeback_sinks.py::test_change_set_is_canonical_and_drops_private_ops`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R600.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** `run_writeback(target, dry_run=True, **ops)` resolves the sink. It refuses a live write when the sink's activation flag is unset. It runs an optional caller preflight. It executes every call through the governed path of `writeback_sinks/governed.py`. That path covers the change set, audit reservation and ledger. High-stakes sinks never auto-execute. A live request is previewed and handed to a caller-provided approval queue, or refused when none exists. Dry runs write no ledger. Thirty vendor sinks register by domain. Connector clients resolve from an injected client or the connector package's `auth.get_client`. | `tests/test_writeback_sinks.py::test_live_write_records_change_set_audit_and_receipt`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R600.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** The package imports no agent harness. The graph engine provides the approval queue and the source-conflict preflight through the `_enqueue_proposal` and `_preflight` operands (EG-DECISION-ENGINE-R615). No other production caller may duplicate this behavior. | `tests/test_writeback_sinks.py::test_leanix_dry_run_proposes_then_live_writes`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R600.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** A live write without its activation flag returns a `refused` manifest naming the flag, and no sink code runs. The stable code is `WRITE_DISABLED`. | `tests/test_writeback_sinks.py::test_live_write_refused_without_flag`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/test_writeback_sinks.py:125
      SDK-SOURCE-INGEST-R600.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Every manifest carries `governed_writeback` evidence: change-set id, authorization mode and effect status; sink failure records `outcome_uncertain` in the ledger. | `tests/test_writeback_sinks.py::test_sink_failure_is_recorded_uncertain_and_reported`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R600.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** `tests/test_writeback_sinks.py` covers refusal, dry run, live ledger, uncertain outcome, high-stakes queue refusal and three vendor sinks. The file runs in under 1 s. The benchmark is `tests/test_writeback_sinks.py::test_live_write_records_change_set_audit_and_receipt` and gates a regression above 10 percent. | `tests/test_writeback_sinks.py::test_high_stakes_live_write_without_queue_is_refused`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R800
      Document-source connector framework (rollup)
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Document-source connector framework (rollup).** `agent_connector_sdk.source_connectors` owns the load, poll and slim connector shapes, resumable checkpoints and the self-registering source registry with the web, rest, rss, arxiv and package-manifest sources. Activation is refused unless the host installs a certifying gate. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.
      requirementSDK-SOURCE-INGESTSPECIFIED11366ce437d5
      tests/source_connectors/test_source_connectors.py:45
      SDK-SOURCE-INGEST-R800.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** `BaseSourceConnector`, `LoadConnector`, `PollConnector`, `SlimConnector`, `SourceDocument`, `ExternalAccess` and `ConnectorCheckpoint` are the public records. | `tests/source_connectors/test_source_connectors.py::test_registry_lists_builtin_sources_and_rejects_unknown`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R800.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** `poll(checkpoint)` returns only documents newer than the watermark and unseen ids; a dead feed yields nothing and never aborts a sweep. | `tests/source_connectors/test_source_connectors.py::test_rss_connector_parses_rss_and_atom_and_polls_by_watermark`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/source_connectors/test_source_connectors.py:122
      tests/source_connectors/test_source_connectors.py:145
      SDK-SOURCE-INGEST-R800.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** `build_connector` discovers the bundled sources and checks the installed activation gate before it instantiates any connector. | `tests/source_connectors/test_source_connectors.py::test_web_connector_crawls_to_depth_and_polls_incrementally`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R800.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** With no gate installed, or a gate that returns false, `build_connector` raises `ConnectorGovernanceError`; an unknown source type raises `KeyError` listing the available types. | `tests/source_connectors/test_source_connectors.py::test_activation_is_refused_without_a_certifying_gate`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/source_connectors/test_source_connectors.py:51
      tests/source_connectors/test_source_connectors.py:58
      SDK-SOURCE-INGEST-R800.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Each moved behavior has a public-surface test. The tests cover registry listing, checkpoint round trip, web crawl depth and rest cursor following. They also cover feed parsing, watermark polling, dead-feed isolation and gate refusal. | `tests/source_connectors/test_source_connectors.py::test_checkpoint_round_trips_and_bad_input_is_none`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R800.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The entry point is `build_connector`. The proof constructs each source through it with injected fetch callables. It asserts that no network or sleep is used. | `tests/source_connectors/test_source_connectors.py::test_dead_feed_never_aborts_a_sweep`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/source_connectors/test_source_connectors.py:145
      SDK-SOURCE-INGEST-R803
      Typed, privacy-safe data preparation kernel (rollup)
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Typed, privacy-safe data preparation kernel (rollup).** `agent_connector_sdk.data_prep` is the allowlisted clean-plan kernel (safe cast, fill, dedupe, canonical names). It works over Arrow tables with bounded value-free profiles and an operator-only certification job. It advances no source checkpoint and holds no authority over native ingest. Arrow support is the `dataprep` extra. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.
      requirementSDK-SOURCE-INGESTSPECIFIED11366ce437d5
      tests/data_prep/certification/test_job.py:28
      tests/data_prep/test_kernel.py:23
      tests/data_prep/test_profiling.py:29
      SDK-SOURCE-INGEST-R803.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** `CleanPlan`, `CleanStep`, `LocalProfile`, `ProfileLimits`, `PrepEvidence` and the certification records are frozen, extra-forbidding models. | `tests/data_prep/test_kernel.py::test_plan_gate_is_strict_and_allowlisted`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R803.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** A plan executes deterministically, replays to the same digest, retains original row ordinals across quarantine and redacts quarantined values. | `tests/data_prep/test_kernel.py::test_replay_is_deterministic_and_plan_is_not_mutated`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R803.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** The base install imports no Arrow, dataframe or validation provider; the extra and the certification providers load lazily. | `tests/data_prep/certification/test_job.py::test_optional_provider_wrappers_are_lazy_and_do_not_run_without_provider`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R803.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** Lossy casts, canonical-name collisions, over-limit profiles and a failed disposition each return a typed refusal with no partial success. | `tests/data_prep/test_kernel.py::test_lossy_casts_are_denied_and_lossless_widening_uses_safe_cast`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R803.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Tests cover the plan gate, redaction, dedupe, profile bounds and the signed certification summary. | `tests/data_prep/test_profiling.py::test_below_threshold_values_never_appear_in_top_k_or_serialized_profile`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R803.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The proof runs a one-million-row plan under the declared profile limits and records elapsed time and peak memory. | `tests/data_prep/test_kernel.py::test_dedupe_requires_explicit_keys_and_preserves_first_input_row`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R804
      Voice-model provenance manifest and license gate (rollup)
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Voice-model provenance manifest and license gate (rollup).** `agent_connector_sdk.voice_supply_chain` records each acquired voice model as an immutable, commit-pinned, digest-checked manifest. It gates promotion handoff on a reviewed license decision and a checked asset. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.
      requirementSDK-SOURCE-INGESTSPECIFIED11366ce437d5
      tests/voice_supply_chain/test_voice_supply_chain.py:23
      SDK-SOURCE-INGEST-R804.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** `VoiceModelManifest` and `VoiceLicenseDecision` are validated models whose defaults are quarantined and pending. | `tests/voice_supply_chain/test_voice_supply_chain.py::test_manifest_normalizes_digest_case_and_defaults_are_fail_closed`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R804.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** Promotion handoff is ready only for an approved decision with a named reviewer on a checked manifest. Copyleft flags never imply approval. | `tests/voice_supply_chain/test_voice_supply_chain.py::test_promotion_handoff_requires_approved_license_and_verified_asset`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/voice_supply_chain/test_voice_supply_chain.py:69
      SDK-SOURCE-INGEST-R804.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** The manifest index lives under the SDK data directory resolved by `agent_connector_sdk.paths`. | `tests/voice_supply_chain/test_voice_supply_chain.py::test_mark_verified_persists_and_refuses_rejected`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R804.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** The module refuses a mutable or short revision, a malformed digest and an unknown counsel value. It also refuses to mark a rejected manifest as checked. | `tests/voice_supply_chain/test_voice_supply_chain.py::test_manifest_requires_immutable_pin_and_valid_digest`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/voice_supply_chain/test_voice_supply_chain.py:48
      SDK-SOURCE-INGEST-R804.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Tests cover each handoff outcome and the manifest validation errors. | `tests/voice_supply_chain/test_voice_supply_chain.py::test_promotion_handoff_requires_approved_license_and_verified_asset`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R804.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The proof records and reads back one thousand decisions and asserts every lookup is a single file read. | `tests/voice_supply_chain/test_voice_supply_chain.py::test_mark_verified_persists_and_refuses_rejected`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R900
      Read-only database source (rollup)
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Read-only database source (rollup).** `agent_connector_sdk.source_connectors.universal.UniversalConnector` reads SQL and MongoDB through one bounded read-only call and returns the schema as a `ChangeSet`. The `database` source maps the rows of one query to documents and polls by a watermark column. The `db` and `mssql` extras provide the networked drivers. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R900.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** `UniversalConnector`, `infer_kind` and `DatabaseConnector` are the public surface. Identifiers are irreversible persistence references. | `tests/source_connectors/test_universal.py::test_identity_is_an_irreversible_reference`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R900.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** `read` returns at most `max_rows` rows. `poll` returns only rows past the watermark and advances it to the largest value seen. | `tests/source_connectors/test_database.py::test_poll_advances_the_watermark_and_is_idempotent`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R900.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** The `database` source resolves its connection profile through `agent_connector_sdk.credentials.resolution` and opens networked connections with `agent_connector_sdk.tls.resolve.resolve_tls_profile`. | `tests/source_connectors/test_universal.py::test_networked_connection_uses_the_tls_profile`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R900.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** Anything but one read-only `SELECT`, a literal connection value and a missing driver are refused. The `table` option raises `RowVersionEvidenceUnavailable`, because the graph service writes row-version evidence (`EG-INGEST-WORKER-R901`). | `tests/source_connectors/test_database.py::test_unsafe_or_unsupported_configuration_is_refused`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/source_connectors/test_database.py:48
      SDK-SOURCE-INGEST-R900.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Tests read a temporary SQLite database. They check row caps, the read-only gate, schema entities and that no identifier holds the database location. | `tests/source_connectors/test_universal.py::test_introspect_emits_schema_entities_without_the_location`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R900.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The entry point is `build_connector("database", ...)`. The proof polls twice and the second poll returns no document. | `tests/source_connectors/test_database.py::test_poll_advances_the_watermark_and_is_idempotent`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/source_connectors/test_database.py:39
      SDK-SOURCE-INGEST-R901
      Governed GraphQL document source (rollup)
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Governed GraphQL document source (rollup).** The `graphql_document` source runs one read-only GraphQL query from a secret-backed profile. It returns redacted documents and governed changes. An upsert is an `Entity` that carries the access, classification, retention and legal-hold properties, which the graph service enforces (`EG-INGEST-WORKER-R900`). A removal from an authoritative snapshot is a `Withdrawal`. The `graphql` extra provides the parser. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R901.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** `GraphQLDocumentConnector`, `GraphQLDocumentError` and `GraphQLHierarchyBatch` are the public surface. A change is an `agent_connector_sdk.ingest.model.Entity` or `Withdrawal`. | `tests/source_connectors/test_graphql_document.py::test_hierarchy_poll_emits_governed_entities_and_is_idempotent`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R901.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** The source follows typed pagination, maps entities, documents, applications and dependencies, and withdraws a record once when an authoritative snapshot no longer holds it. | `tests/source_connectors/test_graphql_document.py::test_authoritative_snapshot_withdraws_a_removed_record_once`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/source_connectors/test_graphql_document.py:355
      SDK-SOURCE-INGEST-R901.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** The profile resolves through `agent_connector_sdk.credentials.resolution`. Requests use `agent_connector_sdk.source_connectors.http_safety` and the TLS profile resolver. | `tests/source_connectors/test_graphql_document.py::test_document_is_redacted_and_carries_no_source_details`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R901.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** A literal profile, a missing identity key, private egress, header injection, hop-by-hop headers, mutations, subscriptions, introspection, missing retention and an unapproved empty snapshot are refused. Upstream error text is never echoed. | `tests/source_connectors/test_graphql_document.py::test_unsafe_profiles_and_upstream_errors_are_refused`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/source_connectors/test_graphql_document.py:283
      SDK-SOURCE-INGEST-R901.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Tests use an injected transport. They assert that no endpoint, token, key, reference or query text reaches a document, change or plan. | `tests/source_connectors/test_graphql_document.py::test_dry_run_plan_reports_counts_only`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R901.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The entry point is `poll`. The proof polls two pages and then polls again from the checkpoint, and the second poll returns nothing. | `tests/source_connectors/test_graphql_document.py::test_hierarchy_poll_emits_governed_entities_and_is_idempotent`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/source_connectors/test_graphql_document.py:324
      SDK-SOURCE-INGEST-R902
      MCP package document source (rollup)
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **MCP package document source (rollup).** The `mcp` source calls one tool of a connector package and maps its records to documents. A preset from `package_manifest` fills the tool contract. Production calls open a stdio session through `agent_connector_sdk.transports.mcp.McpTransport` from the platform `mcp_config.json`. Children `.1` through `.6` cover model, behavior, wiring, refusal, evidence and hot-path proof. | See each child.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R902.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** `MCPPackageConnector`, `configured_mcp_server`, `load_mcp_servers`, `run_sync` and `McpStdioProhibitedError` are the public surface. | `tests/source_connectors/test_mcp_package.py::test_explicit_mapping_yields_documents_with_neutral_metadata`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R902.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** `poll` follows a response cursor one page at a time and drops record IDs it has already seen. | `tests/source_connectors/test_mcp_package.py::test_cursor_poll_pages_then_dedups`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/source_connectors/test_mcp_package.py:63
      SDK-SOURCE-INGEST-R902.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** The server catalog comes from `MCP_CONFIG` or `agent_connector_sdk.paths.platform_config_file`. A preset comes from `package_manifest.get_preset`. | `tests/source_connectors/test_mcp_package.py::test_package_preset_fills_the_tool_contract`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R902.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** A missing tool, an unconfigured server and stdio under `MCP_STDIO_PROHIBITED` are refused with a stated reason. | `tests/source_connectors/test_mcp_package.py::test_stdio_is_refused_when_prohibited`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R902.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** Tests inject the tool caller. They assert neutral metadata, quarantined access and server-name resolution. | `tests/source_connectors/test_mcp_package.py::test_server_resolution_uses_declared_names_only`
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R902.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The entry point is `build_connector("mcp", ...)`. The proof runs the synchronous bridge inside a running event loop. | `tests/source_connectors/test_mcp_package.py::test_run_sync_works_inside_a_running_loop`
      requirementSDK-SOURCE-INGESTVERIFIED8c6dcfdd27e8
      tests/source_connectors/test_mcp_package.py:135
      SDK-SOURCE-INGEST-R017
      Source ingest runs only under an engine-accepted ingest contract (rollup)
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Source ingest runs only under an engine-accepted ingest contract (rollup).** The runner binds every batch to the contract IRI and revision that the engine accepted. It refuses ingest when the engine has not accepted the local contract. Source values become native relationships, not nested properties. Children `.1` to `.6` deliver it. Engine owner: `EG-TYPED-PACKS-R101`. | Rollup closes when every child `.1` to `.6` passes its proving test.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R017.1
      Model
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Model.** `IngestBinding` (`agent_connector_sdk/ingest/model.py:34`) gains `contract_iri` and `contract_revision`. Each record's mapping reference is a contract IRI of the form `contract:<connector>#<object>`. | `tests/test_ingest_contract_binding.py::test_binding_carries_contract_iri`.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R017.2
      Behavior
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Behavior.** Before the first batch, the runner reads `ConnectorPack.Status` and compares the accepted contract digest with the local declaration digest. A nested dictionary value in entity properties becomes one entity and one relationship per its declared mapping. Access properties follow the declared access policy. The checkpoint names the declared cursor policy IRI. | `tests/test_ingest_contract_binding.py::test_nested_values_become_relationships`.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R017.3
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** The digest check attaches in `submit` (`agent_connector_sdk/ingest/service.py:74`). Nested-value conversion attaches where the runner creates entity requests (`agent_connector_sdk/ingest/request.py:85`). Access stamping attaches in `access_properties` (`agent_connector_sdk/adapters/document_sources.py:82`). Document sync enters at `ingest_documents` (`agent_connector_sdk/adapters/document_sources.py:402`). | `tests/test_ingest_contract_binding.py::test_submit_checks_accepted_contract`.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R017.4
      Refusal
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Refusal.** The runner must refuse a batch with `contract_not_accepted` when the digests differ or no contract exists. It must refuse a nested dictionary value without a declared mapping with `undeclared_nested_value`. It must surface `UNKNOWN_MAPPING_REFERENCE` and `CURSOR_POLICY_VIOLATION` from the engine unchanged. No refused batch advances the checkpoint. | `tests/test_ingest_contract_binding.py::test_refusals_keep_checkpoint`.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R017.5
      Evidence
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Evidence.** The run report must name the contract IRI, revision and digest for each batch. The report must match the engine's `SourceMappingReceipt` for that batch. | `tests/test_ingest_contract_binding.py::test_report_matches_engine_receipt`.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R017.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The entry point is the SDK sync runner against a running engine. The test certifies a connector, syncs one record with a nested value and reads it back through the served SPARQL method. It must observe `cp:governedBy` and a native relationship for the nested value. A changed local declaration without certification must refuse with `contract_not_accepted`. | `tests/test_ingest_contract_served.py::test_ingest_requires_accepted_contract`.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R805
      Source access, enumeration and hierarchy contract (rollup)
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Source access, enumeration and hierarchy contract (rollup).** A connector must report source access, the identifier set and the container tree as typed batches. The engine admits them through EG-INGEST-WORKER-R902 to R904. A connector of a read-time access source must also answer access lookups for EG-FEDERATED-QUERY-R703. Children `.1` to `.6` deliver it. | See each child.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R805.1
      Permission and group sync
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Permission and group sync.** Add `PermissionSyncConnector` in `agent_connector_sdk/source_connectors/base.py`. It yields `AccessSnapshot` and `SourceGroup` records from a checkpoint. The records are the generated EG types. The runner sends them as batches of kind `access` and `groups`. | `tests/source_connectors/test_permission_sync.py::test_access_batch_carries_no_content` checks that a batch holds no document body.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R805.2
      Identifier enumeration
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Identifier enumeration.** `SlimConnector.slim` at `agent_connector_sdk/source_connectors/base.py:208` feeds a batch of kind `enumeration`. The batch is complete only after the iterator ends without error. A partial run sends `complete: false`. | `tests/source_connectors/test_permission_sync.py::test_interrupted_enumeration_is_incomplete` breaks the iterator mid-run.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R805.3
      Container hierarchy
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Container hierarchy.** Add `HierarchyConnector` in `agent_connector_sdk/source_connectors/base.py`. It yields `SourceContainer` records with parent identifiers. The runner sends them as a batch of kind `containers`. | `tests/source_connectors/test_permission_sync.py::test_container_batch_preserves_parents` reads a three-level tree.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R805.4
      Wiring
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Wiring.** `sync_stream` at `agent_connector_sdk/runner/syncing.py:200` schedules the three batch kinds after content sync. The permission sync runs every 3,600 s by default. The connector declaration may lower it. | `tests/test_source_sync.py::test_runner_schedules_access_enumeration_and_containers` runs one sync and lists the batch kinds.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R805.5
      Read-time access lookup port
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Read-time access lookup port.** Add `AccessCheckPort.check(principal, record_refs) -> AccessCheckAnswer` in `agent_connector_sdk/ports/access_check.py`. A connector declares `access_mode: checked_at_read` in its manifest. The port answers at most 200 records per call within 2 s. A timeout returns every record as denied. | `tests/test_access_check_port.py::test_timeout_denies_every_record` simulates a slow source.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-SOURCE-INGEST-R805.6
      Hot-path proof
      Definition — SDK-SOURCE-INGEST / SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migrationCanonical requirement and verification source
      **Hot-path proof.** The served test starts the engine server binary on a temporary store. It syncs a fixture connector, revokes one user at the source and runs the permission sync. A read by that user then refuses. Enumeration without one record prunes it after the grace window. | `tests/test_permission_sync_served.py::test_revocation_and_prune_against_real_engine` runs the full path.
      requirementSDK-SOURCE-INGESTSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES
      SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilities
      specNoneSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R001
      Governed HTTP client and retry
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Governed HTTP client and retry.** Connectors build every outbound HTTP client with `create_http_client` or `create_async_http_client`, which wrap one transport in the shared retry policy. A connector must not ship its own session, retry loop, or backoff for HTTP calls. Owner: `SDK-CONNECTOR-CONTROL-RR780.3`, `SDK-CONNECTOR-CONTROL-RR028`. Module: `http/client.py`, `http/retry.py`, `http/transport.py`. | Conformance: pipelines `sdk-conformance` (`PIPE-GATES-R013`), warn by default, `--strict` blocks. Index test: `tests/test_centralized_capability_index.py::test_r001_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R002
      Egress guard and pinned addresses
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Egress guard and pinned addresses.** Connectors validate operator base URLs with `validate_base_url_resolved` and set `pin_egress` on the governed client. A connector must not ship its own URL, private-address, or redirect checks. Owner: `SDK-CONNECTOR-CONTROL-RR014.5`, `SDK-CONNECTOR-CONTROL-RR014.16`, `SDK-CONNECTOR-CONTROL-RR028.1`, `SDK-CONNECTOR-CONTROL-RR033`. Module: `http/egress.py`, `http/safe_post.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r002_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R003
      API client base and auth strategies
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **API client base and auth strategies.** Connectors derive their API client from `BaseApiClient` in `http/support.py` and select an SDK auth strategy. A connector must not ship its own API client base class or header-auth strategy. Owner: `SDK-CONNECTOR-CONTROL-RR014.10`, `SDK-CONNECTOR-CONTROL-RR028.3`. Module: `http/support.py`, `httpsupport/auth.py`, `httpsupport/client_protocol.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r003_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R004
      Pagination helpers
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Pagination helpers.** Connectors page upstream lists with the SDK pagination helpers. The helpers cover the `cursor`, `page`, `offset`, `link`, `since_id`, and `next_url` modes. The `next_url` mode follows the next-page URL at a dotted body path, `next` by default. It resolves a relative URL against the request URL and stops on a null or empty value. Each followed URL must keep the scheme, host, and port of the first request. A mismatch raises `PaginationOriginError` and the helper does not follow it. A repeated URL ends the sweep and sets `truncated`. The `max_pages` cap also ends it. A connector must not ship its own page-walking loop for a mode the SDK covers. Owner: this spec. Module: `http/pagination.py`, `httpsupport/pagination.py`. | Conformance: unit tests in `tests/httpsupport/test_pagination_next_url.py` (relative and absolute next, null stop, cross-origin, scheme and port change, loop guard). Index test: `tests/test_centralized_capability_index.py::test_r004_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESVERIFIEDc842d089626d
      tests/httpsupport/test_pagination_next_url.py:15
      SDK-CENTRALIZED-CAPABILITIES-R005
      Rate-limit telemetry and concurrency
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Rate-limit telemetry and concurrency.** Connectors read rate-limit headers and compute bounded 429 backoff with `parse_rate_limit` and `backoff_seconds`. Connectors pace requests to one upstream with `RateLimiter`, a minimum-interval limiter exported from `agent_connector_sdk.httpsupport`. Connectors bound tool concurrency with `mcp/concurrency.py`. A connector must not ship its own rate-limit header parser, backoff calculation, or minimum-interval request limiter. Owner: this spec. Module: `httpsupport/rate_limit.py`, `mcp/concurrency.py`. | Conformance: unit tests in `tests/httpsupport/test_rate_limiter.py` (fake clock, concurrent callers, async use). Index test: `tests/test_centralized_capability_index.py::test_r005_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESVERIFIEDfb85cad4b0ba
      tests/httpsupport/test_rate_limiter.py:13
      SDK-CENTRALIZED-CAPABILITIES-R006
      Error redaction and typed problems
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Error redaction and typed problems.** Connectors return upstream failures as the SDK error types and pass text through the SDK redaction helpers. An error never carries a secret or a response body. A connector must not ship its own secret-redaction or error-sanitizing helper. Owner: `SDK-CONNECTOR-CONTROL-RR780.2`, `SDK-CONNECTOR-CONTROL-RR014.6`, `SDK-CONNECTOR-CONTROL-RR014.12`. Module: `exceptions.py`, `http/errors.py`, `http/problems.py`, `http/redaction.py`, `httpsupport/redaction.py`, `privacy_pii.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r006_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R007
      Payment challenge handling
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Payment challenge handling.** Connectors that meet an HTTP 402 challenge use the governed client budget and approval gate. A connector must not ship its own payment or 402 handling. Owner: `SDK-CONNECTOR-CONTROL-RR049`, `SDK-FINANCE-SOURCES-R900`. Module: `payments.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r007_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R008
      TLS profiles
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **TLS profiles.** Connectors resolve TLS material with `resolve_tls_profile`. Every HTTPS call uses the resolved profile. A connector must not disable certificate verification, silence TLS warnings, or build its own SSL context. Owner: `SDK-CONNECTOR-CONTROL-RR017`, `SDK-CONNECTOR-CONTROL-RR780.4`. Module: `tls/resolve.py`, `tls/profile.py`, `tls/context.py`. | Conformance: pipelines `sdk-conformance` (`PIPE-GATES-R013`), warn by default, `--strict` blocks; the SDK static scan in the owner row. Index test: `tests/test_centralized_capability_index.py::test_r008_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R009
      Credential and secret-reference resolution
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Credential and secret-reference resolution.** Connectors accept only `env://` and `openbao://` references and resolve them with `credentials.resolver` and `credentials.runtime_references`. A connector must not parse secret references, call a secret store, or read a token from a plain environment variable. Owner: `SDK-CONNECTOR-CONTROL-RR014.4`, `SDK-CONNECTOR-CONTROL-RR035`, `SDK-CONNECTOR-CONTROL-RR900`. Module: `credentials/references.py`, `credentials/resolver.py`, `credentials/openbao.py`, `credentials/provider.py`. | Conformance: pipelines `sdk-conformance` (`PIPE-GATES-R013`), warn by default, `--strict` blocks. Index test: `tests/test_centralized_capability_index.py::test_r009_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R010
      Selected-provider credential profile
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Selected-provider credential profile.** Connectors with more than one backend select one with `credentials.provider_profile` and `PROVIDER_*` settings. A connector must not ship its own backend-selection or profile parser. Owner: `SDK-CONNECTOR-CONTROL-RR014.19`, `SDK-CONNECTOR-CONTROL-RR027`. Module: `credentials/provider_profile.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r010_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R011
      Token providers and source credentials
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Token providers and source credentials.** Connectors obtain bearer, API-key, cookie, basic, and refreshing OAuth2 credentials from `auth/` and `credentials/source.py`. A connector must not ship its own token cache, refresh loop, or client-credentials flow. Owner: `SDK-CONNECTOR-CONTROL-RR031`, `SDK-CONNECTOR-CONTROL-RR900`, `SDK-CONNECTOR-CONTROL-RR014.9`. Module: `auth/tokens.py`, `auth/client_credentials.py`, `auth/static.py`, `credentials/source.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r011_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R012
      OIDC delegation and actor identity
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **OIDC delegation and actor identity.** Connectors read the delegated token with `auth.delegation` and the caller with `current_actor()`. The server factory handles the token. A connector must not decode, validate, or sign tokens for caller identity (the server factory does this). Owner: `SDK-CONNECTOR-CONTROL-RR014.8`, `SDK-CONNECTOR-CONTROL-RR902`, `SDK-CONNECTOR-CONTROL-RR780.1`. Module: `auth/delegation.py`, `auth/oidc.py`, `identity.py`, `mcp/auth/`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r012_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R013
      Browser OAuth with PKCE
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Browser OAuth with PKCE.** Connectors that need an interactive login use `auth.browser` and the PKCE auth manager. A connector must not ship its own authorization-code or PKCE flow. Owner: `SDK-CONNECTOR-CONTROL-RR014.11`, `SDK-CONNECTOR-CONTROL-RR046`. Module: `auth/browser.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r013_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R014
      MCP server factory and served security
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **MCP server factory and served security.** Connectors build their server with the SDK server factory. The factory applies the fail-closed served security profile. The `mcp` extra carries the runtime. A connector must not hand-roll its own server, auth proxy, or security middleware. Owner: `SDK-CONNECTOR-CONTROL-RR014.17`, `SDK-CONNECTOR-CONTROL-RR014.18`. Module: `mcp/server.py`, `mcp/served_security.py`, `mcp/middleware.py`, extra `mcp`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r014_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R015
      Tool surface and tool context
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Tool surface and tool context.** Connectors register one typed tool per API operation with `register_tool_surface` or `register_method_tools`. Tools take the SDK context for progress and approval. A connector must not ship its own tool registry, action-dispatch wrapper, or progress channel. Owner: `SDK-CONNECTOR-CONTROL-RR020`, `SDK-CONNECTOR-CONTROL-RR026`, `SDK-CONNECTOR-CONTROL-RR032`, `SDK-CONNECTOR-CONTROL-RR050`. Module: `mcp/tool_surface.py`, `mcp/method_tools.py`, `mcp/context.py`, `mcp/action_dispatch.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r015_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R016
      GraphQL
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **GraphQL.** Connectors send introspection through the SDK GraphQL helpers and read GraphQL sources through the `graphql_document` source. The `graphql` extra carries the parser. A connector must not ship its own GraphQL wrapper or pin a GraphQL client library itself. Another lane extends `SDK-CONNECTOR-CONTROL-R014.12`. Owner: `SDK-CONNECTOR-CONTROL-RR014.12`, `SDK-CONNECTOR-CONTROL-RR030`, `SDK-CONNECTOR-CONTROL-RR043`, `SDK-SOURCE-INGEST-RR901`. Module: `mcp/graphql.py`, `source_connectors/connectors/graphql_document.py`, extra `graphql`. | Conformance: pipelines `sdk-conformance` (`PIPE-GATES-R013`) for an own client and `connector-graphql` (`PIPE-GATES-R012`) for the extra declaration, warn by default, `--strict` blocks. Index test: `tests/test_centralized_capability_index.py::test_r016_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R017
      A2A protocol
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **A2A protocol.** Connectors use `agent_connector_sdk.a2a` for agent cards, the client, and the server application. The `a2a` extra carries the server stack. A connector must not ship its own agent-card models, A2A client, or A2A application factory. Owner: `SDK-CONNECTOR-CONTROL-RR014.21`, `SDK-CONNECTOR-CONTROL-RR041`. Module: `a2a/models.py`, `a2a/client.py`, `a2a/app.py`, extra `a2a`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r017_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R018
      Engine client adapter and compute
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Engine client adapter and compute.** Connectors reach the engine through the SDK sink, the typed compute adapter, and engine settings read from the environment. A connector must not open its own engine client or hold its own engine audience setting. Owner: `SDK-CONNECTOR-CONTROL-RR014.23`, `SDK-CONNECTOR-CONTROL-RR014.24`, `SDK-CONNECTOR-CONTROL-RR005`. Module: `sinks/epistemic_graph.py`, `compute/engine.py`, `decide/`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r018_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R019
      Ingest bindings and source adapters
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Ingest bindings and source adapters.** Connectors declare an `IngestBinding` and run through the SDK source adapters and runner. Submission uses the generated source-ingest types. A connector must not ship its own checkpoint store, ingest loop, or hand-written ingest types. Owner: `SDK-SOURCE-INGEST-RR001`, `SDK-SOURCE-INGEST-RR005`, `SDK-SOURCE-INGEST-RR017`. Module: `ingest/`, `adapters/`, `runner/syncing.py`, `ports/source_adapter.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r019_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R020
      Database sources
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Database sources.** Connectors read relational and document databases through `UniversalConnector` and the `database` source. The `db` and `mssql` extras carry the drivers. A connector must not pin a database driver itself or ship its own read-only query gate. Owner: `SDK-SOURCE-INGEST-RR900`, `SDK-SOURCE-INGEST-RR004`, `SDK-CONNECTOR-CONTROL-RR901`. Module: `source_connectors/universal.py`, `identifiers.py`, extras `db`, `mssql`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r020_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R021
      Feed and document sources
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Feed and document sources.** Connectors poll feeds and documents with the SDK source connectors. The `feeds` extra carries the feed parser. A connector must not pin a feed parser itself or ship its own poll and watermark loop. Owner: `SDK-SOURCE-INGEST-RR800`, `SDK-SOURCE-INGEST-RR005`. Module: `source_connectors/connectors/rss.py`, `arxiv.py`, `web.py`, `rest.py`, extra `feeds`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r021_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R022
      Message streams
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Message streams.** Connectors read live streams through the SDK stream adapter and `streaming.StreamBus`. The `stream` extra carries the socket library. A connector must not pin a socket library itself or ship its own stream reconnect loop. Owner: `SDK-CONNECTOR-CONTROL-RR782`, `SDK-FINANCE-SOURCES-R900.1`. Module: `streaming.py`, `adapters/event_feed.py`, extra `stream`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r022_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R023
      Market data
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Market data.** Connectors read market data through `finance.market_data` provider chains. The `market` extra carries the table and quote libraries. A connector must not pin the market libraries itself or ship its own provider chain. Owner: `SDK-FINANCE-SOURCES-R001`, `SDK-FINANCE-SOURCES-R900`. Module: `finance/market_data.py`, `finance/`, extra `market`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r023_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R024
      Data preparation
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Data preparation.** Connectors clean and profile tabular data with the `data_prep` kernel. The `dataprep` extra carries the columnar library. A connector must not pin the columnar library itself or ship its own dedupe and profiling code. Owner: `SDK-SOURCE-INGEST-RR803`. Module: `data_prep/`, extra `dataprep`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r024_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R025
      Embedding client
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Embedding client.** Connectors that keep vectors in an external store embed text with `embeddings.create_embedding_model`. Connectors install vector-store clients through the `vector` extra and the embedded-index store through the `vector-chroma` extra. A connector must not ship its own embedding HTTP client or key handling. A connector must not pin a vector-store client that these extras carry. Owner: `SDK-CONNECTOR-CONTROL-RR014.22`. Module: `embeddings.py`, extras `vector`, `vector-chroma`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r025_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESVERIFIEDfb85cad4b0ba
      tests/test_centralized_extras.py:36
      SDK-CENTRALIZED-CAPABILITIES-R026
      Vendor extractors
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Vendor extractors.** Connectors enrich entities with the SDK vendor extractors and the `VendorExtractor` contract. A connector must not ship a second extractor for a vendor the SDK already covers. Owner: `SDK-SOURCE-INGEST-RR006`. Module: `vendor_extractors/`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r026_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R027
      Ontology and content packs
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Ontology and content packs.** Connectors declare their ontology and access contract once. The SDK renders the pack, resources, and mappings. A connector must not hand-write Turtle, pack builders, or `owl:imports` scoping. Owner: `SDK-CONNECTOR-CONTROL-RR067`, `SDK-CONNECTOR-CONTROL-RR021`, `SDK-CONNECTOR-CONTROL-RR022`, `SDK-CONNECTOR-CONTROL-RR019`. Module: `ontology/`, `artifacts/pack.py`, `manifest/ontology_pack.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r027_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R028
      Connector declaration and fingerprints
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Connector declaration and fingerprints.** Connectors take the sync-preset model, schema normalization and tool fingerprints from `manifest/`. A connector declares its sources with `source_meta` and serves them at `connector://resources`. A connector must not define its own sync-preset model. Owner: `SDK-CONNECTOR-CONTROL-RR015`, `SDK-CONNECTOR-CONTROL-RR015.1`, `SDK-CONNECTOR-CONTROL-RR650`, `SDK-CONNECTOR-CONTROL-RR045.11`. Module: `manifest/`, extra `integrity`. | Conformance: SDK duplicate-definition scan in the owner row (`testing/duplicate_symbol_scan.py`). No pipelines gate runs it.. Index test: `tests/test_centralized_capability_index.py::test_r028_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R029
      Certification and fingerprints
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Certification and fingerprints.** Connectors certify with `connector-certify`. The command writes tool pins and schema fingerprints. A connector must not define `CertificationReport` or compute its own fingerprints. Owner: `SDK-CONNECTOR-CONTROL-RR003`, `SDK-CONNECTOR-CONTROL-RR007`, `SDK-CONNECTOR-CONTROL-RR015`, `SDK-CONNECTOR-CONTROL-RR045.11`. Module: `certify/`, script `connector-certify`. | Conformance: `connector-certify` check run by the connector. Pipelines gate runs none.. Index test: `tests/test_centralized_capability_index.py::test_r029_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R030
      Connector identity
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Connector identity.** Connectors declare the fleet name once, in the `agent_connector_sdk.connector` entry point. A connector must not repeat the name as a literal in the pack, manifest, or ingest binding. The owner row is `SDK-CONNECTOR-CONTROL-R071`. Owner: `SDK-CONNECTOR-CONTROL-RR071`. Module: `connector_identity.py`. | Conformance: Owner-row check `ConnectorIdentityError`. Pipelines name gate named in the owner row.. Index test: `tests/test_centralized_capability_index.py::test_r030_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R031
      Governed write-back
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Governed write-back.** Connectors send every write through the SDK write-back port, sinks, and durable ledger. A connector must not ship its own write path, approval check, or retry ledger. Owner: `SDK-GOVERNED-WRITEBACK-R002`, `SDK-GOVERNED-WRITEBACK-R003`. Module: `writeback/`, `writeback_sinks/`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r031_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R032
      Runner and CLI bootstrap
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Runner and CLI bootstrap.** Connectors start through the SDK runner and `connector-sync` command. The runner also reads the environment drift check. A connector must not ship its own sync worker, supervisor, or env-drift check. Owner: `SDK-CONNECTOR-CONTROL-RR014.14`, `SDK-SOURCE-INGEST-RR805`. Module: `runner/`, `mcp/env_drift.py`, script `connector-sync`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r032_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R033
      Health and observability
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Health and observability.** Connectors report health through the SDK health state and server. Logs and progress use the SDK helpers. A connector must not ship its own health endpoint, health states, or log formatter. Owner: `SDK-CONNECTOR-CONTROL-RR065`, `SDK-CONNECTOR-CONTROL-RR050`. Module: `runner/health_state.py`, `runner/health_server.py`, `runner/logs.py`, `progress.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r033_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R034
      Configuration, paths, and locks
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Configuration, paths, and locks.** Connectors read settings from `config.py` and `utilities.py`, state paths from `paths.py`, and locks from `file_lock.py`. A connector must not ship its own settings loader, state-directory resolver, or file lock. Owner: `SDK-CONNECTOR-CONTROL-RR016`, `SDK-CONNECTOR-CONTROL-RR029`, `SDK-CONNECTOR-CONTROL-RR014.7`, `SDK-CONNECTOR-CONTROL-RR014.2`, `SDK-CONNECTOR-CONTROL-RR034`, `SDK-CONNECTOR-CONTROL-RR780.5`. Module: `config.py`, `utilities.py`, `paths.py`, `file_lock.py`, `library_state.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r034_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R035
      Privacy, entitlements, and external access
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Privacy, entitlements, and external access.** Connectors apply the SDK privacy rules, entitlement resolution, and per-record external-access descriptors. A connector must not ship its own PII rules, entitlement lookup, or ACL mapping. Owner: `SDK-CONNECTOR-CONTROL-RR014.6`, `SDK-CONNECTOR-CONTROL-RR014.13`, `SDK-CONNECTOR-CONTROL-RR014.15`, `SDK-CONNECTOR-CONTROL-RR025`, `SDK-CONNECTOR-CONTROL-RR036`. Module: `privacy*.py`, `entitlements.py`, `contracts.py`, `access_contract.py`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r035_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R036
      Source client and repository transport
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Source client and repository transport.** Connectors read repositories through the SDK source client and repository transport. A connector must not ship its own Git, tree, or blob reader. Owner: `SDK-SCM-R001`, `SDK-REPOSITORY-TRANSPORT-R001`. Module: `repository/`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r036_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R037
      Plugin entry-point groups
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Plugin entry-point groups.** Connectors register skills, ontologies, sources, and artifact kinds in the `agent_connector_sdk.*` entry-point groups. A connector must not register a plugin group outside the SDK namespace. Owner: `SDK-CONNECTOR-CONTROL-RR014.20`. Module: `pyproject.toml` entry-point groups. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r037_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R038
      Connector test kit
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Connector test kit.** Connectors prove conformance with the SDK `testing/` kit, including fake servers, sinks, and fleet scans. A connector must not ship its own fake MCP session, fake sink, or import scan. Owner: `SDK-CONNECTOR-CONTROL-RR004`, `SDK-CONNECTOR-CONTROL-RR014.1`. Module: `testing/`. | Conformance: SDK import scan `scan_many_packages`. No pipelines gate runs it.. Index test: `tests/test_centralized_capability_index.py::test_r038_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R039
      Domain record models
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Domain record models.** Connectors emit taxonomy, earth-observation, and voice-supply-chain records with the SDK record models. A connector must not ship its own record model for these domains. Owner: `SDK-SOURCE-INGEST-RR009`, `SDK-SOURCE-INGEST-RR804`, this spec. Module: `taxonomy/`, `earth_observations/`, `voice_supply_chain/`. | Conformance: unchecked. Index test: `tests/test_centralized_capability_index.py::test_r039_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESSPECIFIEDNo recorded commit/test evidence
      SDK-CENTRALIZED-CAPABILITIES-R040
      Optional dependencies come from SDK extras
      Definition — SDK-CENTRALIZED-CAPABILITIES / SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilitiesCanonical requirement and verification source
      **Optional dependencies come from SDK extras.** Connectors install optional drivers through `agent-connector-sdk[<extra>]`. The extras are `integrity`, `mcp`, `a2a`, `feeds`, `dataprep`, `db`, `mssql`, `graphql`, `market`, `stream`, `vector`, and `vector-chroma`. A connector must not pin a package that an SDK extra already pins. A connector must not pin `requests`, because the SDK base install carries `httpx`. Owner: this spec. Module: `pyproject.toml` `[project.optional-dependencies]`. | Conformance: pipelines `sdk-conformance` (`PIPE-GATES-R013`), warn by default, `--strict` blocks. SDK test: `tests/test_centralized_extras.py::test_every_extra_has_a_row`. Index test: `tests/test_centralized_capability_index.py::test_r040_module_and_owner_exist`.
      requirementSDK-CENTRALIZED-CAPABILITIESVERIFIEDfb85cad4b0ba
      tests/test_centralized_extras.py:27
      tests/test_centralized_extras.py:37
      TitleSpec delivery: scion-sdk
      RepositoryKnuckles-Team/scion-sdk
      Commit6437ebf4a3e4
      Captured (UTC)2026-10-25T22:18:08
      Snapshotsnapshot.json (v1)
      Sourcespecs/*/status.json
      Sheet1 of 1