Skip to content

Multi-specialism + governance-aware adapter spec gaps — surfaced by hello adapter validation #3918

Description

@bokelley

Context

While building a multi-tenant + multi-specialism hello adapter for @adcp/sdk (branch adcontextprotocol/adcp-client@bokelley/hello-adapters-gov-rights, tracking issue adcp-client#1387) and running it through protocol expert review, several spec-level gaps surfaced. Three already filed individually: #3892 (rights_grant_id storyboard capture), #3913 (storyboard runner context seeding), #3914 (GOVERNANCE_DENIED storyboard convention). This is the meta-issue for the rest.

Items

Wire schema gaps

  • Add account: AccountReference to AcquireRightsRequest. Every governance-aware brand agent needs operator+brand to look up the account-scoped governance binding. The brand-rights compliance storyboard already sends account: { brand, operator } in acquire_rights_denied's sample request, but the schema doesn't define it — so the framework strips/ignores it for account resolution and adapters fall back to req.buyer.domain (which is the brand, not the buyer's account). Same shape every other governance-aware tool already has.

  • Add optional plan_id to SyncGovernanceRequest.accounts[].governance_agents[]. The wire request binds a governance agent URL to an account but doesn't reference which plan that agent is authoritative for. Adopters today invent conventions ("first plan wins", "active plan") because the wire is silent. Explicit plan_id removes the guesswork and matches how brand agents actually consult governance on acquire_rights.

  • Doc-comment clarification on GOVERNANCE_DENIED placement. error-code.json says it means "registered governance agent denied the transaction" — but is the canonical wire shape (a) AcquireRightsRejected with reason referencing the denial, or (b) thrown AdcpError projected as adcp_error.code: GOVERNANCE_DENIED, or (c) AcquireRightsError.errors[].code: GOVERNANCE_DENIED? Different storyboards interpret differently (brand_rights/governance_denied storyboard: expect_error: code: GOVERNANCE_DENIED is non-spec — AcquireRightsRejected is the canonical denial shape #3914 documents one mismatch). Suggest spec doc-comment: prefer Rejected arm for adopter-controlled denial; reserve thrown error for governance-call FAILURE (timeout / unreachable / config error), parallel to GOVERNANCE_UNAVAILABLE.

  • Broaden estimated_impressions MUST. Spec at acquire-rights-request.json:64 requires estimated_impressions only when the request carries an intent-phase governance_context AND CPM pricing. But governance-aware brand agents that bind via sync_governance (not via inline governance_context token) STILL need to project CPM spend — and "implementer-chosen defaults are non-conformant" per the same spec note. Resolution: any governance-aware CPM projection requires estimated_impressions, not just intent-phase context-token flows. Otherwise adopters either invent non-conformant defaults or block compliance scenarios that reasonable buyer flows produce.

  • Loosen ^https:// URL pattern for cross-agent dial-out URLs in dev. The schema rejects http://localhost:3003/mcp as a governance_agent_url even when the storyboard runner is invoked with --allow-http. Hello adapters demonstrating cross-agent integration locally need a way to register a dev-mode URL. Suggest: ^(https://|http://(localhost|127\.0\.0\.1)(:[0-9]+)?(/.*)?$). Same fix benefits webhook URLs and any *_url field used for cross-agent calls.

Storyboard runner

Spec-repo CI

Cross-references

Metadata

Metadata

Assignees

No one assigned

    Labels

    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.governanceIssue concerns the governance protocol domainneeds-wg-reviewBlocked on a working-group decision — surface in WG meeting agendas

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions