@adcp/sdk 7.10.2 → 7.11.1
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/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/index.json +356 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
- package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
- package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
- package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
- package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
- package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
- package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
- package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
- package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
- package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
- package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
- package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +9 -5
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/testing/storyboard/default-invariants.js +30 -1
- package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +84 -21
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +21 -0
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/types.js.map +1 -1
- package/dist/lib/testing/types.d.ts +9 -0
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.d.ts +6707 -12040
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +1 -1
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/utils/signal-id-builders.d.ts +19 -0
- package/dist/lib/utils/signal-id-builders.d.ts.map +1 -1
- package/dist/lib/utils/signal-id-builders.js +30 -0
- package/dist/lib/utils/signal-id-builders.js.map +1 -1
- package/dist/lib/utils/tool-request-schemas.d.ts.map +1 -1
- package/dist/lib/utils/tool-request-schemas.js +3 -0
- package/dist/lib/utils/tool-request-schemas.js.map +1 -1
- package/dist/lib/v2/projection/constants.d.ts +28 -0
- package/dist/lib/v2/projection/constants.d.ts.map +1 -0
- package/dist/lib/v2/projection/constants.js +31 -0
- package/dist/lib/v2/projection/constants.js.map +1 -0
- package/dist/lib/v2/projection/registry.d.ts.map +1 -1
- package/dist/lib/v2/projection/registry.js +9 -4
- package/dist/lib/v2/projection/registry.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
- package/skills/SHAPE-GOTCHAS.md +5 -0
package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
id: creative/canonical_supported_formats
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Creative canonical supported formats"
|
|
4
|
+
category: creative
|
|
5
|
+
summary: "Verifies the 3.1 creative-agent canonical path: targetable supported_formats capability IDs, build_creative routing, and unsupported target rejection."
|
|
6
|
+
track: creative
|
|
7
|
+
introduced_in: "3.1"
|
|
8
|
+
required_tools:
|
|
9
|
+
- get_adcp_capabilities
|
|
10
|
+
- build_creative
|
|
11
|
+
|
|
12
|
+
narrative: |
|
|
13
|
+
Creative agents in 3.1 declare what they can produce via
|
|
14
|
+
`creative.supported_formats` on `get_adcp_capabilities`. Targetable
|
|
15
|
+
supported-format entries carry an agent-local stable `capability_id` that
|
|
16
|
+
selects the build path on that creative agent. This is separate from media-buy
|
|
17
|
+
`format_option_id`, which selects a product or publisher-catalog format
|
|
18
|
+
option.
|
|
19
|
+
|
|
20
|
+
The buyer reads the canonical capability catalog, invokes one advertised
|
|
21
|
+
capability through `build_creative`, and verifies that an unsupported target
|
|
22
|
+
fails with `FORMAT_NOT_SUPPORTED` instead of silently producing an arbitrary
|
|
23
|
+
manifest.
|
|
24
|
+
|
|
25
|
+
agent:
|
|
26
|
+
interaction_model: creative_agent
|
|
27
|
+
capabilities:
|
|
28
|
+
- supports_generation
|
|
29
|
+
- supports_transformation
|
|
30
|
+
examples:
|
|
31
|
+
- "Creative generation platforms"
|
|
32
|
+
- "Creative transformation services"
|
|
33
|
+
|
|
34
|
+
caller:
|
|
35
|
+
role: buyer_agent
|
|
36
|
+
example: "Pinnacle Agency (buyer)"
|
|
37
|
+
|
|
38
|
+
prerequisites:
|
|
39
|
+
description: |
|
|
40
|
+
The caller needs a brand identity and a creative brief. The test kit
|
|
41
|
+
provides fictional brand context for Acme Outdoor.
|
|
42
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
43
|
+
|
|
44
|
+
phases:
|
|
45
|
+
- id: capability_discovery
|
|
46
|
+
title: "Discover canonical build capabilities"
|
|
47
|
+
narrative: |
|
|
48
|
+
The buyer calls `get_adcp_capabilities` and reads
|
|
49
|
+
`creative.supported_formats` as the creative agent's 3.1 canonical build
|
|
50
|
+
catalog. The first advertised image capability is used in the next phase.
|
|
51
|
+
|
|
52
|
+
steps:
|
|
53
|
+
- id: get_capabilities
|
|
54
|
+
title: "Read supported canonical formats"
|
|
55
|
+
task: get_adcp_capabilities
|
|
56
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
57
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
58
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
59
|
+
comply_scenario: capability_discovery
|
|
60
|
+
stateful: false
|
|
61
|
+
expected: |
|
|
62
|
+
Return a creative capability block with implemented `supported_formats[]`.
|
|
63
|
+
The targetable entry used for build routing has:
|
|
64
|
+
- `capability_id` at the supported-format entry level
|
|
65
|
+
- `format.format_kind` and `format.params.slots[]`
|
|
66
|
+
- no product-level `format_option_id` on the creative-agent
|
|
67
|
+
capability entry used for build routing
|
|
68
|
+
sample_request:
|
|
69
|
+
context:
|
|
70
|
+
correlation_id: "creative_canonical_supported_formats--get_capabilities"
|
|
71
|
+
context_outputs:
|
|
72
|
+
- key: "image_build_capability_id"
|
|
73
|
+
path: "creative.supported_formats[0].capability_id"
|
|
74
|
+
validations:
|
|
75
|
+
- check: response_schema
|
|
76
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
77
|
+
- check: field_present
|
|
78
|
+
path: "creative.supported_formats"
|
|
79
|
+
description: "Creative canonical supported formats are advertised"
|
|
80
|
+
- check: field_value
|
|
81
|
+
path: "creative.supported_formats[0].capability_id"
|
|
82
|
+
value: "training_image_generation"
|
|
83
|
+
description: "The image build path has a stable local capability_id"
|
|
84
|
+
- check: field_value
|
|
85
|
+
path: "creative.supported_formats[0].format.format_kind"
|
|
86
|
+
value: "image"
|
|
87
|
+
description: "The first supported capability declares the image canonical"
|
|
88
|
+
- check: field_present
|
|
89
|
+
path: "creative.supported_formats[0].format.params.slots[0].asset_group_id"
|
|
90
|
+
description: "Canonical format declaration includes slot metadata"
|
|
91
|
+
- check: field_absent
|
|
92
|
+
path: "creative.supported_formats[0].format.format_option_id"
|
|
93
|
+
description: "Creative-agent build routing uses capability_id, not product format_option_id"
|
|
94
|
+
- check: field_absent
|
|
95
|
+
path: "creative.supported_formats[1].capability_id"
|
|
96
|
+
description: "Storyboard fixture only advertises implemented canonical build paths"
|
|
97
|
+
- check: field_value
|
|
98
|
+
path: "context.correlation_id"
|
|
99
|
+
value: "creative_canonical_supported_formats--get_capabilities"
|
|
100
|
+
description: "Context correlation_id returned unchanged"
|
|
101
|
+
|
|
102
|
+
- id: build_from_capability
|
|
103
|
+
title: "Build using the advertised capability"
|
|
104
|
+
narrative: |
|
|
105
|
+
The buyer invokes `build_creative` using the advertised image build
|
|
106
|
+
capability. The produced manifest uses the 3.1 canonical manifest path
|
|
107
|
+
(`format_kind`) and does not fall back to a legacy named format.
|
|
108
|
+
|
|
109
|
+
steps:
|
|
110
|
+
- id: build_image_capability
|
|
111
|
+
title: "Build with the advertised image capability"
|
|
112
|
+
task: build_creative
|
|
113
|
+
schema_ref: "media-buy/build-creative-request.json"
|
|
114
|
+
response_schema_ref: "media-buy/build-creative-response.json"
|
|
115
|
+
doc_ref: "/creative/task-reference/build_creative"
|
|
116
|
+
comply_scenario: creative_flow
|
|
117
|
+
stateful: false
|
|
118
|
+
expected: |
|
|
119
|
+
Return a completed build with a canonical image manifest:
|
|
120
|
+
- `creative_manifest.format_kind: image`
|
|
121
|
+
- generated assets keyed by canonical slot names
|
|
122
|
+
sample_request:
|
|
123
|
+
message: "Create a clean image creative for Acme Outdoor's summer trail sale. Use a direct headline and a clear landing page."
|
|
124
|
+
target_format_id:
|
|
125
|
+
agent_url: "https://your-agent.example.com"
|
|
126
|
+
id: "$context.image_build_capability_id"
|
|
127
|
+
account:
|
|
128
|
+
brand:
|
|
129
|
+
domain: "acmeoutdoor.example"
|
|
130
|
+
operator: "pinnacle-agency.example"
|
|
131
|
+
brand:
|
|
132
|
+
domain: "acmeoutdoor.example"
|
|
133
|
+
quality: "draft"
|
|
134
|
+
idempotency_key: "$generate:uuid_v4#creative_canonical_supported_formats_build_image"
|
|
135
|
+
context:
|
|
136
|
+
correlation_id: "creative_canonical_supported_formats--build_image"
|
|
137
|
+
validations:
|
|
138
|
+
- check: response_schema
|
|
139
|
+
description: "Response matches build-creative-response.json schema"
|
|
140
|
+
- check: field_value
|
|
141
|
+
path: "creative_manifest.format_kind"
|
|
142
|
+
value: "image"
|
|
143
|
+
description: "Generated manifest uses the 3.1 canonical manifest path"
|
|
144
|
+
- check: field_absent
|
|
145
|
+
path: "creative_manifest.format_id"
|
|
146
|
+
description: "Canonical build does not invent a legacy named-format id"
|
|
147
|
+
- check: field_present
|
|
148
|
+
path: "creative_manifest.assets.image_main"
|
|
149
|
+
description: "Output manifest includes an image asset under the canonical slot"
|
|
150
|
+
- check: field_value
|
|
151
|
+
path: "context.correlation_id"
|
|
152
|
+
value: "creative_canonical_supported_formats--build_image"
|
|
153
|
+
description: "Context correlation_id returned unchanged"
|
|
154
|
+
|
|
155
|
+
- id: reject_unsupported_capability
|
|
156
|
+
title: "Reject unsupported target capability"
|
|
157
|
+
narrative: |
|
|
158
|
+
A buyer may cache or mistype a build target. The creative agent must fail
|
|
159
|
+
closed with `FORMAT_NOT_SUPPORTED` instead of producing a manifest under a
|
|
160
|
+
target it does not recognize. Legacy named-format IDs may still be
|
|
161
|
+
accepted during the 3.x migration window; this phase probes an unknown
|
|
162
|
+
selector that is neither a legacy format nor an advertised capability.
|
|
163
|
+
|
|
164
|
+
steps:
|
|
165
|
+
- id: reject_unknown_capability
|
|
166
|
+
title: "Reject an unknown build target"
|
|
167
|
+
task: build_creative
|
|
168
|
+
schema_ref: "media-buy/build-creative-request.json"
|
|
169
|
+
response_schema_ref: "media-buy/build-creative-response.json"
|
|
170
|
+
doc_ref: "/creative/task-reference/build_creative"
|
|
171
|
+
comply_scenario: creative_flow
|
|
172
|
+
stateful: false
|
|
173
|
+
expect_error: true
|
|
174
|
+
negative_path: payload_well_formed
|
|
175
|
+
expected: |
|
|
176
|
+
Return a build_creative error response with:
|
|
177
|
+
- errors[0].code: FORMAT_NOT_SUPPORTED
|
|
178
|
+
- errors[0].field: target_format_id
|
|
179
|
+
- errors[0].recovery: correctable
|
|
180
|
+
sample_request:
|
|
181
|
+
message: "Create an unsupported canonical creative."
|
|
182
|
+
target_format_id:
|
|
183
|
+
agent_url: "https://your-agent.example.com"
|
|
184
|
+
id: "unknown_takeover_generation"
|
|
185
|
+
account:
|
|
186
|
+
brand:
|
|
187
|
+
domain: "acmeoutdoor.example"
|
|
188
|
+
operator: "pinnacle-agency.example"
|
|
189
|
+
brand:
|
|
190
|
+
domain: "acmeoutdoor.example"
|
|
191
|
+
quality: "draft"
|
|
192
|
+
idempotency_key: "$generate:uuid_v4#creative_canonical_supported_formats_reject_unknown"
|
|
193
|
+
context:
|
|
194
|
+
correlation_id: "creative_canonical_supported_formats--reject_unknown"
|
|
195
|
+
validations:
|
|
196
|
+
- check: response_schema
|
|
197
|
+
description: "Response matches build-creative-response.json schema"
|
|
198
|
+
- check: error_code
|
|
199
|
+
value: "FORMAT_NOT_SUPPORTED"
|
|
200
|
+
description: "Unsupported build target is rejected with the canonical error code"
|
|
201
|
+
- check: field_value
|
|
202
|
+
path: "errors[0].field"
|
|
203
|
+
value: "target_format_id"
|
|
204
|
+
description: "Error points at the unsupported target selector"
|
|
205
|
+
- check: field_value
|
|
206
|
+
path: "errors[0].recovery"
|
|
207
|
+
value: "correctable"
|
|
208
|
+
description: "Buyer can correct the target by choosing an advertised capability_id"
|
|
209
|
+
- check: field_value
|
|
210
|
+
path: "context.correlation_id"
|
|
211
|
+
value: "creative_canonical_supported_formats--reject_unknown"
|
|
212
|
+
description: "Context correlation_id returned unchanged"
|
package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml
ADDED
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
id: creative/creative_lifecycle_webhooks
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
introduced_in: "3.1"
|
|
4
|
+
title: "Creative lifecycle webhooks"
|
|
5
|
+
category: creative
|
|
6
|
+
summary: "Registers account-level creative lifecycle notifications, forces a seller-side status transition, observes creative.status_changed, and verifies list_creatives snapshot repair plus optional creative.purged coverage."
|
|
7
|
+
track: creative
|
|
8
|
+
required_tools:
|
|
9
|
+
- sync_accounts
|
|
10
|
+
- sync_creatives
|
|
11
|
+
- list_creatives
|
|
12
|
+
- comply_test_controller
|
|
13
|
+
|
|
14
|
+
narrative: |
|
|
15
|
+
A buyer registers an account-level webhook subscriber through
|
|
16
|
+
sync_accounts.accounts[].notification_configs[] for creative lifecycle
|
|
17
|
+
events. The runner then pushes a creative, forces a seller-side lifecycle
|
|
18
|
+
transition with comply_test_controller, observes the account-anchored
|
|
19
|
+
creative.status_changed event, and re-reads list_creatives as the repair
|
|
20
|
+
path after a missed or distrusted webhook.
|
|
21
|
+
|
|
22
|
+
This storyboard is deliberately separate from media-buy impairment coverage:
|
|
23
|
+
creative.status_changed and creative.purged are account-anchored lifecycle
|
|
24
|
+
events, while impairment webhooks are media-buy anchored state-event logs.
|
|
25
|
+
|
|
26
|
+
agent:
|
|
27
|
+
interaction_model: stateful_push
|
|
28
|
+
capabilities:
|
|
29
|
+
- has_creative_library
|
|
30
|
+
- emits_account_lifecycle_webhooks
|
|
31
|
+
examples:
|
|
32
|
+
- "Creative management platforms"
|
|
33
|
+
- "Ad servers with account-scoped creative libraries"
|
|
34
|
+
- "Media sellers that host buyer-supplied creative assets"
|
|
35
|
+
|
|
36
|
+
caller:
|
|
37
|
+
role: compliance_runner
|
|
38
|
+
example: "AdCP Verified runner with webhook receiver capability"
|
|
39
|
+
|
|
40
|
+
prerequisites:
|
|
41
|
+
description: |
|
|
42
|
+
The runner MUST host the webhook receiver contract so the account-level
|
|
43
|
+
notification_configs[] URL can point at a per-step receiver. This
|
|
44
|
+
storyboard is intended for sellers that expose account-level creative
|
|
45
|
+
lifecycle notifications; sellers that do not support notification_configs[]
|
|
46
|
+
should omit this scenario from their claimed coverage.
|
|
47
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
48
|
+
|
|
49
|
+
phases:
|
|
50
|
+
- id: register_account_lifecycle_subscriber
|
|
51
|
+
title: "Register account-level creative lifecycle notifications"
|
|
52
|
+
narrative: |
|
|
53
|
+
The buyer provisions a sandbox account and declares a webhook subscriber
|
|
54
|
+
interested in account-anchored creative.status_changed and
|
|
55
|
+
creative.purged events. The subscriber URL is owned by the runner.
|
|
56
|
+
|
|
57
|
+
steps:
|
|
58
|
+
- id: sync_accounts_with_lifecycle_notifications
|
|
59
|
+
title: "Register notification_configs[] for creative lifecycle events"
|
|
60
|
+
task: sync_accounts
|
|
61
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
62
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
63
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
64
|
+
stateful: true
|
|
65
|
+
expected: |
|
|
66
|
+
Seller accepts the sandbox account relationship and persists the
|
|
67
|
+
account-level subscriber:
|
|
68
|
+
- action: created or updated
|
|
69
|
+
- status: active
|
|
70
|
+
- notification_configs[0].subscriber_id: buyer-primary
|
|
71
|
+
- notification_configs[0].event_types includes creative.status_changed
|
|
72
|
+
and creative.purged
|
|
73
|
+
sample_request:
|
|
74
|
+
brand:
|
|
75
|
+
domain: "acmeoutdoor.example"
|
|
76
|
+
accounts:
|
|
77
|
+
- brand:
|
|
78
|
+
domain: "acmeoutdoor.example"
|
|
79
|
+
operator: "pinnacle-agency.example"
|
|
80
|
+
billing: "operator"
|
|
81
|
+
sandbox: true
|
|
82
|
+
notification_configs:
|
|
83
|
+
- subscriber_id: "buyer-primary"
|
|
84
|
+
url: "{{runner.webhook_url:creative_lifecycle_events}}"
|
|
85
|
+
event_types:
|
|
86
|
+
- "creative.status_changed"
|
|
87
|
+
- "creative.purged"
|
|
88
|
+
active: true
|
|
89
|
+
idempotency_key: "$generate:uuid_v4#creative_lifecycle_webhooks_sync_accounts"
|
|
90
|
+
context:
|
|
91
|
+
correlation_id: "creative_lifecycle_webhooks--sync_accounts"
|
|
92
|
+
validations:
|
|
93
|
+
- check: response_schema
|
|
94
|
+
description: "Response matches sync-accounts-response.json"
|
|
95
|
+
- check: field_value
|
|
96
|
+
path: "accounts[0].action"
|
|
97
|
+
allowed_values: ["created", "updated", "unchanged"]
|
|
98
|
+
description: "Account sync succeeded"
|
|
99
|
+
- check: field_value
|
|
100
|
+
path: "accounts[0].status"
|
|
101
|
+
allowed_values: ["active"]
|
|
102
|
+
description: "Sandbox account is active"
|
|
103
|
+
- check: field_value
|
|
104
|
+
path: "accounts[0].notification_configs[0].subscriber_id"
|
|
105
|
+
value: "buyer-primary"
|
|
106
|
+
description: "Seller echoes the account-level subscriber id"
|
|
107
|
+
- check: field_present
|
|
108
|
+
path: "accounts[0].notification_configs[0].event_types"
|
|
109
|
+
description: "Seller echoes the account-level creative lifecycle event filter array"
|
|
110
|
+
|
|
111
|
+
- id: seed_creative
|
|
112
|
+
title: "Create a sandbox creative"
|
|
113
|
+
narrative: |
|
|
114
|
+
The buyer syncs a creative into the account-scoped library. The creative
|
|
115
|
+
starts from a known approved baseline before the runner forces a
|
|
116
|
+
seller-side status transition.
|
|
117
|
+
|
|
118
|
+
steps:
|
|
119
|
+
- id: sync_creative
|
|
120
|
+
title: "Sync a display creative into the account library"
|
|
121
|
+
task: sync_creatives
|
|
122
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
123
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
124
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
125
|
+
stateful: true
|
|
126
|
+
expected: |
|
|
127
|
+
Creative is created or updated and can be addressed by creative_id
|
|
128
|
+
in later list_creatives and comply_test_controller calls.
|
|
129
|
+
sample_request:
|
|
130
|
+
account:
|
|
131
|
+
brand:
|
|
132
|
+
domain: "acmeoutdoor.example"
|
|
133
|
+
operator: "pinnacle-agency.example"
|
|
134
|
+
brand:
|
|
135
|
+
domain: "acmeoutdoor.example"
|
|
136
|
+
creatives:
|
|
137
|
+
- creative_id: "acme_lifecycle_banner_001"
|
|
138
|
+
name: "Trail Pro lifecycle webhook banner"
|
|
139
|
+
format_id:
|
|
140
|
+
agent_url: "https://your-platform.example.com"
|
|
141
|
+
id: "display_300x250"
|
|
142
|
+
assets:
|
|
143
|
+
image:
|
|
144
|
+
asset_type: "image"
|
|
145
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/trail-pro-300x250.png"
|
|
146
|
+
width: 300
|
|
147
|
+
height: 250
|
|
148
|
+
mime_type: "image/png"
|
|
149
|
+
idempotency_key: "$generate:uuid_v4#creative_lifecycle_webhooks_sync_creative"
|
|
150
|
+
context:
|
|
151
|
+
correlation_id: "creative_lifecycle_webhooks--sync_creative"
|
|
152
|
+
validations:
|
|
153
|
+
- check: response_schema
|
|
154
|
+
description: "Response matches sync-creatives-response.json"
|
|
155
|
+
- check: field_value
|
|
156
|
+
path: "creatives[0].creative_id"
|
|
157
|
+
value: "acme_lifecycle_banner_001"
|
|
158
|
+
description: "Creative id is echoed"
|
|
159
|
+
- check: field_value
|
|
160
|
+
path: "creatives[0].action"
|
|
161
|
+
allowed_values: ["created", "updated"]
|
|
162
|
+
description: "Creative was stored"
|
|
163
|
+
|
|
164
|
+
- id: force_creative_approved
|
|
165
|
+
title: "Force approved baseline"
|
|
166
|
+
task: comply_test_controller
|
|
167
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
168
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
169
|
+
doc_ref: "/building/implementation/comply-test-controller"
|
|
170
|
+
stateful: true
|
|
171
|
+
expected: |
|
|
172
|
+
success: true. The creative is approved before the status-changed
|
|
173
|
+
event phase begins.
|
|
174
|
+
sample_request:
|
|
175
|
+
account:
|
|
176
|
+
sandbox: true
|
|
177
|
+
brand:
|
|
178
|
+
domain: "acmeoutdoor.example"
|
|
179
|
+
scenario: "force_creative_status"
|
|
180
|
+
params:
|
|
181
|
+
creative_id: "acme_lifecycle_banner_001"
|
|
182
|
+
status: "approved"
|
|
183
|
+
context:
|
|
184
|
+
correlation_id: "creative_lifecycle_webhooks--force_approved"
|
|
185
|
+
validations:
|
|
186
|
+
- check: response_schema
|
|
187
|
+
description: "Response matches comply-test-controller-response.json"
|
|
188
|
+
- check: field_value
|
|
189
|
+
path: "success"
|
|
190
|
+
allowed_values: [true]
|
|
191
|
+
description: "Controller accepted the approved baseline"
|
|
192
|
+
|
|
193
|
+
- id: status_changed_event
|
|
194
|
+
title: "Observe creative.status_changed"
|
|
195
|
+
narrative: |
|
|
196
|
+
The controller forces an approved → rejected seller-side transition. The
|
|
197
|
+
seller emits creative.status_changed to the registered account-level
|
|
198
|
+
subscriber, and the buyer re-reads the creative snapshot to repair state
|
|
199
|
+
after any missed webhook.
|
|
200
|
+
|
|
201
|
+
steps:
|
|
202
|
+
- id: force_creative_rejected
|
|
203
|
+
title: "Force approved → rejected"
|
|
204
|
+
task: comply_test_controller
|
|
205
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
206
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
207
|
+
doc_ref: "/building/implementation/comply-test-controller"
|
|
208
|
+
stateful: true
|
|
209
|
+
expected: |
|
|
210
|
+
success: true. Seller observed a seller-initiated creative lifecycle
|
|
211
|
+
transition and must notify account-level lifecycle subscribers.
|
|
212
|
+
sample_request:
|
|
213
|
+
account:
|
|
214
|
+
sandbox: true
|
|
215
|
+
brand:
|
|
216
|
+
domain: "acmeoutdoor.example"
|
|
217
|
+
scenario: "force_creative_status"
|
|
218
|
+
params:
|
|
219
|
+
creative_id: "acme_lifecycle_banner_001"
|
|
220
|
+
status: "rejected"
|
|
221
|
+
rejection_reason: "Lifecycle webhook storyboard: forced revocation for account-level notification coverage."
|
|
222
|
+
context:
|
|
223
|
+
correlation_id: "creative_lifecycle_webhooks--force_rejected"
|
|
224
|
+
validations:
|
|
225
|
+
- check: response_schema
|
|
226
|
+
description: "Response matches comply-test-controller-response.json"
|
|
227
|
+
- check: field_value
|
|
228
|
+
path: "success"
|
|
229
|
+
allowed_values: [true]
|
|
230
|
+
description: "Controller accepted the rejected transition"
|
|
231
|
+
|
|
232
|
+
- id: expect_status_changed_webhook
|
|
233
|
+
title: "Assert creative.status_changed webhook payload"
|
|
234
|
+
task: expect_webhook
|
|
235
|
+
triggered_by: force_creative_rejected
|
|
236
|
+
filter:
|
|
237
|
+
notification_type: "creative.status_changed"
|
|
238
|
+
creative_id: "acme_lifecycle_banner_001"
|
|
239
|
+
subscriber_id: "buyer-primary"
|
|
240
|
+
timeout_seconds: 30
|
|
241
|
+
expect_idempotency_key: true
|
|
242
|
+
webhook_payload_schema_ref: "creative/creative-status-changed-webhook.json"
|
|
243
|
+
requires_contract: webhook_receiver_runner
|
|
244
|
+
stateful: true
|
|
245
|
+
expected: |
|
|
246
|
+
A webhook arrives at the account-level subscriber URL. Payload
|
|
247
|
+
validates against creative-status-changed-webhook.json and carries:
|
|
248
|
+
notification_type: creative.status_changed, subscriber_id:
|
|
249
|
+
buyer-primary, creative_id: acme_lifecycle_banner_001,
|
|
250
|
+
transition.from: approved, transition.to: rejected, notification_id,
|
|
251
|
+
and idempotency_key.
|
|
252
|
+
|
|
253
|
+
- id: list_creatives_after_status_change
|
|
254
|
+
title: "Repair from list_creatives after the status webhook"
|
|
255
|
+
task: list_creatives
|
|
256
|
+
schema_ref: "creative/list-creatives-request.json"
|
|
257
|
+
response_schema_ref: "creative/list-creatives-response.json"
|
|
258
|
+
doc_ref: "/creative/task-reference/list_creatives"
|
|
259
|
+
stateful: true
|
|
260
|
+
expected: |
|
|
261
|
+
Snapshot repair shows the creative's current rejected status and the
|
|
262
|
+
recent creative.status_changed activity record, keyed by the same
|
|
263
|
+
creative_id as the webhook payload.
|
|
264
|
+
sample_request:
|
|
265
|
+
account:
|
|
266
|
+
brand:
|
|
267
|
+
domain: "acmeoutdoor.example"
|
|
268
|
+
operator: "pinnacle-agency.example"
|
|
269
|
+
brand:
|
|
270
|
+
domain: "acmeoutdoor.example"
|
|
271
|
+
creative_ids:
|
|
272
|
+
- "acme_lifecycle_banner_001"
|
|
273
|
+
include_webhook_activity: true
|
|
274
|
+
context:
|
|
275
|
+
correlation_id: "creative_lifecycle_webhooks--list_after_status_change"
|
|
276
|
+
validations:
|
|
277
|
+
- check: response_schema
|
|
278
|
+
description: "Response matches list-creatives-response.json"
|
|
279
|
+
- check: field_value
|
|
280
|
+
path: "creatives[0].creative_id"
|
|
281
|
+
value: "acme_lifecycle_banner_001"
|
|
282
|
+
description: "Snapshot returns the transitioned creative"
|
|
283
|
+
- check: field_value
|
|
284
|
+
path: "creatives[0].status"
|
|
285
|
+
value: "rejected"
|
|
286
|
+
description: "Snapshot repair reflects the current rejected status"
|
|
287
|
+
- check: field_value
|
|
288
|
+
path: "creatives[0].webhook_activity[0].notification_type"
|
|
289
|
+
value: "creative.status_changed"
|
|
290
|
+
description: "Snapshot exposes recent status-changed webhook activity"
|
|
291
|
+
- check: field_present
|
|
292
|
+
path: "creatives[0].webhook_activity[0].idempotency_key"
|
|
293
|
+
description: "Activity record carries the delivery idempotency key"
|
|
294
|
+
|
|
295
|
+
- id: purged_event_optional
|
|
296
|
+
title: "Optional creative.purged coverage"
|
|
297
|
+
optional: true
|
|
298
|
+
narrative: |
|
|
299
|
+
Sellers that advertise force_creative_purge can deterministically destroy
|
|
300
|
+
the sandbox creative and emit creative.purged. This phase is optional;
|
|
301
|
+
the required status_changed and snapshot-repair coverage above still
|
|
302
|
+
stands when a seller does not implement the purge primitive.
|
|
303
|
+
|
|
304
|
+
steps:
|
|
305
|
+
- id: force_creative_purged
|
|
306
|
+
title: "Force a soft purge"
|
|
307
|
+
task: comply_test_controller
|
|
308
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
309
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
310
|
+
doc_ref: "/building/implementation/comply-test-controller"
|
|
311
|
+
stateful: true
|
|
312
|
+
expected: |
|
|
313
|
+
success: true when the seller supports force_creative_purge. The
|
|
314
|
+
creative is soft-purged so list_creatives can expose a tombstone.
|
|
315
|
+
sample_request:
|
|
316
|
+
account:
|
|
317
|
+
sandbox: true
|
|
318
|
+
brand:
|
|
319
|
+
domain: "acmeoutdoor.example"
|
|
320
|
+
scenario: "force_creative_purge"
|
|
321
|
+
params:
|
|
322
|
+
creative_id: "acme_lifecycle_banner_001"
|
|
323
|
+
purge_kind: "soft"
|
|
324
|
+
reason_code: "retention_expired"
|
|
325
|
+
reason_detail: "Lifecycle webhook storyboard: soft purge for account-level notification coverage."
|
|
326
|
+
context:
|
|
327
|
+
correlation_id: "creative_lifecycle_webhooks--force_purged"
|
|
328
|
+
validations:
|
|
329
|
+
- check: response_schema
|
|
330
|
+
description: "Response matches comply-test-controller-response.json"
|
|
331
|
+
|
|
332
|
+
- id: expect_purged_webhook
|
|
333
|
+
title: "Assert creative.purged webhook payload"
|
|
334
|
+
task: expect_webhook
|
|
335
|
+
triggered_by: force_creative_purged
|
|
336
|
+
filter:
|
|
337
|
+
notification_type: "creative.purged"
|
|
338
|
+
creative_id: "acme_lifecycle_banner_001"
|
|
339
|
+
subscriber_id: "buyer-primary"
|
|
340
|
+
timeout_seconds: 30
|
|
341
|
+
expect_idempotency_key: true
|
|
342
|
+
webhook_payload_schema_ref: "creative/creative-purged-webhook.json"
|
|
343
|
+
requires_contract: webhook_receiver_runner
|
|
344
|
+
stateful: true
|
|
345
|
+
expected: |
|
|
346
|
+
A creative.purged webhook arrives for the same account-level
|
|
347
|
+
subscriber. Payload validates against creative-purged-webhook.json
|
|
348
|
+
and carries creative_id, notification_id, idempotency_key,
|
|
349
|
+
purge_kind: soft, and reason_code.
|
|
350
|
+
|
|
351
|
+
- id: list_creatives_after_purge
|
|
352
|
+
title: "Repair from list_creatives tombstone"
|
|
353
|
+
task: list_creatives
|
|
354
|
+
schema_ref: "creative/list-creatives-request.json"
|
|
355
|
+
response_schema_ref: "creative/list-creatives-response.json"
|
|
356
|
+
doc_ref: "/creative/task-reference/list_creatives"
|
|
357
|
+
stateful: true
|
|
358
|
+
expected: |
|
|
359
|
+
With include_purged and include_webhook_activity, snapshot repair
|
|
360
|
+
surfaces the soft-purged tombstone and the recent creative.purged
|
|
361
|
+
activity record.
|
|
362
|
+
sample_request:
|
|
363
|
+
account:
|
|
364
|
+
brand:
|
|
365
|
+
domain: "acmeoutdoor.example"
|
|
366
|
+
operator: "pinnacle-agency.example"
|
|
367
|
+
brand:
|
|
368
|
+
domain: "acmeoutdoor.example"
|
|
369
|
+
creative_ids:
|
|
370
|
+
- "acme_lifecycle_banner_001"
|
|
371
|
+
include_purged: true
|
|
372
|
+
include_webhook_activity: true
|
|
373
|
+
context:
|
|
374
|
+
correlation_id: "creative_lifecycle_webhooks--list_after_purge"
|
|
375
|
+
validations:
|
|
376
|
+
- check: response_schema
|
|
377
|
+
description: "Response matches list-creatives-response.json"
|
|
378
|
+
- check: field_value
|
|
379
|
+
path: "creatives[0].creative_id"
|
|
380
|
+
value: "acme_lifecycle_banner_001"
|
|
381
|
+
description: "Tombstone retains the creative id"
|
|
382
|
+
- check: field_value
|
|
383
|
+
path: "creatives[0].purge.kind"
|
|
384
|
+
value: "soft"
|
|
385
|
+
description: "Soft-purged creative remains visible as a tombstone"
|
|
386
|
+
- check: field_value
|
|
387
|
+
path: "creatives[0].webhook_activity[0].notification_type"
|
|
388
|
+
value: "creative.purged"
|
|
389
|
+
description: "Snapshot exposes recent purged webhook activity"
|