@adcp/sdk 6.9.0 → 6.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/adcp.js +285 -5
- package/compliance/cache/3.0.6.previous/domains/brand/index.yaml +163 -0
- package/compliance/cache/3.0.6.previous/domains/creative/index.yaml +412 -0
- package/compliance/cache/3.0.6.previous/domains/governance/index.yaml +683 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.6.previous/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.0.6.previous/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.6.previous/index.json +324 -0
- package/compliance/cache/3.0.6.previous/protocols/brand/index.yaml +163 -0
- package/compliance/cache/3.0.6.previous/protocols/creative/index.yaml +412 -0
- package/compliance/cache/3.0.6.previous/protocols/governance/index.yaml +683 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.6.previous/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.0.6.previous/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.6.previous/specialisms/audience-sync/index.yaml +280 -0
- package/compliance/cache/3.0.6.previous/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.0.6.previous/specialisms/brand-rights/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.0.6.previous/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.0.6.previous/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-ad-server/index.yaml +383 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-generative/generative-seller.yaml +758 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-generative/index.yaml +746 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-template/index.yaml +413 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-aware-seller/index.yaml +136 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.0.6.previous/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-broadcast-tv/index.yaml +689 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-catalog-driven/index.yaml +779 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-guaranteed/index.yaml +504 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-non-guaranteed/index.yaml +428 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-proposal-mode/index.yaml +520 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-social/index.yaml +584 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/index.yaml +415 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/scenarios/governance_denied.yaml +207 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-owned/index.yaml +316 -0
- package/compliance/cache/3.0.6.previous/test-kits/acme-outdoor.yaml +210 -0
- package/compliance/cache/3.0.6.previous/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.0.6.previous/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.0.6.previous/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.0.6.previous/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.0.6.previous/test-kits/substitution-observer-runner.yaml +690 -0
- package/compliance/cache/3.0.6.previous/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.0.6.previous/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/README.md +219 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.0.6.previous/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.0.6.previous/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.0.6.previous/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.0.6.previous/universal/deterministic-testing.yaml +1343 -0
- package/compliance/cache/3.0.6.previous/universal/error-compliance.yaml +474 -0
- package/compliance/cache/3.0.6.previous/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.0.6.previous/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.0.6.previous/universal/get-signals-pagination-integrity.yaml +211 -0
- package/compliance/cache/3.0.6.previous/universal/idempotency.yaml +593 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity-creative-formats.yaml +258 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity-list-accounts.yaml +262 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.0.6.previous/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.0.6.previous/universal/runner-output-contract.yaml +358 -0
- package/compliance/cache/3.0.6.previous/universal/schema-validation.yaml +526 -0
- package/compliance/cache/3.0.6.previous/universal/security.yaml +431 -0
- package/compliance/cache/3.0.6.previous/universal/signed-requests.yaml +205 -0
- package/compliance/cache/3.0.6.previous/universal/storyboard-schema.yaml +1176 -0
- package/compliance/cache/3.0.6.previous/universal/v3-envelope-integrity.yaml +106 -0
- package/compliance/cache/3.0.6.previous/universal/webhook-emission.yaml +337 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/create-adcp-server.d.ts +33 -0
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +127 -1
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/credential-policy.d.ts +221 -0
- package/dist/lib/server/credential-policy.d.ts.map +1 -0
- package/dist/lib/server/credential-policy.js +260 -0
- package/dist/lib/server/credential-policy.js.map +1 -0
- package/dist/lib/server/dynamic-registry.d.ts +219 -0
- package/dist/lib/server/dynamic-registry.d.ts.map +1 -0
- package/dist/lib/server/dynamic-registry.js +245 -0
- package/dist/lib/server/dynamic-registry.js.map +1 -0
- package/dist/lib/server/index.d.ts +8 -0
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +15 -4
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/operational-platform.d.ts +239 -0
- package/dist/lib/server/operational-platform.d.ts.map +1 -0
- package/dist/lib/server/operational-platform.js +94 -0
- package/dist/lib/server/operational-platform.js.map +1 -0
- package/dist/lib/server/wire-safe.d.ts +211 -0
- package/dist/lib/server/wire-safe.d.ts.map +1 -0
- package/dist/lib/server/wire-safe.js +231 -0
- package/dist/lib/server/wire-safe.js.map +1 -0
- package/dist/lib/server/wire-spec-fields.generated.d.ts +168 -0
- package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -0
- package/dist/lib/server/wire-spec-fields.generated.js +172 -0
- package/dist/lib/server/wire-spec-fields.generated.js.map +1 -0
- package/dist/lib/testing/compliance/index.d.ts +2 -0
- package/dist/lib/testing/compliance/index.d.ts.map +1 -1
- package/dist/lib/testing/compliance/index.js +6 -1
- package/dist/lib/testing/compliance/index.js.map +1 -1
- package/dist/lib/testing/compliance/summary.d.ts +77 -0
- package/dist/lib/testing/compliance/summary.d.ts.map +1 -0
- package/dist/lib/testing/compliance/summary.js +176 -0
- package/dist/lib/testing/compliance/summary.js.map +1 -0
- package/dist/lib/testing/storyboard/compliance.d.ts +26 -0
- package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/compliance.js +51 -0
- package/dist/lib/testing/storyboard/compliance.js.map +1 -1
- package/dist/lib/testing/storyboard/index.d.ts +2 -2
- package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/index.js +4 -2
- package/dist/lib/testing/storyboard/index.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +58 -5
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
id: audience_sync
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Audience sync"
|
|
4
|
+
protocol: media-buy
|
|
5
|
+
category: audience_sync
|
|
6
|
+
summary: "Full audience lifecycle: account discovery, audience creation with hashed identifiers, and audience deletion."
|
|
7
|
+
track: audiences
|
|
8
|
+
required_tools:
|
|
9
|
+
- list_accounts
|
|
10
|
+
- sync_audiences
|
|
11
|
+
|
|
12
|
+
# Cross-step assertion (adcp#2664, extended in adcp-client#782). status.monotonic
|
|
13
|
+
# rejects audience status transitions observed across steps that aren't on
|
|
14
|
+
# the spec lifecycle graph. Audience lifecycle is fully bidirectional across
|
|
15
|
+
# processing / ready / too_small — the graph allows ready ↔ processing on
|
|
16
|
+
# re-sync, ready ↔ too_small as counts cross minimum_size, and the re-sync
|
|
17
|
+
# path too_small → processing → ready. Off-graph regressions (e.g. a seller
|
|
18
|
+
# silently downgrading from ready to an unknown enum value) fail here rather
|
|
19
|
+
# than slipping past per-step schema checks.
|
|
20
|
+
invariants:
|
|
21
|
+
- status.monotonic
|
|
22
|
+
|
|
23
|
+
platform_types:
|
|
24
|
+
- display_ad_server
|
|
25
|
+
- social_platform
|
|
26
|
+
- retail_media
|
|
27
|
+
- audio_platform
|
|
28
|
+
- dsp
|
|
29
|
+
- pmax_platform
|
|
30
|
+
|
|
31
|
+
narrative: |
|
|
32
|
+
You support audience syncing via the sync_audiences task. Buyers push first-party
|
|
33
|
+
audience segments to your platform using hashed identifiers (emails, phones). Your
|
|
34
|
+
platform matches those identifiers against your user graph and returns match rates.
|
|
35
|
+
|
|
36
|
+
This storyboard verifies the full audience lifecycle: discover an account to sync
|
|
37
|
+
against, create a test audience with hashed identifiers, and clean up by deleting it.
|
|
38
|
+
|
|
39
|
+
agent:
|
|
40
|
+
interaction_model: media_buy_seller
|
|
41
|
+
capabilities:
|
|
42
|
+
- sells_media
|
|
43
|
+
- accepts_audiences
|
|
44
|
+
examples:
|
|
45
|
+
- "Retail media networks"
|
|
46
|
+
- "Social platforms"
|
|
47
|
+
- "DSPs with audience onboarding"
|
|
48
|
+
|
|
49
|
+
caller:
|
|
50
|
+
role: buyer_agent
|
|
51
|
+
example: "Scope3 (DSP)"
|
|
52
|
+
|
|
53
|
+
prerequisites:
|
|
54
|
+
description: |
|
|
55
|
+
The caller needs an active account on the seller platform. The account_setup phase
|
|
56
|
+
discovers or creates the account relationship before syncing audiences.
|
|
57
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
58
|
+
|
|
59
|
+
phases:
|
|
60
|
+
- id: capability_discovery
|
|
61
|
+
title: "Capability discovery"
|
|
62
|
+
narrative: |
|
|
63
|
+
The buyer calls get_adcp_capabilities to confirm the agent supports media buying before syncing audiences.
|
|
64
|
+
|
|
65
|
+
steps:
|
|
66
|
+
- id: get_capabilities
|
|
67
|
+
title: "Check agent capabilities"
|
|
68
|
+
narrative: |
|
|
69
|
+
Verify that the agent declares the expected protocol support before
|
|
70
|
+
proceeding with domain-specific operations.
|
|
71
|
+
task: get_adcp_capabilities
|
|
72
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
73
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
74
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
75
|
+
comply_scenario: capability_discovery
|
|
76
|
+
stateful: false
|
|
77
|
+
expected: |
|
|
78
|
+
Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
|
|
79
|
+
sample_request:
|
|
80
|
+
context:
|
|
81
|
+
correlation_id: "audience_sync--get_capabilities"
|
|
82
|
+
validations:
|
|
83
|
+
- check: response_schema
|
|
84
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
85
|
+
- check: field_present
|
|
86
|
+
path: "supported_protocols"
|
|
87
|
+
description: "Agent declares supported protocols"
|
|
88
|
+
|
|
89
|
+
- check: field_present
|
|
90
|
+
path: "context"
|
|
91
|
+
description: "Response echoes back the context object"
|
|
92
|
+
- check: field_value
|
|
93
|
+
path: "context.correlation_id"
|
|
94
|
+
value: "audience_sync--get_capabilities"
|
|
95
|
+
description: "Context correlation_id returned unchanged"
|
|
96
|
+
- id: account_setup
|
|
97
|
+
title: "Account setup"
|
|
98
|
+
narrative: |
|
|
99
|
+
Before syncing audiences, the buyer needs an account on the seller platform.
|
|
100
|
+
This phase discovers an existing account via list_accounts or establishes one
|
|
101
|
+
via sync_accounts.
|
|
102
|
+
|
|
103
|
+
steps:
|
|
104
|
+
- id: discover_account
|
|
105
|
+
title: "Discover or create account"
|
|
106
|
+
narrative: |
|
|
107
|
+
List existing accounts to find one suitable for audience sync. The account
|
|
108
|
+
must already exist and be active. The account_id is captured for use in
|
|
109
|
+
subsequent audience operations.
|
|
110
|
+
task: list_accounts
|
|
111
|
+
schema_ref: "account/list-accounts-request.json"
|
|
112
|
+
response_schema_ref: "account/list-accounts-response.json"
|
|
113
|
+
doc_ref: "/accounts/tasks/list_accounts"
|
|
114
|
+
stateful: true
|
|
115
|
+
expected: |
|
|
116
|
+
Return at least one account with:
|
|
117
|
+
- account_id: platform-assigned identifier
|
|
118
|
+
- status: active (required for audience sync)
|
|
119
|
+
|
|
120
|
+
sample_request:
|
|
121
|
+
context:
|
|
122
|
+
correlation_id: "audience_sync--discover_account"
|
|
123
|
+
|
|
124
|
+
validations:
|
|
125
|
+
- check: response_schema
|
|
126
|
+
description: "Response matches list-accounts-response.json schema"
|
|
127
|
+
- check: field_present
|
|
128
|
+
path: "accounts[0].account_id"
|
|
129
|
+
description: "At least one account exists with an account_id"
|
|
130
|
+
|
|
131
|
+
- check: field_present
|
|
132
|
+
path: "context"
|
|
133
|
+
description: "Response echoes back the context object"
|
|
134
|
+
- check: field_value
|
|
135
|
+
path: "context.correlation_id"
|
|
136
|
+
value: "audience_sync--discover_account"
|
|
137
|
+
description: "Context correlation_id returned unchanged"
|
|
138
|
+
- id: audience_sync
|
|
139
|
+
title: "Audience sync"
|
|
140
|
+
narrative: |
|
|
141
|
+
The buyer syncs a test audience containing hashed email and phone identifiers.
|
|
142
|
+
The seller platform matches those identifiers and returns per-audience results
|
|
143
|
+
including action (created/updated), status, and match rates.
|
|
144
|
+
|
|
145
|
+
After verifying creation, the test audience is deleted to clean up.
|
|
146
|
+
|
|
147
|
+
steps:
|
|
148
|
+
- id: discover_audiences
|
|
149
|
+
title: "Discover existing audiences"
|
|
150
|
+
narrative: |
|
|
151
|
+
Call sync_audiences with no audiences array to discover what audiences
|
|
152
|
+
already exist on the platform for this account. This is a read-only
|
|
153
|
+
discovery call.
|
|
154
|
+
task: sync_audiences
|
|
155
|
+
schema_ref: "media-buy/sync-audiences-request.json"
|
|
156
|
+
response_schema_ref: "media-buy/sync-audiences-response.json"
|
|
157
|
+
doc_ref: "/media-buy/task-reference/sync_audiences"
|
|
158
|
+
comply_scenario: sync_audiences
|
|
159
|
+
stateful: false
|
|
160
|
+
expected: |
|
|
161
|
+
Return existing audiences for the account (may be empty).
|
|
162
|
+
Each audience should have an audience_id and status.
|
|
163
|
+
|
|
164
|
+
sample_request:
|
|
165
|
+
account:
|
|
166
|
+
brand:
|
|
167
|
+
domain: "acmeoutdoor.example"
|
|
168
|
+
operator: "pinnacle-agency.example"
|
|
169
|
+
|
|
170
|
+
idempotency_key: "$generate:uuid_v4#audience_sync_audience_sync_discover_audiences"
|
|
171
|
+
context:
|
|
172
|
+
correlation_id: "audience_sync--discover_audiences"
|
|
173
|
+
validations:
|
|
174
|
+
- check: response_schema
|
|
175
|
+
description: "Response matches sync-audiences-response.json schema"
|
|
176
|
+
|
|
177
|
+
- check: field_present
|
|
178
|
+
path: "context"
|
|
179
|
+
description: "Response echoes back the context object"
|
|
180
|
+
- check: field_value
|
|
181
|
+
path: "context.correlation_id"
|
|
182
|
+
value: "audience_sync--discover_audiences"
|
|
183
|
+
description: "Context correlation_id returned unchanged"
|
|
184
|
+
- id: create_audience
|
|
185
|
+
title: "Create test audience"
|
|
186
|
+
narrative: |
|
|
187
|
+
Push a test audience with hashed email and phone identifiers. The seller
|
|
188
|
+
matches identifiers against their user graph and returns the audience with
|
|
189
|
+
action: created, match counts, and match rate.
|
|
190
|
+
task: sync_audiences
|
|
191
|
+
schema_ref: "media-buy/sync-audiences-request.json"
|
|
192
|
+
response_schema_ref: "media-buy/sync-audiences-response.json"
|
|
193
|
+
doc_ref: "/media-buy/task-reference/sync_audiences"
|
|
194
|
+
comply_scenario: sync_audiences
|
|
195
|
+
stateful: true
|
|
196
|
+
expected: |
|
|
197
|
+
Accept the audience and return:
|
|
198
|
+
- audience_id: matches the submitted ID
|
|
199
|
+
- action: created
|
|
200
|
+
- status: active or processing
|
|
201
|
+
- uploaded_count: number of identifiers received
|
|
202
|
+
- matched_count: number of identifiers matched
|
|
203
|
+
- effective_match_rate: ratio of matched to uploaded
|
|
204
|
+
|
|
205
|
+
sample_request:
|
|
206
|
+
account:
|
|
207
|
+
brand:
|
|
208
|
+
domain: "acmeoutdoor.example"
|
|
209
|
+
operator: "pinnacle-agency.example"
|
|
210
|
+
audiences:
|
|
211
|
+
- audience_id: "adcp-test-audience-001"
|
|
212
|
+
name: "AdCP test audience"
|
|
213
|
+
add:
|
|
214
|
+
- external_id: "adcp-user-0001"
|
|
215
|
+
hashed_email: "a000000000000000000000000000000000000000000000000000000000000000"
|
|
216
|
+
- external_id: "adcp-user-0002"
|
|
217
|
+
hashed_phone: "b000000000000000000000000000000000000000000000000000000000000000"
|
|
218
|
+
|
|
219
|
+
idempotency_key: "$generate:uuid_v4#audience_sync_audience_sync_create_audience"
|
|
220
|
+
context:
|
|
221
|
+
correlation_id: "audience_sync--create_audience"
|
|
222
|
+
validations:
|
|
223
|
+
- check: response_schema
|
|
224
|
+
description: "Response matches sync-audiences-response.json schema"
|
|
225
|
+
- check: field_present
|
|
226
|
+
path: "audiences[0].audience_id"
|
|
227
|
+
description: "Audience has an audience_id"
|
|
228
|
+
- check: field_present
|
|
229
|
+
path: "audiences[0].action"
|
|
230
|
+
description: "Audience has an action (created or updated)"
|
|
231
|
+
|
|
232
|
+
- check: field_present
|
|
233
|
+
path: "context"
|
|
234
|
+
description: "Response echoes back the context object"
|
|
235
|
+
- check: field_value
|
|
236
|
+
path: "context.correlation_id"
|
|
237
|
+
value: "audience_sync--create_audience"
|
|
238
|
+
description: "Context correlation_id returned unchanged"
|
|
239
|
+
- id: delete_audience
|
|
240
|
+
title: "Delete test audience"
|
|
241
|
+
narrative: |
|
|
242
|
+
Clean up by deleting the test audience. The seller should acknowledge the
|
|
243
|
+
deletion with action: deleted.
|
|
244
|
+
task: sync_audiences
|
|
245
|
+
schema_ref: "media-buy/sync-audiences-request.json"
|
|
246
|
+
response_schema_ref: "media-buy/sync-audiences-response.json"
|
|
247
|
+
doc_ref: "/media-buy/task-reference/sync_audiences"
|
|
248
|
+
comply_scenario: sync_audiences
|
|
249
|
+
stateful: true
|
|
250
|
+
expected: |
|
|
251
|
+
Delete the test audience and return:
|
|
252
|
+
- audience_id: matches the test audience
|
|
253
|
+
- action: deleted
|
|
254
|
+
|
|
255
|
+
sample_request:
|
|
256
|
+
account:
|
|
257
|
+
brand:
|
|
258
|
+
domain: "acmeoutdoor.example"
|
|
259
|
+
operator: "pinnacle-agency.example"
|
|
260
|
+
audiences:
|
|
261
|
+
- audience_id: "adcp-test-audience-001"
|
|
262
|
+
delete: true
|
|
263
|
+
|
|
264
|
+
idempotency_key: "$generate:uuid_v4#audience_sync_audience_sync_delete_audience"
|
|
265
|
+
context:
|
|
266
|
+
correlation_id: "audience_sync--delete_audience"
|
|
267
|
+
validations:
|
|
268
|
+
- check: response_schema
|
|
269
|
+
description: "Response matches sync-audiences-response.json schema"
|
|
270
|
+
- check: field_present
|
|
271
|
+
path: "audiences[0].action"
|
|
272
|
+
description: "Audience deletion acknowledged with action field"
|
|
273
|
+
|
|
274
|
+
- check: field_present
|
|
275
|
+
path: "context"
|
|
276
|
+
description: "Response echoes back the context object"
|
|
277
|
+
- check: field_value
|
|
278
|
+
path: "context.correlation_id"
|
|
279
|
+
value: "audience_sync--delete_audience"
|
|
280
|
+
description: "Context correlation_id returned unchanged"
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
id: brand_rights
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Brand identity and rights licensing"
|
|
4
|
+
protocol: brand
|
|
5
|
+
category: brand_rights
|
|
6
|
+
summary: "Brand agent that serves identity assets and licenses rights for AI-generated content."
|
|
7
|
+
track: core
|
|
8
|
+
required_tools:
|
|
9
|
+
- get_brand_identity
|
|
10
|
+
requires_scenarios:
|
|
11
|
+
- brand_rights/governance_denied
|
|
12
|
+
|
|
13
|
+
narrative: |
|
|
14
|
+
You run a brand agent — a system that holds brand identity data (logos, colors, fonts,
|
|
15
|
+
tone of voice) and licenses rights for AI-generated content. A buyer agent connects to
|
|
16
|
+
discover your brand identity, browse available rights, acquire licenses, manage them over
|
|
17
|
+
time, and submit generated creatives for brand approval.
|
|
18
|
+
|
|
19
|
+
Brand agents are the bridge between brand owners and generative AI. When a DSP or
|
|
20
|
+
creative platform wants to generate an ad for your brand, they call your brand agent
|
|
21
|
+
to get the identity guidelines, license the right to generate content, and then submit
|
|
22
|
+
the result for approval before it goes live.
|
|
23
|
+
|
|
24
|
+
This storyboard covers the full brand rights lifecycle: discovering the brand, browsing
|
|
25
|
+
rights, acquiring a license, managing it, and approving generated content.
|
|
26
|
+
|
|
27
|
+
agent:
|
|
28
|
+
interaction_model: brand_rights_holder
|
|
29
|
+
capabilities:
|
|
30
|
+
- brand_identity
|
|
31
|
+
- rights_licensing
|
|
32
|
+
examples:
|
|
33
|
+
- "Rights management platforms"
|
|
34
|
+
- "Talent agencies"
|
|
35
|
+
- "Brand licensing services"
|
|
36
|
+
- "Enterprise brand portals"
|
|
37
|
+
|
|
38
|
+
caller:
|
|
39
|
+
role: buyer_agent
|
|
40
|
+
example: "Pinnacle Agency (creative buyer)"
|
|
41
|
+
|
|
42
|
+
prerequisites:
|
|
43
|
+
description: |
|
|
44
|
+
The caller needs brand context for identity discovery and campaign parameters for
|
|
45
|
+
rights acquisition. The test kit provides a sample brand with visual identity assets.
|
|
46
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
47
|
+
|
|
48
|
+
phases:
|
|
49
|
+
- id: capability_discovery
|
|
50
|
+
title: "Capability discovery"
|
|
51
|
+
narrative: |
|
|
52
|
+
The buyer calls get_adcp_capabilities to confirm the agent supports brand identity and rights before requesting brand data.
|
|
53
|
+
|
|
54
|
+
steps:
|
|
55
|
+
- id: get_capabilities
|
|
56
|
+
title: "Check agent capabilities"
|
|
57
|
+
narrative: |
|
|
58
|
+
Verify that the agent declares the expected protocol support before
|
|
59
|
+
proceeding with domain-specific operations.
|
|
60
|
+
task: get_adcp_capabilities
|
|
61
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
62
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
63
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
64
|
+
comply_scenario: capability_discovery
|
|
65
|
+
stateful: false
|
|
66
|
+
expected: |
|
|
67
|
+
Return capabilities declaring brand in supported_protocols, confirming the agent serves brand identity and rights.
|
|
68
|
+
sample_request:
|
|
69
|
+
context:
|
|
70
|
+
correlation_id: "brand_rights--get_capabilities"
|
|
71
|
+
validations:
|
|
72
|
+
- check: response_schema
|
|
73
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
74
|
+
- check: field_present
|
|
75
|
+
path: "supported_protocols"
|
|
76
|
+
description: "Agent declares supported protocols"
|
|
77
|
+
|
|
78
|
+
- check: field_present
|
|
79
|
+
path: "context"
|
|
80
|
+
description: "Response echoes back the context object"
|
|
81
|
+
- check: field_value
|
|
82
|
+
path: "context.correlation_id"
|
|
83
|
+
value: "brand_rights--get_capabilities"
|
|
84
|
+
description: "Context correlation_id returned unchanged"
|
|
85
|
+
- id: identity_discovery
|
|
86
|
+
title: "Brand identity discovery"
|
|
87
|
+
narrative: |
|
|
88
|
+
The buyer retrieves the brand's public identity — logos, colors, fonts, tone of
|
|
89
|
+
voice, and visual guidelines. This is the foundation for any generative content:
|
|
90
|
+
the buyer needs to know what the brand looks like and sounds like before generating
|
|
91
|
+
anything.
|
|
92
|
+
|
|
93
|
+
steps:
|
|
94
|
+
- id: get_brand_identity
|
|
95
|
+
title: "Retrieve brand identity"
|
|
96
|
+
narrative: |
|
|
97
|
+
The buyer calls get_brand_identity to retrieve the brand's visual and verbal
|
|
98
|
+
identity. Public-tier access returns basic assets. Authorized access (after
|
|
99
|
+
account linking) provides high-resolution assets, voice configs, and detailed
|
|
100
|
+
tone guidelines.
|
|
101
|
+
task: get_brand_identity
|
|
102
|
+
schema_ref: "brand/get-brand-identity-request.json"
|
|
103
|
+
response_schema_ref: "brand/get-brand-identity-response.json"
|
|
104
|
+
doc_ref: "/brand-protocol/tasks/get_brand_identity"
|
|
105
|
+
stateful: false
|
|
106
|
+
expected: |
|
|
107
|
+
Return brand identity data:
|
|
108
|
+
- Logos at multiple resolutions
|
|
109
|
+
- Brand colors (primary, secondary, accent)
|
|
110
|
+
- Typography (fonts, weights, sizes)
|
|
111
|
+
- Tone of voice guidelines
|
|
112
|
+
- Visual style guidelines
|
|
113
|
+
|
|
114
|
+
sample_request:
|
|
115
|
+
brand_id: "acme_outdoor"
|
|
116
|
+
|
|
117
|
+
context:
|
|
118
|
+
correlation_id: "brand_rights--get_brand_identity"
|
|
119
|
+
|
|
120
|
+
validations:
|
|
121
|
+
- check: response_schema
|
|
122
|
+
description: "Response matches brand identity schema"
|
|
123
|
+
- check: field_present
|
|
124
|
+
path: "brand_id"
|
|
125
|
+
description: "Response includes brand_id"
|
|
126
|
+
- check: field_value
|
|
127
|
+
path: "brand_id"
|
|
128
|
+
value: "acme_outdoor"
|
|
129
|
+
description: "Returned brand_id matches the requested brand"
|
|
130
|
+
- check: field_present
|
|
131
|
+
path: "names"
|
|
132
|
+
description: "Response includes brand names"
|
|
133
|
+
|
|
134
|
+
- id: get_brand_identity_invalid
|
|
135
|
+
title: "Reject invalid brand ID"
|
|
136
|
+
narrative: |
|
|
137
|
+
The buyer requests identity for a brand that does not exist. The agent must
|
|
138
|
+
return an error rather than generating default identity data — an agent that
|
|
139
|
+
silently returns placeholder identity would pass schema checks but fail this
|
|
140
|
+
behavioral test.
|
|
141
|
+
task: get_brand_identity
|
|
142
|
+
schema_ref: "brand/get-brand-identity-request.json"
|
|
143
|
+
response_schema_ref: "brand/get-brand-identity-response.json"
|
|
144
|
+
doc_ref: "/brand-protocol/tasks/get_brand_identity"
|
|
145
|
+
stateful: false
|
|
146
|
+
expect_error: true
|
|
147
|
+
negative_path: payload_well_formed
|
|
148
|
+
expected: |
|
|
149
|
+
Reject the request with an error:
|
|
150
|
+
- Error indicates the brand was not found
|
|
151
|
+
- No default or placeholder identity data returned
|
|
152
|
+
|
|
153
|
+
sample_request:
|
|
154
|
+
brand_id: "nonexistent_brand_xyz"
|
|
155
|
+
|
|
156
|
+
validations:
|
|
157
|
+
- check: error_code
|
|
158
|
+
description: "Error code present for unknown brand"
|
|
159
|
+
|
|
160
|
+
- id: rights_search
|
|
161
|
+
title: "Browse available rights"
|
|
162
|
+
narrative: |
|
|
163
|
+
The buyer discovers what rights are available for licensing. Rights define what
|
|
164
|
+
generative content can be created — image generation, video synthesis, voice
|
|
165
|
+
cloning, copy writing — and at what terms.
|
|
166
|
+
|
|
167
|
+
steps:
|
|
168
|
+
- id: get_rights
|
|
169
|
+
title: "Discover available rights"
|
|
170
|
+
narrative: |
|
|
171
|
+
The buyer calls get_rights to search across the agent's full rights
|
|
172
|
+
roster (talent, music, stock media, etc.). `buyer_brand` identifies
|
|
173
|
+
the advertiser so the agent can apply compatibility filtering
|
|
174
|
+
(competitor exclusions, dietary conflicts from the buyer's
|
|
175
|
+
brand.json). The optional `brand_id` filter — which scopes results
|
|
176
|
+
to a specific rights-holder brand (e.g., a named athlete) — is
|
|
177
|
+
omitted here so the agent returns its full catalog.
|
|
178
|
+
task: get_rights
|
|
179
|
+
schema_ref: "brand/get-rights-request.json"
|
|
180
|
+
response_schema_ref: "brand/get-rights-response.json"
|
|
181
|
+
doc_ref: "/brand-protocol/tasks/get_rights"
|
|
182
|
+
stateful: false
|
|
183
|
+
expected: |
|
|
184
|
+
Return available rights with pricing:
|
|
185
|
+
- Right types (image_generation, video_synthesis, copy_writing, etc.)
|
|
186
|
+
- Pricing options per right
|
|
187
|
+
- Duration and renewal terms
|
|
188
|
+
- Usage constraints (impression caps, geo restrictions)
|
|
189
|
+
|
|
190
|
+
sample_request:
|
|
191
|
+
query: "image generation rights for advertising"
|
|
192
|
+
uses:
|
|
193
|
+
- "ai_generated_image"
|
|
194
|
+
buyer_brand:
|
|
195
|
+
domain: "acmeoutdoor.example"
|
|
196
|
+
|
|
197
|
+
context:
|
|
198
|
+
correlation_id: "brand_rights--get_rights"
|
|
199
|
+
context_outputs:
|
|
200
|
+
- path: "rights.0.rights_id"
|
|
201
|
+
key: "rights_id"
|
|
202
|
+
- path: "rights.0.pricing_options.0.pricing_option_id"
|
|
203
|
+
key: "pricing_option_id"
|
|
204
|
+
|
|
205
|
+
validations:
|
|
206
|
+
- check: response_schema
|
|
207
|
+
description: "Response matches get_rights schema"
|
|
208
|
+
- check: field_present
|
|
209
|
+
path: "rights"
|
|
210
|
+
description: "Response includes rights array"
|
|
211
|
+
|
|
212
|
+
- check: field_present
|
|
213
|
+
path: "context"
|
|
214
|
+
description: "Response echoes back the context object"
|
|
215
|
+
- check: field_value
|
|
216
|
+
path: "context.correlation_id"
|
|
217
|
+
value: "brand_rights--get_rights"
|
|
218
|
+
description: "Context correlation_id returned unchanged"
|
|
219
|
+
- id: rights_acquisition
|
|
220
|
+
title: "Acquire a rights license"
|
|
221
|
+
narrative: |
|
|
222
|
+
The buyer selects a right and acquires a license. This is the contractual commitment —
|
|
223
|
+
the buyer pays for the right to generate content of a specific type for a defined
|
|
224
|
+
period. The brand agent issues generation credentials.
|
|
225
|
+
|
|
226
|
+
steps:
|
|
227
|
+
- id: acquire_rights
|
|
228
|
+
title: "Purchase a rights license"
|
|
229
|
+
narrative: |
|
|
230
|
+
The buyer acquires a specific right by selecting a pricing option and providing
|
|
231
|
+
campaign context. The brand agent validates the request, processes payment,
|
|
232
|
+
and returns a rights grant with generation credentials.
|
|
233
|
+
task: acquire_rights
|
|
234
|
+
schema_ref: "brand/acquire-rights-request.json"
|
|
235
|
+
response_schema_ref: "brand/acquire-rights-response.json"
|
|
236
|
+
doc_ref: "/brand-protocol/tasks/acquire_rights"
|
|
237
|
+
stateful: true
|
|
238
|
+
expected: |
|
|
239
|
+
Return the acquired rights grant:
|
|
240
|
+
- rights_id: unique identifier
|
|
241
|
+
- status: acquired
|
|
242
|
+
- Generation credentials
|
|
243
|
+
- Expiration date and usage limits
|
|
244
|
+
- Terms and constraints
|
|
245
|
+
|
|
246
|
+
sample_request:
|
|
247
|
+
account:
|
|
248
|
+
brand:
|
|
249
|
+
domain: "acmeoutdoor.example"
|
|
250
|
+
operator: "pinnacle-agency.example"
|
|
251
|
+
rights_id: "$context.rights_id"
|
|
252
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
253
|
+
buyer:
|
|
254
|
+
domain: "pinnacle-agency.example"
|
|
255
|
+
campaign:
|
|
256
|
+
description: "AI-generated display ads for Acme Outdoor summer trail gear campaign"
|
|
257
|
+
uses:
|
|
258
|
+
- "likeness"
|
|
259
|
+
- "commercial"
|
|
260
|
+
start_date: "2026-04-01"
|
|
261
|
+
end_date: "2026-06-30"
|
|
262
|
+
revocation_webhook:
|
|
263
|
+
url: "https://pinnacle-agency.example/webhooks/revocation"
|
|
264
|
+
authentication:
|
|
265
|
+
schemes:
|
|
266
|
+
- "Bearer"
|
|
267
|
+
credentials: "pinnacle-revocation-webhook-secret-token"
|
|
268
|
+
|
|
269
|
+
idempotency_key: "$generate:uuid_v4#brand_rights_rights_acquisition_acquire_rights"
|
|
270
|
+
context:
|
|
271
|
+
correlation_id: "brand_rights--acquire_rights"
|
|
272
|
+
context_outputs:
|
|
273
|
+
- path: "rights_id"
|
|
274
|
+
key: "rights_grant_id"
|
|
275
|
+
|
|
276
|
+
validations:
|
|
277
|
+
- check: response_schema
|
|
278
|
+
description: "Response matches acquire_rights schema"
|
|
279
|
+
- check: field_present
|
|
280
|
+
path: "rights_id"
|
|
281
|
+
description: "Response includes rights_id"
|
|
282
|
+
|
|
283
|
+
- check: field_present
|
|
284
|
+
path: "context"
|
|
285
|
+
description: "Response echoes back the context object"
|
|
286
|
+
- check: field_value
|
|
287
|
+
path: "context.correlation_id"
|
|
288
|
+
value: "brand_rights--acquire_rights"
|
|
289
|
+
description: "Context correlation_id returned unchanged"
|
|
290
|
+
# NOTE: update_rights and creative_approval are intentionally absent.
|
|
291
|
+
# - update_rights has no published JSON request/response schemas yet (spec
|
|
292
|
+
# describes it conceptually in rights-terms.json).
|
|
293
|
+
# - creative_approval is modeled in the spec as a webhook (POST to the
|
|
294
|
+
# approval_webhook returned from acquire_rights), not an AdCP tool. Agents
|
|
295
|
+
# expose it as a regular HTTP endpoint outside the MCP surface.
|
|
296
|
+
# Both will be added back as storyboard phases once upstream schemas land
|
|
297
|
+
# (see https://github.com/adcontextprotocol/adcp for tracking).
|
|
298
|
+
|
|
299
|
+
- id: rights_enforcement
|
|
300
|
+
title: "Rights enforcement"
|
|
301
|
+
narrative: |
|
|
302
|
+
These steps test that the brand agent enforces rights constraints — expired
|
|
303
|
+
licenses, impression cap violations, and geographic restrictions. An agent that
|
|
304
|
+
only implements the happy path would pass the phases above but fail here.
|
|
305
|
+
|
|
306
|
+
steps:
|
|
307
|
+
- id: acquire_expired_rights
|
|
308
|
+
title: "Reject acquisition with expired campaign dates"
|
|
309
|
+
narrative: |
|
|
310
|
+
The buyer attempts to acquire rights for a campaign with dates entirely in
|
|
311
|
+
the past. The brand agent must reject this — a compliant agent does not issue
|
|
312
|
+
licenses for expired campaigns.
|
|
313
|
+
task: acquire_rights
|
|
314
|
+
schema_ref: "brand/acquire-rights-request.json"
|
|
315
|
+
response_schema_ref: "brand/acquire-rights-response.json"
|
|
316
|
+
doc_ref: "/brand-protocol/tasks/acquire_rights"
|
|
317
|
+
stateful: true
|
|
318
|
+
expect_error: true
|
|
319
|
+
negative_path: payload_well_formed
|
|
320
|
+
expected: |
|
|
321
|
+
Reject the request:
|
|
322
|
+
- Campaign dates are in the past
|
|
323
|
+
- Error indicates the rights period is invalid or expired
|
|
324
|
+
|
|
325
|
+
sample_request:
|
|
326
|
+
account:
|
|
327
|
+
brand:
|
|
328
|
+
domain: "acmeoutdoor.example"
|
|
329
|
+
operator: "pinnacle-agency.example"
|
|
330
|
+
rights_id: "$context.rights_id"
|
|
331
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
332
|
+
buyer:
|
|
333
|
+
domain: "pinnacle-agency.example"
|
|
334
|
+
campaign:
|
|
335
|
+
description: "Expired campaign test"
|
|
336
|
+
uses:
|
|
337
|
+
- "commercial"
|
|
338
|
+
start_date: "2024-01-01"
|
|
339
|
+
end_date: "2024-03-31"
|
|
340
|
+
revocation_webhook:
|
|
341
|
+
url: "https://pinnacle-agency.example/webhooks/revocation"
|
|
342
|
+
authentication:
|
|
343
|
+
schemes:
|
|
344
|
+
- "Bearer"
|
|
345
|
+
credentials: "pinnacle-expired-rights-revocation-webhook-token"
|
|
346
|
+
idempotency_key: "$generate:uuid_v4#brand_rights_rights_enforcement_acquire_expired_rights"
|
|
347
|
+
|
|
348
|
+
validations:
|
|
349
|
+
- check: error_code
|
|
350
|
+
description: "Error code present for expired campaign dates"
|