@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
package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
id: media_buy_seller/frequency_cap_enforcement
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller honors a package-level frequency cap and reports observed frequency at-or-below the cap"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies that a seller advertising frequency_capping accepts a package-level frequency_cap (max_impressions + per + window form) on create_media_buy and, after simulated delivery, reports observed reach and frequency on get_media_buy_delivery with the observed frequency at-or-below the requested cap. Runtime-enforcement scenario — no rejection arm. Sellers without frequency_capping grade not_applicable."
|
|
6
|
+
track: media_buy
|
|
7
|
+
|
|
8
|
+
# Gate: scenario runs only when the seller declares frequency_capping (object
|
|
9
|
+
# presence indicates the seller honors targeting.frequency_cap and rejects
|
|
10
|
+
# caps it cannot enforce rather than silently dropping them). Sellers without
|
|
11
|
+
# the capability — many programmatic exchanges that pass frequency control
|
|
12
|
+
# upstream to the bidder, broadcast TV inventory where caps are managed at
|
|
13
|
+
# the schedule level — grade `not_applicable`, not failing. Requires runner
|
|
14
|
+
# support for the `present:` matcher (adcp-client >= 7.6.0).
|
|
15
|
+
requires_capability:
|
|
16
|
+
path: media_buy.frequency_capping
|
|
17
|
+
present: true
|
|
18
|
+
|
|
19
|
+
required_tools:
|
|
20
|
+
- get_products
|
|
21
|
+
- create_media_buy
|
|
22
|
+
- get_media_buy_delivery
|
|
23
|
+
- comply_test_controller
|
|
24
|
+
|
|
25
|
+
invariants:
|
|
26
|
+
- status.monotonic
|
|
27
|
+
|
|
28
|
+
narrative: |
|
|
29
|
+
Frequency capping is a runtime-enforcement contract, not a buy-time
|
|
30
|
+
validation. The buyer attaches a frequency_cap to a package's
|
|
31
|
+
targeting_overlay declaring "no more than N impressions per entity in
|
|
32
|
+
a given window"; the seller commits to enforcing that ceiling during
|
|
33
|
+
delivery and reporting observed reach + frequency in delivery totals
|
|
34
|
+
so the buyer can verify enforcement.
|
|
35
|
+
|
|
36
|
+
This scenario is the buy-mode contract test on the cap side. Unlike
|
|
37
|
+
audience_buy_flow and performance_buy_flow, there is no unbound-id
|
|
38
|
+
rejection phase — frequency_cap is a numeric constraint, not a pointer
|
|
39
|
+
to a registered resource, so there's nothing structurally analogous to
|
|
40
|
+
reject against. The discriminating assertion is the observed frequency
|
|
41
|
+
in delivery: a seller that silently drops the cap would deliver to its
|
|
42
|
+
natural frequency distribution (typically well above the cap when the
|
|
43
|
+
buy is impression-heavy relative to reach), and observed frequency
|
|
44
|
+
would exceed the requested max_impressions ceiling.
|
|
45
|
+
|
|
46
|
+
Discriminating behaviors this scenario verifies:
|
|
47
|
+
1. create_media_buy with a package whose targeting_overlay.frequency_cap
|
|
48
|
+
carries the cap form (max_impressions + per + window) is accepted —
|
|
49
|
+
the response carries a media_buy_id used for subsequent delivery
|
|
50
|
+
checks. Cap-form (not cooldown-form `suppress`) is asserted because
|
|
51
|
+
it's the form that declares a numeric ceiling on exposures, which
|
|
52
|
+
this scenario verifies enforcement of.
|
|
53
|
+
2. get_media_buy_delivery for the capped buy reports `totals.reach`
|
|
54
|
+
(computed; frequency needs a denominator) and `totals.frequency`
|
|
55
|
+
(observed average exposures per reach unit). frequency_capping:
|
|
56
|
+
present commits the seller to surfacing these metrics — without them
|
|
57
|
+
the buyer cannot verify cap enforcement.
|
|
58
|
+
3. The observed frequency is at-or-below the requested cap of 3
|
|
59
|
+
impressions per individual per day. Asserted as `field_less_than`
|
|
60
|
+
against a literal threshold of 3.01 — the storyboard-schema check
|
|
61
|
+
enum exposes strict less-than via `field_less_than` with a literal
|
|
62
|
+
`value:` (see static/compliance/source/universal/storyboard-schema.yaml).
|
|
63
|
+
A native `<=` / `max:` matcher does not exist today; the strict-less-
|
|
64
|
+
than form with a small epsilon above the cap is the strongest
|
|
65
|
+
literal-threshold assertion available. A runner extension adding a
|
|
66
|
+
`field_at_most` / `field_lte` check enum would let this assertion
|
|
67
|
+
drop the epsilon and target the literal cap value — captured as a
|
|
68
|
+
soft follow-up; the cap-enforcement signal is already discriminating
|
|
69
|
+
without it.
|
|
70
|
+
|
|
71
|
+
Per-package frequency breakdown (a row carrying its own cap and observed
|
|
72
|
+
values) is deliberately NOT asserted here — delivery-metrics.json carries
|
|
73
|
+
frequency at the totals level, and per-package frequency reporting isn't
|
|
74
|
+
a first-class shape today. A follow-up scenario gated on a sub-capability
|
|
75
|
+
bit could land per-package frequency attribution.
|
|
76
|
+
|
|
77
|
+
agent:
|
|
78
|
+
interaction_model: media_buy_seller
|
|
79
|
+
capabilities:
|
|
80
|
+
- sells_media
|
|
81
|
+
- supports_non_guaranteed
|
|
82
|
+
- frequency_capping
|
|
83
|
+
examples:
|
|
84
|
+
- "DSPs honoring buyer-supplied frequency caps on direct buys"
|
|
85
|
+
- "Walled-garden platforms with per-user impression ceilings"
|
|
86
|
+
- "CTV platforms with household-level frequency management"
|
|
87
|
+
- "Retail-media networks with logged-in-account cap enforcement"
|
|
88
|
+
|
|
89
|
+
caller:
|
|
90
|
+
role: buyer_agent
|
|
91
|
+
example: "Pinnacle Agency (buyer)"
|
|
92
|
+
|
|
93
|
+
prerequisites:
|
|
94
|
+
description: |
|
|
95
|
+
The seller must implement comply_test_controller with simulate_delivery.
|
|
96
|
+
simulate_delivery injects impressions and spend; the seller then
|
|
97
|
+
computes reach and frequency at delivery-report time from its internal
|
|
98
|
+
user-graph model so get_media_buy_delivery has totals.reach and
|
|
99
|
+
totals.frequency to return.
|
|
100
|
+
|
|
101
|
+
The buyer fixture supplies a brand, an operator, and a small display
|
|
102
|
+
buy sufficient to exercise frequency-cap acceptance and observed-
|
|
103
|
+
frequency reporting.
|
|
104
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
105
|
+
controller_seeding: true
|
|
106
|
+
|
|
107
|
+
fixtures:
|
|
108
|
+
products:
|
|
109
|
+
- product_id: "frequency_capped_display_q2"
|
|
110
|
+
delivery_type: "non_guaranteed"
|
|
111
|
+
channels: ["display"]
|
|
112
|
+
format_ids:
|
|
113
|
+
- id: "display_300x250"
|
|
114
|
+
pricing_options:
|
|
115
|
+
- product_id: "frequency_capped_display_q2"
|
|
116
|
+
pricing_option_id: "auction_cpm"
|
|
117
|
+
pricing_model: "cpm"
|
|
118
|
+
currency: "USD"
|
|
119
|
+
floor_price: 2.00
|
|
120
|
+
|
|
121
|
+
phases:
|
|
122
|
+
|
|
123
|
+
- id: setup
|
|
124
|
+
title: "Establish account and discover products"
|
|
125
|
+
steps:
|
|
126
|
+
- id: sync_accounts
|
|
127
|
+
title: "Establish account"
|
|
128
|
+
task: sync_accounts
|
|
129
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
130
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
131
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
132
|
+
stateful: true
|
|
133
|
+
expected: |
|
|
134
|
+
Return the account with account_id and status active.
|
|
135
|
+
sample_request:
|
|
136
|
+
accounts:
|
|
137
|
+
- brand:
|
|
138
|
+
domain: "acmeoutdoor.example"
|
|
139
|
+
operator: "pinnacle-agency.example"
|
|
140
|
+
billing: "operator"
|
|
141
|
+
idempotency_key: "$generate:uuid_v4#frequency_cap_enforcement_setup_sync_accounts"
|
|
142
|
+
validations:
|
|
143
|
+
- check: response_schema
|
|
144
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
145
|
+
- check: field_present
|
|
146
|
+
path: "accounts[0].account_id"
|
|
147
|
+
description: "Account has a platform-assigned ID"
|
|
148
|
+
|
|
149
|
+
- id: get_products_for_frequency_cap
|
|
150
|
+
title: "Discover products"
|
|
151
|
+
task: get_products
|
|
152
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
153
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
154
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
155
|
+
stateful: false
|
|
156
|
+
expected: |
|
|
157
|
+
Return at least one display product compatible with package-level
|
|
158
|
+
frequency_cap targeting overlays.
|
|
159
|
+
sample_request:
|
|
160
|
+
buying_mode: "brief"
|
|
161
|
+
brief: "Display inventory, US adults 25-54, Q2 flight, ~$15K budget. Frequency-capped at 3 impressions per individual per day."
|
|
162
|
+
account:
|
|
163
|
+
brand:
|
|
164
|
+
domain: "acmeoutdoor.example"
|
|
165
|
+
operator: "pinnacle-agency.example"
|
|
166
|
+
validations:
|
|
167
|
+
- check: response_schema
|
|
168
|
+
description: "Response matches get-products-response.json schema"
|
|
169
|
+
- check: field_present
|
|
170
|
+
path: "products"
|
|
171
|
+
description: "Response contains products"
|
|
172
|
+
|
|
173
|
+
- id: create_buy_with_frequency_cap
|
|
174
|
+
title: "Create a buy whose package carries a frequency_cap"
|
|
175
|
+
narrative: |
|
|
176
|
+
The buyer creates a media buy whose package targeting_overlay carries
|
|
177
|
+
a frequency_cap in the cap form (max_impressions + per + window). The
|
|
178
|
+
seller should accept and return a media_buy_id. Cap-form (not
|
|
179
|
+
cooldown-form `suppress`) is the assertion target because it declares
|
|
180
|
+
the numeric ceiling whose enforcement this scenario verifies.
|
|
181
|
+
|
|
182
|
+
steps:
|
|
183
|
+
- id: create_media_buy_with_frequency_cap
|
|
184
|
+
title: "Create media buy with frequency_cap in targeting_overlay"
|
|
185
|
+
task: create_media_buy
|
|
186
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
187
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
188
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
189
|
+
stateful: true
|
|
190
|
+
expected: |
|
|
191
|
+
Create the media buy. Response carries a media_buy_id used for
|
|
192
|
+
subsequent get_media_buy_delivery calls.
|
|
193
|
+
sample_request:
|
|
194
|
+
brand:
|
|
195
|
+
domain: "acmeoutdoor.example"
|
|
196
|
+
account:
|
|
197
|
+
brand:
|
|
198
|
+
domain: "acmeoutdoor.example"
|
|
199
|
+
operator: "pinnacle-agency.example"
|
|
200
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
201
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
202
|
+
packages:
|
|
203
|
+
- product_id: "frequency_capped_display_q2"
|
|
204
|
+
budget: 15000
|
|
205
|
+
pricing_option_id: "auction_cpm"
|
|
206
|
+
targeting_overlay:
|
|
207
|
+
frequency_cap:
|
|
208
|
+
max_impressions: 3
|
|
209
|
+
per: "individuals"
|
|
210
|
+
window:
|
|
211
|
+
interval: 1
|
|
212
|
+
unit: "days"
|
|
213
|
+
idempotency_key: "$generate:uuid_v4#frequency_cap_enforcement_create_buy_create_media_buy"
|
|
214
|
+
context_outputs:
|
|
215
|
+
- name: media_buy_id
|
|
216
|
+
path: "media_buy_id"
|
|
217
|
+
validations:
|
|
218
|
+
- check: response_schema
|
|
219
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
220
|
+
- check: field_present
|
|
221
|
+
path: "media_buy_id"
|
|
222
|
+
description: "Media buy has a platform-assigned ID"
|
|
223
|
+
|
|
224
|
+
- id: simulate_delivery_with_observed_frequency
|
|
225
|
+
title: "Inject impressions sufficient to test cap enforcement"
|
|
226
|
+
narrative: |
|
|
227
|
+
simulate_delivery injects an impression count well above the natural
|
|
228
|
+
reach of the targeted audience — the seller must clamp delivery (or
|
|
229
|
+
report clamped delivery) such that observed frequency stays at-or-
|
|
230
|
+
below the requested cap of 3 impressions per individual per day. A
|
|
231
|
+
seller silently dropping the cap would surface frequency well above
|
|
232
|
+
3 for impression-heavy buys against a small audience.
|
|
233
|
+
|
|
234
|
+
steps:
|
|
235
|
+
- id: simulate_capped_delivery
|
|
236
|
+
title: "Inject impressions + spend for the capped buy"
|
|
237
|
+
task: comply_test_controller
|
|
238
|
+
requires_tool: comply_test_controller
|
|
239
|
+
stateful: true
|
|
240
|
+
expected: |
|
|
241
|
+
The test controller acknowledges the simulated delivery.
|
|
242
|
+
sample_request:
|
|
243
|
+
account:
|
|
244
|
+
sandbox: true
|
|
245
|
+
scenario: "simulate_delivery"
|
|
246
|
+
params:
|
|
247
|
+
media_buy_id: "$context.media_buy_id"
|
|
248
|
+
impressions: 8550
|
|
249
|
+
reported_spend:
|
|
250
|
+
amount: 1500.00
|
|
251
|
+
currency: "USD"
|
|
252
|
+
validations:
|
|
253
|
+
- check: field_value
|
|
254
|
+
path: "success"
|
|
255
|
+
allowed_values: [true]
|
|
256
|
+
description: "Delivery simulation succeeds"
|
|
257
|
+
|
|
258
|
+
- id: assert_frequency_observed_within_cap
|
|
259
|
+
title: "Verify delivery reports reach + frequency at-or-below the cap"
|
|
260
|
+
narrative: |
|
|
261
|
+
The discriminating assertion of the frequency-cap mode. Delivery
|
|
262
|
+
reporting MUST surface totals.reach and totals.frequency (per
|
|
263
|
+
delivery-metrics.json — frequency requires a reach denominator to
|
|
264
|
+
be interpretable, and frequency_capping: present commits the seller
|
|
265
|
+
to populating these) and the observed frequency MUST be at-or-below
|
|
266
|
+
the requested cap of 3 impressions per individual per day.
|
|
267
|
+
|
|
268
|
+
Strict-less-than threshold is set at 3.01 because the storyboard-
|
|
269
|
+
schema check enum exposes `field_less_than` with a literal `value:`
|
|
270
|
+
as the only single-step numeric-comparison matcher today — there is
|
|
271
|
+
no native `<=` / `field_at_most` form. The 0.01 epsilon lets the
|
|
272
|
+
assertion target the cap literal (3) without rejecting honest
|
|
273
|
+
sellers that report frequency at exactly 3.0. A future runner
|
|
274
|
+
extension adding `field_at_most` would let this drop to a literal
|
|
275
|
+
`value: 3` without the epsilon; the cap-enforcement signal is
|
|
276
|
+
already discriminating without it.
|
|
277
|
+
|
|
278
|
+
steps:
|
|
279
|
+
- id: get_capped_delivery
|
|
280
|
+
title: "Get delivery and verify reach + frequency within cap"
|
|
281
|
+
task: get_media_buy_delivery
|
|
282
|
+
schema_ref: "media-buy/get-media-buy-delivery-request.json"
|
|
283
|
+
response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
|
|
284
|
+
doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
|
|
285
|
+
stateful: true
|
|
286
|
+
expected: |
|
|
287
|
+
Delivery response includes totals.reach and totals.frequency for
|
|
288
|
+
the capped buy, with observed frequency at-or-below the cap of 3.
|
|
289
|
+
sample_request:
|
|
290
|
+
account:
|
|
291
|
+
brand:
|
|
292
|
+
domain: "acmeoutdoor.example"
|
|
293
|
+
operator: "pinnacle-agency.example"
|
|
294
|
+
media_buy_ids:
|
|
295
|
+
- "$context.media_buy_id"
|
|
296
|
+
include_package_daily_breakdown: true
|
|
297
|
+
validations:
|
|
298
|
+
- check: response_schema
|
|
299
|
+
description: "Response matches get-media-buy-delivery-response.json schema"
|
|
300
|
+
- check: field_present
|
|
301
|
+
path: "media_buy_deliveries[0].totals.reach"
|
|
302
|
+
description: "Reach surfaced at the buy level — frequency needs a denominator to be interpretable"
|
|
303
|
+
- check: field_present
|
|
304
|
+
path: "media_buy_deliveries[0].totals.frequency"
|
|
305
|
+
description: "Observed frequency surfaced at the buy level — frequency_capping: present commits the seller to populating this"
|
|
306
|
+
- check: field_less_than
|
|
307
|
+
path: "media_buy_deliveries[0].totals.frequency"
|
|
308
|
+
value: 3.01
|
|
309
|
+
description: "Observed frequency is at-or-below the requested cap of 3 impressions per individual per day (strict less-than against 3.01 with 0.01 epsilon — see phase narrative)"
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
id: media_buy_seller/governance_approved
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller creates buy when governance approves"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies that the seller creates a media buy when governance approves the transaction."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- sync_governance
|
|
9
|
+
- get_products
|
|
10
|
+
- create_media_buy
|
|
11
|
+
|
|
12
|
+
narrative: |
|
|
13
|
+
This is a multi-agent test. The test harness sets up a permissive governance plan on
|
|
14
|
+
a governance agent with a $100K budget, then registers that agent with the seller.
|
|
15
|
+
The buyer creates a $25K buy which falls within limits.
|
|
16
|
+
|
|
17
|
+
When the seller calls check_governance during create_media_buy, the governance agent
|
|
18
|
+
approves. The seller must confirm the buy normally.
|
|
19
|
+
|
|
20
|
+
By default, the governance agent is the training agent at test-agent.adcontextprotocol.org.
|
|
21
|
+
Override by supplying a different `governance_agent_url` in the run's initial context
|
|
22
|
+
(e.g., via `--context` on `adcp storyboard run` once the CLI supports it).
|
|
23
|
+
|
|
24
|
+
context:
|
|
25
|
+
governance_agent_url: "https://test-agent.adcontextprotocol.org"
|
|
26
|
+
|
|
27
|
+
agent:
|
|
28
|
+
interaction_model: media_buy_seller
|
|
29
|
+
capabilities:
|
|
30
|
+
- sells_media
|
|
31
|
+
- governance_aware
|
|
32
|
+
examples:
|
|
33
|
+
- "Any media buy seller with governance support"
|
|
34
|
+
|
|
35
|
+
caller:
|
|
36
|
+
role: buyer_agent
|
|
37
|
+
example: "Pinnacle Agency (buyer)"
|
|
38
|
+
|
|
39
|
+
prerequisites:
|
|
40
|
+
description: |
|
|
41
|
+
A governance agent that supports sync_plans and check_governance.
|
|
42
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
43
|
+
controller_seeding: true
|
|
44
|
+
|
|
45
|
+
fixtures:
|
|
46
|
+
products:
|
|
47
|
+
- product_id: "outdoor_display_q2"
|
|
48
|
+
delivery_type: "guaranteed"
|
|
49
|
+
channels: ["display"]
|
|
50
|
+
format_ids:
|
|
51
|
+
- id: "display_300x250"
|
|
52
|
+
- product_id: "outdoor_video_q2"
|
|
53
|
+
delivery_type: "guaranteed"
|
|
54
|
+
channels: ["video"]
|
|
55
|
+
format_ids:
|
|
56
|
+
- id: "video_15s"
|
|
57
|
+
pricing_options:
|
|
58
|
+
- product_id: "outdoor_display_q2"
|
|
59
|
+
pricing_option_id: "cpm_standard"
|
|
60
|
+
pricing_model: "cpm"
|
|
61
|
+
currency: "USD"
|
|
62
|
+
fixed_price: 8.0
|
|
63
|
+
- product_id: "outdoor_video_q2"
|
|
64
|
+
pricing_option_id: "cpm_standard"
|
|
65
|
+
pricing_model: "cpm"
|
|
66
|
+
currency: "USD"
|
|
67
|
+
fixed_price: 12.0
|
|
68
|
+
|
|
69
|
+
phases:
|
|
70
|
+
- id: governance_plan_setup
|
|
71
|
+
title: "Set up permissive governance plan"
|
|
72
|
+
narrative: |
|
|
73
|
+
Create a governance plan on the governance agent with a high budget ($100K).
|
|
74
|
+
The subsequent $25K buy will fall within these limits and should be approved.
|
|
75
|
+
|
|
76
|
+
steps:
|
|
77
|
+
- id: sync_plans
|
|
78
|
+
title: "Create permissive governance plan"
|
|
79
|
+
task: sync_plans
|
|
80
|
+
schema_ref: "governance/sync-plans-request.json"
|
|
81
|
+
response_schema_ref: "governance/sync-plans-response.json"
|
|
82
|
+
doc_ref: "/governance/campaign/tasks/sync_plans"
|
|
83
|
+
stateful: true
|
|
84
|
+
expected: |
|
|
85
|
+
The governance agent acknowledges the plan with a plan_id.
|
|
86
|
+
sample_request:
|
|
87
|
+
idempotency_key: "$generate:uuid_v4#governance_approved_sync_plans"
|
|
88
|
+
plans:
|
|
89
|
+
- plan_id: "comply-gov-approved-plan"
|
|
90
|
+
brand:
|
|
91
|
+
domain: "acmeoutdoor.example"
|
|
92
|
+
objectives: "Q2 outdoor lifestyle campaign — display and video"
|
|
93
|
+
budget:
|
|
94
|
+
total: 100000
|
|
95
|
+
currency: "USD"
|
|
96
|
+
reallocation_threshold: 100000
|
|
97
|
+
flight:
|
|
98
|
+
start: "2026-04-01T00:00:00Z"
|
|
99
|
+
end: "2026-06-30T23:59:59Z"
|
|
100
|
+
countries: ["US", "CA"]
|
|
101
|
+
validations:
|
|
102
|
+
- check: response_schema
|
|
103
|
+
description: "Response matches sync-plans-response.json schema"
|
|
104
|
+
|
|
105
|
+
- id: seller_setup
|
|
106
|
+
title: "Account and governance registration on seller"
|
|
107
|
+
steps:
|
|
108
|
+
- id: sync_accounts
|
|
109
|
+
title: "Establish account with seller"
|
|
110
|
+
task: sync_accounts
|
|
111
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
112
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
113
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
114
|
+
stateful: true
|
|
115
|
+
expected: |
|
|
116
|
+
Return the account with account_id and status active.
|
|
117
|
+
sample_request:
|
|
118
|
+
accounts:
|
|
119
|
+
- brand:
|
|
120
|
+
domain: "acmeoutdoor.example"
|
|
121
|
+
operator: "pinnacle-agency.example"
|
|
122
|
+
billing: "operator"
|
|
123
|
+
payment_terms: "net_30"
|
|
124
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_approved_seller_setup_sync_accounts"
|
|
125
|
+
validations:
|
|
126
|
+
- check: response_schema
|
|
127
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
128
|
+
- check: field_present
|
|
129
|
+
path: "accounts[0].account_id"
|
|
130
|
+
description: "Account has a platform-assigned ID"
|
|
131
|
+
|
|
132
|
+
- id: sync_governance
|
|
133
|
+
title: "Register governance agent with seller"
|
|
134
|
+
task: sync_governance
|
|
135
|
+
schema_ref: "account/sync-governance-request.json"
|
|
136
|
+
response_schema_ref: "account/sync-governance-response.json"
|
|
137
|
+
doc_ref: "/accounts/tasks/sync_governance"
|
|
138
|
+
stateful: true
|
|
139
|
+
expected: |
|
|
140
|
+
Acknowledge the governance agent registration.
|
|
141
|
+
sample_request:
|
|
142
|
+
accounts:
|
|
143
|
+
- account:
|
|
144
|
+
brand:
|
|
145
|
+
domain: "acmeoutdoor.example"
|
|
146
|
+
operator: "pinnacle-agency.example"
|
|
147
|
+
governance_agents:
|
|
148
|
+
- url: "$context.governance_agent_url"
|
|
149
|
+
authentication:
|
|
150
|
+
schemes: ["Bearer"]
|
|
151
|
+
credentials: "gov-token-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
152
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_approved_seller_setup_sync_governance"
|
|
153
|
+
validations:
|
|
154
|
+
- check: response_schema
|
|
155
|
+
description: "Response matches sync-governance-response.json schema"
|
|
156
|
+
|
|
157
|
+
- id: buy_approved
|
|
158
|
+
title: "Create buy within governance limits"
|
|
159
|
+
steps:
|
|
160
|
+
- id: get_products_brief
|
|
161
|
+
title: "Discover products"
|
|
162
|
+
task: get_products
|
|
163
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
164
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
165
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
166
|
+
comply_scenario: full_sales_flow
|
|
167
|
+
stateful: false
|
|
168
|
+
expected: |
|
|
169
|
+
Return products matching the brief.
|
|
170
|
+
sample_request:
|
|
171
|
+
buying_mode: "brief"
|
|
172
|
+
brief: "Display and video inventory on outdoor lifestyle content. Q2 flight, $25K budget. Adults 25-54, US."
|
|
173
|
+
account:
|
|
174
|
+
brand:
|
|
175
|
+
domain: "acmeoutdoor.example"
|
|
176
|
+
operator: "pinnacle-agency.example"
|
|
177
|
+
validations:
|
|
178
|
+
- check: response_schema
|
|
179
|
+
description: "Response matches get-products-response.json schema"
|
|
180
|
+
- check: field_present
|
|
181
|
+
path: "products"
|
|
182
|
+
description: "Response contains products"
|
|
183
|
+
|
|
184
|
+
- id: create_media_buy
|
|
185
|
+
title: "Create buy (governance approves)"
|
|
186
|
+
task: create_media_buy
|
|
187
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
188
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
189
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
190
|
+
comply_scenario: create_media_buy
|
|
191
|
+
stateful: true
|
|
192
|
+
expected: |
|
|
193
|
+
The buy succeeds — governance approved because the $25K buy is within
|
|
194
|
+
the plan's $100K budget.
|
|
195
|
+
sample_request:
|
|
196
|
+
brand:
|
|
197
|
+
domain: "acmeoutdoor.example"
|
|
198
|
+
account:
|
|
199
|
+
brand:
|
|
200
|
+
domain: "acmeoutdoor.example"
|
|
201
|
+
operator: "pinnacle-agency.example"
|
|
202
|
+
start_time: "2026-04-01T00:00:00Z"
|
|
203
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
204
|
+
packages:
|
|
205
|
+
- product_id: "outdoor_display_q2"
|
|
206
|
+
budget: 15000
|
|
207
|
+
pricing_option_id: "cpm_standard"
|
|
208
|
+
- product_id: "outdoor_video_q2"
|
|
209
|
+
budget: 10000
|
|
210
|
+
pricing_option_id: "cpm_standard"
|
|
211
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_approved_buy_approved_create_media_buy"
|
|
212
|
+
validations:
|
|
213
|
+
- check: response_schema
|
|
214
|
+
description: "Response matches create-media-buy-response.json schema"
|