@adcp/sdk 7.10.2 → 7.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/index.json +356 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
- package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
- package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
- package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
- package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
- package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
- package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
- package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
- package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
- package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
- package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
- package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +9 -5
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/testing/storyboard/default-invariants.js +30 -1
- package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +84 -21
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +21 -0
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/types.js.map +1 -1
- package/dist/lib/testing/types.d.ts +9 -0
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.d.ts +6707 -12040
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +1 -1
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/utils/signal-id-builders.d.ts +19 -0
- package/dist/lib/utils/signal-id-builders.d.ts.map +1 -1
- package/dist/lib/utils/signal-id-builders.js +30 -0
- package/dist/lib/utils/signal-id-builders.js.map +1 -1
- package/dist/lib/utils/tool-request-schemas.d.ts.map +1 -1
- package/dist/lib/utils/tool-request-schemas.js +3 -0
- package/dist/lib/utils/tool-request-schemas.js.map +1 -1
- package/dist/lib/v2/projection/constants.d.ts +28 -0
- package/dist/lib/v2/projection/constants.d.ts.map +1 -0
- package/dist/lib/v2/projection/constants.js +31 -0
- package/dist/lib/v2/projection/constants.js.map +1 -0
- package/dist/lib/v2/projection/registry.d.ts.map +1 -1
- package/dist/lib/v2/projection/registry.js +9 -4
- package/dist/lib/v2/projection/registry.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
- package/skills/SHAPE-GOTCHAS.md +5 -0
package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
id: media_buy_seller/vendor_metric_accountability
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "End-to-end vendor-metric accountability: declaration → filter → emission"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Buyer discovers products that declare a vendor metric, creates a media buy, and verifies vendor-metric values appear in the delivery report."
|
|
6
|
+
track: reporting
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
- get_media_buy_delivery
|
|
11
|
+
- comply_test_controller
|
|
12
|
+
|
|
13
|
+
narrative: |
|
|
14
|
+
Vendor-defined metrics (attention scores, emissions, panel demographics) must
|
|
15
|
+
flow through the full media buy lifecycle — declared at discovery, carried
|
|
16
|
+
through the buy, and emitted in delivery reporting. AdCP supports this in
|
|
17
|
+
three pieces:
|
|
18
|
+
|
|
19
|
+
1. `reporting_capabilities.vendor_metrics` on the product — each entry is a
|
|
20
|
+
pointer `{ vendor, metric_id }` into the vendor's metric catalog (category,
|
|
21
|
+
methodology, and documentation live at the vendor's `brand.json`).
|
|
22
|
+
|
|
23
|
+
2. `filters.required_vendor_metrics` on `get_products` — buyer declares which
|
|
24
|
+
vendor metric it needs. Sellers MUST silently exclude products that don't
|
|
25
|
+
match (filter-not-fail; do not return an error). At least one of `vendor`
|
|
26
|
+
or `metric_id` must be pinned per entry.
|
|
27
|
+
|
|
28
|
+
3. `by_package[].vendor_metric_values` on `get_media_buy_delivery` — reported
|
|
29
|
+
values for each declared vendor metric. One row per `(vendor.domain,
|
|
30
|
+
vendor.brand_id, metric_id)` per reporting period. Sellers MUST
|
|
31
|
+
de-duplicate before emission.
|
|
32
|
+
|
|
33
|
+
This storyboard exercises that contract end to end. It uses
|
|
34
|
+
comply_test_controller to seed a product with vendor metrics declared and to
|
|
35
|
+
inject delivery data with vendor_metric_values, then asserts the schema-level
|
|
36
|
+
contract on the delivery response.
|
|
37
|
+
|
|
38
|
+
Item 3 of the originating issue (#3501) — whether vendor-metric emission
|
|
39
|
+
failures need a dedicated hint kind — is deferred to a follow-up adcp-client PR.
|
|
40
|
+
|
|
41
|
+
agent:
|
|
42
|
+
interaction_model: media_buy_seller
|
|
43
|
+
capabilities:
|
|
44
|
+
- sells_media
|
|
45
|
+
examples:
|
|
46
|
+
- "Any media buy seller that declares vendor_metrics on its products"
|
|
47
|
+
|
|
48
|
+
caller:
|
|
49
|
+
role: buyer_agent
|
|
50
|
+
example: "Pinnacle Agency (buyer)"
|
|
51
|
+
|
|
52
|
+
prerequisites:
|
|
53
|
+
description: |
|
|
54
|
+
The seller supports comply_test_controller and can seed products with
|
|
55
|
+
`reporting_capabilities.vendor_metrics`. The seeded product must appear in
|
|
56
|
+
`get_products` responses when filtered by the declared vendor.
|
|
57
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
58
|
+
controller_seeding: true
|
|
59
|
+
|
|
60
|
+
fixtures:
|
|
61
|
+
products:
|
|
62
|
+
- product_id: "display_premium_vendor_metrics"
|
|
63
|
+
delivery_type: "guaranteed"
|
|
64
|
+
channels: ["display"]
|
|
65
|
+
format_ids:
|
|
66
|
+
- id: "display_300x250"
|
|
67
|
+
reporting_capabilities:
|
|
68
|
+
available_metrics:
|
|
69
|
+
- impressions
|
|
70
|
+
- clicks
|
|
71
|
+
- spend
|
|
72
|
+
vendor_metrics:
|
|
73
|
+
- vendor:
|
|
74
|
+
domain: "attentionvendor.example"
|
|
75
|
+
metric_id: "attention_units"
|
|
76
|
+
pricing_options:
|
|
77
|
+
- product_id: "display_premium_vendor_metrics"
|
|
78
|
+
pricing_option_id: "cpm_standard_vendor"
|
|
79
|
+
pricing_model: "cpm"
|
|
80
|
+
currency: "USD"
|
|
81
|
+
fixed_price: 12.0
|
|
82
|
+
|
|
83
|
+
phases:
|
|
84
|
+
- id: discover_with_required_vendor_metrics
|
|
85
|
+
title: "Discover products that declare an attention vendor metric"
|
|
86
|
+
narrative: |
|
|
87
|
+
The buyer needs display inventory that declares attention measurement from
|
|
88
|
+
a specific vendor. They pass `required_vendor_metrics: [{ vendor: { domain:
|
|
89
|
+
"attentionvendor.example" } }]` in filters. The seller MUST silently exclude
|
|
90
|
+
products whose `reporting_capabilities.vendor_metrics` doesn't satisfy the
|
|
91
|
+
filter — same filter-not-fail convention as `required_metrics`.
|
|
92
|
+
steps:
|
|
93
|
+
- id: sync_accounts
|
|
94
|
+
title: "Establish account"
|
|
95
|
+
task: sync_accounts
|
|
96
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
97
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
98
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
99
|
+
stateful: true
|
|
100
|
+
expected: |
|
|
101
|
+
Return the account with account_id and status active.
|
|
102
|
+
sample_request:
|
|
103
|
+
accounts:
|
|
104
|
+
- brand:
|
|
105
|
+
domain: "acmeoutdoor.example"
|
|
106
|
+
operator: "pinnacle-agency.example"
|
|
107
|
+
billing: "operator"
|
|
108
|
+
payment_terms: "net_30"
|
|
109
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_accountability_setup_sync_accounts"
|
|
110
|
+
validations:
|
|
111
|
+
- check: response_schema
|
|
112
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
113
|
+
- check: field_present
|
|
114
|
+
path: "accounts[0].account_id"
|
|
115
|
+
description: "Account has a platform-assigned ID"
|
|
116
|
+
|
|
117
|
+
- id: get_products_required_vendor_metrics
|
|
118
|
+
title: "Discover with required_vendor_metrics filter"
|
|
119
|
+
task: get_products
|
|
120
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
121
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
122
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
123
|
+
comply_scenario: full_sales_flow
|
|
124
|
+
stateful: false
|
|
125
|
+
expected: |
|
|
126
|
+
Return only products whose reporting_capabilities.vendor_metrics
|
|
127
|
+
includes an entry for vendor domain "attentionvendor.example". Products
|
|
128
|
+
that don't declare this vendor are silently excluded — the seller does
|
|
129
|
+
NOT return an error for unmet vendor metric requirements.
|
|
130
|
+
sample_request:
|
|
131
|
+
buying_mode: "brief"
|
|
132
|
+
brief: "Display inventory with attention measurement from attentionvendor."
|
|
133
|
+
filters:
|
|
134
|
+
channels: ["display"]
|
|
135
|
+
is_fixed_price: true
|
|
136
|
+
required_vendor_metrics:
|
|
137
|
+
- vendor:
|
|
138
|
+
domain: "attentionvendor.example"
|
|
139
|
+
account:
|
|
140
|
+
brand:
|
|
141
|
+
domain: "acmeoutdoor.example"
|
|
142
|
+
operator: "pinnacle-agency.example"
|
|
143
|
+
context_outputs:
|
|
144
|
+
- path: "products[0].product_id"
|
|
145
|
+
key: "product_id"
|
|
146
|
+
- path: "products[0].pricing_options[0].pricing_option_id"
|
|
147
|
+
key: "pricing_option_id"
|
|
148
|
+
validations:
|
|
149
|
+
- check: response_schema
|
|
150
|
+
description: "Response matches get-products-response.json schema"
|
|
151
|
+
- check: field_present
|
|
152
|
+
path: "products[0].product_id"
|
|
153
|
+
description: "At least one product matched the required_vendor_metrics filter"
|
|
154
|
+
- check: field_present
|
|
155
|
+
path: "products[0].reporting_capabilities.vendor_metrics"
|
|
156
|
+
description: "Matched product declares vendor_metrics in reporting_capabilities"
|
|
157
|
+
- check: field_present
|
|
158
|
+
path: "products[0].reporting_capabilities.vendor_metrics[0].vendor.domain"
|
|
159
|
+
description: "Each declared vendor metric entry carries a vendor domain"
|
|
160
|
+
- check: field_present
|
|
161
|
+
path: "products[0].reporting_capabilities.vendor_metrics[0].metric_id"
|
|
162
|
+
description: "Each declared vendor metric entry carries a metric_id"
|
|
163
|
+
- check: field_present
|
|
164
|
+
path: "products[0].pricing_options[0].fixed_price"
|
|
165
|
+
description: "The captured pricing option is fixed-price; fixed-price storyboards do not send bid_price"
|
|
166
|
+
|
|
167
|
+
- id: create_media_buy
|
|
168
|
+
title: "Commit the media buy on the matched product"
|
|
169
|
+
narrative: |
|
|
170
|
+
The buyer commits a media buy on the vendor-metric-capable product. The
|
|
171
|
+
product's `vendor_metrics` declaration carries forward as the vendor
|
|
172
|
+
reporting contract for the resulting buy — no additional field is required
|
|
173
|
+
on `create_media_buy` itself.
|
|
174
|
+
steps:
|
|
175
|
+
- id: create_media_buy
|
|
176
|
+
title: "Create media buy"
|
|
177
|
+
task: create_media_buy
|
|
178
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
179
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
180
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
181
|
+
comply_scenario: create_media_buy
|
|
182
|
+
stateful: true
|
|
183
|
+
expected: |
|
|
184
|
+
The buy succeeds. The product's vendor_metrics declaration carries
|
|
185
|
+
forward as the vendor reporting contract — no additional field is
|
|
186
|
+
required on the buy itself.
|
|
187
|
+
sample_request:
|
|
188
|
+
brand:
|
|
189
|
+
domain: "acmeoutdoor.example"
|
|
190
|
+
account:
|
|
191
|
+
brand:
|
|
192
|
+
domain: "acmeoutdoor.example"
|
|
193
|
+
operator: "pinnacle-agency.example"
|
|
194
|
+
start_time: "2026-05-01T00:00:00Z"
|
|
195
|
+
end_time: "2026-05-31T23:59:59Z"
|
|
196
|
+
packages:
|
|
197
|
+
- product_id: "$context.product_id"
|
|
198
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
199
|
+
budget: 12000
|
|
200
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_accountability_create"
|
|
201
|
+
context_outputs:
|
|
202
|
+
- path: "media_buy_id"
|
|
203
|
+
key: "media_buy_id"
|
|
204
|
+
validations:
|
|
205
|
+
- check: response_schema
|
|
206
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
207
|
+
- check: field_present
|
|
208
|
+
path: "media_buy_id"
|
|
209
|
+
description: "Seller returns a media_buy_id"
|
|
210
|
+
|
|
211
|
+
- id: simulate_and_validate_vendor_metrics
|
|
212
|
+
title: "Simulate delivery with vendor-metric values and validate emission"
|
|
213
|
+
narrative: |
|
|
214
|
+
Inject simulated delivery via the test controller, including
|
|
215
|
+
vendor_metric_values, then call get_media_buy_delivery and check that
|
|
216
|
+
`by_package[].vendor_metric_values` carries the injected entries.
|
|
217
|
+
|
|
218
|
+
The semantic uniqueness key for each vendor metric row is
|
|
219
|
+
`(vendor.domain, vendor.brand_id, metric_id)`. Since brand_id is optional
|
|
220
|
+
in BrandRef, the operative key for single-brand vendors is
|
|
221
|
+
`(vendor.domain, metric_id)`. Sellers MUST NOT emit the same
|
|
222
|
+
`(vendor, metric_id)` pair twice in a single delivery report.
|
|
223
|
+
steps:
|
|
224
|
+
- id: simulate_delivery_with_vendor_metrics
|
|
225
|
+
title: "Inject simulated delivery with vendor_metric_values"
|
|
226
|
+
task: comply_test_controller
|
|
227
|
+
requires_tool: comply_test_controller
|
|
228
|
+
stateful: true
|
|
229
|
+
expected: |
|
|
230
|
+
The test controller acknowledges the simulated delivery data including
|
|
231
|
+
the vendor_metric_values.
|
|
232
|
+
sample_request:
|
|
233
|
+
account:
|
|
234
|
+
sandbox: true
|
|
235
|
+
scenario: "simulate_delivery"
|
|
236
|
+
params:
|
|
237
|
+
media_buy_id: "$context.media_buy_id"
|
|
238
|
+
impressions: 80000
|
|
239
|
+
reported_spend:
|
|
240
|
+
amount: 960.00
|
|
241
|
+
currency: "USD"
|
|
242
|
+
vendor_metric_values:
|
|
243
|
+
- vendor:
|
|
244
|
+
domain: "attentionvendor.example"
|
|
245
|
+
metric_id: "attention_units"
|
|
246
|
+
value: 4.2
|
|
247
|
+
unit: "score"
|
|
248
|
+
measurable_impressions: 72000
|
|
249
|
+
validations:
|
|
250
|
+
- check: field_value
|
|
251
|
+
path: "success"
|
|
252
|
+
allowed_values: [true]
|
|
253
|
+
description: "Delivery simulation succeeds"
|
|
254
|
+
|
|
255
|
+
- id: get_delivery_with_vendor_metrics
|
|
256
|
+
title: "Get delivery report and assert vendor_metric_values are present"
|
|
257
|
+
task: get_media_buy_delivery
|
|
258
|
+
schema_ref: "media-buy/get-media-buy-delivery-request.json"
|
|
259
|
+
response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
|
|
260
|
+
doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
|
|
261
|
+
comply_scenario: reporting_flow
|
|
262
|
+
stateful: true
|
|
263
|
+
expected: |
|
|
264
|
+
Return delivery metrics with vendor_metric_values populated in
|
|
265
|
+
by_package[0]. The entry must carry vendor.domain, metric_id, and
|
|
266
|
+
value matching the injected data. measurable_impressions is the
|
|
267
|
+
coverage denominator — buyers compute coverage rate as
|
|
268
|
+
measurable_impressions / impressions.
|
|
269
|
+
sample_request:
|
|
270
|
+
account:
|
|
271
|
+
brand:
|
|
272
|
+
domain: "acmeoutdoor.example"
|
|
273
|
+
operator: "pinnacle-agency.example"
|
|
274
|
+
media_buy_ids:
|
|
275
|
+
- "$context.media_buy_id"
|
|
276
|
+
validations:
|
|
277
|
+
- check: response_schema
|
|
278
|
+
description: "Response matches get-media-buy-delivery-response.json schema"
|
|
279
|
+
- check: field_present
|
|
280
|
+
path: "media_buy_deliveries[0].by_package[0].vendor_metric_values"
|
|
281
|
+
description: "by_package[0] includes vendor_metric_values — vendor metric emission contract honored"
|
|
282
|
+
- check: field_present
|
|
283
|
+
path: "media_buy_deliveries[0].by_package[0].vendor_metric_values[0].vendor.domain"
|
|
284
|
+
description: "Each vendor_metric_value entry carries a vendor domain"
|
|
285
|
+
- check: field_present
|
|
286
|
+
path: "media_buy_deliveries[0].by_package[0].vendor_metric_values[0].metric_id"
|
|
287
|
+
description: "Each vendor_metric_value entry carries a metric_id"
|
|
288
|
+
- check: field_present
|
|
289
|
+
path: "media_buy_deliveries[0].by_package[0].vendor_metric_values[0].value"
|
|
290
|
+
description: "Each vendor_metric_value entry carries a value"
|
|
291
|
+
- check: field_present
|
|
292
|
+
path: "media_buy_deliveries[0].by_package[0].vendor_metric_values[0].measurable_impressions"
|
|
293
|
+
description: "Coverage denominator is present — buyers can compute vendor measurement coverage rate"
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
id: media_buy_seller/vendor_metric_catalog_precondition
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Vendor-metric external catalog precondition"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Exercises the 3.1 SHOULD-window behavior for vendor_metric goals whose metric_id is absent from a seeded measurement.metrics[] catalog."
|
|
6
|
+
track: media_buy
|
|
7
|
+
introduced_in: "3.1"
|
|
8
|
+
|
|
9
|
+
# Gate: scenario runs only when the seller declares vendor-metric
|
|
10
|
+
# optimization support. Sellers that do not advertise this optional 3.1
|
|
11
|
+
# capability are not expected to handle vendor_metric optimization goals.
|
|
12
|
+
requires_capability:
|
|
13
|
+
path: media_buy.vendor_metric_optimization
|
|
14
|
+
present: true
|
|
15
|
+
|
|
16
|
+
required_tools:
|
|
17
|
+
- create_media_buy
|
|
18
|
+
- sync_accounts
|
|
19
|
+
- comply_test_controller
|
|
20
|
+
|
|
21
|
+
narrative: |
|
|
22
|
+
Vendor-metric optimization goals bind to a measurement vendor's
|
|
23
|
+
`measurement.metrics[]` catalog. In AdCP 3.1, sellers SHOULD verify that the
|
|
24
|
+
goal's `(vendor, metric_id)` is present in that vendor-published catalog, but
|
|
25
|
+
MAY accept catalog misses while measurement vendors finish publishing
|
|
26
|
+
conformant capability catalogs. The next minor tightens this discovery
|
|
27
|
+
precondition to MUST.
|
|
28
|
+
|
|
29
|
+
This storyboard seeds two facts that intentionally diverge. The seller product
|
|
30
|
+
can optimize and report `attention_catalog_probe`, satisfying the product
|
|
31
|
+
capability and reporting-coherence preconditions. The measurement vendor
|
|
32
|
+
catalog seeded for `attentionvendor.example` publishes only
|
|
33
|
+
`attention_catalog_baseline`, so `attention_catalog_probe` is a deterministic
|
|
34
|
+
external catalog miss. The storyboard captures the 3.1 compatibility window:
|
|
35
|
+
a seller may accept the request, or it may reject with `TERMS_REJECTED`. The
|
|
36
|
+
3.2 storyboard cut should collapse this branch set to the reject path only.
|
|
37
|
+
|
|
38
|
+
agent:
|
|
39
|
+
interaction_model: media_buy_seller
|
|
40
|
+
capabilities:
|
|
41
|
+
- sells_media
|
|
42
|
+
- supports_vendor_metric_optimization
|
|
43
|
+
examples:
|
|
44
|
+
- "Premium publishers with attention measurement optimization"
|
|
45
|
+
- "Sellers integrating vendor-defined measurement into bidding"
|
|
46
|
+
|
|
47
|
+
caller:
|
|
48
|
+
role: buyer_agent
|
|
49
|
+
example: "Pinnacle Agency (buyer)"
|
|
50
|
+
|
|
51
|
+
prerequisites:
|
|
52
|
+
description: |
|
|
53
|
+
The runner seeds a product that can optimize and report the
|
|
54
|
+
attention_catalog_probe metric, with an attentionvendor.example
|
|
55
|
+
measurement.metrics[] fixture that deliberately omits that metric_id. The
|
|
56
|
+
request is therefore valid by product capability and reporting coherence,
|
|
57
|
+
but is a deterministic external catalog miss.
|
|
58
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
59
|
+
controller_seeding: true
|
|
60
|
+
|
|
61
|
+
fixtures:
|
|
62
|
+
products:
|
|
63
|
+
- product_id: "display_vendor_metric_catalog_precondition"
|
|
64
|
+
delivery_type: "non_guaranteed"
|
|
65
|
+
channels: ["display"]
|
|
66
|
+
format_ids:
|
|
67
|
+
- id: "display_300x250"
|
|
68
|
+
reporting_capabilities:
|
|
69
|
+
available_metrics:
|
|
70
|
+
- impressions
|
|
71
|
+
- clicks
|
|
72
|
+
- spend
|
|
73
|
+
vendor_metrics:
|
|
74
|
+
- vendor:
|
|
75
|
+
domain: "attentionvendor.example"
|
|
76
|
+
metric_id: "attention_catalog_probe"
|
|
77
|
+
vendor_metric_optimization:
|
|
78
|
+
supported_metrics:
|
|
79
|
+
- vendor:
|
|
80
|
+
domain: "attentionvendor.example"
|
|
81
|
+
metric_id: "attention_catalog_probe"
|
|
82
|
+
supported_targets:
|
|
83
|
+
- threshold_rate
|
|
84
|
+
pricing_options:
|
|
85
|
+
- product_id: "display_vendor_metric_catalog_precondition"
|
|
86
|
+
pricing_option_id: "cpm_vendor_metric_catalog_precondition"
|
|
87
|
+
pricing_model: "cpm"
|
|
88
|
+
currency: "USD"
|
|
89
|
+
fixed_price: 14.0
|
|
90
|
+
|
|
91
|
+
phases:
|
|
92
|
+
- id: account_setup
|
|
93
|
+
title: "Establish account"
|
|
94
|
+
narrative: |
|
|
95
|
+
The buyer provisions or resolves an account so subsequent media-buy
|
|
96
|
+
creation uses the same tenant scope as the seeded product.
|
|
97
|
+
steps:
|
|
98
|
+
- id: sync_accounts
|
|
99
|
+
title: "Establish buyer account"
|
|
100
|
+
task: sync_accounts
|
|
101
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
102
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
103
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
104
|
+
stateful: true
|
|
105
|
+
expected: |
|
|
106
|
+
Return the account with account_id and status active.
|
|
107
|
+
sample_request:
|
|
108
|
+
accounts:
|
|
109
|
+
- brand:
|
|
110
|
+
domain: "acmeoutdoor.example"
|
|
111
|
+
operator: "pinnacle-agency.example"
|
|
112
|
+
billing: "operator"
|
|
113
|
+
payment_terms: "net_30"
|
|
114
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_catalog_precondition_sync_accounts"
|
|
115
|
+
validations:
|
|
116
|
+
- check: response_schema
|
|
117
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
118
|
+
- check: field_present
|
|
119
|
+
path: "accounts[0].account_id"
|
|
120
|
+
description: "Account has a platform-assigned ID"
|
|
121
|
+
|
|
122
|
+
- id: seed_measurement_catalog
|
|
123
|
+
title: "Seed the measurement vendor catalog"
|
|
124
|
+
narrative: |
|
|
125
|
+
The product fixture proves the seller-side vendor_metric capability and
|
|
126
|
+
reporting contract. This controller step separately seeds the external
|
|
127
|
+
measurement vendor catalog so the later create_media_buy request is a
|
|
128
|
+
deterministic catalog miss rather than merely catalog-unproven.
|
|
129
|
+
|
|
130
|
+
steps:
|
|
131
|
+
- id: seed_attention_vendor_catalog
|
|
132
|
+
title: "Seed attentionvendor.example without the requested metric"
|
|
133
|
+
task: comply_test_controller
|
|
134
|
+
requires_tool: comply_test_controller
|
|
135
|
+
stateful: true
|
|
136
|
+
expected: |
|
|
137
|
+
The controller stores attentionvendor.example's measurement.metrics[]
|
|
138
|
+
catalog for this compliance session.
|
|
139
|
+
sample_request:
|
|
140
|
+
account:
|
|
141
|
+
sandbox: true
|
|
142
|
+
brand:
|
|
143
|
+
domain: "acmeoutdoor.example"
|
|
144
|
+
scenario: "seed_measurement_catalog"
|
|
145
|
+
params:
|
|
146
|
+
vendor:
|
|
147
|
+
domain: "attentionvendor.example"
|
|
148
|
+
metrics:
|
|
149
|
+
- metric_id: "attention_catalog_baseline"
|
|
150
|
+
unit: "score"
|
|
151
|
+
description: "Baseline attention metric present in the seeded vendor catalog."
|
|
152
|
+
context:
|
|
153
|
+
correlation_id: "vendor_metric_catalog_precondition--seed_catalog"
|
|
154
|
+
validations:
|
|
155
|
+
- check: field_value
|
|
156
|
+
path: "success"
|
|
157
|
+
allowed_values: [true]
|
|
158
|
+
description: "Measurement catalog seeding succeeds"
|
|
159
|
+
- check: field_present
|
|
160
|
+
path: "context"
|
|
161
|
+
description: "Response echoes back the context object"
|
|
162
|
+
- check: field_value
|
|
163
|
+
path: "context.correlation_id"
|
|
164
|
+
value: "vendor_metric_catalog_precondition--seed_catalog"
|
|
165
|
+
description: "Context correlation_id returned unchanged"
|
|
166
|
+
|
|
167
|
+
- id: catalog_miss_accept_path
|
|
168
|
+
title: "3.1 catalog-miss metric — accept path"
|
|
169
|
+
narrative: |
|
|
170
|
+
The seller may accept the buy during the 3.1 SHOULD window even though
|
|
171
|
+
attention_catalog_probe is absent from the seeded vendor catalog.
|
|
172
|
+
optional: true
|
|
173
|
+
branch_set:
|
|
174
|
+
id: vendor_metric_catalog_miss_handled
|
|
175
|
+
semantics: any_of
|
|
176
|
+
steps:
|
|
177
|
+
- id: create_media_buy_catalog_miss_accept
|
|
178
|
+
title: "Accept vendor_metric with catalog miss during 3.1 SHOULD window"
|
|
179
|
+
task: create_media_buy
|
|
180
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
181
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
182
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
183
|
+
comply_scenario: create_media_buy
|
|
184
|
+
auth:
|
|
185
|
+
type: api_key
|
|
186
|
+
from_test_kit: true
|
|
187
|
+
stateful: false
|
|
188
|
+
contributes: true
|
|
189
|
+
expected: |
|
|
190
|
+
3.1 compatibility behavior: accept the buy even though the metric is
|
|
191
|
+
absent from the seeded vendor measurement.metrics[] catalog.
|
|
192
|
+
sample_request:
|
|
193
|
+
brand:
|
|
194
|
+
domain: "acmeoutdoor.example"
|
|
195
|
+
account:
|
|
196
|
+
brand:
|
|
197
|
+
domain: "acmeoutdoor.example"
|
|
198
|
+
operator: "pinnacle-agency.example"
|
|
199
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
200
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
201
|
+
packages:
|
|
202
|
+
- product_id: "display_vendor_metric_catalog_precondition"
|
|
203
|
+
pricing_option_id: "cpm_vendor_metric_catalog_precondition"
|
|
204
|
+
budget: 5000
|
|
205
|
+
optimization_goals:
|
|
206
|
+
- kind: "vendor_metric"
|
|
207
|
+
vendor:
|
|
208
|
+
domain: "attentionvendor.example"
|
|
209
|
+
metric_id: "attention_catalog_probe"
|
|
210
|
+
target:
|
|
211
|
+
kind: "threshold_rate"
|
|
212
|
+
value: 70
|
|
213
|
+
priority: 1
|
|
214
|
+
committed_metrics:
|
|
215
|
+
- scope: "vendor"
|
|
216
|
+
vendor:
|
|
217
|
+
domain: "attentionvendor.example"
|
|
218
|
+
metric_id: "attention_catalog_probe"
|
|
219
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_catalog_precondition_accept"
|
|
220
|
+
validations:
|
|
221
|
+
- check: response_schema
|
|
222
|
+
description: "Response matches create-media-buy-response.json schema for the 3.1 catalog-miss accept branch"
|
|
223
|
+
- check: field_present
|
|
224
|
+
path: "media_buy_id"
|
|
225
|
+
description: "Seller returns a media_buy_id during the 3.1 catalog-miss SHOULD window"
|
|
226
|
+
|
|
227
|
+
- id: catalog_miss_reject_path
|
|
228
|
+
title: "3.1 catalog-miss metric — reject path"
|
|
229
|
+
narrative: |
|
|
230
|
+
The seller may also reject the same request in 3.1. This is the
|
|
231
|
+
recommended behavior ahead of the 3.2 MUST boundary.
|
|
232
|
+
optional: true
|
|
233
|
+
branch_set:
|
|
234
|
+
id: vendor_metric_catalog_miss_handled
|
|
235
|
+
semantics: any_of
|
|
236
|
+
steps:
|
|
237
|
+
- id: create_media_buy_catalog_miss_reject
|
|
238
|
+
title: "Reject vendor_metric with catalog miss using TERMS_REJECTED"
|
|
239
|
+
task: create_media_buy
|
|
240
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
241
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
242
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
243
|
+
comply_scenario: create_media_buy
|
|
244
|
+
expect_error: true
|
|
245
|
+
negative_path: payload_well_formed
|
|
246
|
+
auth:
|
|
247
|
+
type: api_key
|
|
248
|
+
from_test_kit: true
|
|
249
|
+
stateful: false
|
|
250
|
+
contributes: true
|
|
251
|
+
expected: |
|
|
252
|
+
Recommended 3.1 behavior and required 3.2 behavior: reject with
|
|
253
|
+
TERMS_REJECTED because the metric is absent from the vendor's seeded
|
|
254
|
+
measurement.metrics[] catalog.
|
|
255
|
+
sample_request:
|
|
256
|
+
brand:
|
|
257
|
+
domain: "acmeoutdoor.example"
|
|
258
|
+
account:
|
|
259
|
+
brand:
|
|
260
|
+
domain: "acmeoutdoor.example"
|
|
261
|
+
operator: "pinnacle-agency.example"
|
|
262
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
263
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
264
|
+
packages:
|
|
265
|
+
- product_id: "display_vendor_metric_catalog_precondition"
|
|
266
|
+
pricing_option_id: "cpm_vendor_metric_catalog_precondition"
|
|
267
|
+
budget: 5000
|
|
268
|
+
optimization_goals:
|
|
269
|
+
- kind: "vendor_metric"
|
|
270
|
+
vendor:
|
|
271
|
+
domain: "attentionvendor.example"
|
|
272
|
+
metric_id: "attention_catalog_probe"
|
|
273
|
+
target:
|
|
274
|
+
kind: "threshold_rate"
|
|
275
|
+
value: 70
|
|
276
|
+
priority: 1
|
|
277
|
+
committed_metrics:
|
|
278
|
+
- scope: "vendor"
|
|
279
|
+
vendor:
|
|
280
|
+
domain: "attentionvendor.example"
|
|
281
|
+
metric_id: "attention_catalog_probe"
|
|
282
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_catalog_precondition_reject"
|
|
283
|
+
validations:
|
|
284
|
+
- check: error_code
|
|
285
|
+
allowed_values: ["TERMS_REJECTED"]
|
|
286
|
+
description: "Seller may reject catalog-miss vendor metrics with TERMS_REJECTED in 3.1; catalog misses become required rejections at 3.2"
|
|
287
|
+
|
|
288
|
+
- id: catalog_miss_assertion
|
|
289
|
+
title: "Require catalog-miss metric handling"
|
|
290
|
+
narrative: |
|
|
291
|
+
Synthetic assertion over the accept and reject branches. In 3.1, either
|
|
292
|
+
compatibility acceptance or recommended TERMS_REJECTED rejection satisfies
|
|
293
|
+
the catalog-miss metric behavior. The 3.2 storyboard cut should collapse
|
|
294
|
+
this branch set to the reject branch only.
|
|
295
|
+
steps:
|
|
296
|
+
- id: assert_vendor_metric_catalog_miss_handled
|
|
297
|
+
title: "Require catalog-miss handling from either branch"
|
|
298
|
+
task: assert_contribution
|
|
299
|
+
comply_scenario: create_media_buy
|
|
300
|
+
stateful: false
|
|
301
|
+
expected: |
|
|
302
|
+
At least one of catalog_miss_accept_path or catalog_miss_reject_path
|
|
303
|
+
contributed vendor_metric_catalog_miss_handled.
|
|
304
|
+
validations:
|
|
305
|
+
- check: any_of
|
|
306
|
+
allowed_values: ["vendor_metric_catalog_miss_handled"]
|
|
307
|
+
description: "Agent must either accept the catalog-miss metric during the 3.1 SHOULD window or reject it with TERMS_REJECTED."
|