@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
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
id: media_buy_seller/available_actions
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller carries product allowed actions into per-buy available actions"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Validates the AdCP 3.1 media-buy action-discovery flow: product allowed_actions[], buy available_actions[], SLAWindow duration fields, self-serve mutation, and ACTION_NOT_ALLOWED enforcement."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
- get_media_buys
|
|
11
|
+
- update_media_buy
|
|
12
|
+
|
|
13
|
+
narrative: |
|
|
14
|
+
Buyers should not hard-code a seller's media-buy state machine. Sellers
|
|
15
|
+
declare the product-level action template in get_products.allowed_actions[],
|
|
16
|
+
resolve it into the authoritative buy-level available_actions[] when the
|
|
17
|
+
buy is created, return that surface from get_media_buys, and enforce the
|
|
18
|
+
same surface when update_media_buy is called.
|
|
19
|
+
|
|
20
|
+
This scenario creates a media buy from a product whose allowed_actions[]
|
|
21
|
+
advertise one self-serve budget action, one proposal-routed flight action,
|
|
22
|
+
and one approval-routed cancellation action. The runner then verifies that
|
|
23
|
+
the created buy and subsequent get/update responses carry the resolved
|
|
24
|
+
available_actions[] surface, that the self-serve update succeeds, and that
|
|
25
|
+
direct updates for non-self-serve or unadvertised product actions reject
|
|
26
|
+
with ACTION_NOT_ALLOWED.
|
|
27
|
+
|
|
28
|
+
agent:
|
|
29
|
+
interaction_model: stateful_preloaded
|
|
30
|
+
capabilities:
|
|
31
|
+
- sells_media
|
|
32
|
+
examples:
|
|
33
|
+
- "Any AdCP media buy seller exposing the 3.1 action-discovery surface"
|
|
34
|
+
|
|
35
|
+
caller:
|
|
36
|
+
role: buyer_agent
|
|
37
|
+
example: "Pinnacle Agency (buyer)"
|
|
38
|
+
|
|
39
|
+
prerequisites:
|
|
40
|
+
description: |
|
|
41
|
+
The runner seeds a product with allowed_actions[]. The seller must carry
|
|
42
|
+
that product template into buy-level available_actions[] on create_media_buy,
|
|
43
|
+
persist it for get_media_buys, and enforce the advertised modes when
|
|
44
|
+
update_media_buy is called.
|
|
45
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
46
|
+
controller_seeding: true
|
|
47
|
+
|
|
48
|
+
fixtures:
|
|
49
|
+
products:
|
|
50
|
+
- product_id: "available_actions_display"
|
|
51
|
+
name: "Available Actions Display Package"
|
|
52
|
+
description: "Display inventory fixture used to verify product allowed actions become buy available actions."
|
|
53
|
+
delivery_type: "guaranteed"
|
|
54
|
+
channels: ["display"]
|
|
55
|
+
format_ids:
|
|
56
|
+
- id: "display_300x250"
|
|
57
|
+
allowed_actions:
|
|
58
|
+
- action: "increase_budget"
|
|
59
|
+
modes: ["self_serve"]
|
|
60
|
+
sla:
|
|
61
|
+
response_max: "PT5M"
|
|
62
|
+
completion_max: "PT1H"
|
|
63
|
+
- action: "extend_flight"
|
|
64
|
+
modes: ["requires_proposal"]
|
|
65
|
+
sla:
|
|
66
|
+
response_max: "PT4H"
|
|
67
|
+
completion_max: "P2D"
|
|
68
|
+
terms_ref: "terms://available-actions/extension"
|
|
69
|
+
- action: "cancel"
|
|
70
|
+
modes: ["requires_approval"]
|
|
71
|
+
sla:
|
|
72
|
+
response_max: "PT1H"
|
|
73
|
+
completion_max: "P1D"
|
|
74
|
+
- action: "decrease_budget"
|
|
75
|
+
modes: ["self_serve"]
|
|
76
|
+
allowed_statuses: ["active"]
|
|
77
|
+
pricing_options:
|
|
78
|
+
- product_id: "available_actions_display"
|
|
79
|
+
pricing_option_id: "available_actions_cpm"
|
|
80
|
+
pricing_model: "cpm"
|
|
81
|
+
currency: "USD"
|
|
82
|
+
fixed_price: 8.0
|
|
83
|
+
|
|
84
|
+
phases:
|
|
85
|
+
- id: discover_product_action_template
|
|
86
|
+
title: "Discover product allowed actions"
|
|
87
|
+
narrative: |
|
|
88
|
+
The buyer discovers the product-level allowed_actions[] template before
|
|
89
|
+
creating a media buy. This is the product promise the later buy-level
|
|
90
|
+
surface must resolve and enforce.
|
|
91
|
+
steps:
|
|
92
|
+
- id: get_product_allowed_actions
|
|
93
|
+
title: "Read allowed_actions from get_products"
|
|
94
|
+
task: get_products
|
|
95
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
96
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
97
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
98
|
+
comply_scenario: media_buy_action_discovery
|
|
99
|
+
stateful: true
|
|
100
|
+
expected: |
|
|
101
|
+
Return the seeded product with allowed_actions[] entries for
|
|
102
|
+
increase_budget, extend_flight, and cancel.
|
|
103
|
+
sample_request:
|
|
104
|
+
buying_mode: brief
|
|
105
|
+
brief: "available actions display package"
|
|
106
|
+
filters:
|
|
107
|
+
channels: ["display"]
|
|
108
|
+
account:
|
|
109
|
+
brand:
|
|
110
|
+
domain: "acmeoutdoor.example"
|
|
111
|
+
operator: "pinnacle-agency.example"
|
|
112
|
+
brand:
|
|
113
|
+
domain: "acmeoutdoor.example"
|
|
114
|
+
context:
|
|
115
|
+
correlation_id: "available_actions--get_products"
|
|
116
|
+
validations:
|
|
117
|
+
- check: response_schema
|
|
118
|
+
description: "Response matches get-products-response.json schema"
|
|
119
|
+
- check: field_value
|
|
120
|
+
path: "products[0].product_id"
|
|
121
|
+
value: "available_actions_display"
|
|
122
|
+
description: "The seeded product is discoverable through get_products"
|
|
123
|
+
- check: field_value
|
|
124
|
+
path: "products[0].allowed_actions[0].action"
|
|
125
|
+
value: "increase_budget"
|
|
126
|
+
description: "Product advertises the self-serve budget action"
|
|
127
|
+
- check: field_value
|
|
128
|
+
path: "products[0].allowed_actions[0].modes[0]"
|
|
129
|
+
value: "self_serve"
|
|
130
|
+
description: "Product declares increase_budget as self-serve"
|
|
131
|
+
- check: field_value
|
|
132
|
+
path: "products[0].allowed_actions[0].sla.response_max"
|
|
133
|
+
value: "PT5M"
|
|
134
|
+
description: "Product action SLA uses the generated ISO 8601 duration shape"
|
|
135
|
+
- check: field_value
|
|
136
|
+
path: "products[0].allowed_actions[1].action"
|
|
137
|
+
value: "extend_flight"
|
|
138
|
+
description: "Product advertises the proposal-routed flight extension action"
|
|
139
|
+
- check: field_value
|
|
140
|
+
path: "products[0].allowed_actions[1].modes[0]"
|
|
141
|
+
value: "requires_proposal"
|
|
142
|
+
description: "Product declares extend_flight as proposal-routed"
|
|
143
|
+
- check: field_value
|
|
144
|
+
path: "products[0].allowed_actions[2].action"
|
|
145
|
+
value: "cancel"
|
|
146
|
+
description: "Product advertises the approval-routed cancellation action"
|
|
147
|
+
- check: field_value
|
|
148
|
+
path: "products[0].allowed_actions[2].modes[0]"
|
|
149
|
+
value: "requires_approval"
|
|
150
|
+
description: "Product declares cancel as approval-routed"
|
|
151
|
+
- check: field_value
|
|
152
|
+
path: "products[0].allowed_actions[3].action"
|
|
153
|
+
value: "decrease_budget"
|
|
154
|
+
description: "Product advertises a status-scoped budget decrease action"
|
|
155
|
+
- check: field_value
|
|
156
|
+
path: "products[0].allowed_actions[3].allowed_statuses[0]"
|
|
157
|
+
value: "active"
|
|
158
|
+
description: "Product can scope allowed actions to specific buy statuses"
|
|
159
|
+
|
|
160
|
+
- id: create_buy_from_product
|
|
161
|
+
title: "Resolve product actions onto the buy"
|
|
162
|
+
narrative: |
|
|
163
|
+
The buyer creates a media buy from the discovered product. The seller
|
|
164
|
+
must materialize the product-level template into buy-level
|
|
165
|
+
available_actions[] on the create response.
|
|
166
|
+
steps:
|
|
167
|
+
- id: create_media_buy_with_available_actions
|
|
168
|
+
title: "Create a buy from the action-enabled product"
|
|
169
|
+
task: create_media_buy
|
|
170
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
171
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
172
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
173
|
+
comply_scenario: media_buy_action_discovery
|
|
174
|
+
stateful: true
|
|
175
|
+
expected: |
|
|
176
|
+
Create the buy and return available_actions[] resolved from the
|
|
177
|
+
product's allowed_actions[] template.
|
|
178
|
+
sample_request:
|
|
179
|
+
account:
|
|
180
|
+
brand:
|
|
181
|
+
domain: "acmeoutdoor.example"
|
|
182
|
+
operator: "pinnacle-agency.example"
|
|
183
|
+
brand:
|
|
184
|
+
domain: "acmeoutdoor.example"
|
|
185
|
+
media_buy_id: "available_actions_product_mb"
|
|
186
|
+
start_time: "2026-05-01T00:00:00Z"
|
|
187
|
+
end_time: "2027-07-31T23:59:59Z"
|
|
188
|
+
packages:
|
|
189
|
+
- product_id: "available_actions_display"
|
|
190
|
+
pricing_option_id: "available_actions_cpm"
|
|
191
|
+
budget: 10000
|
|
192
|
+
idempotency_key: "$generate:uuid_v4#available_actions_create_buy"
|
|
193
|
+
context:
|
|
194
|
+
correlation_id: "available_actions--create_buy"
|
|
195
|
+
context_outputs:
|
|
196
|
+
- path: "media_buy_id"
|
|
197
|
+
key: "available_actions_media_buy_id"
|
|
198
|
+
- path: "packages[0].package_id"
|
|
199
|
+
key: "available_actions_package_id"
|
|
200
|
+
validations:
|
|
201
|
+
- check: response_schema
|
|
202
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
203
|
+
- check: field_present
|
|
204
|
+
path: "media_buy_id"
|
|
205
|
+
description: "Seller returns the created media buy ID"
|
|
206
|
+
- check: field_present
|
|
207
|
+
path: "packages[0].package_id"
|
|
208
|
+
description: "Seller returns the created package ID for later updates"
|
|
209
|
+
- check: field_value
|
|
210
|
+
path: "available_actions[0].action"
|
|
211
|
+
value: "increase_budget"
|
|
212
|
+
description: "Created buy carries increase_budget from product allowed_actions"
|
|
213
|
+
- check: field_value
|
|
214
|
+
path: "available_actions[0].mode"
|
|
215
|
+
value: "self_serve"
|
|
216
|
+
description: "Created buy resolves increase_budget to self_serve"
|
|
217
|
+
- check: field_value
|
|
218
|
+
path: "available_actions[0].sla.response_max"
|
|
219
|
+
value: "PT5M"
|
|
220
|
+
description: "Created buy preserves response_max SLA duration"
|
|
221
|
+
- check: field_value
|
|
222
|
+
path: "available_actions[0].sla.completion_max"
|
|
223
|
+
value: "PT1H"
|
|
224
|
+
description: "Created buy preserves completion_max SLA duration"
|
|
225
|
+
- check: field_value
|
|
226
|
+
path: "available_actions[1].action"
|
|
227
|
+
value: "extend_flight"
|
|
228
|
+
description: "Created buy carries extend_flight from product allowed_actions"
|
|
229
|
+
- check: field_value
|
|
230
|
+
path: "available_actions[1].mode"
|
|
231
|
+
value: "requires_proposal"
|
|
232
|
+
description: "Created buy resolves extend_flight to requires_proposal"
|
|
233
|
+
- check: field_value
|
|
234
|
+
path: "available_actions[1].terms_ref"
|
|
235
|
+
value: "terms://available-actions/extension"
|
|
236
|
+
description: "Created buy preserves the action terms reference"
|
|
237
|
+
- check: field_value
|
|
238
|
+
path: "available_actions[2].action"
|
|
239
|
+
value: "cancel"
|
|
240
|
+
description: "Created buy carries cancel from product allowed_actions"
|
|
241
|
+
- check: field_value
|
|
242
|
+
path: "available_actions[2].mode"
|
|
243
|
+
value: "requires_approval"
|
|
244
|
+
description: "Created buy resolves cancel to requires_approval"
|
|
245
|
+
- check: field_present
|
|
246
|
+
path: "valid_actions"
|
|
247
|
+
description: "Legacy valid_actions may still be present during the 3.x deprecation window"
|
|
248
|
+
|
|
249
|
+
- id: read_persisted_buy_actions
|
|
250
|
+
title: "Read persisted buy actions"
|
|
251
|
+
narrative: |
|
|
252
|
+
The buyer reads the created buy. The same available_actions[] surface
|
|
253
|
+
must persist through get_media_buys; it is the authoritative contract
|
|
254
|
+
for update_media_buy.
|
|
255
|
+
steps:
|
|
256
|
+
- id: get_created_buy_available_actions
|
|
257
|
+
title: "Read available_actions from get_media_buys"
|
|
258
|
+
task: get_media_buys
|
|
259
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
260
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
261
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
262
|
+
comply_scenario: media_buy_action_discovery
|
|
263
|
+
stateful: true
|
|
264
|
+
expected: |
|
|
265
|
+
Return the created buy with the same available_actions[] resolved
|
|
266
|
+
during create_media_buy.
|
|
267
|
+
sample_request:
|
|
268
|
+
account:
|
|
269
|
+
brand:
|
|
270
|
+
domain: "acmeoutdoor.example"
|
|
271
|
+
operator: "pinnacle-agency.example"
|
|
272
|
+
brand:
|
|
273
|
+
domain: "acmeoutdoor.example"
|
|
274
|
+
media_buy_ids: ["$context.available_actions_media_buy_id"]
|
|
275
|
+
context:
|
|
276
|
+
correlation_id: "available_actions--get_buy"
|
|
277
|
+
validations:
|
|
278
|
+
- check: response_schema
|
|
279
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
280
|
+
- check: field_value
|
|
281
|
+
path: "media_buys[0].media_buy_id"
|
|
282
|
+
value: "$context.available_actions_media_buy_id"
|
|
283
|
+
description: "Seller returns the created media buy"
|
|
284
|
+
- check: field_value
|
|
285
|
+
path: "media_buys[0].available_actions[0].action"
|
|
286
|
+
value: "increase_budget"
|
|
287
|
+
description: "Persisted buy carries the self-serve budget action"
|
|
288
|
+
- check: field_value
|
|
289
|
+
path: "media_buys[0].available_actions[0].mode"
|
|
290
|
+
value: "self_serve"
|
|
291
|
+
description: "Persisted buy keeps the self-serve mode"
|
|
292
|
+
- check: field_value
|
|
293
|
+
path: "media_buys[0].available_actions[1].action"
|
|
294
|
+
value: "extend_flight"
|
|
295
|
+
description: "Persisted buy carries the proposal-routed action"
|
|
296
|
+
- check: field_value
|
|
297
|
+
path: "media_buys[0].available_actions[1].mode"
|
|
298
|
+
value: "requires_proposal"
|
|
299
|
+
description: "Persisted buy keeps the proposal mode"
|
|
300
|
+
- check: field_value
|
|
301
|
+
path: "media_buys[0].available_actions[2].action"
|
|
302
|
+
value: "cancel"
|
|
303
|
+
description: "Persisted buy carries the approval-routed action"
|
|
304
|
+
- check: field_value
|
|
305
|
+
path: "media_buys[0].available_actions[2].mode"
|
|
306
|
+
value: "requires_approval"
|
|
307
|
+
description: "Persisted buy keeps the approval mode"
|
|
308
|
+
- check: field_value
|
|
309
|
+
path: "context.correlation_id"
|
|
310
|
+
value: "available_actions--get_buy"
|
|
311
|
+
description: "Context correlation_id returned unchanged"
|
|
312
|
+
|
|
313
|
+
- id: enforce_available_actions
|
|
314
|
+
title: "Enforce advertised actions"
|
|
315
|
+
narrative: |
|
|
316
|
+
The buyer attempts updates against the created buy. The self-serve action
|
|
317
|
+
succeeds, proposal/approval modes reject direct mutation with
|
|
318
|
+
mode_mismatch, and an action never advertised by the product rejects as
|
|
319
|
+
not_supported_on_product.
|
|
320
|
+
steps:
|
|
321
|
+
- id: increase_budget
|
|
322
|
+
title: "Apply the advertised self-serve budget action"
|
|
323
|
+
task: update_media_buy
|
|
324
|
+
schema_ref: "media-buy/update-media-buy-request.json"
|
|
325
|
+
response_schema_ref: "media-buy/update-media-buy-response.json"
|
|
326
|
+
doc_ref: "/media-buy/task-reference/update_media_buy"
|
|
327
|
+
comply_scenario: media_buy_action_discovery
|
|
328
|
+
stateful: true
|
|
329
|
+
expected: |
|
|
330
|
+
Accept the budget increase and return the post-update
|
|
331
|
+
available_actions[] surface.
|
|
332
|
+
sample_request:
|
|
333
|
+
account:
|
|
334
|
+
brand:
|
|
335
|
+
domain: "acmeoutdoor.example"
|
|
336
|
+
operator: "pinnacle-agency.example"
|
|
337
|
+
brand:
|
|
338
|
+
domain: "acmeoutdoor.example"
|
|
339
|
+
media_buy_id: "$context.available_actions_media_buy_id"
|
|
340
|
+
packages:
|
|
341
|
+
- package_id: "$context.available_actions_package_id"
|
|
342
|
+
budget: 12000
|
|
343
|
+
idempotency_key: "$generate:uuid_v4#available_actions_increase_budget"
|
|
344
|
+
context:
|
|
345
|
+
correlation_id: "available_actions--increase_budget"
|
|
346
|
+
validations:
|
|
347
|
+
- check: response_schema
|
|
348
|
+
description: "Response matches update-media-buy-response.json schema"
|
|
349
|
+
- check: field_value
|
|
350
|
+
path: "media_buy_id"
|
|
351
|
+
value: "$context.available_actions_media_buy_id"
|
|
352
|
+
description: "Seller updates the requested media buy"
|
|
353
|
+
- check: field_value
|
|
354
|
+
path: "available_actions[0].action"
|
|
355
|
+
value: "increase_budget"
|
|
356
|
+
description: "Update response carries the post-update action surface"
|
|
357
|
+
- check: field_value
|
|
358
|
+
path: "context.correlation_id"
|
|
359
|
+
value: "available_actions--increase_budget"
|
|
360
|
+
description: "Context correlation_id returned unchanged"
|
|
361
|
+
|
|
362
|
+
- id: direct_extend_requires_proposal
|
|
363
|
+
title: "Reject direct update for proposal-routed extension"
|
|
364
|
+
task: update_media_buy
|
|
365
|
+
schema_ref: "media-buy/update-media-buy-request.json"
|
|
366
|
+
response_schema_ref: "media-buy/update-media-buy-response.json"
|
|
367
|
+
doc_ref: "/media-buy/task-reference/update_media_buy"
|
|
368
|
+
comply_scenario: media_buy_action_discovery
|
|
369
|
+
expect_error: true
|
|
370
|
+
negative_path: mode_mismatch
|
|
371
|
+
stateful: true
|
|
372
|
+
expected: |
|
|
373
|
+
Reject with ACTION_NOT_ALLOWED because extend_flight is advertised,
|
|
374
|
+
but its resolved mode is requires_proposal rather than self_serve.
|
|
375
|
+
sample_request:
|
|
376
|
+
account:
|
|
377
|
+
brand:
|
|
378
|
+
domain: "acmeoutdoor.example"
|
|
379
|
+
operator: "pinnacle-agency.example"
|
|
380
|
+
brand:
|
|
381
|
+
domain: "acmeoutdoor.example"
|
|
382
|
+
media_buy_id: "$context.available_actions_media_buy_id"
|
|
383
|
+
end_time: "2027-08-31T23:59:59Z"
|
|
384
|
+
idempotency_key: "$generate:uuid_v4#available_actions_extend_direct"
|
|
385
|
+
context:
|
|
386
|
+
correlation_id: "available_actions--extend_direct"
|
|
387
|
+
validations:
|
|
388
|
+
- check: error_code
|
|
389
|
+
code: ACTION_NOT_ALLOWED
|
|
390
|
+
description: "Seller rejects direct mutation for proposal-routed action"
|
|
391
|
+
- check: field_value
|
|
392
|
+
path: "errors[0].details.attempted_action"
|
|
393
|
+
value: "extend_flight"
|
|
394
|
+
description: "Error identifies the attempted fine-grained action"
|
|
395
|
+
- check: field_value
|
|
396
|
+
path: "errors[0].details.reason"
|
|
397
|
+
value: "mode_mismatch"
|
|
398
|
+
description: "Error distinguishes mode mismatch from unsupported action"
|
|
399
|
+
- check: field_value
|
|
400
|
+
path: "errors[0].recovery"
|
|
401
|
+
value: "correctable"
|
|
402
|
+
description: "Mode mismatch is a correctable flow-switch recovery"
|
|
403
|
+
- check: field_value
|
|
404
|
+
path: "errors[0].details.currently_available_actions[1].mode"
|
|
405
|
+
value: "requires_proposal"
|
|
406
|
+
description: "Recovery details echo the current proposal-routed action surface"
|
|
407
|
+
- check: field_value
|
|
408
|
+
path: "context.correlation_id"
|
|
409
|
+
value: "available_actions--extend_direct"
|
|
410
|
+
description: "Context correlation_id returned unchanged"
|
|
411
|
+
|
|
412
|
+
- id: direct_cancel_requires_approval
|
|
413
|
+
title: "Reject direct update for approval-routed cancellation"
|
|
414
|
+
task: update_media_buy
|
|
415
|
+
schema_ref: "media-buy/update-media-buy-request.json"
|
|
416
|
+
response_schema_ref: "media-buy/update-media-buy-response.json"
|
|
417
|
+
doc_ref: "/media-buy/task-reference/update_media_buy"
|
|
418
|
+
comply_scenario: media_buy_action_discovery
|
|
419
|
+
expect_error: true
|
|
420
|
+
negative_path: mode_mismatch
|
|
421
|
+
stateful: true
|
|
422
|
+
expected: |
|
|
423
|
+
Reject with ACTION_NOT_ALLOWED because cancel is advertised, but its
|
|
424
|
+
resolved mode is requires_approval rather than self_serve.
|
|
425
|
+
sample_request:
|
|
426
|
+
account:
|
|
427
|
+
brand:
|
|
428
|
+
domain: "acmeoutdoor.example"
|
|
429
|
+
operator: "pinnacle-agency.example"
|
|
430
|
+
brand:
|
|
431
|
+
domain: "acmeoutdoor.example"
|
|
432
|
+
media_buy_id: "$context.available_actions_media_buy_id"
|
|
433
|
+
canceled: true
|
|
434
|
+
cancellation_reason: "Buyer wants a direct cancellation despite approval routing"
|
|
435
|
+
idempotency_key: "$generate:uuid_v4#available_actions_cancel_direct"
|
|
436
|
+
context:
|
|
437
|
+
correlation_id: "available_actions--cancel_direct"
|
|
438
|
+
validations:
|
|
439
|
+
- check: error_code
|
|
440
|
+
code: ACTION_NOT_ALLOWED
|
|
441
|
+
description: "Seller rejects direct mutation for approval-routed action"
|
|
442
|
+
- check: field_value
|
|
443
|
+
path: "errors[0].details.attempted_action"
|
|
444
|
+
value: "cancel"
|
|
445
|
+
description: "Error identifies the attempted fine-grained action"
|
|
446
|
+
- check: field_value
|
|
447
|
+
path: "errors[0].details.reason"
|
|
448
|
+
value: "mode_mismatch"
|
|
449
|
+
description: "Error distinguishes approval routing from unsupported action"
|
|
450
|
+
- check: field_value
|
|
451
|
+
path: "errors[0].recovery"
|
|
452
|
+
value: "correctable"
|
|
453
|
+
description: "Approval mode mismatch is a correctable flow-switch recovery"
|
|
454
|
+
- check: field_value
|
|
455
|
+
path: "errors[0].details.currently_available_actions[2].mode"
|
|
456
|
+
value: "requires_approval"
|
|
457
|
+
description: "Recovery details echo the current approval-routed action surface"
|
|
458
|
+
- check: field_value
|
|
459
|
+
path: "context.correlation_id"
|
|
460
|
+
value: "available_actions--cancel_direct"
|
|
461
|
+
description: "Context correlation_id returned unchanged"
|
|
462
|
+
|
|
463
|
+
- id: direct_decrease_wrong_status
|
|
464
|
+
title: "Reject an action whose product status scope does not match"
|
|
465
|
+
task: update_media_buy
|
|
466
|
+
schema_ref: "media-buy/update-media-buy-request.json"
|
|
467
|
+
response_schema_ref: "media-buy/update-media-buy-response.json"
|
|
468
|
+
doc_ref: "/media-buy/task-reference/update_media_buy"
|
|
469
|
+
comply_scenario: media_buy_action_discovery
|
|
470
|
+
expect_error: true
|
|
471
|
+
negative_path: wrong_status
|
|
472
|
+
stateful: true
|
|
473
|
+
expected: |
|
|
474
|
+
Reject with ACTION_NOT_ALLOWED because decrease_budget is supported
|
|
475
|
+
by the product, but only for active buys. The created buy is still
|
|
476
|
+
pending_creatives, so the action is not currently available.
|
|
477
|
+
sample_request:
|
|
478
|
+
account:
|
|
479
|
+
brand:
|
|
480
|
+
domain: "acmeoutdoor.example"
|
|
481
|
+
operator: "pinnacle-agency.example"
|
|
482
|
+
brand:
|
|
483
|
+
domain: "acmeoutdoor.example"
|
|
484
|
+
media_buy_id: "$context.available_actions_media_buy_id"
|
|
485
|
+
packages:
|
|
486
|
+
- package_id: "$context.available_actions_package_id"
|
|
487
|
+
budget: 11000
|
|
488
|
+
idempotency_key: "$generate:uuid_v4#available_actions_decrease_wrong_status"
|
|
489
|
+
context:
|
|
490
|
+
correlation_id: "available_actions--decrease_wrong_status"
|
|
491
|
+
validations:
|
|
492
|
+
- check: error_code
|
|
493
|
+
code: ACTION_NOT_ALLOWED
|
|
494
|
+
description: "Seller rejects a product-supported action in the wrong buy status"
|
|
495
|
+
- check: field_value
|
|
496
|
+
path: "errors[0].details.attempted_action"
|
|
497
|
+
value: "decrease_budget"
|
|
498
|
+
description: "Error identifies the attempted fine-grained action"
|
|
499
|
+
- check: field_value
|
|
500
|
+
path: "errors[0].details.reason"
|
|
501
|
+
value: "wrong_status"
|
|
502
|
+
description: "Error distinguishes status scoping from unsupported action"
|
|
503
|
+
- check: field_value
|
|
504
|
+
path: "errors[0].recovery"
|
|
505
|
+
value: "correctable"
|
|
506
|
+
description: "Wrong-status action rejection is correctable by waiting for or transitioning status"
|
|
507
|
+
- check: field_value
|
|
508
|
+
path: "errors[0].details.currently_available_actions[0].action"
|
|
509
|
+
value: "increase_budget"
|
|
510
|
+
description: "Recovery details echo the currently available buy actions"
|
|
511
|
+
- check: field_value
|
|
512
|
+
path: "context.correlation_id"
|
|
513
|
+
value: "available_actions--decrease_wrong_status"
|
|
514
|
+
description: "Context correlation_id returned unchanged"
|
|
515
|
+
|
|
516
|
+
- id: direct_pause_not_supported_on_product
|
|
517
|
+
title: "Reject an action the product never advertised"
|
|
518
|
+
task: update_media_buy
|
|
519
|
+
schema_ref: "media-buy/update-media-buy-request.json"
|
|
520
|
+
response_schema_ref: "media-buy/update-media-buy-response.json"
|
|
521
|
+
doc_ref: "/media-buy/task-reference/update_media_buy"
|
|
522
|
+
comply_scenario: media_buy_action_discovery
|
|
523
|
+
expect_error: true
|
|
524
|
+
negative_path: unsupported_action
|
|
525
|
+
stateful: true
|
|
526
|
+
expected: |
|
|
527
|
+
Reject with ACTION_NOT_ALLOWED because pause is not present in the
|
|
528
|
+
product's allowed_actions[] template and therefore is not available
|
|
529
|
+
on the buy.
|
|
530
|
+
sample_request:
|
|
531
|
+
account:
|
|
532
|
+
brand:
|
|
533
|
+
domain: "acmeoutdoor.example"
|
|
534
|
+
operator: "pinnacle-agency.example"
|
|
535
|
+
brand:
|
|
536
|
+
domain: "acmeoutdoor.example"
|
|
537
|
+
media_buy_id: "$context.available_actions_media_buy_id"
|
|
538
|
+
paused: true
|
|
539
|
+
idempotency_key: "$generate:uuid_v4#available_actions_pause_direct"
|
|
540
|
+
context:
|
|
541
|
+
correlation_id: "available_actions--pause_direct"
|
|
542
|
+
validations:
|
|
543
|
+
- check: error_code
|
|
544
|
+
code: ACTION_NOT_ALLOWED
|
|
545
|
+
description: "Seller rejects direct mutation for an action not supported by the product"
|
|
546
|
+
- check: field_value
|
|
547
|
+
path: "errors[0].details.attempted_action"
|
|
548
|
+
value: "pause"
|
|
549
|
+
description: "Error identifies the attempted fine-grained action"
|
|
550
|
+
- check: field_value
|
|
551
|
+
path: "errors[0].details.reason"
|
|
552
|
+
value: "not_supported_on_product"
|
|
553
|
+
description: "Error distinguishes product capability from transient buy state"
|
|
554
|
+
- check: field_value
|
|
555
|
+
path: "errors[0].recovery"
|
|
556
|
+
value: "terminal"
|
|
557
|
+
description: "Unsupported product action is terminal for this buy"
|
|
558
|
+
- check: field_value
|
|
559
|
+
path: "errors[0].details.currently_available_actions[0].action"
|
|
560
|
+
value: "increase_budget"
|
|
561
|
+
description: "Recovery details echo the currently available buy actions"
|
|
562
|
+
- check: field_value
|
|
563
|
+
path: "context.correlation_id"
|
|
564
|
+
value: "available_actions--pause_direct"
|
|
565
|
+
description: "Context correlation_id returned unchanged"
|