@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,125 @@
|
|
|
1
|
+
# Summit Foods — CPG Advertiser Test Kit
|
|
2
|
+
#
|
|
3
|
+
# Entity definition: fictional-entities.yaml → advertisers[summit_foods]
|
|
4
|
+
#
|
|
5
|
+
# Organic food / CPG brand that buys retail media inventory on ShopGrid.
|
|
6
|
+
#
|
|
7
|
+
# This brand is registered as a sandbox brand in AgenticAdvertising.org (AAO).
|
|
8
|
+
# Agents resolve summitfoods.example via the standard AAO brand resolution path.
|
|
9
|
+
# AAO returns the brand.json below but excludes sandbox brands from production
|
|
10
|
+
# brand discovery results.
|
|
11
|
+
|
|
12
|
+
id: summit_foods
|
|
13
|
+
name: "Summit Foods"
|
|
14
|
+
description: "Organic food CPG brand for retail media storyboard testing"
|
|
15
|
+
sandbox: true
|
|
16
|
+
|
|
17
|
+
# security_baseline auth fixture — see acme-outdoor.yaml for semantics.
|
|
18
|
+
auth:
|
|
19
|
+
api_key: "demo-summit-foods-v1"
|
|
20
|
+
probe_task: list_creatives
|
|
21
|
+
|
|
22
|
+
brand:
|
|
23
|
+
house:
|
|
24
|
+
domain: "summitfoods.example"
|
|
25
|
+
name: "Summit Foods"
|
|
26
|
+
brand_id: "summit_foods"
|
|
27
|
+
names:
|
|
28
|
+
- en: "Summit Foods"
|
|
29
|
+
description: "Organic pantry staples made from ingredients you can pronounce. From farm to shelf, nothing artificial."
|
|
30
|
+
industry: "cpg"
|
|
31
|
+
keller_type: "master"
|
|
32
|
+
logos:
|
|
33
|
+
- url: "https://test-assets.adcontextprotocol.org/summit-foods/logo-primary.png"
|
|
34
|
+
orientation: "horizontal"
|
|
35
|
+
background: "light-bg"
|
|
36
|
+
variant: "primary"
|
|
37
|
+
width: 400
|
|
38
|
+
height: 100
|
|
39
|
+
- url: "https://test-assets.adcontextprotocol.org/summit-foods/logo-icon.png"
|
|
40
|
+
orientation: "square"
|
|
41
|
+
background: "transparent-bg"
|
|
42
|
+
variant: "icon"
|
|
43
|
+
width: 200
|
|
44
|
+
height: 200
|
|
45
|
+
colors:
|
|
46
|
+
primary: "#33691E"
|
|
47
|
+
secondary: "#F9A825"
|
|
48
|
+
accent: "#BF360C"
|
|
49
|
+
background: "#FAFAF5"
|
|
50
|
+
text: "#1B1B1B"
|
|
51
|
+
fonts:
|
|
52
|
+
heading:
|
|
53
|
+
family: "Nunito"
|
|
54
|
+
weight: 700
|
|
55
|
+
url: "https://fonts.googleapis.com/css2?family=Nunito:wght@700"
|
|
56
|
+
body:
|
|
57
|
+
family: "Nunito"
|
|
58
|
+
weight: 400
|
|
59
|
+
url: "https://fonts.googleapis.com/css2?family=Nunito"
|
|
60
|
+
tone:
|
|
61
|
+
voice: "Honest and approachable. We talk like a farmer at a market stall — proud of the product, plain about what's in it."
|
|
62
|
+
attributes:
|
|
63
|
+
- "transparent"
|
|
64
|
+
- "approachable"
|
|
65
|
+
- "earthy"
|
|
66
|
+
dos:
|
|
67
|
+
- "Name specific ingredients and sourcing"
|
|
68
|
+
- "Use plain language over marketing speak"
|
|
69
|
+
- "Emphasize taste alongside health"
|
|
70
|
+
donts:
|
|
71
|
+
- "Use 'clean eating' or diet-culture language"
|
|
72
|
+
- "Make unsubstantiated health claims"
|
|
73
|
+
- "Position as premium or exclusive — Summit Foods is everyday food"
|
|
74
|
+
|
|
75
|
+
assets:
|
|
76
|
+
images:
|
|
77
|
+
- id: "hero_300x250"
|
|
78
|
+
url: "https://test-assets.adcontextprotocol.org/summit-foods/hero-300x250.jpg"
|
|
79
|
+
width: 300
|
|
80
|
+
height: 250
|
|
81
|
+
mime_type: "image/jpeg"
|
|
82
|
+
description: "Medium rectangle hero — product lineup on kitchen counter"
|
|
83
|
+
|
|
84
|
+
- id: "hero_728x90"
|
|
85
|
+
url: "https://test-assets.adcontextprotocol.org/summit-foods/hero-728x90.jpg"
|
|
86
|
+
width: 728
|
|
87
|
+
height: 90
|
|
88
|
+
mime_type: "image/jpeg"
|
|
89
|
+
description: "Leaderboard hero — harvest field with Summit Foods packaging"
|
|
90
|
+
|
|
91
|
+
- id: "hero_320x50"
|
|
92
|
+
url: "https://test-assets.adcontextprotocol.org/summit-foods/hero-320x50.jpg"
|
|
93
|
+
width: 320
|
|
94
|
+
height: 50
|
|
95
|
+
mime_type: "image/jpeg"
|
|
96
|
+
description: "Mobile banner hero — close-up of organic granola bar"
|
|
97
|
+
|
|
98
|
+
- id: "hero_160x600"
|
|
99
|
+
url: "https://test-assets.adcontextprotocol.org/summit-foods/hero-160x600.jpg"
|
|
100
|
+
width: 160
|
|
101
|
+
height: 600
|
|
102
|
+
mime_type: "image/jpeg"
|
|
103
|
+
description: "Wide skyscraper hero — vertical pantry shelf with Summit products"
|
|
104
|
+
|
|
105
|
+
- id: "hero_master"
|
|
106
|
+
url: "https://test-assets.adcontextprotocol.org/summit-foods/hero-master.jpg"
|
|
107
|
+
width: 1200
|
|
108
|
+
height: 628
|
|
109
|
+
mime_type: "image/jpeg"
|
|
110
|
+
description: "Master hero image — high-res breakfast spread with Summit products"
|
|
111
|
+
|
|
112
|
+
text:
|
|
113
|
+
headlines:
|
|
114
|
+
- "Organic. Honest. Delicious."
|
|
115
|
+
- "Ingredients You Can Pronounce"
|
|
116
|
+
- "From Our Farm to Your Shelf"
|
|
117
|
+
descriptions:
|
|
118
|
+
- "Organic pantry staples made with five ingredients or fewer. Summit Foods — real food for real kitchens."
|
|
119
|
+
- "No fillers, no artificial anything. Just honest food that tastes like food should."
|
|
120
|
+
cta:
|
|
121
|
+
- "Shop Now"
|
|
122
|
+
- "Find in Store"
|
|
123
|
+
- "Try the Sampler"
|
|
124
|
+
|
|
125
|
+
click_url: "https://summitfoods.example/shop"
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
# Webhook Receiver Runner — Harness Contract Test Kit
|
|
2
|
+
#
|
|
3
|
+
# Applies to:
|
|
4
|
+
# - universal/webhook-emission.yaml (primary consumer — grades outbound
|
|
5
|
+
# webhook conformance: idempotency_key presence, stability across retries,
|
|
6
|
+
# and RFC 9421 signature validity when 9421 is in effect)
|
|
7
|
+
# - universal/idempotency.yaml (replay-side-effect invariant — "no duplicate
|
|
8
|
+
# webhooks on replay" step is gated on this contract being in scope)
|
|
9
|
+
# - Any future storyboard that needs to observe outbound webhooks.
|
|
10
|
+
#
|
|
11
|
+
# The webhook-emission universal grades an agent's outbound-webhook
|
|
12
|
+
# conformance: idempotency_key presence and stability across retries, and —
|
|
13
|
+
# when the 9421 webhook profile is in effect — RFC 9421 signature validity per
|
|
14
|
+
# docs/building/implementation/security.mdx#webhook-callbacks.
|
|
15
|
+
#
|
|
16
|
+
# Storyboards are unidirectional by default (runner → agent). Verifying what
|
|
17
|
+
# the agent sends back requires the runner to host a webhook receiver during
|
|
18
|
+
# test execution and observe inbound deliveries. This test-kit defines the
|
|
19
|
+
# coordination contract between that receiver and a webhook-emitting agent
|
|
20
|
+
# under test.
|
|
21
|
+
#
|
|
22
|
+
# Clean seam: the runner does NOT reimplement signature verification or dedup.
|
|
23
|
+
# It delegates to `@adcp/client` primitives (AsyncHandler, WebhookMetadata,
|
|
24
|
+
# IdempotencyBackend) so the same code that production receivers use is what
|
|
25
|
+
# the conformance runner exercises. A single bug fix in the library covers both.
|
|
26
|
+
|
|
27
|
+
id: webhook_receiver_runner
|
|
28
|
+
applies_to:
|
|
29
|
+
universals:
|
|
30
|
+
- webhook-emission
|
|
31
|
+
- idempotency
|
|
32
|
+
|
|
33
|
+
description: |
|
|
34
|
+
Coordination contract between a black-box runner hosting a webhook receiver
|
|
35
|
+
and a webhook-emitting agent under test. The runner mints per-step HTTPS
|
|
36
|
+
endpoints, injects them into push_notification_config.url on the steps that
|
|
37
|
+
trigger webhooks, observes incoming deliveries via @adcp/client AsyncHandler
|
|
38
|
+
hooks, and asserts on idempotency_key presence, idempotency_key stability
|
|
39
|
+
across retries, and (when advertised) 9421 signature validity.
|
|
40
|
+
|
|
41
|
+
endpoint_scope: sandbox
|
|
42
|
+
# Storyboards that drive webhook emission typically call spend-committing
|
|
43
|
+
# operations (create_media_buy, acquire_*, activate_signal). Running those
|
|
44
|
+
# against production would create real commitments. Graders MUST target a
|
|
45
|
+
# sandbox/staging endpoint. Agents claiming the specialism SHOULD expose a
|
|
46
|
+
# dedicated grading endpoint.
|
|
47
|
+
|
|
48
|
+
harness_mode: black_box
|
|
49
|
+
|
|
50
|
+
# --- Ephemeral endpoint mechanism ---
|
|
51
|
+
#
|
|
52
|
+
# Three viable shapes with materially different operational costs. The runner
|
|
53
|
+
# selects per run mode; storyboard authors SHOULD NOT assume a specific mode.
|
|
54
|
+
#
|
|
55
|
+
# loopback_mock (default for lint/fast runs):
|
|
56
|
+
# The runner intercepts the agent's outbound HTTP at the library-client
|
|
57
|
+
# level (via @adcp/client AsyncHandler) before the request leaves the
|
|
58
|
+
# process. Zero network dependencies. Exercises serialization, signature
|
|
59
|
+
# math, and idempotency-key logic, but not real wire behavior (no TLS
|
|
60
|
+
# handshake, no proxy interposition, no real DNS). Appropriate for CI lint
|
|
61
|
+
# gates and SDK self-tests.
|
|
62
|
+
#
|
|
63
|
+
# proxy_url (default for full conformance runs):
|
|
64
|
+
# The CI environment exposes an HTTPS URL that routes into the runner
|
|
65
|
+
# process. The runner mints per-step paths under that base. Exercises real
|
|
66
|
+
# wire behavior end-to-end, including TLS, proxies, and body preservation.
|
|
67
|
+
# Appropriate for AdCP Verified grading where the agent under test is a
|
|
68
|
+
# remote service.
|
|
69
|
+
#
|
|
70
|
+
# tunnel (optional wrapper, NOT a hard dep):
|
|
71
|
+
# ngrok, cloudflared, or similar. Operators MAY configure a tunnel as the
|
|
72
|
+
# proxy_url provider, but the runner MUST NOT require a specific tunnel
|
|
73
|
+
# vendor. Adding a tunnel is a wrapper concern outside the spec.
|
|
74
|
+
#
|
|
75
|
+
# The specialism grades observable agent behavior; the receiver mechanism is
|
|
76
|
+
# an implementation detail below the conformance seam. An agent that passes
|
|
77
|
+
# under loopback_mock MUST also pass under proxy_url for the same storyboard —
|
|
78
|
+
# any divergence is a conformance bug in the runner or the client library, not
|
|
79
|
+
# a legitimate agent-behavior difference.
|
|
80
|
+
|
|
81
|
+
endpoint_modes:
|
|
82
|
+
- mode: loopback_mock
|
|
83
|
+
default_for: [lint, fast]
|
|
84
|
+
description: |
|
|
85
|
+
Intercepts the agent's outbound HTTP at the @adcp/client AsyncHandler
|
|
86
|
+
layer. No external network exposure. Zero CI setup cost.
|
|
87
|
+
runner_config:
|
|
88
|
+
intercept_layer: adcp_client_async_handler
|
|
89
|
+
|
|
90
|
+
- mode: proxy_url
|
|
91
|
+
default_for: [full_conformance, adcp_verified]
|
|
92
|
+
description: |
|
|
93
|
+
Operator-supplied HTTPS URL routing to the runner process. The runner
|
|
94
|
+
mints per-step paths under this base.
|
|
95
|
+
runner_config:
|
|
96
|
+
base_url_env: ADCP_RUNNER_WEBHOOK_BASE_URL
|
|
97
|
+
required_for_adcp_verified: true
|
|
98
|
+
scheme: https
|
|
99
|
+
# HTTPS is REQUIRED for proxy_url. Runners MUST reject an
|
|
100
|
+
# ADCP_RUNNER_WEBHOOK_BASE_URL with an http:// scheme unless the runner
|
|
101
|
+
# is started with an explicit local-dev flag (not exposed in AdCP
|
|
102
|
+
# Verified grading). The loopback_mock mode operates in-process and has
|
|
103
|
+
# no TLS surface; this rule applies only to proxy_url.
|
|
104
|
+
|
|
105
|
+
# --- Per-step receiver URLs ---
|
|
106
|
+
#
|
|
107
|
+
# The runner exposes two substitution variables to storyboards:
|
|
108
|
+
#
|
|
109
|
+
# {{runner.webhook_base}} HTTPS base for the current run
|
|
110
|
+
# {{runner.webhook_url:<step_id>}} Per-step URL unique to step <step_id>
|
|
111
|
+
#
|
|
112
|
+
# Per-step URLs scope assertions cleanly: an expect_webhook on step_A matches
|
|
113
|
+
# only webhooks delivered to step_A's URL. Fan-in scenarios (one URL receiving
|
|
114
|
+
# from multiple emitting steps) are deferred — see storyboard-schema.yaml
|
|
115
|
+
# "shared_receiver (deferred / out of scope v1)."
|
|
116
|
+
|
|
117
|
+
receiver_urls:
|
|
118
|
+
per_step_url_template: "{{runner.webhook_base}}/step/<step_id>/<operation_id>"
|
|
119
|
+
operation_id_source: push_notification_config.url
|
|
120
|
+
# <operation_id> in the URL template is the ID the RUNNER (acting as caller)
|
|
121
|
+
# sets in the path segment of push_notification_config.url when it registers
|
|
122
|
+
# the webhook on the triggering step. This is NOT a server-generated ID — the
|
|
123
|
+
# agent under test MUST NOT mint its own operation_id. The agent's webhook
|
|
124
|
+
# payload MUST echo this operation_id back verbatim so the runner can match
|
|
125
|
+
# inbound deliveries to the step that triggered them.
|
|
126
|
+
|
|
127
|
+
# --- Retry-replay assertion shape ---
|
|
128
|
+
#
|
|
129
|
+
# expect_webhook_retry_keys_stable is the only step that requires a specific
|
|
130
|
+
# receiver-behavior contract. The runner's webhook receiver deterministically
|
|
131
|
+
# returns HTTP 5xx for the first `count` deliveries, then 2xx, and records the
|
|
132
|
+
# idempotency_key on every delivery. The runner then asserts all recorded keys
|
|
133
|
+
# are byte-identical.
|
|
134
|
+
#
|
|
135
|
+
# The sender's retry back-off is out of scope for the contract — the runner
|
|
136
|
+
# sets a sufficient timeout_seconds on the step to cover reasonable back-off
|
|
137
|
+
# schedules (default 90s). Any conformant at-least-once sender will retry
|
|
138
|
+
# within that window.
|
|
139
|
+
|
|
140
|
+
retry_replay_contract:
|
|
141
|
+
mechanism: receiver_returns_5xx_then_2xx
|
|
142
|
+
default_count: 3
|
|
143
|
+
min_count: 1
|
|
144
|
+
max_count: 10
|
|
145
|
+
# Hard ceiling on retry_trigger.count. Runners MUST reject storyboards whose
|
|
146
|
+
# retry_trigger.count falls outside [min_count, max_count] with a storyboard
|
|
147
|
+
# validation error at load time. The ceiling prevents a typo (count: 1000000)
|
|
148
|
+
# from turning a runner into a DoS amplifier against a real seller in
|
|
149
|
+
# proxy_url mode. Sellers exercise retry back-off with N=3 routinely;
|
|
150
|
+
# higher counts do not add meaningful conformance signal.
|
|
151
|
+
default_http_status: 503
|
|
152
|
+
allowed_statuses: [429, 500, 502, 503, 504]
|
|
153
|
+
# Runners MUST reject retry_trigger.http_status values outside this
|
|
154
|
+
# allowlist. Statuses like 400 or 404 are not retryable signals for
|
|
155
|
+
# at-least-once senders — a storyboard declaring one is a bug, not a
|
|
156
|
+
# legitimate test shape.
|
|
157
|
+
default_timeout_seconds: 90
|
|
158
|
+
expected_behavior: |
|
|
159
|
+
The sender retries on each 5xx response. Every retry MUST carry the
|
|
160
|
+
byte-identical idempotency_key the first delivery carried. The runner
|
|
161
|
+
records all deliveries and asserts key stability; a key rotation across
|
|
162
|
+
retries fails the step with `idempotency_key_rotated`.
|
|
163
|
+
|
|
164
|
+
When 9421 is in effect for the storyboard, the runner ALSO verifies the
|
|
165
|
+
signature on every retry delivery using the run-scoped replay store (see
|
|
166
|
+
client_primitives.signature_replay_store). A sender that reuses the 9421
|
|
167
|
+
`nonce` sig-param across retries fails the step with `signature_replayed`
|
|
168
|
+
on the second delivery even though idempotency_key is stable — nonce
|
|
169
|
+
freshness is a separate invariant.
|
|
170
|
+
|
|
171
|
+
# --- @adcp/client primitives the runner hooks ---
|
|
172
|
+
#
|
|
173
|
+
# The runner does NOT reimplement signature verification or dedup. It consumes
|
|
174
|
+
# the following primitives from @adcp/client (see adcontextprotocol/adcp-client)
|
|
175
|
+
# so the conformance surface matches what production receivers use:
|
|
176
|
+
|
|
177
|
+
client_primitives:
|
|
178
|
+
async_handler_config:
|
|
179
|
+
# AdCPClient is constructed with an AsyncHandlerConfig whose webhookDedup
|
|
180
|
+
# uses a runner-owned IdempotencyBackend. The runner's backend wraps the
|
|
181
|
+
# standard memoryBackend() and records every (agent_id, idempotency_key)
|
|
182
|
+
# observed for later assertion.
|
|
183
|
+
reference: AsyncHandlerConfig.webhookDedup
|
|
184
|
+
doc: https://github.com/adcontextprotocol/adcp-client/pull/629
|
|
185
|
+
|
|
186
|
+
webhook_metadata:
|
|
187
|
+
# Every onXxxStatusChange handler receives a WebhookMetadata second arg
|
|
188
|
+
# carrying idempotency_key. The runner's handlers write this into the
|
|
189
|
+
# per-step observation buffer.
|
|
190
|
+
reference: WebhookMetadata.idempotency_key
|
|
191
|
+
doc: https://github.com/adcontextprotocol/adcp-client/pull/629
|
|
192
|
+
|
|
193
|
+
activity_webhook_duplicate:
|
|
194
|
+
# The client emits Activity { type: "webhook_duplicate" } when a repeat
|
|
195
|
+
# idempotency_key hits the dedup backend. The runner counts these to
|
|
196
|
+
# assert that retries triggered by expect_webhook_retry_keys_stable do
|
|
197
|
+
# reach the client (indicating the sender is retrying) AND are suppressed
|
|
198
|
+
# as duplicates (indicating the key stayed stable).
|
|
199
|
+
reference: Activity.type == "webhook_duplicate"
|
|
200
|
+
doc: https://github.com/adcontextprotocol/adcp-client/pull/629
|
|
201
|
+
|
|
202
|
+
webhook_signature_verifier:
|
|
203
|
+
# Once RFC 9421 webhook signing lands in the client library (follow-up to
|
|
204
|
+
# adcontextprotocol/adcp#2423), the runner hooks the verifier to surface
|
|
205
|
+
# webhook_signature_* error codes on failure. Until that lands,
|
|
206
|
+
# expect_webhook_signature_valid grades as preview / skip with a stable
|
|
207
|
+
# non-applicable marker.
|
|
208
|
+
reference: 9421 webhook verifier (TBD in @adcp/client)
|
|
209
|
+
status: pending
|
|
210
|
+
blocked_on: "@adcp/client implementation of docs/building/implementation/security.mdx#webhook-callbacks"
|
|
211
|
+
|
|
212
|
+
signature_replay_store:
|
|
213
|
+
# The runner MUST maintain ONE (keyid, nonce) replay store shared across
|
|
214
|
+
# every webhook delivery it observes in a storyboard run — including
|
|
215
|
+
# every expect_webhook_signature_valid step AND every retry delivery
|
|
216
|
+
# produced under expect_webhook_retry_keys_stable.
|
|
217
|
+
#
|
|
218
|
+
# Rationale: without a shared store, a publisher emitting the same signed
|
|
219
|
+
# bytes at two different expect_webhook_signature_valid steps would pass
|
|
220
|
+
# both in isolation, silently missing cross-step nonce replay. The 9421
|
|
221
|
+
# profile's (keyid, nonce) uniqueness guarantee is per-signer, not
|
|
222
|
+
# per-step — scoping replay state per-step in the runner would redefine
|
|
223
|
+
# the guarantee in a way production receivers don't.
|
|
224
|
+
#
|
|
225
|
+
# Scope: one store per storyboard run; destroyed at run end. Not shared
|
|
226
|
+
# across runs (a fresh run is a fresh counterparty-session from the
|
|
227
|
+
# publisher's perspective).
|
|
228
|
+
reference: Run-scoped (keyid, nonce) replay store
|
|
229
|
+
required_for:
|
|
230
|
+
- expect_webhook_signature_valid
|
|
231
|
+
- expect_webhook_retry_keys_stable (when 9421 in effect)
|
|
232
|
+
|
|
233
|
+
# --- Claim scope ---
|
|
234
|
+
|
|
235
|
+
scope:
|
|
236
|
+
in_scope: |
|
|
237
|
+
- Per-step receiver URL template and operation_id echo pattern.
|
|
238
|
+
- Retry-replay receiver-behavior contract (5xx-then-2xx, count and status).
|
|
239
|
+
- @adcp/client primitives the runner delegates to for observation and
|
|
240
|
+
verification.
|
|
241
|
+
- Endpoint mode selection (loopback_mock vs. proxy_url) and which mode
|
|
242
|
+
AdCP Verified grading runs under.
|
|
243
|
+
- Black-box-only harness mode (white_box is out of scope for webhook
|
|
244
|
+
receiver testing because the seam is the client library, not the
|
|
245
|
+
agent's internals).
|
|
246
|
+
out_of_scope: |
|
|
247
|
+
- The agent's internal webhook emission code path — the contract grades
|
|
248
|
+
observable behavior only.
|
|
249
|
+
- Which 9421 library the client uses — the client is free to pin any
|
|
250
|
+
validated RFC 9421 implementation.
|
|
251
|
+
- HTTP retry back-off schedules — the runner's timeout_seconds is
|
|
252
|
+
sufficient; precise back-off is sender-implementation-specific.
|
|
253
|
+
- Webhook-signing negative conformance vectors — those live at
|
|
254
|
+
/compliance/{version}/test-vectors/webhook-signing/ (follow-up) and
|
|
255
|
+
are graded per-vector, not via this contract.
|
|
256
|
+
- Production webhook receiver configuration — this contract configures
|
|
257
|
+
test counterparties only.
|
|
258
|
+
|
|
259
|
+
references:
|
|
260
|
+
universal: static/compliance/source/universal/webhook-emission.yaml
|
|
261
|
+
spec_section: /docs/building/implementation/security.mdx#webhook-callbacks
|
|
262
|
+
client_receiver_pr: https://github.com/adcontextprotocol/adcp-client/pull/629
|
|
263
|
+
signing_upstream_pr: https://github.com/adcontextprotocol/adcp/pull/2423
|
|
264
|
+
idempotency_upstream_pr: https://github.com/adcontextprotocol/adcp/pull/2417
|
|
265
|
+
runner_implementation_tracking: https://github.com/adcontextprotocol/adcp/issues/2426
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Minimal plan with required fields only",
|
|
3
|
+
"spec_reference": "#plan-state-binding",
|
|
4
|
+
"description": "Baseline canonicalization over the required plan fields (plan_id, brand, objectives, budget, flight). No optionals set.",
|
|
5
|
+
"plan_as_supplied": {
|
|
6
|
+
"plan_id": "plan_minimal_2026",
|
|
7
|
+
"brand": {
|
|
8
|
+
"domain": "example.com"
|
|
9
|
+
},
|
|
10
|
+
"objectives": "Drive awareness for Q1 launch.",
|
|
11
|
+
"budget": {
|
|
12
|
+
"total": 100000,
|
|
13
|
+
"currency": "USD",
|
|
14
|
+
"reallocation_threshold": 5000
|
|
15
|
+
},
|
|
16
|
+
"flight": {
|
|
17
|
+
"start": "2026-04-01T00:00:00Z",
|
|
18
|
+
"end": "2026-06-30T00:00:00Z"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"expected": {
|
|
22
|
+
"preimage": {
|
|
23
|
+
"plan_id": "plan_minimal_2026",
|
|
24
|
+
"brand": {
|
|
25
|
+
"domain": "example.com"
|
|
26
|
+
},
|
|
27
|
+
"objectives": "Drive awareness for Q1 launch.",
|
|
28
|
+
"budget": {
|
|
29
|
+
"total": 100000,
|
|
30
|
+
"currency": "USD",
|
|
31
|
+
"reallocation_threshold": 5000
|
|
32
|
+
},
|
|
33
|
+
"flight": {
|
|
34
|
+
"start": "2026-04-01T00:00:00Z",
|
|
35
|
+
"end": "2026-06-30T00:00:00Z"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"jcs_bytes": "{\"brand\":{\"domain\":\"example.com\"},\"budget\":{\"currency\":\"USD\",\"reallocation_threshold\":5000,\"total\":100000},\"flight\":{\"end\":\"2026-06-30T00:00:00Z\",\"start\":\"2026-04-01T00:00:00Z\"},\"objectives\":\"Drive awareness for Q1 launch.\",\"plan_id\":\"plan_minimal_2026\"}",
|
|
39
|
+
"sha256_hex": "a11d2314312dcdcc203db35ff8e7ddfdf64761f0320f54d16f318e1415421be7",
|
|
40
|
+
"plan_hash": "oR0jFDEtzcwgPbNf-Ofd_fZHYfAyD1TRbzGOFBVCG-c"
|
|
41
|
+
},
|
|
42
|
+
"$comment": "Generated by .context/generate-plan-hash-vectors.mjs. Re-run on spec changes."
|
|
43
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Plan exercising every optional field",
|
|
3
|
+
"spec_reference": "#plan-state-binding",
|
|
4
|
+
"description": "All optional fields populated including delegations[], custom_policies[], channels.mix_targets{}, budget.allocations{}, and ext{}.",
|
|
5
|
+
"plan_as_supplied": {
|
|
6
|
+
"plan_id": "plan_full_2026",
|
|
7
|
+
"brand": {
|
|
8
|
+
"domain": "acmecorp.com",
|
|
9
|
+
"industries": [
|
|
10
|
+
"consumer_finance"
|
|
11
|
+
],
|
|
12
|
+
"data_subject_contestation": {
|
|
13
|
+
"url": "https://acmecorp.com/contest",
|
|
14
|
+
"email": "privacy@acmecorp.com"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"objectives": "Drive awareness for spring launch across premium video.",
|
|
18
|
+
"budget": {
|
|
19
|
+
"total": 500000,
|
|
20
|
+
"currency": "USD",
|
|
21
|
+
"reallocation_threshold": 25000,
|
|
22
|
+
"per_seller_max_pct": 40,
|
|
23
|
+
"allocations": {
|
|
24
|
+
"media_buy": {
|
|
25
|
+
"amount": 400000
|
|
26
|
+
},
|
|
27
|
+
"rights_license": {
|
|
28
|
+
"amount": 75000,
|
|
29
|
+
"max_pct": 20
|
|
30
|
+
},
|
|
31
|
+
"signal_activation": {
|
|
32
|
+
"amount": 25000
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"human_review_required": true,
|
|
37
|
+
"channels": {
|
|
38
|
+
"required": [
|
|
39
|
+
"olv"
|
|
40
|
+
],
|
|
41
|
+
"allowed": [
|
|
42
|
+
"audio",
|
|
43
|
+
"ctv",
|
|
44
|
+
"display",
|
|
45
|
+
"olv"
|
|
46
|
+
],
|
|
47
|
+
"mix_targets": {
|
|
48
|
+
"olv": {
|
|
49
|
+
"min_pct": 40,
|
|
50
|
+
"max_pct": 70
|
|
51
|
+
},
|
|
52
|
+
"display": {
|
|
53
|
+
"min_pct": 10,
|
|
54
|
+
"max_pct": 30
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"flight": {
|
|
59
|
+
"start": "2026-03-15T00:00:00Z",
|
|
60
|
+
"end": "2026-06-15T00:00:00Z"
|
|
61
|
+
},
|
|
62
|
+
"countries": [
|
|
63
|
+
"US"
|
|
64
|
+
],
|
|
65
|
+
"regions": [
|
|
66
|
+
"US-CA",
|
|
67
|
+
"US-MA",
|
|
68
|
+
"US-NY"
|
|
69
|
+
],
|
|
70
|
+
"policy_ids": [
|
|
71
|
+
"alcohol_advertising",
|
|
72
|
+
"eu_ai_act_annex_iii",
|
|
73
|
+
"us_coppa"
|
|
74
|
+
],
|
|
75
|
+
"policy_categories": [
|
|
76
|
+
"fair_lending"
|
|
77
|
+
],
|
|
78
|
+
"custom_policies": [
|
|
79
|
+
{
|
|
80
|
+
"policy_id": "no_competitor_adjacency",
|
|
81
|
+
"policy": "No advertising adjacent to direct competitor content.",
|
|
82
|
+
"enforcement": "must"
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"mode": "enforce",
|
|
86
|
+
"approved_sellers": [
|
|
87
|
+
"https://publisher-a.example",
|
|
88
|
+
"https://publisher-b.example"
|
|
89
|
+
],
|
|
90
|
+
"delegations": [
|
|
91
|
+
{
|
|
92
|
+
"agent_url": "https://buying.agency.example",
|
|
93
|
+
"authority": "execute_only",
|
|
94
|
+
"budget_limit": {
|
|
95
|
+
"amount": 200000,
|
|
96
|
+
"currency": "USD"
|
|
97
|
+
},
|
|
98
|
+
"markets": [
|
|
99
|
+
"US"
|
|
100
|
+
],
|
|
101
|
+
"expires_at": "2026-12-31T23:59:59Z"
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
"ext": {
|
|
105
|
+
"trace_id": "trace_abc123"
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
"expected": {
|
|
109
|
+
"preimage": {
|
|
110
|
+
"plan_id": "plan_full_2026",
|
|
111
|
+
"brand": {
|
|
112
|
+
"domain": "acmecorp.com",
|
|
113
|
+
"industries": [
|
|
114
|
+
"consumer_finance"
|
|
115
|
+
],
|
|
116
|
+
"data_subject_contestation": {
|
|
117
|
+
"url": "https://acmecorp.com/contest",
|
|
118
|
+
"email": "privacy@acmecorp.com"
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
"objectives": "Drive awareness for spring launch across premium video.",
|
|
122
|
+
"budget": {
|
|
123
|
+
"total": 500000,
|
|
124
|
+
"currency": "USD",
|
|
125
|
+
"reallocation_threshold": 25000,
|
|
126
|
+
"per_seller_max_pct": 40,
|
|
127
|
+
"allocations": {
|
|
128
|
+
"media_buy": {
|
|
129
|
+
"amount": 400000
|
|
130
|
+
},
|
|
131
|
+
"rights_license": {
|
|
132
|
+
"amount": 75000,
|
|
133
|
+
"max_pct": 20
|
|
134
|
+
},
|
|
135
|
+
"signal_activation": {
|
|
136
|
+
"amount": 25000
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"human_review_required": true,
|
|
141
|
+
"channels": {
|
|
142
|
+
"required": [
|
|
143
|
+
"olv"
|
|
144
|
+
],
|
|
145
|
+
"allowed": [
|
|
146
|
+
"audio",
|
|
147
|
+
"ctv",
|
|
148
|
+
"display",
|
|
149
|
+
"olv"
|
|
150
|
+
],
|
|
151
|
+
"mix_targets": {
|
|
152
|
+
"olv": {
|
|
153
|
+
"min_pct": 40,
|
|
154
|
+
"max_pct": 70
|
|
155
|
+
},
|
|
156
|
+
"display": {
|
|
157
|
+
"min_pct": 10,
|
|
158
|
+
"max_pct": 30
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
"flight": {
|
|
163
|
+
"start": "2026-03-15T00:00:00Z",
|
|
164
|
+
"end": "2026-06-15T00:00:00Z"
|
|
165
|
+
},
|
|
166
|
+
"countries": [
|
|
167
|
+
"US"
|
|
168
|
+
],
|
|
169
|
+
"regions": [
|
|
170
|
+
"US-CA",
|
|
171
|
+
"US-MA",
|
|
172
|
+
"US-NY"
|
|
173
|
+
],
|
|
174
|
+
"policy_ids": [
|
|
175
|
+
"alcohol_advertising",
|
|
176
|
+
"eu_ai_act_annex_iii",
|
|
177
|
+
"us_coppa"
|
|
178
|
+
],
|
|
179
|
+
"policy_categories": [
|
|
180
|
+
"fair_lending"
|
|
181
|
+
],
|
|
182
|
+
"custom_policies": [
|
|
183
|
+
{
|
|
184
|
+
"policy_id": "no_competitor_adjacency",
|
|
185
|
+
"policy": "No advertising adjacent to direct competitor content.",
|
|
186
|
+
"enforcement": "must"
|
|
187
|
+
}
|
|
188
|
+
],
|
|
189
|
+
"mode": "enforce",
|
|
190
|
+
"approved_sellers": [
|
|
191
|
+
"https://publisher-a.example",
|
|
192
|
+
"https://publisher-b.example"
|
|
193
|
+
],
|
|
194
|
+
"delegations": [
|
|
195
|
+
{
|
|
196
|
+
"agent_url": "https://buying.agency.example",
|
|
197
|
+
"authority": "execute_only",
|
|
198
|
+
"budget_limit": {
|
|
199
|
+
"amount": 200000,
|
|
200
|
+
"currency": "USD"
|
|
201
|
+
},
|
|
202
|
+
"markets": [
|
|
203
|
+
"US"
|
|
204
|
+
],
|
|
205
|
+
"expires_at": "2026-12-31T23:59:59Z"
|
|
206
|
+
}
|
|
207
|
+
],
|
|
208
|
+
"ext": {
|
|
209
|
+
"trace_id": "trace_abc123"
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
"jcs_bytes": "{\"approved_sellers\":[\"https://publisher-a.example\",\"https://publisher-b.example\"],\"brand\":{\"data_subject_contestation\":{\"email\":\"privacy@acmecorp.com\",\"url\":\"https://acmecorp.com/contest\"},\"domain\":\"acmecorp.com\",\"industries\":[\"consumer_finance\"]},\"budget\":{\"allocations\":{\"media_buy\":{\"amount\":400000},\"rights_license\":{\"amount\":75000,\"max_pct\":20},\"signal_activation\":{\"amount\":25000}},\"currency\":\"USD\",\"per_seller_max_pct\":40,\"reallocation_threshold\":25000,\"total\":500000},\"channels\":{\"allowed\":[\"audio\",\"ctv\",\"display\",\"olv\"],\"mix_targets\":{\"display\":{\"max_pct\":30,\"min_pct\":10},\"olv\":{\"max_pct\":70,\"min_pct\":40}},\"required\":[\"olv\"]},\"countries\":[\"US\"],\"custom_policies\":[{\"enforcement\":\"must\",\"policy\":\"No advertising adjacent to direct competitor content.\",\"policy_id\":\"no_competitor_adjacency\"}],\"delegations\":[{\"agent_url\":\"https://buying.agency.example\",\"authority\":\"execute_only\",\"budget_limit\":{\"amount\":200000,\"currency\":\"USD\"},\"expires_at\":\"2026-12-31T23:59:59Z\",\"markets\":[\"US\"]}],\"ext\":{\"trace_id\":\"trace_abc123\"},\"flight\":{\"end\":\"2026-06-15T00:00:00Z\",\"start\":\"2026-03-15T00:00:00Z\"},\"human_review_required\":true,\"mode\":\"enforce\",\"objectives\":\"Drive awareness for spring launch across premium video.\",\"plan_id\":\"plan_full_2026\",\"policy_categories\":[\"fair_lending\"],\"policy_ids\":[\"alcohol_advertising\",\"eu_ai_act_annex_iii\",\"us_coppa\"],\"regions\":[\"US-CA\",\"US-MA\",\"US-NY\"]}",
|
|
213
|
+
"sha256_hex": "15ef2c87895e763dc4be0f410b0e62d943112bff5c8c27667c77a979b9907673",
|
|
214
|
+
"plan_hash": "Fe8sh4ledj3Evg9BCw5i2UMRK_9cjCdmfHepebmQdnM"
|
|
215
|
+
},
|
|
216
|
+
"$comment": "Generated by .context/generate-plan-hash-vectors.mjs. Re-run on spec changes."
|
|
217
|
+
}
|