- 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
- 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.
Requirements (635)
Specs (9)
Each bar shows one state against all records of the same kind.
Percentages count current rows. Done means VERIFIED.
| State | Definition |
|---|---|
| SPECIFIED | The requirement is written. No code for it is on the default branch. |
| LANDED | A commit that carries its ID in a Spec trailer is on the default branch. |
| VERIFIED | It 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
| Spec / title | Req. | Landed | Done | Spec state | Code references |
|---|---|---|---|---|---|
| SDK-CONNECTOR-CONTROLSDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publication | 300 | 95/300 | 86 | SPECIFIED | ../../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 adapters | 12 | 7/12 | 6 | SPECIFIED | requirements.md documentation: file exists; coverage not verified |
| SDK-GOVERNED-WRITEBACKSDK-GOVERNED-WRITEBACK — Governed write-back to attached sources | 23 | 3/23 | 3 | SPECIFIED | agent_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 contract | 1 | 1/1 | 1 | ✓ VERIFIED | Not mapped |
| SDK-QUALITY-RELEASESDK-QUALITY-RELEASE — Portable SDK quality, Pages, and release | 6 | 6/6 | 6 | ✓ VERIFIED | requirements.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 transport | 5 | 4/5 | 4 | SPECIFIED | requirements.md documentation: file exists; coverage not verified |
| SDK-SCMSDK-SCM — SDK source client and virtual workspace | 14 | 0/14 | 0 | SPECIFIED | agent_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 migration | 234 | 72/234 | 72 | SPECIFIED | Approved 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 capabilities | 40 | 4/40 | 4 | SPECIFIED | spec.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.
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)
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)
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.
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
| Spec | Relationship | Target | Evidence |
|---|---|---|---|
| SDK-CONNECTOR-CONTROL Unparsed reference declaration: this contract derives from connector context and MCP progress needs.; source: specs/SDK-CONNECTOR-CONTROL/plan.md | depends on | Arbora host contract | Knuckles-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 | references | ARBORA-FLEET-R036 | Knuckles-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 | references | ARBORA-FLEET-R038 | Knuckles-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 | references | EG-FEDERATED-QUERY-R073.2 | Knuckles-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 | references | EG-TYPED-PACKS-R104 | Knuckles-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 on | SDK-CONNECTOR-CONTROL-R016 | Knuckles-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 on | SDK-CONNECTOR-CONTROL-R020 | Knuckles-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 on | SDK-CONNECTOR-CONTROL-R026 | Knuckles-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 on | SDK-CONNECTOR-CONTROL-R026.1 | Knuckles-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 on | SDK-CONNECTOR-CONTROL-R029 | Knuckles-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 on | SDK-CONNECTOR-CONTROL-R032 | Knuckles-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 | references | SDK-CONNECTOR-CONTROL-R014.17 | Knuckles-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 | references | SDK-CONNECTOR-CONTROL-R019 | Knuckles-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 | references | SDK-CONNECTOR-CONTROL-R040 | Knuckles-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 | references | SDK-CONNECTOR-CONTROL-R041 | Knuckles-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 | references | SDK-CONNECTOR-CONTROL-R042 | Knuckles-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 | references | SDK-CONNECTOR-CONTROL-R043 | Knuckles-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 | references | SDK-CONNECTOR-CONTROL-R044 | Knuckles-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 | references | SDK-CONNECTOR-CONTROL-R067 | Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-CONNECTOR-CONTROL/plan.md |
Knuckles-Team/scion-sdk / Source ingestion
| Spec | Relationship | Target | Evidence |
|---|---|---|---|
| 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 on | Approved query execution | Knuckles-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 on | EG-FEDERATED-QUERY-R085 | Knuckles-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 on | Source ingestion authority | Knuckles-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 on | SDK-CONNECTOR-CONTROL-R021 | Knuckles-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 on | SDK-GOVERNED-WRITEBACK-R001 | Knuckles-Team/scion-sdk: local spec declaration; source: specs/SDK-SOURCE-INGEST/plan.md |
Knuckles-Team/scion-sdk / Unassigned
| Spec | Relationship | Target | Evidence |
|---|---|---|---|
| SDK-CENTRALIZED-CAPABILITIES | No relationships declared; dependencies unknown | ||
| SDK-FINANCE-SOURCES | No 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 | references | RFC 8785 | Unresolved: unresolved; source: specs/SDK-GOVERNED-WRITEBACK/plan.md |
| SDK-OBSERVABILITY-FEEDS | No relationships declared; dependencies unknown | ||
| SDK-QUALITY-RELEASE | No relationships declared; dependencies unknown | ||
| SDK-REPOSITORY-TRANSPORT | No relationships declared; dependencies unknown | ||
| SDK-SCM | No relationships declared; dependencies unknown | ||
Issues
0 open at capture.
Pull Requests
0 open at capture.
The build reads GitHub one time. This page makes no live API requests.
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 / source | Kind | Parent | State | Commit / test evidence |
|---|---|---|---|---|
| SDK-CONNECTOR-CONTROL SDK-CONNECTOR-CONTROL — SDK connector control, certification, and pack publication | spec | None | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | dcc7d285ccc9 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | dcc7d285ccc9 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. | requirement | SDK-CONNECTOR-CONTROL | LANDED | 0f826d4ca6db 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | dcc7d285ccc9 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 584fb45cdf24 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 077a14c9f3d3 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | 0f826d4ca6db 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 077a14c9f3d3 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. | requirement | SDK-CONNECTOR-CONTROL | LANDED | 5e1bd9257555 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. | requirement | SDK-CONNECTOR-CONTROL | LANDED | 5e1bd9257555 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. | requirement | SDK-CONNECTOR-CONTROL | LANDED | 5e1bd9257555 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. | requirement | SDK-CONNECTOR-CONTROL | LANDED | 5e1bd9257555 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. | requirement | SDK-CONNECTOR-CONTROL | LANDED | 5e1bd9257555 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | 5e1bd9257555 |
| 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 077a14c9f3d3 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 061f9b58abb2 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 061f9b58abb2 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 584fb45cdf24 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | fad5328aee62 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. | requirement | SDK-CONNECTOR-CONTROL | LANDED | b0c376748245 |
| 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 045ba48df230 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 8f36880f39a7 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 434185d3a820 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 `/`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 434185d3a820 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | 0bc459ee7335 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 0a10559775ea 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 077a14c9f3d3 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 1cbd6f28d13d 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 713782e7901c 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 5a476653a386 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 3fd28fa8b883 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | d0d04813b42e 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 38b66f26f32a 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 284fb12a19ed 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 284fb12a19ed 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 64bcd00be5ef 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 19ca24046d12 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 284fb12a19ed 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 284fb12a19ed 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | f5de79afc1e0 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 284fb12a19ed 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 38b66f26f32a 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 629ef53c29f0 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 2c4e8ae0f172 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | 39fdd8f06293 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | LANDED | 629ef53c29f0 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | 3ddd773fb6dc 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 92d09c57796b 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | LANDED | ad6af590e63c |
| 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 851969957034 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` | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | ec63e38e9b5d 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 4f377bf3e39a 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | afc686a65836 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | afc686a65836 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | afc686a65836 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | afc686a65836 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | ed3b2f7f83d5 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 15b099abed9d 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | da3aa0ab05a4 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | da3aa0ab05a4 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 16cb53774404 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | eb0b3b299f31 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 682810f22bdd 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 91301b15d255 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 8c6dcfdd27e8 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 8c6dcfdd27e8 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 8c6dcfdd27e8 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` | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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` | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 8c6dcfdd27e8 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 889be6e354c7 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 889be6e354c7 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 889be6e354c7 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). | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 889be6e354c7 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). | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 889be6e354c7 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | ea6e90065040 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 8ec791033514 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | aa58c5dd6858 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__`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | aa58c5dd6858 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` | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 85fafc5b02ad 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 268d030fffad 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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`. | requirement | SDK-CONNECTOR-CONTROL | SPECIFIED | No 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 9571c94146e2 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 0d150cf96fd8 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 0d150cf96fd8 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 2078ee0208c5 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | f0b9e7f4f535 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 2487b614c171 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | f0b9e7f4f535 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`. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 95f251043be1 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. | requirement | SDK-CONNECTOR-CONTROL | VERIFIED | 647f3de98067 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 | spec | None | SPECIFIED | No 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. | requirement | SDK-FINANCE-SOURCES | LANDED | 840bd894c581 |
| 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. | requirement | SDK-FINANCE-SOURCES | VERIFIED | 077a14c9f3d3 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. | requirement | SDK-FINANCE-SOURCES | VERIFIED | 13fcdacb3ff1 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. | requirement | SDK-FINANCE-SOURCES | VERIFIED | 077a14c9f3d3 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. | requirement | SDK-FINANCE-SOURCES | VERIFIED | 077a14c9f3d3 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. | requirement | SDK-FINANCE-SOURCES | SPECIFIED | No 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` | requirement | SDK-FINANCE-SOURCES | SPECIFIED | No 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` | requirement | SDK-FINANCE-SOURCES | SPECIFIED | No 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` | requirement | SDK-FINANCE-SOURCES | SPECIFIED | No 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` | requirement | SDK-FINANCE-SOURCES | VERIFIED | 8c6dcfdd27e8 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` | requirement | SDK-FINANCE-SOURCES | SPECIFIED | No 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` | requirement | SDK-FINANCE-SOURCES | VERIFIED | 8c6dcfdd27e8 tests/test_payments.py:93 |
| SDK-GOVERNED-WRITEBACK SDK-GOVERNED-WRITEBACK — Governed write-back to attached sources | spec | None | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | daeb199f91c0 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | VERIFIED | 2d39be956d8d 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. | requirement | SDK-GOVERNED-WRITEBACK | VERIFIED | 2d39be956d8d 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | 6ef04661acc2 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | SPECIFIED | No 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. | requirement | SDK-GOVERNED-WRITEBACK | VERIFIED | 2d39be956d8d 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 | spec | None | VERIFIED | No 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. | requirement | SDK-OBSERVABILITY-FEEDS | VERIFIED | 077a14c9f3d3 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 | spec | None | VERIFIED | No 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. | requirement | SDK-QUALITY-RELEASE | VERIFIED | 3edcf05bc64a 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. | requirement | SDK-QUALITY-RELEASE | VERIFIED | fad5328aee62 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. | requirement | SDK-QUALITY-RELEASE | VERIFIED | 42b930057c3e 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. | requirement | SDK-QUALITY-RELEASE | VERIFIED | 010681764371 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. | requirement | SDK-QUALITY-RELEASE | VERIFIED | 096f27ee29e5 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. | requirement | SDK-QUALITY-RELEASE | VERIFIED | 8baf6d9167cd 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 | spec | None | SPECIFIED | No 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. | requirement | SDK-REPOSITORY-TRANSPORT | VERIFIED | acf470ac4906 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. | requirement | SDK-REPOSITORY-TRANSPORT | SPECIFIED | No 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. | requirement | SDK-REPOSITORY-TRANSPORT | VERIFIED | 077a14c9f3d3 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. | requirement | SDK-REPOSITORY-TRANSPORT | VERIFIED | acf470ac4906 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. | requirement | SDK-REPOSITORY-TRANSPORT | VERIFIED | acf470ac4906 tests/test_repository_transport.py:180 |
| SDK-SCM SDK-SCM — SDK source client and virtual workspace | spec | None | SPECIFIED | No 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. | requirement | SDK-SCM | SPECIFIED | No 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` | requirement | SDK-SCM | SPECIFIED | No 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` | requirement | SDK-SCM | SPECIFIED | No 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` | requirement | SDK-SCM | SPECIFIED | No 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` | requirement | SDK-SCM | SPECIFIED | No 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` | requirement | SDK-SCM | SPECIFIED | No 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` | requirement | SDK-SCM | SPECIFIED | No 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. | requirement | SDK-SCM | SPECIFIED | No 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` | requirement | SDK-SCM | SPECIFIED | No 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` | requirement | SDK-SCM | SPECIFIED | No 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` | requirement | SDK-SCM | SPECIFIED | No 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` | requirement | SDK-SCM | SPECIFIED | No 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` | requirement | SDK-SCM | SPECIFIED | No 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` | requirement | SDK-SCM | SPECIFIED | No recorded commit/test evidence |
| SDK-SOURCE-INGEST SDK-SOURCE-INGEST — SDK source sync, drift quarantine, and adapter migration | spec | None | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | ffb9260d7602 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 23f241b07560 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | 23f241b07560 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | b55555566da2 |
| 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 10376b1e9728 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 36d2c92e439c 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 36d2c92e439c 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 36d2c92e439c 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 10376b1e9728 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 1cbd1de01d83 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 1cbd1de01d83 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 1cbd1de01d83 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 10376b1e9728 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 10376b1e9728 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 10376b1e9728 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | ffb9260d7602 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 289aadb634d8 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 3735e4434463 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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`. | requirement | SDK-SOURCE-INGEST | VERIFIED | ed3b2f7f83d5 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`. | requirement | SDK-SOURCE-INGEST | VERIFIED | ed3b2f7f83d5 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`. | requirement | SDK-SOURCE-INGEST | VERIFIED | ed3b2f7f83d5 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | a775ed2ea1ef 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 36bc3184a30e 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | e877477e46b8 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | e877477e46b8 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 8853950ea5be 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | ce0f7eaf04e2 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 6519a20529e9 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | ce0f7eaf04e2 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 6519a20529e9 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 5199756f499e 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | c4795a2e0d04 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 2078ee0208c5 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()`. | requirement | SDK-SOURCE-INGEST | VERIFIED | aa58c5dd6858 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 2487b614c171 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 2487b614c171 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 07aa2957dd25 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 840277a9b0a4 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 840277a9b0a4 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. | requirement | SDK-SOURCE-INGEST | VERIFIED | 840277a9b0a4 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`. | requirement | SDK-SOURCE-INGEST | VERIFIED | 08685a0f0cf8 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | ec8d36a076f4 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | 11366ce437d5 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | 11366ce437d5 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | 11366ce437d5 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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` | requirement | SDK-SOURCE-INGEST | VERIFIED | 8c6dcfdd27e8 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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`. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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`. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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`. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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`. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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`. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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`. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No 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. | requirement | SDK-SOURCE-INGEST | SPECIFIED | No recorded commit/test evidence |
| SDK-CENTRALIZED-CAPABILITIES SDK-CENTRALIZED-CAPABILITIES — Centralized connector capabilities | spec | None | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | VERIFIED | c842d089626d 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | VERIFIED | fb85cad4b0ba 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | VERIFIED | fb85cad4b0ba 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | SPECIFIED | No 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`. | requirement | SDK-CENTRALIZED-CAPABILITIES | VERIFIED | fb85cad4b0ba tests/test_centralized_extras.py:27 tests/test_centralized_extras.py:37 |