Context
Adopter platform methods that return empty without calling anything (e.g. sync_creatives → [], get_media_buy_delivery → []) violate AdCP's anti-façade contract introduced in adcp PR #3816. Today there is no machine-checkable way to assert "this method actually made a downstream call to the ad server" — storyboard runs pass even when the platform is a no-op.
Cross-link: existing issue #347 (upstream-traffic recorder middleware) — this issue is the platform-side bookend. #347 records HTTP traffic the SDK emits; this issue records the calls the platform attempts to make to the ad server.
Refs:
examples/v3_reference_seller/src/platform.py
- adcp PR #3816 (anti-façade contract)
Acceptance Criteria
Context
Adopter platform methods that return empty without calling anything (e.g.
sync_creatives→[],get_media_buy_delivery→[]) violate AdCP's anti-façade contract introduced in adcp PR #3816. Today there is no machine-checkable way to assert "this method actually made a downstream call to the ad server" — storyboard runs pass even when the platform is a no-op.Cross-link: existing issue #347 (upstream-traffic recorder middleware) — this issue is the platform-side bookend. #347 records HTTP traffic the SDK emits; this issue records the calls the platform attempts to make to the ad server.
Refs:
examples/v3_reference_seller/src/platform.pyAcceptance Criteria
MockAdServerProtocol (or ABC) defined in the decisioning toolkit — the contract every platform method should call into for upstream operations (push creative, push media buy, fetch delivery, etc.)/_debug/trafficendpoint exposes the counters, gated behind a debug flagplatform.pyrewired to call theMockAdServerfor every spec operationtraffic.sync_creatives.call_count >= 1after async_creativesstoryboard