Skip to content

tracking: DecisioningPlatform as the canonical AdCP adapter contract β€” alignment, migration, and positioningΒ #480

@bokelley

Description

@bokelley

🚧 DO NOT TRIAGE β€” tracking / positioning issue, owned by @bokelley. Work is decomposed across child issues #477, #478, #479. Do not assign work directly here.

Why this issue exists

When an AdCP operator sits down to build a multi-tenant sales agent today, the natural design instinct is to define an AdServerAdapter ABC β€” a contract their adapters (GAM, Kevel, Triton, in-house) implement, with a registry that dispatches per tenant. We've now seen this pattern emerge independently in at least one mature downstream (~15K LOC of Layer-2 infrastructure built around a custom AdServerAdapter).

The SDK already ships the contract: adcp.decisioning.DecisioningPlatform + specialism mixins (SalesPlatform, SignalsPlatform, CreativePlatform, GovernancePlatform, etc.) + AccountStore + BuyerAgentRegistry + TaskRegistry + webhook_emit + dispatch + compose. Operators who write their own AdServerAdapter ABC are building a parallel implementation of DecisioningPlatform.

This isn't anyone's fault. The SDK has historically been positioned as "protocol runtime + types," not "the canonical adapter contract." Operators who want a multi-tenant adapter pattern have to dig into adcp.decisioning and infer the seam from the reference seller, which assumes one platform per process.

This tracking issue captures the strategic alignment work: make DecisioningPlatform the obvious answer to "what's the AdCP adapter contract?", with worked examples for the multi-platform case and migration patterns for operators with parallel abstractions.

Scope (constituent issues)

The actual work is decomposed into three child issues:

What's deliberately NOT in scope

Success criteria

This tracking issue closes when:

Why this matters strategically

Three downstream effects, in order of immediacy:

  1. Reduces duplicate-implementation cost for operators. Every operator writing their own AdServerAdapter is rebuilding what DecisioningPlatform already does β€” usually with worse multi-tenant ergonomics, less spec coverage, and webhook delivery bugs the SDK has already solved (signed-bytes-vs-sent-bytes, retry/circuit-breaker, durable queue).

  2. Establishes the marketplace seam. Once DecisioningPlatform is the obvious answer, third parties (publishers, SSPs, vendors) can ship adapter packages against a stable contract. Today there's no contract to ship against β€” every adapter is monorepo-bound.

  3. Aligns SDK positioning with AAO mission. The SDK shifts from "Python types + protocol runtime" to "the runtime everyone uses to build AdCP-conformant adapters." That's the ecosystem play; the protocol-library framing leaves the high-leverage layer (Layer 2) unowned and re-implemented N times.

Open positioning questions (no decision needed yet)

  • Should adcp.adapters exist as a package namespace? Today everything platform-shaped lives under adcp.decisioning. "Adapter" might be more discoverable for operators arriving from a multi-tenant-SaaS background; "decisioning platform" is more accurate to the AdCP spec. Possible to ship adcp.adapters as an alias namespace re-exporting adcp.decisioning symbols.

  • Should the SDK ship reference adapters? A Python-native mock adapter is built in feat(examples): multi-platform-per-process proof β€” mock platforms with PlatformRouter, refactor v3 reference seller along the wayΒ #477. Whether adcp-<vendor>-adapter packages are an SDK-org concern or community-owned projects is a positioning call we can defer.


This issue is positioning, not engineering. Engineering happens in #477 / #478 / #479. Don't let this issue accumulate scope creep β€” the moment something concrete needs doing, it gets a child issue.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions