@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,413 @@
|
|
|
1
|
+
id: creative_template
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Creative template and transformation agent"
|
|
4
|
+
protocol: creative
|
|
5
|
+
category: creative_template
|
|
6
|
+
summary: "Stateless creative agent that takes assets in, applies templates, and produces tags or rendered output."
|
|
7
|
+
track: creative
|
|
8
|
+
required_tools:
|
|
9
|
+
- build_creative
|
|
10
|
+
|
|
11
|
+
# Cross-step assertion (adcp#2664). status.monotonic rejects resource
|
|
12
|
+
# status transitions observed across steps that aren't on the spec
|
|
13
|
+
# lifecycle graph — e.g. approved → processing on a creative asset.
|
|
14
|
+
invariants:
|
|
15
|
+
- status.monotonic
|
|
16
|
+
|
|
17
|
+
narrative: |
|
|
18
|
+
You build a creative management or rich media platform — think Celtra, a format
|
|
19
|
+
conversion service, or any tool that defines ad templates and transforms input assets
|
|
20
|
+
into finished creatives. Your agent is stateless: every call is self-contained. The
|
|
21
|
+
caller passes assets inline with each request, and you return the result. There is no
|
|
22
|
+
creative library to sync to and no persistent state between calls.
|
|
23
|
+
|
|
24
|
+
A buyer agent connects to discover your templates, preview them with real brand assets,
|
|
25
|
+
and request fully built creatives for trafficking. This storyboard walks through that
|
|
26
|
+
flow step by step.
|
|
27
|
+
|
|
28
|
+
agent:
|
|
29
|
+
interaction_model: stateless_transform
|
|
30
|
+
capabilities:
|
|
31
|
+
- supports_transformation
|
|
32
|
+
examples:
|
|
33
|
+
- "Celtra"
|
|
34
|
+
- "Format conversion services"
|
|
35
|
+
- "Rich media template platforms"
|
|
36
|
+
|
|
37
|
+
caller:
|
|
38
|
+
role: buyer_agent
|
|
39
|
+
example: "Scope3 (DSP)"
|
|
40
|
+
|
|
41
|
+
prerequisites:
|
|
42
|
+
description: |
|
|
43
|
+
The caller needs a brand identity (brand.json with colors, fonts, logos) and creative
|
|
44
|
+
assets that match the format's requirements (images at the right dimensions, text at
|
|
45
|
+
the right lengths). The test kit provides these ingredients so you can test without
|
|
46
|
+
assembling them yourself.
|
|
47
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
48
|
+
|
|
49
|
+
phases:
|
|
50
|
+
- id: capability_discovery
|
|
51
|
+
title: "Capability discovery"
|
|
52
|
+
narrative: |
|
|
53
|
+
The buyer calls get_adcp_capabilities to confirm the agent supports creative operations before browsing or building creatives.
|
|
54
|
+
|
|
55
|
+
steps:
|
|
56
|
+
- id: get_capabilities
|
|
57
|
+
title: "Check agent capabilities"
|
|
58
|
+
narrative: |
|
|
59
|
+
Verify that the agent declares the expected protocol support before
|
|
60
|
+
proceeding with domain-specific operations.
|
|
61
|
+
task: get_adcp_capabilities
|
|
62
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
63
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
64
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
65
|
+
comply_scenario: capability_discovery
|
|
66
|
+
stateful: false
|
|
67
|
+
expected: |
|
|
68
|
+
Return capabilities declaring creative in supported_protocols, confirming the agent handles creative operations.
|
|
69
|
+
sample_request:
|
|
70
|
+
context:
|
|
71
|
+
correlation_id: "creative_template--get_capabilities"
|
|
72
|
+
validations:
|
|
73
|
+
- check: response_schema
|
|
74
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
75
|
+
- check: field_present
|
|
76
|
+
path: "supported_protocols"
|
|
77
|
+
description: "Agent declares supported protocols"
|
|
78
|
+
|
|
79
|
+
- check: field_present
|
|
80
|
+
path: "context"
|
|
81
|
+
description: "Response echoes back the context object"
|
|
82
|
+
- check: field_value
|
|
83
|
+
path: "context.correlation_id"
|
|
84
|
+
value: "creative_template--get_capabilities"
|
|
85
|
+
description: "Context correlation_id returned unchanged"
|
|
86
|
+
- id: format_exposure
|
|
87
|
+
title: "Format discovery"
|
|
88
|
+
narrative: |
|
|
89
|
+
The buyer's first question is: what can your platform do? They call
|
|
90
|
+
list_creative_formats to discover your templates — the available ad formats,
|
|
91
|
+
what assets each one requires, what dimensions they render at, and what
|
|
92
|
+
variables (dynamic fields) they support.
|
|
93
|
+
|
|
94
|
+
For a Celtra-like platform, this is where your publisher templates (Yahoo
|
|
95
|
+
Lighthouse, custom slider units) and standard templates (300x250 banners,
|
|
96
|
+
responsive display) get exposed as AdCP-compliant format definitions.
|
|
97
|
+
|
|
98
|
+
steps:
|
|
99
|
+
- id: discover_formats
|
|
100
|
+
title: "Discover available formats"
|
|
101
|
+
narrative: |
|
|
102
|
+
A buyer agent asks: "What creative formats do you support?" This is
|
|
103
|
+
the entry point for any interaction with your agent. The response tells
|
|
104
|
+
the buyer what templates are available, what assets each one needs, and
|
|
105
|
+
what the output dimensions will be.
|
|
106
|
+
task: list_creative_formats
|
|
107
|
+
schema_ref: "creative/list-creative-formats-request.json"
|
|
108
|
+
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
109
|
+
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
110
|
+
comply_scenario: creative_sync
|
|
111
|
+
stateful: false
|
|
112
|
+
expected: |
|
|
113
|
+
Return your supported formats. Each format must include:
|
|
114
|
+
- format_id with your agent_url and a unique id
|
|
115
|
+
- Human-readable name and description
|
|
116
|
+
- Asset slots with types, roles, and requirements (dimensions, file sizes, mime types)
|
|
117
|
+
- Render dimensions (width/height per render)
|
|
118
|
+
- Variables array if the format supports dynamic fields (text, colors, images)
|
|
119
|
+
|
|
120
|
+
sample_request:
|
|
121
|
+
context:
|
|
122
|
+
correlation_id: "creative_template--discover_formats"
|
|
123
|
+
|
|
124
|
+
validations:
|
|
125
|
+
- check: response_schema
|
|
126
|
+
description: "Response matches list-creative-formats-response.json schema"
|
|
127
|
+
- check: field_present
|
|
128
|
+
path: "formats"
|
|
129
|
+
description: "Response contains a formats array"
|
|
130
|
+
- check: field_present
|
|
131
|
+
path: "formats[0].format_id.agent_url"
|
|
132
|
+
description: "Each format has a format_id with agent_url"
|
|
133
|
+
- check: field_present
|
|
134
|
+
path: "formats[0].assets"
|
|
135
|
+
description: "Each format defines its asset requirements"
|
|
136
|
+
- check: field_present
|
|
137
|
+
path: "formats[0].renders"
|
|
138
|
+
description: "Each format defines its render dimensions"
|
|
139
|
+
|
|
140
|
+
- check: field_present
|
|
141
|
+
path: "context"
|
|
142
|
+
description: "Response echoes back the context object"
|
|
143
|
+
- check: field_value
|
|
144
|
+
path: "context.correlation_id"
|
|
145
|
+
value: "creative_template--discover_formats"
|
|
146
|
+
description: "Context correlation_id returned unchanged"
|
|
147
|
+
- id: filter_by_type
|
|
148
|
+
title: "Filter formats by type"
|
|
149
|
+
narrative: |
|
|
150
|
+
The buyer narrows the search. Maybe they only want display formats, or
|
|
151
|
+
they need formats that accept image assets at specific dimensions. This
|
|
152
|
+
tests that your agent handles filter parameters correctly.
|
|
153
|
+
task: list_creative_formats
|
|
154
|
+
schema_ref: "creative/list-creative-formats-request.json"
|
|
155
|
+
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
156
|
+
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
157
|
+
comply_scenario: creative_sync
|
|
158
|
+
stateful: false
|
|
159
|
+
expected: |
|
|
160
|
+
Return only formats matching the filter criteria. If no formats match,
|
|
161
|
+
return an empty formats array — not an error.
|
|
162
|
+
|
|
163
|
+
sample_request:
|
|
164
|
+
type: "display"
|
|
165
|
+
max_width: 728
|
|
166
|
+
max_height: 90
|
|
167
|
+
|
|
168
|
+
context:
|
|
169
|
+
correlation_id: "creative_template--filter_by_type"
|
|
170
|
+
validations:
|
|
171
|
+
- check: response_schema
|
|
172
|
+
description: "Response matches schema"
|
|
173
|
+
|
|
174
|
+
- check: field_present
|
|
175
|
+
path: "context"
|
|
176
|
+
description: "Response echoes back the context object"
|
|
177
|
+
- check: field_value
|
|
178
|
+
path: "context.correlation_id"
|
|
179
|
+
value: "creative_template--filter_by_type"
|
|
180
|
+
description: "Context correlation_id returned unchanged"
|
|
181
|
+
- check: field_present
|
|
182
|
+
path: "formats[0].format_id.agent_url"
|
|
183
|
+
description: "Format IDs include agent_url"
|
|
184
|
+
- check: field_present
|
|
185
|
+
path: "formats[0].format_id.id"
|
|
186
|
+
description: "Format IDs include id — must match those in get_products"
|
|
187
|
+
- id: preview
|
|
188
|
+
title: "Preview with real assets"
|
|
189
|
+
narrative: |
|
|
190
|
+
The buyer wants to see what the template looks like with actual content.
|
|
191
|
+
They pass a complete creative manifest inline — brand identity, assets,
|
|
192
|
+
and format reference — and your agent renders a preview.
|
|
193
|
+
|
|
194
|
+
This is where the stateless nature matters: the buyer doesn't sync assets
|
|
195
|
+
to your library first. Everything needed is in the request.
|
|
196
|
+
|
|
197
|
+
To test this, you need compatible "ingredients" — a brand.json and assets
|
|
198
|
+
that match your format's requirements. The test kit provides these.
|
|
199
|
+
|
|
200
|
+
steps:
|
|
201
|
+
- id: preview_creative
|
|
202
|
+
title: "Preview a creative"
|
|
203
|
+
narrative: |
|
|
204
|
+
The buyer has chosen a format from Phase 1 and assembled a manifest with
|
|
205
|
+
brand assets. They call preview_creative with the full manifest inline to
|
|
206
|
+
see how the template renders with real content.
|
|
207
|
+
|
|
208
|
+
For a Celtra-like platform, this is where the template gets populated with
|
|
209
|
+
the advertiser's images, copy, and brand colors, and a preview URL or HTML
|
|
210
|
+
snippet is returned.
|
|
211
|
+
task: preview_creative
|
|
212
|
+
schema_ref: "creative/preview-creative-request.json"
|
|
213
|
+
response_schema_ref: "creative/preview-creative-response.json"
|
|
214
|
+
doc_ref: "/creative/task-reference/preview_creative"
|
|
215
|
+
comply_scenario: creative_flow
|
|
216
|
+
stateful: false
|
|
217
|
+
expected: |
|
|
218
|
+
Return a preview render. The response should include:
|
|
219
|
+
- A preview URL (iframe-embeddable) and/or inline HTML
|
|
220
|
+
- Render dimensions matching the format spec
|
|
221
|
+
- An expiration timestamp (previews are ephemeral)
|
|
222
|
+
|
|
223
|
+
The preview should show the template populated with the provided assets —
|
|
224
|
+
not a placeholder or empty template.
|
|
225
|
+
|
|
226
|
+
sample_request:
|
|
227
|
+
account:
|
|
228
|
+
brand:
|
|
229
|
+
domain: "acmeoutdoor.example"
|
|
230
|
+
operator: "pinnacle-agency.example"
|
|
231
|
+
request_type: "single"
|
|
232
|
+
creative_manifest:
|
|
233
|
+
format_id:
|
|
234
|
+
agent_url: "https://your-agent.example.com"
|
|
235
|
+
id: "display_300x250"
|
|
236
|
+
assets:
|
|
237
|
+
image:
|
|
238
|
+
asset_type: "image"
|
|
239
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-300x250.jpg"
|
|
240
|
+
width: 300
|
|
241
|
+
height: 250
|
|
242
|
+
click_url:
|
|
243
|
+
asset_type: "url"
|
|
244
|
+
url: "https://acmeoutdoor.example/summer-sale"
|
|
245
|
+
headline:
|
|
246
|
+
asset_type: "text"
|
|
247
|
+
content: "Summer Sale — 40% Off All Gear"
|
|
248
|
+
output_format: "url"
|
|
249
|
+
quality: "draft"
|
|
250
|
+
|
|
251
|
+
context:
|
|
252
|
+
correlation_id: "creative_template--preview_creative"
|
|
253
|
+
validations:
|
|
254
|
+
- check: response_schema
|
|
255
|
+
description: "Response matches preview-creative-response.json schema"
|
|
256
|
+
- check: field_present
|
|
257
|
+
path: "previews[0].renders[0].preview_url"
|
|
258
|
+
description: "Preview includes a renderable URL"
|
|
259
|
+
|
|
260
|
+
- check: field_present
|
|
261
|
+
path: "context"
|
|
262
|
+
description: "Response echoes back the context object"
|
|
263
|
+
- check: field_value
|
|
264
|
+
path: "context.correlation_id"
|
|
265
|
+
value: "creative_template--preview_creative"
|
|
266
|
+
description: "Context correlation_id returned unchanged"
|
|
267
|
+
- id: build
|
|
268
|
+
title: "Full build (transformation)"
|
|
269
|
+
narrative: |
|
|
270
|
+
Now the buyer needs a finished creative — a serving tag or rendered output they
|
|
271
|
+
can traffic in a media buy. They call build_creative with the same inline manifest
|
|
272
|
+
and a target format. Your agent applies the template and returns the output.
|
|
273
|
+
|
|
274
|
+
This is where the three tag generation models come in:
|
|
275
|
+
- Universal tags: a single tag that adapts to any environment
|
|
276
|
+
- Single-placement tags: scoped to specific dimensions
|
|
277
|
+
- Multi-placement tags: covering multiple sizes in one tag
|
|
278
|
+
|
|
279
|
+
The output is a creative manifest with the serving code in an HTML, JavaScript,
|
|
280
|
+
or VAST asset — ready for the buyer to traffic.
|
|
281
|
+
|
|
282
|
+
steps:
|
|
283
|
+
- id: build_creative
|
|
284
|
+
title: "Build a creative from assets"
|
|
285
|
+
narrative: |
|
|
286
|
+
The buyer passes assets inline along with a target format and asks your agent
|
|
287
|
+
to produce a finished creative. This is the core transformation: raw assets in,
|
|
288
|
+
serving tag out.
|
|
289
|
+
|
|
290
|
+
For a Celtra-like platform, this means applying the template, assembling the
|
|
291
|
+
rich media unit, and returning an ad tag the buyer can traffic.
|
|
292
|
+
task: build_creative
|
|
293
|
+
schema_ref: "media-buy/build-creative-request.json"
|
|
294
|
+
response_schema_ref: "media-buy/build-creative-response.json"
|
|
295
|
+
doc_ref: "/creative/task-reference/build_creative"
|
|
296
|
+
comply_scenario: creative_flow
|
|
297
|
+
stateful: false
|
|
298
|
+
expected: |
|
|
299
|
+
Return a creative manifest with the output creative. The response should include:
|
|
300
|
+
- A creative manifest with serving code (html, javascript, or vast asset)
|
|
301
|
+
- The format_id matching the target format
|
|
302
|
+
- Assets array with the generated output
|
|
303
|
+
|
|
304
|
+
The output should be a valid, traffickable creative — not a preview or placeholder.
|
|
305
|
+
|
|
306
|
+
sample_request:
|
|
307
|
+
creative_manifest:
|
|
308
|
+
format_id:
|
|
309
|
+
agent_url: "https://your-agent.example.com"
|
|
310
|
+
id: "display_300x250"
|
|
311
|
+
assets:
|
|
312
|
+
image:
|
|
313
|
+
asset_type: "image"
|
|
314
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-300x250.jpg"
|
|
315
|
+
width: 300
|
|
316
|
+
height: 250
|
|
317
|
+
click_url:
|
|
318
|
+
asset_type: "url"
|
|
319
|
+
url: "https://acmeoutdoor.example/summer-sale"
|
|
320
|
+
headline:
|
|
321
|
+
asset_type: "text"
|
|
322
|
+
content: "Summer Sale — 40% Off All Gear"
|
|
323
|
+
target_format_id:
|
|
324
|
+
agent_url: "https://your-agent.example.com"
|
|
325
|
+
id: "display_300x250"
|
|
326
|
+
account:
|
|
327
|
+
brand:
|
|
328
|
+
domain: "acmeoutdoor.example"
|
|
329
|
+
operator: "pinnacle-agency.example"
|
|
330
|
+
|
|
331
|
+
idempotency_key: "$generate:uuid_v4#creative_template_build_build_creative"
|
|
332
|
+
context:
|
|
333
|
+
correlation_id: "creative_template--build_creative"
|
|
334
|
+
validations:
|
|
335
|
+
- check: response_schema
|
|
336
|
+
description: "Response matches build-creative-response.json schema"
|
|
337
|
+
- check: field_present
|
|
338
|
+
path: "creative_manifest.assets"
|
|
339
|
+
description: "Output manifest includes assets"
|
|
340
|
+
- check: field_present
|
|
341
|
+
path: "creative_manifest.format_id"
|
|
342
|
+
description: "Output manifest includes format_id"
|
|
343
|
+
|
|
344
|
+
- check: field_present
|
|
345
|
+
path: "context"
|
|
346
|
+
description: "Response echoes back the context object"
|
|
347
|
+
- check: field_value
|
|
348
|
+
path: "context.correlation_id"
|
|
349
|
+
value: "creative_template--build_creative"
|
|
350
|
+
description: "Context correlation_id returned unchanged"
|
|
351
|
+
- id: build_multi_format
|
|
352
|
+
title: "Build for multiple formats"
|
|
353
|
+
narrative: |
|
|
354
|
+
The buyer needs the same creative adapted to several sizes — 300x250, 728x90,
|
|
355
|
+
and 320x50. Instead of making three separate calls, they pass target_format_ids
|
|
356
|
+
(plural) and your agent returns manifests for each.
|
|
357
|
+
|
|
358
|
+
This tests the multi-format generation capability that makes template agents
|
|
359
|
+
valuable — build once, get all sizes.
|
|
360
|
+
task: build_creative
|
|
361
|
+
schema_ref: "media-buy/build-creative-request.json"
|
|
362
|
+
response_schema_ref: "media-buy/build-creative-response.json"
|
|
363
|
+
doc_ref: "/creative/task-reference/build_creative"
|
|
364
|
+
comply_scenario: creative_flow
|
|
365
|
+
stateful: false
|
|
366
|
+
expected: |
|
|
367
|
+
Return creative manifests for each requested format. If a format cannot be
|
|
368
|
+
produced, include it in the response with an error — don't fail the entire
|
|
369
|
+
request.
|
|
370
|
+
|
|
371
|
+
sample_request:
|
|
372
|
+
creative_manifest:
|
|
373
|
+
format_id:
|
|
374
|
+
agent_url: "https://your-agent.example.com"
|
|
375
|
+
id: "source_master"
|
|
376
|
+
assets:
|
|
377
|
+
image:
|
|
378
|
+
asset_type: "image"
|
|
379
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-master.jpg"
|
|
380
|
+
width: 1200
|
|
381
|
+
height: 628
|
|
382
|
+
click_url:
|
|
383
|
+
asset_type: "url"
|
|
384
|
+
url: "https://acmeoutdoor.example/summer-sale"
|
|
385
|
+
headline:
|
|
386
|
+
asset_type: "text"
|
|
387
|
+
content: "Summer Sale — 40% Off All Gear"
|
|
388
|
+
target_format_ids:
|
|
389
|
+
- agent_url: "https://your-agent.example.com"
|
|
390
|
+
id: "display_300x250"
|
|
391
|
+
- agent_url: "https://your-agent.example.com"
|
|
392
|
+
id: "display_728x90"
|
|
393
|
+
- agent_url: "https://your-agent.example.com"
|
|
394
|
+
id: "display_320x50"
|
|
395
|
+
account:
|
|
396
|
+
brand:
|
|
397
|
+
domain: "acmeoutdoor.example"
|
|
398
|
+
operator: "pinnacle-agency.example"
|
|
399
|
+
|
|
400
|
+
idempotency_key: "$generate:uuid_v4#creative_template_build_build_multi_format"
|
|
401
|
+
context:
|
|
402
|
+
correlation_id: "creative_template--build_multi_format"
|
|
403
|
+
validations:
|
|
404
|
+
- check: response_schema
|
|
405
|
+
description: "Response matches schema"
|
|
406
|
+
|
|
407
|
+
- check: field_present
|
|
408
|
+
path: "context"
|
|
409
|
+
description: "Response echoes back the context object"
|
|
410
|
+
- check: field_value
|
|
411
|
+
path: "context.correlation_id"
|
|
412
|
+
value: "creative_template--build_multi_format"
|
|
413
|
+
description: "Context correlation_id returned unchanged"
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
id: governance_aware_seller
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Governance-aware seller"
|
|
4
|
+
protocol: media-buy
|
|
5
|
+
category: governance_aware_seller
|
|
6
|
+
summary: "Seller agent that composes with a campaign-governance agent on the buyer side — accepts sync_governance, calls check_governance before confirming spend, and propagates governance approvals, conditions, and denials unchanged. Optional claim; pure sellers without governance composition do not claim this specialism and skip the governance scenarios as not_applicable."
|
|
7
|
+
track: media_buy
|
|
8
|
+
required_tools:
|
|
9
|
+
- sync_governance
|
|
10
|
+
- create_media_buy
|
|
11
|
+
|
|
12
|
+
# Cross-step assertion (adcp#2639): governance-aware sellers are exactly
|
|
13
|
+
# the surface this assertion protects. If a seller propagates a denial
|
|
14
|
+
# response from its governance agent but then creates the media buy
|
|
15
|
+
# anyway, no per-step validation notices — this assertion does.
|
|
16
|
+
# Cross-step assertion (adcp#2664): status.monotonic rejects media_buy
|
|
17
|
+
# status transitions observed across steps that aren't on the spec
|
|
18
|
+
# lifecycle graph — catches an approved-with-conditions buy jumping
|
|
19
|
+
# from pending_creatives back to pending_start, or active → pending_creatives.
|
|
20
|
+
invariants:
|
|
21
|
+
- governance.denial_blocks_mutation
|
|
22
|
+
- status.monotonic
|
|
23
|
+
requires_scenarios:
|
|
24
|
+
- media_buy_seller/governance_approved
|
|
25
|
+
- media_buy_seller/governance_conditions
|
|
26
|
+
- media_buy_seller/governance_denied
|
|
27
|
+
- media_buy_seller/governance_denied_recovery
|
|
28
|
+
|
|
29
|
+
narrative: |
|
|
30
|
+
Governance composition is an optional seller capability. A seller agent can be
|
|
31
|
+
fully spec-compliant without integrating with a buyer-side governance agent —
|
|
32
|
+
it accepts `create_media_buy`, validates the request against its own rules
|
|
33
|
+
(budget, inventory, creative), and returns success or a seller-scoped error
|
|
34
|
+
(`VALIDATION_ERROR`, `INVENTORY_UNAVAILABLE`, `TERMS_REJECTED`, etc.). The
|
|
35
|
+
governance handshake — `sync_governance` registration, `check_governance`
|
|
36
|
+
consultation before confirming spend, and `GOVERNANCE_DENIED` / governance
|
|
37
|
+
condition propagation — is only exercisable by a seller that has opted into
|
|
38
|
+
composing with the buyer's governance agent.
|
|
39
|
+
|
|
40
|
+
Sellers that want to advertise "I honor the buyer's governance plan" claim
|
|
41
|
+
this specialism. The grading exercises the four scenarios that require the
|
|
42
|
+
governance handshake:
|
|
43
|
+
- `governance_approved` — seller accepts a buy that governance approved and
|
|
44
|
+
echoes the `governance_context` token back,
|
|
45
|
+
- `governance_conditions` — seller accepts a buy with conditions attached by
|
|
46
|
+
governance and propagates them through to the response,
|
|
47
|
+
- `governance_denied` — seller refuses a buy that governance denied and
|
|
48
|
+
returns `GOVERNANCE_DENIED` with the governance findings,
|
|
49
|
+
- `governance_denied_recovery` — seller accepts the corrected retry that
|
|
50
|
+
falls within the plan limits after the buyer reads the denial findings.
|
|
51
|
+
|
|
52
|
+
Sellers that do not claim this specialism are graded `not_applicable` on
|
|
53
|
+
these scenarios rather than failed. This mirrors the pattern used by the
|
|
54
|
+
other governance-* specialisms (`governance-spend-authority`,
|
|
55
|
+
`governance-delivery-monitor`) and by `measurement-verification` —
|
|
56
|
+
cross-cutting capabilities that involve campaign behavior are gated behind
|
|
57
|
+
explicit specialism claims instead of being force-included under every
|
|
58
|
+
sales-* specialism. (`signed-requests` was previously listed here; it was
|
|
59
|
+
reclassified in 3.1 to a universal capability-gated storyboard.)
|
|
60
|
+
|
|
61
|
+
Composition means the seller:
|
|
62
|
+
- accepts `sync_governance` to register the buyer's governance agent URL and
|
|
63
|
+
authority categories,
|
|
64
|
+
- calls `check_governance` on the registered agent before confirming a
|
|
65
|
+
spend-committing request,
|
|
66
|
+
- returns `GOVERNANCE_DENIED` with the governance findings propagated
|
|
67
|
+
unchanged when the check denies,
|
|
68
|
+
- echoes the `governance_context` token from approvals and surfaces
|
|
69
|
+
governance conditions to the buyer,
|
|
70
|
+
- does not silently downgrade the denial to a seller-scoped error
|
|
71
|
+
(`VALIDATION_ERROR` etc.) — the buyer needs to know the denial came from
|
|
72
|
+
its own governance agent to correct and retry.
|
|
73
|
+
|
|
74
|
+
agent:
|
|
75
|
+
interaction_model: media_buy_seller
|
|
76
|
+
capabilities:
|
|
77
|
+
- sells_media
|
|
78
|
+
- governance_aware
|
|
79
|
+
examples:
|
|
80
|
+
- "Publisher seller that integrates sync_governance and check_governance"
|
|
81
|
+
- "SSP that honors buyer-side governance plans before confirming bids"
|
|
82
|
+
- "Retail media network that refuses buys when the buyer's governance denies"
|
|
83
|
+
|
|
84
|
+
caller:
|
|
85
|
+
role: buyer_agent
|
|
86
|
+
example: "Pinnacle Agency (buyer) with a registered governance agent"
|
|
87
|
+
|
|
88
|
+
prerequisites:
|
|
89
|
+
description: |
|
|
90
|
+
A governance agent that supports `sync_plans` and `check_governance`, and
|
|
91
|
+
a seller agent that supports `sync_governance` and propagates governance
|
|
92
|
+
approvals, conditions, and denials unchanged.
|
|
93
|
+
|
|
94
|
+
By default, the grading runner uses the training governance agent at
|
|
95
|
+
`test-agent.adcontextprotocol.org`. Override with `--governance-agent-url`
|
|
96
|
+
to use a custom governance agent that satisfies the campaign-governance
|
|
97
|
+
protocol.
|
|
98
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
99
|
+
|
|
100
|
+
phases:
|
|
101
|
+
- id: capability_discovery
|
|
102
|
+
title: "Capability discovery"
|
|
103
|
+
narrative: |
|
|
104
|
+
The buyer calls get_adcp_capabilities to confirm the agent supports media buying before sending briefs or creating buys.
|
|
105
|
+
|
|
106
|
+
steps:
|
|
107
|
+
- id: get_capabilities
|
|
108
|
+
title: "Check agent capabilities"
|
|
109
|
+
narrative: |
|
|
110
|
+
Verify that the agent declares the expected protocol support before
|
|
111
|
+
proceeding with domain-specific operations.
|
|
112
|
+
task: get_adcp_capabilities
|
|
113
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
114
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
115
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
116
|
+
comply_scenario: capability_discovery
|
|
117
|
+
stateful: false
|
|
118
|
+
expected: |
|
|
119
|
+
Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
|
|
120
|
+
sample_request:
|
|
121
|
+
context:
|
|
122
|
+
correlation_id: "governance_aware_seller--get_capabilities"
|
|
123
|
+
validations:
|
|
124
|
+
- check: response_schema
|
|
125
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
126
|
+
- check: field_present
|
|
127
|
+
path: "supported_protocols"
|
|
128
|
+
description: "Agent declares supported protocols"
|
|
129
|
+
|
|
130
|
+
- check: field_present
|
|
131
|
+
path: "context"
|
|
132
|
+
description: "Response echoes back the context object"
|
|
133
|
+
- check: field_value
|
|
134
|
+
path: "context.correlation_id"
|
|
135
|
+
value: "governance_aware_seller--get_capabilities"
|
|
136
|
+
description: "Context correlation_id returned unchanged"
|