Skip to content

v5.0.0

Choose a tag to compare

@github-actions github-actions released this 17 Apr 10:04
· 1572 commits to main since this release
3268554

Major Changes

  • fc33966: BREAKING: TaskResult is now a discriminated union. Failed tasks use status:'failed' instead of 'completed'. MCP isError responses preserve structured data (adcp_error, context, ext) instead of throwing. Adds adcpError, correlationId, retryAfterMs convenience accessors and isRetryable()/getRetryDelay() utilities.

Minor Changes

  • 5a3c835: Brand rights as a first-class server domain, plus creative-asset record shape alignment

    Brand rights first-class domain. createAdcpServer({ brandRights: {...} }) now accepts a domain group for the three schema-backed tools: get_brand_identity, get_rights, and acquire_rights. No more manual server.tool() registration, no bespoke taskToolResponse wrapping — context echo, account resolution, and brand protocol declaration in get_adcp_capabilities all work out of the box.

    update_rights and creative_approval are intentionally not part of the domain group. The AdCP spec has no published JSON schemas for either — creative_approval is modeled as a webhook (POST to approval_webhook returned from acquire_rights), and update_rights is only described in prose. Adding permissive passthrough schemas just to satisfy a storyboard would be building to the test. They will be added when upstream schemas land (tracked in https://github.com/adcontextprotocol/adcp).

    Request-builder honors sample_request for build_creative and sync_creatives. Hand-authored sample payloads are preserved end-to-end, so storyboards can exercise slot-specific briefs, format-scoped uploads, and multi-format requests without the builder overwriting them. Matches the behavior already present for update_media_buy, create_media_buy, sync_plans, and calibrate_content.

    Creative asset record shape. All storyboard sample_request.creatives[].assets payloads now match the generated CreativeAssetSchema, which declares assets as z.record(asset_id, asset). Agents validating requests against the generated Zod schemas will no longer reject storyboard payloads that previously used the array-of-asset-objects form. Fixes creative_lifecycle, creative_template, creative_generative, creative_sales_agent, social_platform, media_buy_seller, media_buy_proposal_mode, media_buy_guaranteed_approval, deterministic_testing, and brand_rights.

    Protocol gaps surfaced (tracked for upstream AdCP spec work):

    • update_rights and creative_approval lack published JSON schemas — the latter is spec'd as a webhook, so the gap is request/response schemas for either transport
    • error_compliance storyboard is media-buy-scoped (requires get_products) — needs capability-aware dispatch to cover creative, signals, brand-rights, and governance agents

    Skill updates.

    • build-brand-rights-agent/SKILL.md rewritten around the new domain group and against the actual schemas/cache/latest/brand/*.json shapes (names as locale-keyed objects, logos with orientation/background/variant, pricing_options with model/price/uses, acquire_rights status discriminated union). Creative-approval flow is documented as an outbound webhook POST; update_rights is documented as a regular HTTP endpoint until schemas land.
  • f44c8c9: Add context passthrough testing, format_id reconciliation, and identifier roundtrip validations across all storyboards. Client SDK now preserves context and ext through field stripping via ADCP_ENVELOPE_FIELDS. Runner merges context/ext from sample_request into request builder output.

  • 8ad72f4: Added createAdcpServer — declarative server builder with domain-grouped handlers, automatic account resolution, response builder wiring, tool annotations, and auto-generated capabilities. Added checkGovernance and governanceDeniedError composable helpers for governance checks in financial handlers.

  • ed52beb: Add validation.filterInvalidProducts client option to filter out invalid products from get_products responses instead of rejecting the entire response when some products fail schema validation

  • 337fbeb: Fix broken code examples in build-seller-agent skill and improve createAdcpServer DX. Skill fixes: tsc command, creative state transitions, simulateDelivery params, confirmed_at, storyboard table, capabilities casing, channels type inference. Framework fixes: make account optional in registered MCP input schemas for handler-level validation; accept Record<string, unknown> from DomainHandler return types so plain object literals compile without exact type matching. Add compile-time test for all skill file typescript examples.

  • 8376f90: Add NetworkConsistencyChecker for validating managed publisher network deployments. Detects orphaned pointers, stale pointers, missing pointers, schema errors, and unreachable agent endpoints. Available as both a library import and CLI command (adcp check-network).

  • 316565c: Add media buy response builders that eliminate common implementation traps: validActionsForStatus() maps status to valid actions, mediaBuyResponse() auto-defaults revision/confirmed_at/valid_actions, cancelMediaBuyResponse() requires cancellation metadata. Sync schemas from latest AdCP.

  • d99b118: Add composable scenario library for seller storyboard certification. Scenarios are small, focused behavior tests (governance outcomes, product refinement, proposal finalize) that specialization storyboards declare via requires_scenarios. The compliance engine resolves and runs them alongside the main storyboard, enabling modular certification without duplicating test logic across seller types.

  • 5a3c835: Add storyboards, scenarios, and SDK helpers covering AdCP 3.0 primitives

    • New collection_governance storyboard for collection list CRUD, webhook delivery, and targeting via CollectionListReference
    • New media_buy_seller/measurement_terms_rejected scenario exercising the TERMS_REJECTED round-trip: buyer proposes unworkable terms, seller rejects, buyer retries with seller-compatible terms
    • New media_buy_seller/governance_denied_recovery scenario verifying the buyer can correct a denied buy and retry within plan limits
    • New media_buy_seller/pending_creatives_to_start scenario validating the pending_creatives → pending_start transition after sync_creatives
    • New media_buy_seller/inventory_list_targeting scenario exercising property_list + collection_list targeting on both create_media_buy AND update_media_buy (catches create/update parity regressions) and verifying persistence via get_media_buys
    • New media_buy_seller/inventory_list_no_match scenario covering the case where referenced lists resolve to zero matching inventory — seller must return a zero-forecast product or an informative error, not crash
    • New signal_marketplace/governance_denied and brand_rights/governance_denied scenarios covering governance across signal activation and rights licensing purchase types
    • Extended error_compliance with a version_negotiation phase that validates VERSION_UNSUPPORTED on an unsupported adcp_major_version and acceptance of a supported one
    • New media_buy_seller/invalid_transitions scenario with hard error_code assertions for MEDIA_BUY_NOT_FOUND, PACKAGE_NOT_FOUND, and NOT_CANCELLABLE (state-machine hardening)
    • Hardened existing error_compliance probes (negative_budget, reversed_dates_error, nonexistent_product) from soft field_present: errors to specific error_code assertions via allowed_values
    • check: error_code validations now accept allowed_values in addition to value, so scenarios can assert one-of for semantically overlapping codes (e.g. VALIDATION_ERROR vs INVALID_REQUEST)
    • Wired new scenarios into parent storyboards via requires_scenarios
    • Extended fictional-entities.yaml with a collections section (outdoor, automotive, and food programming) so storyboards have canonical test data for collection_list targeting
    • Extended test-kits/acme-outdoor.yaml with an inventory_targets section providing matching and non-matching PropertyListReference / CollectionListReference fixtures
    • Added resolvePropertyList / resolveCollectionList / matchesPropertyList / matchesCollectionList helpers to @adcp/client/server so seller handlers can filter inventory against buyer-supplied list references in one line
  • 7116ee7: Type brand_json with Zod schema matching the AdCP brand.json spec. SandboxBrand.brand_json is now typed as BrandJson instead of Record<string, unknown>, and sandbox data is validated at load time. Brand entries use spec-compliant field names (id, names) instead of the previous brand_id/name.

  • 48c0501: Close schema pipeline gap: generate TypeScript types and Zod schemas for all missing JSON schemas, add TOOL_REQUEST_SCHEMAS and TOOL_RESPONSE_SCHEMAS exports

Patch Changes

  • 1395e20: Add behavioral compliance validations to brand rights, property governance, and content standards storyboards

    • Brand rights: verify resolved identity data (brand_id match, names present), reject invalid brand IDs, validate creative approval decisions, test expired campaign and nonexistent grant enforcement
    • Property governance: assert compliant/non-compliant delivery verdicts, add enforcement phase with authorized and unauthorized publisher tests, fix context propagation for property_list_id
    • Content standards: assert calibration verdict, add must-rule violation test, add policy version change test with re-calibration, strengthen delivery validation with summary and results checks
  • 09a0c3e: Fix storyboard sample_requests and request-builder fallbacks to match AdCP schemas for brand_rights and property_governance

  • a8159c9: Enable --protocol a2a for storyboard testing. Connection cleanup is now protocol-aware, A2A clients are cached to avoid re-fetching the agent card on every tool call, and the compliance-testing auto-augment log now goes to stderr so it doesn't corrupt --json output.

  • 5a3c835: Preserve adcp_major_version through per-tool field filtering and handle synchronous error responses from MCP Tasks servers. Version-negotiation probes (e.g. intentionally unsupported major versions) now reach sellers intact, and VERSION_UNSUPPORTED errors returned synchronously by MCP servers are surfaced to callers rather than being masked by a Tasks SDK validation error.