@adcp/sdk 7.11.0 → 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/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/testing/storyboard/default-invariants.js +23 -0
- 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/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
id: media_buy_seller/proposal_finalize
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller handles proposal refinement and finalize"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies the full proposal lifecycle: brief with proposals, refine a proposal, finalize to committed, and accept via create_media_buy."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
|
|
11
|
+
requires_capability:
|
|
12
|
+
path: media_buy.supports_proposals
|
|
13
|
+
equals: true
|
|
14
|
+
|
|
15
|
+
narrative: |
|
|
16
|
+
Proposals are curated media plans that the seller generates alongside products. The buyer
|
|
17
|
+
reviews proposals, refines them (adjust budget splits, swap products, add constraints),
|
|
18
|
+
and then finalizes a proposal to get firm pricing and an inventory hold. Once committed,
|
|
19
|
+
the buyer accepts the proposal via create_media_buy.
|
|
20
|
+
|
|
21
|
+
The proposal lifecycle is: draft (indicative pricing) -> refine -> finalize (firm pricing,
|
|
22
|
+
inventory hold) -> create_media_buy (accept and go live).
|
|
23
|
+
|
|
24
|
+
This scenario exercises the complete proposal flow including the finalize action, which
|
|
25
|
+
transitions a proposal from draft to committed status with an expires_at hold window.
|
|
26
|
+
|
|
27
|
+
agent:
|
|
28
|
+
interaction_model: media_buy_seller
|
|
29
|
+
capabilities:
|
|
30
|
+
- sells_media
|
|
31
|
+
- accepts_briefs
|
|
32
|
+
- generates_proposals
|
|
33
|
+
examples:
|
|
34
|
+
- "Full-service publisher with proposal engine"
|
|
35
|
+
- "Retail media network with curated packages"
|
|
36
|
+
|
|
37
|
+
caller:
|
|
38
|
+
role: buyer_agent
|
|
39
|
+
example: "Pinnacle Agency (buyer)"
|
|
40
|
+
|
|
41
|
+
prerequisites:
|
|
42
|
+
description: |
|
|
43
|
+
The caller needs a brand identity and operator credentials. The seller must support
|
|
44
|
+
proposal generation (return proposals alongside products in get_products responses).
|
|
45
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
46
|
+
|
|
47
|
+
phases:
|
|
48
|
+
- id: setup
|
|
49
|
+
title: "Account setup"
|
|
50
|
+
steps:
|
|
51
|
+
- id: sync_accounts
|
|
52
|
+
title: "Establish account"
|
|
53
|
+
task: sync_accounts
|
|
54
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
55
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
56
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
57
|
+
stateful: true
|
|
58
|
+
expected: |
|
|
59
|
+
Return the account with account_id and status active.
|
|
60
|
+
|
|
61
|
+
sample_request:
|
|
62
|
+
accounts:
|
|
63
|
+
- brand:
|
|
64
|
+
domain: "acmeoutdoor.example"
|
|
65
|
+
operator: "pinnacle-agency.example"
|
|
66
|
+
billing: "operator"
|
|
67
|
+
payment_terms: "net_30"
|
|
68
|
+
|
|
69
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_setup_sync_accounts"
|
|
70
|
+
validations:
|
|
71
|
+
- check: response_schema
|
|
72
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
73
|
+
- check: field_present
|
|
74
|
+
path: "accounts[0].account_id"
|
|
75
|
+
description: "Account has a platform-assigned ID"
|
|
76
|
+
|
|
77
|
+
- id: brief_with_proposals
|
|
78
|
+
title: "Brief with proposals"
|
|
79
|
+
narrative: |
|
|
80
|
+
Send a brief and receive proposals alongside products. Proposals are curated
|
|
81
|
+
media plans with budget allocations the buyer can review and refine.
|
|
82
|
+
|
|
83
|
+
steps:
|
|
84
|
+
- id: get_products_brief
|
|
85
|
+
title: "Send a brief and receive proposals"
|
|
86
|
+
task: get_products
|
|
87
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
88
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
89
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
90
|
+
comply_scenario: full_sales_flow
|
|
91
|
+
stateful: false
|
|
92
|
+
expected: |
|
|
93
|
+
Return products and proposals matching the brief:
|
|
94
|
+
- products: individual products with pricing and forecasts
|
|
95
|
+
- proposals: curated media plans with proposal_id, budget_allocations, rationale
|
|
96
|
+
|
|
97
|
+
sample_request:
|
|
98
|
+
buying_mode: "brief"
|
|
99
|
+
brief: "Premium video and display across outdoor lifestyle and sports. Q2 flight, $50K budget. Adults 25-54, US and Canada."
|
|
100
|
+
account:
|
|
101
|
+
brand:
|
|
102
|
+
domain: "acmeoutdoor.example"
|
|
103
|
+
operator: "pinnacle-agency.example"
|
|
104
|
+
|
|
105
|
+
context_outputs:
|
|
106
|
+
- path: "proposals[0].proposal_id"
|
|
107
|
+
key: "proposal_id"
|
|
108
|
+
|
|
109
|
+
validations:
|
|
110
|
+
- check: response_schema
|
|
111
|
+
description: "Response matches get-products-response.json schema"
|
|
112
|
+
- check: field_present
|
|
113
|
+
path: "products"
|
|
114
|
+
description: "Response contains products"
|
|
115
|
+
- check: field_present
|
|
116
|
+
path: "proposals"
|
|
117
|
+
description: "Response contains proposals"
|
|
118
|
+
- check: field_present
|
|
119
|
+
path: "proposals[0].proposal_id"
|
|
120
|
+
description: "Proposals have IDs"
|
|
121
|
+
|
|
122
|
+
- id: refine_proposal
|
|
123
|
+
title: "Refine the proposal"
|
|
124
|
+
narrative: |
|
|
125
|
+
The buyer reviews the proposals and wants to adjust one. They call get_products in
|
|
126
|
+
refine mode targeting a specific proposal_id with changes. The seller applies the
|
|
127
|
+
refinements and returns the updated proposal.
|
|
128
|
+
|
|
129
|
+
steps:
|
|
130
|
+
- id: get_products_refine
|
|
131
|
+
title: "Refine a specific proposal"
|
|
132
|
+
task: get_products
|
|
133
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
134
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
135
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
136
|
+
comply_scenario: full_sales_flow
|
|
137
|
+
stateful: true
|
|
138
|
+
expected: |
|
|
139
|
+
Return the refined proposal:
|
|
140
|
+
- proposals: updated proposal reflecting the requested changes
|
|
141
|
+
- refinement_applied: how each refinement was handled
|
|
142
|
+
- Updated budget allocations, product selections, and forecasts
|
|
143
|
+
|
|
144
|
+
sample_request:
|
|
145
|
+
buying_mode: "refine"
|
|
146
|
+
refine:
|
|
147
|
+
- scope: "proposal"
|
|
148
|
+
proposal_id: "$context.proposal_id"
|
|
149
|
+
ask: "Shift 60% of budget to CTV. Drop the display product and redistribute that budget to video."
|
|
150
|
+
- scope: "request"
|
|
151
|
+
ask: "All products must support frequency capping at 3 per day."
|
|
152
|
+
account:
|
|
153
|
+
brand:
|
|
154
|
+
domain: "acmeoutdoor.example"
|
|
155
|
+
operator: "pinnacle-agency.example"
|
|
156
|
+
|
|
157
|
+
validations:
|
|
158
|
+
- check: response_schema
|
|
159
|
+
description: "Response matches get-products-response.json schema"
|
|
160
|
+
- check: field_present
|
|
161
|
+
path: "proposals"
|
|
162
|
+
description: "Response contains updated proposals"
|
|
163
|
+
|
|
164
|
+
- id: unknown_proposal_finalize
|
|
165
|
+
title: "Reject unknown proposals during finalization"
|
|
166
|
+
narrative: |
|
|
167
|
+
The buyer asks to finalize a proposal reference that was never issued by
|
|
168
|
+
the seller. The request is schema-valid; the rejection is semantic and
|
|
169
|
+
must use the canonical proposal-not-found code.
|
|
170
|
+
|
|
171
|
+
steps:
|
|
172
|
+
- id: get_products_finalize_unknown_proposal
|
|
173
|
+
title: "Reject finalize against an unknown proposal"
|
|
174
|
+
task: get_products
|
|
175
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
176
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
177
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
178
|
+
expect_error: true
|
|
179
|
+
negative_path: payload_well_formed
|
|
180
|
+
stateful: true
|
|
181
|
+
expected: |
|
|
182
|
+
Reject with:
|
|
183
|
+
- code: PROPOSAL_NOT_FOUND
|
|
184
|
+
- recovery: correctable
|
|
185
|
+
- field: refine[0].proposal_id
|
|
186
|
+
|
|
187
|
+
sample_request:
|
|
188
|
+
buying_mode: "refine"
|
|
189
|
+
refine:
|
|
190
|
+
- scope: "proposal"
|
|
191
|
+
proposal_id: "prop_unknown_proposal_not_found"
|
|
192
|
+
action: "finalize"
|
|
193
|
+
account:
|
|
194
|
+
brand:
|
|
195
|
+
domain: "acmeoutdoor.example"
|
|
196
|
+
operator: "pinnacle-agency.example"
|
|
197
|
+
|
|
198
|
+
validations:
|
|
199
|
+
- check: error_code
|
|
200
|
+
value: "PROPOSAL_NOT_FOUND"
|
|
201
|
+
description: "Unknown proposal finalize returns the canonical proposal-not-found code"
|
|
202
|
+
- check: field_value
|
|
203
|
+
path: "adcp_error.recovery"
|
|
204
|
+
value: "correctable"
|
|
205
|
+
description: "Recovery is correctable"
|
|
206
|
+
- check: field_value
|
|
207
|
+
path: "adcp_error.field"
|
|
208
|
+
value: "refine[0].proposal_id"
|
|
209
|
+
description: "Error field identifies the missing proposal reference"
|
|
210
|
+
|
|
211
|
+
- id: finalize_proposal
|
|
212
|
+
title: "Finalize the proposal"
|
|
213
|
+
narrative: |
|
|
214
|
+
The buyer is satisfied with the refined proposal and requests finalization. This
|
|
215
|
+
triggers the transition from draft (indicative pricing) to committed (firm pricing
|
|
216
|
+
with inventory hold). The seller may need time to process this — the buyer should
|
|
217
|
+
not set a time_budget to signal willingness to wait.
|
|
218
|
+
|
|
219
|
+
After finalization, the proposal has firm pricing and an expires_at timestamp.
|
|
220
|
+
The buyer must create the media buy before the hold expires.
|
|
221
|
+
|
|
222
|
+
steps:
|
|
223
|
+
- id: get_products_finalize
|
|
224
|
+
title: "Finalize the proposal"
|
|
225
|
+
task: get_products
|
|
226
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
227
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
228
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
229
|
+
comply_scenario: full_sales_flow
|
|
230
|
+
stateful: true
|
|
231
|
+
expected: |
|
|
232
|
+
Return the finalized proposal with committed status:
|
|
233
|
+
- proposals[0].proposal_status: committed
|
|
234
|
+
- proposals[0].expires_at: timestamp for the inventory hold window
|
|
235
|
+
- Firm pricing (not indicative)
|
|
236
|
+
- The proposal is ready to accept via create_media_buy
|
|
237
|
+
|
|
238
|
+
sample_request:
|
|
239
|
+
buying_mode: "refine"
|
|
240
|
+
refine:
|
|
241
|
+
- scope: "proposal"
|
|
242
|
+
proposal_id: "$context.proposal_id"
|
|
243
|
+
action: "finalize"
|
|
244
|
+
account:
|
|
245
|
+
brand:
|
|
246
|
+
domain: "acmeoutdoor.example"
|
|
247
|
+
operator: "pinnacle-agency.example"
|
|
248
|
+
|
|
249
|
+
context_outputs:
|
|
250
|
+
- path: "proposals[0].insertion_order.io_id"
|
|
251
|
+
key: "io_id"
|
|
252
|
+
|
|
253
|
+
validations:
|
|
254
|
+
- check: response_schema
|
|
255
|
+
description: "Response matches get-products-response.json schema"
|
|
256
|
+
- check: field_present
|
|
257
|
+
path: "proposals"
|
|
258
|
+
description: "Response contains the finalized proposal"
|
|
259
|
+
|
|
260
|
+
- id: accept_proposal
|
|
261
|
+
title: "Accept the committed proposal"
|
|
262
|
+
narrative: |
|
|
263
|
+
The buyer accepts the committed proposal by creating a media buy with the
|
|
264
|
+
proposal_id. The seller converts the proposal's product selections and budget
|
|
265
|
+
allocations into active packages.
|
|
266
|
+
|
|
267
|
+
steps:
|
|
268
|
+
- id: create_media_buy
|
|
269
|
+
title: "Create media buy from proposal"
|
|
270
|
+
task: create_media_buy
|
|
271
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
272
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
273
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
274
|
+
comply_scenario: create_media_buy
|
|
275
|
+
stateful: true
|
|
276
|
+
expected: |
|
|
277
|
+
Convert the committed proposal into an active media buy:
|
|
278
|
+
- media_buy_id: the seller's identifier
|
|
279
|
+
- status: active
|
|
280
|
+
- confirmed_at: timestamp
|
|
281
|
+
- packages: line items derived from the proposal's budget allocations
|
|
282
|
+
- proposal_id: echoed back to confirm which proposal was accepted
|
|
283
|
+
|
|
284
|
+
sample_request:
|
|
285
|
+
brand:
|
|
286
|
+
domain: "acmeoutdoor.example"
|
|
287
|
+
account:
|
|
288
|
+
brand:
|
|
289
|
+
domain: "acmeoutdoor.example"
|
|
290
|
+
operator: "pinnacle-agency.example"
|
|
291
|
+
sandbox: true
|
|
292
|
+
proposal_id: "$context.proposal_id"
|
|
293
|
+
total_budget:
|
|
294
|
+
amount: 50000
|
|
295
|
+
currency: "USD"
|
|
296
|
+
start_time: "2026-04-01T00:00:00Z"
|
|
297
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
298
|
+
io_acceptance:
|
|
299
|
+
io_id: "$context.io_id"
|
|
300
|
+
accepted_at: "2026-03-15T14:30:00Z"
|
|
301
|
+
signatory: "ops@acmeoutdoor.example"
|
|
302
|
+
|
|
303
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_accept_proposal_create_media_buy"
|
|
304
|
+
validations:
|
|
305
|
+
- check: response_schema
|
|
306
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
307
|
+
|
|
308
|
+
- id: unknown_proposal_references
|
|
309
|
+
title: "Reject unknown proposal references"
|
|
310
|
+
narrative: |
|
|
311
|
+
The buyer references proposal IDs that were never issued by the seller.
|
|
312
|
+
These requests are schema-valid; the rejection is semantic. The seller
|
|
313
|
+
must return the canonical PROPOSAL_NOT_FOUND code rather than generic
|
|
314
|
+
NOT_FOUND, INVALID_REQUEST, or platform-specific proposal errors.
|
|
315
|
+
|
|
316
|
+
steps:
|
|
317
|
+
- id: get_products_refine_unknown_proposal
|
|
318
|
+
title: "Reject refine against an unknown proposal"
|
|
319
|
+
task: get_products
|
|
320
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
321
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
322
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
323
|
+
expect_error: true
|
|
324
|
+
negative_path: payload_well_formed
|
|
325
|
+
stateful: true
|
|
326
|
+
expected: |
|
|
327
|
+
Reject with:
|
|
328
|
+
- code: PROPOSAL_NOT_FOUND
|
|
329
|
+
- recovery: correctable
|
|
330
|
+
- field: refine[0].proposal_id
|
|
331
|
+
|
|
332
|
+
sample_request:
|
|
333
|
+
buying_mode: "refine"
|
|
334
|
+
refine:
|
|
335
|
+
- scope: "proposal"
|
|
336
|
+
proposal_id: "prop_unknown_proposal_not_found"
|
|
337
|
+
ask: "Shift budget toward premium video."
|
|
338
|
+
account:
|
|
339
|
+
brand:
|
|
340
|
+
domain: "acmeoutdoor.example"
|
|
341
|
+
operator: "pinnacle-agency.example"
|
|
342
|
+
|
|
343
|
+
validations:
|
|
344
|
+
- check: error_code
|
|
345
|
+
value: "PROPOSAL_NOT_FOUND"
|
|
346
|
+
description: "Unknown proposal refine returns the canonical proposal-not-found code"
|
|
347
|
+
- check: field_value
|
|
348
|
+
path: "adcp_error.recovery"
|
|
349
|
+
value: "correctable"
|
|
350
|
+
description: "Recovery is correctable"
|
|
351
|
+
- check: field_value
|
|
352
|
+
path: "adcp_error.field"
|
|
353
|
+
value: "refine[0].proposal_id"
|
|
354
|
+
description: "Error field identifies the missing proposal reference"
|
|
355
|
+
|
|
356
|
+
- id: create_media_buy_unknown_proposal
|
|
357
|
+
title: "Reject create_media_buy from an unknown proposal"
|
|
358
|
+
task: create_media_buy
|
|
359
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
360
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
361
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
362
|
+
comply_scenario: create_media_buy
|
|
363
|
+
expect_error: true
|
|
364
|
+
negative_path: payload_well_formed
|
|
365
|
+
stateful: true
|
|
366
|
+
expected: |
|
|
367
|
+
Reject with:
|
|
368
|
+
- code: PROPOSAL_NOT_FOUND
|
|
369
|
+
- recovery: correctable
|
|
370
|
+
- field: proposal_id
|
|
371
|
+
|
|
372
|
+
sample_request:
|
|
373
|
+
brand:
|
|
374
|
+
domain: "acmeoutdoor.example"
|
|
375
|
+
account:
|
|
376
|
+
brand:
|
|
377
|
+
domain: "acmeoutdoor.example"
|
|
378
|
+
operator: "pinnacle-agency.example"
|
|
379
|
+
sandbox: true
|
|
380
|
+
proposal_id: "prop_unknown_proposal_not_found"
|
|
381
|
+
total_budget:
|
|
382
|
+
amount: 50000
|
|
383
|
+
currency: "USD"
|
|
384
|
+
start_time: "2026-04-01T00:00:00Z"
|
|
385
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
386
|
+
|
|
387
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_unknown_proposal_create_media_buy"
|
|
388
|
+
validations:
|
|
389
|
+
- check: error_code
|
|
390
|
+
value: "PROPOSAL_NOT_FOUND"
|
|
391
|
+
description: "Unknown proposal create returns the canonical proposal-not-found code"
|
|
392
|
+
- check: field_value
|
|
393
|
+
path: "adcp_error.recovery"
|
|
394
|
+
value: "correctable"
|
|
395
|
+
description: "Recovery is correctable"
|
|
396
|
+
- check: field_value
|
|
397
|
+
path: "adcp_error.field"
|
|
398
|
+
value: "proposal_id"
|
|
399
|
+
description: "Error field identifies the missing proposal reference"
|
package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
id: media_buy_seller/proposal_finalize_asap_timing
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller handles proposal finalize — asap start_time form"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Variant of proposal_finalize that exercises start_time: 'asap' on create_media_buy, catching wrapper-layer rejections of the spec-defined string literal form."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
|
|
11
|
+
requires_capability:
|
|
12
|
+
path: media_buy.supports_proposals
|
|
13
|
+
equals: true
|
|
14
|
+
|
|
15
|
+
narrative: |
|
|
16
|
+
Mirrors the proposal_finalize scenario but passes start_time: "asap" (the spec-defined
|
|
17
|
+
string literal from start-timing.json) when accepting the committed proposal. This arm
|
|
18
|
+
catches implementations that accept ISO 8601 dates but reject the "asap" string form
|
|
19
|
+
at the wrapper/validation layer before the handler's date-carry-forward logic runs.
|
|
20
|
+
|
|
21
|
+
The AdCP spec defines start_time as a oneOf over two string variants: the literal "asap"
|
|
22
|
+
and an ISO 8601 date-time string. Both must be accepted by conformant sellers.
|
|
23
|
+
|
|
24
|
+
Background: an adopter identified that their Pydantic wrapper was rejecting
|
|
25
|
+
"asap" at the input-validation layer. The current proposal_finalize scenario only tests
|
|
26
|
+
the ISO date form; this variant provides coverage for the "asap" form.
|
|
27
|
+
|
|
28
|
+
agent:
|
|
29
|
+
interaction_model: media_buy_seller
|
|
30
|
+
capabilities:
|
|
31
|
+
- sells_media
|
|
32
|
+
- accepts_briefs
|
|
33
|
+
- generates_proposals
|
|
34
|
+
examples:
|
|
35
|
+
- "Full-service publisher with proposal engine"
|
|
36
|
+
- "Retail media network with curated packages"
|
|
37
|
+
|
|
38
|
+
caller:
|
|
39
|
+
role: buyer_agent
|
|
40
|
+
example: "Pinnacle Agency (buyer)"
|
|
41
|
+
|
|
42
|
+
prerequisites:
|
|
43
|
+
description: |
|
|
44
|
+
The caller needs a brand identity and operator credentials. The seller must support
|
|
45
|
+
proposal generation (return proposals alongside products in get_products responses).
|
|
46
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
47
|
+
|
|
48
|
+
phases:
|
|
49
|
+
- id: setup
|
|
50
|
+
title: "Account setup"
|
|
51
|
+
steps:
|
|
52
|
+
- id: sync_accounts
|
|
53
|
+
title: "Establish account"
|
|
54
|
+
task: sync_accounts
|
|
55
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
56
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
57
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
58
|
+
stateful: true
|
|
59
|
+
expected: |
|
|
60
|
+
Return the account with account_id and status active.
|
|
61
|
+
|
|
62
|
+
sample_request:
|
|
63
|
+
accounts:
|
|
64
|
+
- brand:
|
|
65
|
+
domain: "acmeoutdoor.example"
|
|
66
|
+
operator: "pinnacle-agency.example"
|
|
67
|
+
billing: "operator"
|
|
68
|
+
payment_terms: "net_30"
|
|
69
|
+
|
|
70
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_asap_timing_setup_sync_accounts"
|
|
71
|
+
validations:
|
|
72
|
+
- check: response_schema
|
|
73
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
74
|
+
- check: field_present
|
|
75
|
+
path: "accounts[0].account_id"
|
|
76
|
+
description: "Account has a platform-assigned ID"
|
|
77
|
+
|
|
78
|
+
- id: brief_with_proposals
|
|
79
|
+
title: "Brief with proposals"
|
|
80
|
+
narrative: |
|
|
81
|
+
Send a brief and receive proposals alongside products.
|
|
82
|
+
|
|
83
|
+
steps:
|
|
84
|
+
- id: get_products_brief
|
|
85
|
+
title: "Send a brief and receive proposals"
|
|
86
|
+
task: get_products
|
|
87
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
88
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
89
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
90
|
+
comply_scenario: full_sales_flow
|
|
91
|
+
stateful: false
|
|
92
|
+
expected: |
|
|
93
|
+
Return products and proposals matching the brief:
|
|
94
|
+
- products: individual products with pricing and forecasts
|
|
95
|
+
- proposals: curated media plans with proposal_id, budget_allocations, rationale
|
|
96
|
+
|
|
97
|
+
sample_request:
|
|
98
|
+
buying_mode: "brief"
|
|
99
|
+
brief: "Premium video and display across outdoor lifestyle and sports. Q2 flight, $50K budget. Adults 25-54, US and Canada."
|
|
100
|
+
account:
|
|
101
|
+
brand:
|
|
102
|
+
domain: "acmeoutdoor.example"
|
|
103
|
+
operator: "pinnacle-agency.example"
|
|
104
|
+
|
|
105
|
+
context_outputs:
|
|
106
|
+
- path: "proposals[0].proposal_id"
|
|
107
|
+
key: "proposal_id"
|
|
108
|
+
|
|
109
|
+
validations:
|
|
110
|
+
- check: response_schema
|
|
111
|
+
description: "Response matches get-products-response.json schema"
|
|
112
|
+
- check: field_present
|
|
113
|
+
path: "products"
|
|
114
|
+
description: "Response contains products"
|
|
115
|
+
- check: field_present
|
|
116
|
+
path: "proposals"
|
|
117
|
+
description: "Response contains proposals"
|
|
118
|
+
- check: field_present
|
|
119
|
+
path: "proposals[0].proposal_id"
|
|
120
|
+
description: "Proposals have IDs"
|
|
121
|
+
|
|
122
|
+
- id: refine_proposal
|
|
123
|
+
title: "Refine the proposal"
|
|
124
|
+
narrative: |
|
|
125
|
+
The buyer reviews and refines the proposal before finalization.
|
|
126
|
+
|
|
127
|
+
steps:
|
|
128
|
+
- id: get_products_refine
|
|
129
|
+
title: "Refine a specific proposal"
|
|
130
|
+
task: get_products
|
|
131
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
132
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
133
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
134
|
+
comply_scenario: full_sales_flow
|
|
135
|
+
stateful: true
|
|
136
|
+
expected: |
|
|
137
|
+
Return the refined proposal reflecting the requested changes.
|
|
138
|
+
|
|
139
|
+
sample_request:
|
|
140
|
+
buying_mode: "refine"
|
|
141
|
+
refine:
|
|
142
|
+
- scope: "proposal"
|
|
143
|
+
proposal_id: "$context.proposal_id"
|
|
144
|
+
ask: "Shift 60% of budget to CTV. Drop the display product and redistribute that budget to video."
|
|
145
|
+
- scope: "request"
|
|
146
|
+
ask: "All products must support frequency capping at 3 per day."
|
|
147
|
+
account:
|
|
148
|
+
brand:
|
|
149
|
+
domain: "acmeoutdoor.example"
|
|
150
|
+
operator: "pinnacle-agency.example"
|
|
151
|
+
|
|
152
|
+
validations:
|
|
153
|
+
- check: response_schema
|
|
154
|
+
description: "Response matches get-products-response.json schema"
|
|
155
|
+
- check: field_present
|
|
156
|
+
path: "proposals"
|
|
157
|
+
description: "Response contains updated proposals"
|
|
158
|
+
|
|
159
|
+
- id: finalize_proposal
|
|
160
|
+
title: "Finalize the proposal"
|
|
161
|
+
narrative: |
|
|
162
|
+
The buyer requests finalization to transition the proposal from draft to committed
|
|
163
|
+
with firm pricing and an inventory hold.
|
|
164
|
+
|
|
165
|
+
steps:
|
|
166
|
+
- id: get_products_finalize
|
|
167
|
+
title: "Finalize the proposal"
|
|
168
|
+
task: get_products
|
|
169
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
170
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
171
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
172
|
+
comply_scenario: full_sales_flow
|
|
173
|
+
stateful: true
|
|
174
|
+
expected: |
|
|
175
|
+
Return the finalized proposal with committed status:
|
|
176
|
+
- proposals[0].proposal_status: committed
|
|
177
|
+
- proposals[0].expires_at: timestamp for the inventory hold window
|
|
178
|
+
- Firm pricing (not indicative)
|
|
179
|
+
- The proposal is ready to accept via create_media_buy
|
|
180
|
+
|
|
181
|
+
sample_request:
|
|
182
|
+
buying_mode: "refine"
|
|
183
|
+
refine:
|
|
184
|
+
- scope: "proposal"
|
|
185
|
+
proposal_id: "$context.proposal_id"
|
|
186
|
+
action: "finalize"
|
|
187
|
+
account:
|
|
188
|
+
brand:
|
|
189
|
+
domain: "acmeoutdoor.example"
|
|
190
|
+
operator: "pinnacle-agency.example"
|
|
191
|
+
|
|
192
|
+
context_outputs:
|
|
193
|
+
- path: "proposals[0].insertion_order.io_id"
|
|
194
|
+
key: "io_id"
|
|
195
|
+
|
|
196
|
+
validations:
|
|
197
|
+
- check: response_schema
|
|
198
|
+
description: "Response matches get-products-response.json schema"
|
|
199
|
+
- check: field_present
|
|
200
|
+
path: "proposals"
|
|
201
|
+
description: "Response contains the finalized proposal"
|
|
202
|
+
|
|
203
|
+
- id: accept_proposal
|
|
204
|
+
title: "Accept the committed proposal with start_time: asap"
|
|
205
|
+
narrative: |
|
|
206
|
+
The buyer accepts the committed proposal via create_media_buy, supplying
|
|
207
|
+
start_time as the string literal "asap" (the spec-defined form from
|
|
208
|
+
start-timing.json). This verifies the seller's input-validation layer
|
|
209
|
+
accepts this form without rejecting it before the handler runs.
|
|
210
|
+
|
|
211
|
+
io_acceptance is included so this scenario works against sellers that
|
|
212
|
+
finalize proposals with requires_signature: true (the common production
|
|
213
|
+
shape). The asap-vs-iso check is on start_time only — passing io_acceptance
|
|
214
|
+
keeps the IO gate satisfied so the start_time form is the discriminator.
|
|
215
|
+
|
|
216
|
+
Response field checks (media_buy_id, status, etc.) are intentionally limited
|
|
217
|
+
to response_schema here. Behavioral verification of the create_media_buy
|
|
218
|
+
response is the parent proposal_finalize scenario's job. This variant's sole
|
|
219
|
+
purpose is to confirm the seller's input layer does not reject start_time:
|
|
220
|
+
"asap" before the handler runs — a non-error response satisfies that.
|
|
221
|
+
|
|
222
|
+
steps:
|
|
223
|
+
- id: create_media_buy
|
|
224
|
+
title: "Create media buy from proposal — start_time: asap"
|
|
225
|
+
task: create_media_buy
|
|
226
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
227
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
228
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
229
|
+
comply_scenario: create_media_buy
|
|
230
|
+
stateful: true
|
|
231
|
+
expected: |
|
|
232
|
+
Convert the committed proposal into an active media buy:
|
|
233
|
+
- media_buy_id: the seller's identifier
|
|
234
|
+
- status: active
|
|
235
|
+
- confirmed_at: timestamp
|
|
236
|
+
- packages: line items derived from the proposal's budget allocations
|
|
237
|
+
- proposal_id: echoed back to confirm which proposal was accepted
|
|
238
|
+
|
|
239
|
+
The seller MUST accept start_time: "asap" (string literal) without
|
|
240
|
+
rejecting it at the wrapper/input-validation layer.
|
|
241
|
+
|
|
242
|
+
sample_request:
|
|
243
|
+
brand:
|
|
244
|
+
domain: "acmeoutdoor.example"
|
|
245
|
+
account:
|
|
246
|
+
brand:
|
|
247
|
+
domain: "acmeoutdoor.example"
|
|
248
|
+
operator: "pinnacle-agency.example"
|
|
249
|
+
sandbox: true
|
|
250
|
+
proposal_id: "$context.proposal_id"
|
|
251
|
+
total_budget:
|
|
252
|
+
amount: 50000
|
|
253
|
+
currency: "USD"
|
|
254
|
+
start_time: "asap"
|
|
255
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
256
|
+
io_acceptance:
|
|
257
|
+
io_id: "$context.io_id"
|
|
258
|
+
accepted_at: "2026-03-15T14:30:00Z"
|
|
259
|
+
signatory: "ops@acmeoutdoor.example"
|
|
260
|
+
|
|
261
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_asap_timing_accept_proposal_create_media_buy"
|
|
262
|
+
validations:
|
|
263
|
+
- check: response_schema
|
|
264
|
+
description: "Response matches create-media-buy-response.json schema"
|