@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/proposal_not_found_errors.yaml
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
id: media_buy_seller/proposal_not_found_errors
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller returns canonical proposal error codes"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Validates that the seller returns PROPOSAL_NOT_FOUND (and PROPOSAL_EXPIRED) rather than generic NOT_FOUND or INVALID_REQUEST when the buyer references proposal IDs that do not exist or have expired."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
|
|
11
|
+
requires_capability:
|
|
12
|
+
path: media_buy.supports_proposals
|
|
13
|
+
equals: true
|
|
14
|
+
|
|
15
|
+
narrative: |
|
|
16
|
+
Error-code coverage is the most common compliance gap. This scenario forces
|
|
17
|
+
PROPOSAL_NOT_FOUND on two distinct paths — get_products refine mode and
|
|
18
|
+
create_media_buy — using fabricated proposal IDs the seller cannot resolve.
|
|
19
|
+
A separate phase forces PROPOSAL_EXPIRED using a sentinel ID that represents
|
|
20
|
+
a known-but-expired proposal hold window.
|
|
21
|
+
|
|
22
|
+
All three probes use schema-valid requests (negative_path: payload_well_formed)
|
|
23
|
+
so the error is semantic, not a JSON-schema validation rejection. Hard
|
|
24
|
+
check: error_code assertions ensure sellers cannot pass by returning generic
|
|
25
|
+
NOT_FOUND or INVALID_REQUEST.
|
|
26
|
+
|
|
27
|
+
Background: PROPOSAL_NOT_FOUND and PROPOSAL_EXPIRED were added to the canonical
|
|
28
|
+
error catalog in #4043. Without storyboard coverage, sellers can keep returning
|
|
29
|
+
generic codes on the negative proposal paths and still pass the happy-path
|
|
30
|
+
proposal storyboards.
|
|
31
|
+
|
|
32
|
+
agent:
|
|
33
|
+
interaction_model: media_buy_seller
|
|
34
|
+
capabilities:
|
|
35
|
+
- sells_media
|
|
36
|
+
- accepts_briefs
|
|
37
|
+
- generates_proposals
|
|
38
|
+
examples:
|
|
39
|
+
- "Full-service publisher with proposal engine"
|
|
40
|
+
- "Retail media network with curated packages"
|
|
41
|
+
|
|
42
|
+
caller:
|
|
43
|
+
role: buyer_agent
|
|
44
|
+
example: "Pinnacle Agency (buyer)"
|
|
45
|
+
|
|
46
|
+
prerequisites:
|
|
47
|
+
description: |
|
|
48
|
+
The seller must support proposals (media_buy.supports_proposals: true).
|
|
49
|
+
|
|
50
|
+
Sentinel IDs used in this storyboard:
|
|
51
|
+
- does-not-exist-proposal-not-found-v1: a proposal_id the seller can never resolve
|
|
52
|
+
(never created, wrong tenant, evicted). Triggers PROPOSAL_NOT_FOUND.
|
|
53
|
+
- expired-proposal-sentinel-v1: a proposal_id the seller treats as known-but-expired
|
|
54
|
+
(expires_at in the past). Triggers PROPOSAL_EXPIRED. Sellers that cannot distinguish
|
|
55
|
+
expired from never-existed MAY return PROPOSAL_NOT_FOUND for this probe; the
|
|
56
|
+
validation uses allowed_values to accept both.
|
|
57
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
58
|
+
|
|
59
|
+
phases:
|
|
60
|
+
- id: setup
|
|
61
|
+
title: "Account setup"
|
|
62
|
+
steps:
|
|
63
|
+
- id: sync_accounts
|
|
64
|
+
title: "Establish account"
|
|
65
|
+
task: sync_accounts
|
|
66
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
67
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
68
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
69
|
+
stateful: true
|
|
70
|
+
expected: |
|
|
71
|
+
Return the account with account_id and status active.
|
|
72
|
+
|
|
73
|
+
sample_request:
|
|
74
|
+
accounts:
|
|
75
|
+
- brand:
|
|
76
|
+
domain: "acmeoutdoor.example"
|
|
77
|
+
operator: "pinnacle-agency.example"
|
|
78
|
+
billing: "operator"
|
|
79
|
+
payment_terms: "net_30"
|
|
80
|
+
|
|
81
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_not_found_errors_setup_sync_accounts"
|
|
82
|
+
validations:
|
|
83
|
+
- check: response_schema
|
|
84
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
85
|
+
- check: field_present
|
|
86
|
+
path: "accounts[0].account_id"
|
|
87
|
+
description: "Account has a platform-assigned ID"
|
|
88
|
+
|
|
89
|
+
- id: unknown_proposal_refine
|
|
90
|
+
title: "Refine an unknown proposal_id"
|
|
91
|
+
narrative: |
|
|
92
|
+
The buyer sends get_products in refine mode with a proposal_id the seller cannot
|
|
93
|
+
resolve. The seller must return PROPOSAL_NOT_FOUND — not NOT_FOUND, not
|
|
94
|
+
INVALID_REQUEST, not a 500. The request is schema-valid; the error is semantic.
|
|
95
|
+
|
|
96
|
+
steps:
|
|
97
|
+
- id: get_products_refine_unknown_proposal
|
|
98
|
+
title: "get_products refine with bogus proposal_id"
|
|
99
|
+
task: get_products
|
|
100
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
101
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
102
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
103
|
+
comply_scenario: full_sales_flow
|
|
104
|
+
expect_error: true
|
|
105
|
+
negative_path: payload_well_formed
|
|
106
|
+
stateful: false
|
|
107
|
+
expected: |
|
|
108
|
+
Reject with:
|
|
109
|
+
- code: PROPOSAL_NOT_FOUND
|
|
110
|
+
- recovery: correctable
|
|
111
|
+
- error.field pointing at the proposal reference (if available)
|
|
112
|
+
- context echoed unchanged
|
|
113
|
+
|
|
114
|
+
sample_request:
|
|
115
|
+
buying_mode: "refine"
|
|
116
|
+
refine:
|
|
117
|
+
- scope: "proposal"
|
|
118
|
+
proposal_id: "does-not-exist-proposal-not-found-v1"
|
|
119
|
+
ask: "Shift 60% of budget to CTV."
|
|
120
|
+
account:
|
|
121
|
+
brand:
|
|
122
|
+
domain: "acmeoutdoor.example"
|
|
123
|
+
operator: "pinnacle-agency.example"
|
|
124
|
+
context:
|
|
125
|
+
correlation_id: "proposal_not_found_errors--get_products_refine"
|
|
126
|
+
validations:
|
|
127
|
+
- check: error_code
|
|
128
|
+
value: "PROPOSAL_NOT_FOUND"
|
|
129
|
+
description: "Error code is PROPOSAL_NOT_FOUND"
|
|
130
|
+
- check: field_present
|
|
131
|
+
path: "context"
|
|
132
|
+
description: "Response echoes back the context object even on errors"
|
|
133
|
+
- check: field_value
|
|
134
|
+
path: "context.correlation_id"
|
|
135
|
+
value: "proposal_not_found_errors--get_products_refine"
|
|
136
|
+
description: "Context correlation_id returned unchanged"
|
|
137
|
+
|
|
138
|
+
- id: unknown_proposal_create
|
|
139
|
+
title: "create_media_buy from an unknown proposal_id"
|
|
140
|
+
narrative: |
|
|
141
|
+
The buyer sends create_media_buy referencing a proposal_id the seller cannot resolve.
|
|
142
|
+
The seller must return PROPOSAL_NOT_FOUND with correctable recovery — the buyer should
|
|
143
|
+
re-issue get_products with buying_mode: refine + action: finalize to obtain a valid
|
|
144
|
+
committed proposal_id before retrying create_media_buy.
|
|
145
|
+
|
|
146
|
+
steps:
|
|
147
|
+
- id: create_media_buy_unknown_proposal
|
|
148
|
+
title: "create_media_buy with bogus proposal_id"
|
|
149
|
+
task: create_media_buy
|
|
150
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
151
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
152
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
153
|
+
comply_scenario: create_media_buy
|
|
154
|
+
expect_error: true
|
|
155
|
+
negative_path: payload_well_formed
|
|
156
|
+
stateful: false
|
|
157
|
+
expected: |
|
|
158
|
+
Reject with:
|
|
159
|
+
- code: PROPOSAL_NOT_FOUND
|
|
160
|
+
- recovery: correctable
|
|
161
|
+
- error.field pointing at proposal_id (if available)
|
|
162
|
+
- context echoed unchanged
|
|
163
|
+
|
|
164
|
+
sample_request:
|
|
165
|
+
brand:
|
|
166
|
+
domain: "acmeoutdoor.example"
|
|
167
|
+
account:
|
|
168
|
+
brand:
|
|
169
|
+
domain: "acmeoutdoor.example"
|
|
170
|
+
operator: "pinnacle-agency.example"
|
|
171
|
+
proposal_id: "does-not-exist-proposal-not-found-v1"
|
|
172
|
+
total_budget:
|
|
173
|
+
amount: 50000
|
|
174
|
+
currency: "USD"
|
|
175
|
+
start_time: "2026-04-01T00:00:00Z"
|
|
176
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
177
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_not_found_errors_unknown_proposal_create_create_media_buy_unknown_proposal"
|
|
178
|
+
context:
|
|
179
|
+
correlation_id: "proposal_not_found_errors--create_media_buy_unknown"
|
|
180
|
+
validations:
|
|
181
|
+
- check: error_code
|
|
182
|
+
value: "PROPOSAL_NOT_FOUND"
|
|
183
|
+
description: "Error code is PROPOSAL_NOT_FOUND"
|
|
184
|
+
- check: field_present
|
|
185
|
+
path: "context"
|
|
186
|
+
description: "Response echoes back the context object even on errors"
|
|
187
|
+
- check: field_value
|
|
188
|
+
path: "context.correlation_id"
|
|
189
|
+
value: "proposal_not_found_errors--create_media_buy_unknown"
|
|
190
|
+
description: "Context correlation_id returned unchanged"
|
|
191
|
+
|
|
192
|
+
- id: expired_proposal_create
|
|
193
|
+
title: "create_media_buy from an expired proposal"
|
|
194
|
+
narrative: |
|
|
195
|
+
The buyer sends create_media_buy referencing a proposal_id whose expires_at hold
|
|
196
|
+
window has passed. The seller must return PROPOSAL_EXPIRED — distinct from
|
|
197
|
+
PROPOSAL_NOT_FOUND because the proposal was known but its inventory hold has lapsed.
|
|
198
|
+
Recovery is correctable: re-issue get_products with buying_mode: refine +
|
|
199
|
+
action: finalize to obtain a fresh committed proposal before retrying.
|
|
200
|
+
|
|
201
|
+
Sellers that cannot distinguish a known-but-expired proposal from a never-existed
|
|
202
|
+
proposal MAY return PROPOSAL_NOT_FOUND for this probe; the validation uses
|
|
203
|
+
allowed_values to accept both codes. Per-code precision is preferred for
|
|
204
|
+
buyer-agent recovery clarity (expired = re-finalize the same proposal;
|
|
205
|
+
not-found = restart discovery from scratch).
|
|
206
|
+
|
|
207
|
+
Trigger convention: the test kit configures 'expired-proposal-sentinel-v1' as a
|
|
208
|
+
seller-side known-but-expired proposal_id. Sellers that cannot configure a
|
|
209
|
+
sentinel should document their test-kit approach in their compliance notes.
|
|
210
|
+
|
|
211
|
+
steps:
|
|
212
|
+
- id: create_media_buy_expired_proposal
|
|
213
|
+
title: "create_media_buy with expired proposal_id"
|
|
214
|
+
task: create_media_buy
|
|
215
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
216
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
217
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
218
|
+
comply_scenario: create_media_buy
|
|
219
|
+
expect_error: true
|
|
220
|
+
negative_path: payload_well_formed
|
|
221
|
+
stateful: false
|
|
222
|
+
expected: |
|
|
223
|
+
Reject with:
|
|
224
|
+
- code: PROPOSAL_EXPIRED (preferred) or PROPOSAL_NOT_FOUND (acceptable if seller
|
|
225
|
+
cannot distinguish known-but-expired from never-existed)
|
|
226
|
+
- recovery: correctable
|
|
227
|
+
- context echoed unchanged
|
|
228
|
+
|
|
229
|
+
sample_request:
|
|
230
|
+
brand:
|
|
231
|
+
domain: "acmeoutdoor.example"
|
|
232
|
+
account:
|
|
233
|
+
brand:
|
|
234
|
+
domain: "acmeoutdoor.example"
|
|
235
|
+
operator: "pinnacle-agency.example"
|
|
236
|
+
proposal_id: "expired-proposal-sentinel-v1"
|
|
237
|
+
total_budget:
|
|
238
|
+
amount: 50000
|
|
239
|
+
currency: "USD"
|
|
240
|
+
start_time: "2026-04-01T00:00:00Z"
|
|
241
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
242
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_not_found_errors_expired_proposal_create_create_media_buy_expired_proposal"
|
|
243
|
+
context:
|
|
244
|
+
correlation_id: "proposal_not_found_errors--create_media_buy_expired"
|
|
245
|
+
validations:
|
|
246
|
+
- check: error_code
|
|
247
|
+
allowed_values:
|
|
248
|
+
- "PROPOSAL_EXPIRED"
|
|
249
|
+
- "PROPOSAL_NOT_FOUND"
|
|
250
|
+
description: "Error code is PROPOSAL_EXPIRED (preferred) or PROPOSAL_NOT_FOUND (acceptable when seller cannot distinguish known-but-expired from never-existed)"
|
|
251
|
+
- check: field_present
|
|
252
|
+
path: "context"
|
|
253
|
+
description: "Response echoes back the context object even on errors"
|
|
254
|
+
- check: field_value
|
|
255
|
+
path: "context.correlation_id"
|
|
256
|
+
value: "proposal_not_found_errors--create_media_buy_expired"
|
|
257
|
+
description: "Context correlation_id returned unchanged"
|
package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml
ADDED
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
id: media_buy_seller/provenance_audit_observation
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller accepts a provenance carve-out claim surfaced as an audit observation"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Buyer submits AI-assisted creatives with human_oversight directed/edited and disclosure.required false. Seller invokes an on-list verifier, records OVERSIGHT_DISCLOSURE_CARVEOUT_CLAIMED audit observations, and accepts the creatives rather than treating the observations as rejections."
|
|
6
|
+
track: creative
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- sync_creatives
|
|
10
|
+
- comply_test_controller
|
|
11
|
+
|
|
12
|
+
narrative: |
|
|
13
|
+
This scenario exercises the non-rejection half of provenance verification.
|
|
14
|
+
The buyer claims editorial-responsibility carve-outs by submitting AI-
|
|
15
|
+
assisted creatives with human_oversight: directed/edited and
|
|
16
|
+
disclosure.required: false. Those combinations are audit-worthy, but they
|
|
17
|
+
are not contradictions and are not grounds for rejection by themselves.
|
|
18
|
+
|
|
19
|
+
The seller should call an on-list governance agent via get_creative_features.
|
|
20
|
+
The verifier returns audit_observations[] with
|
|
21
|
+
OVERSIGHT_DISCLOSURE_CARVEOUT_CLAIMED. The seller accepts the creative
|
|
22
|
+
through the normal lifecycle rather than rejecting solely on that
|
|
23
|
+
observation. Shared conformance observes the accept result, outbound
|
|
24
|
+
verifier calls, and a sandbox-only controller query for the recorded
|
|
25
|
+
observation; public seller responses do not have to expose the seller's
|
|
26
|
+
internal audit log.
|
|
27
|
+
|
|
28
|
+
agent:
|
|
29
|
+
interaction_model: stateful_push
|
|
30
|
+
capabilities:
|
|
31
|
+
- has_creative_library
|
|
32
|
+
examples:
|
|
33
|
+
- "Publishers and SSPs that run independent provenance review against buyer-declared disclosure claims"
|
|
34
|
+
|
|
35
|
+
caller:
|
|
36
|
+
role: buyer_agent
|
|
37
|
+
example: "Pinnacle Agency (buyer)"
|
|
38
|
+
|
|
39
|
+
prerequisites:
|
|
40
|
+
description: |
|
|
41
|
+
Seller publishes a product with creative_policy.accepted_verifiers
|
|
42
|
+
pointing at a governance agent that implements get_creative_features and
|
|
43
|
+
can emit audit_observations[] for oversight/disclosure carve-out claims.
|
|
44
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
45
|
+
controller_seeding: true
|
|
46
|
+
|
|
47
|
+
fixtures:
|
|
48
|
+
products:
|
|
49
|
+
- product_id: "test-product-provenance-audit-observation"
|
|
50
|
+
name: "Provenance Audit Observation Test Product"
|
|
51
|
+
description: "Sandbox display inventory exercising audit-worthy but non-rejecting provenance carve-out claims"
|
|
52
|
+
delivery_type: "non_guaranteed"
|
|
53
|
+
channels: ["display"]
|
|
54
|
+
creative_policy:
|
|
55
|
+
co_branding: "optional"
|
|
56
|
+
landing_page: "any"
|
|
57
|
+
templates_available: false
|
|
58
|
+
provenance_required: true
|
|
59
|
+
accepted_verifiers:
|
|
60
|
+
- agent_url: "https://governance.encypher.seller.example"
|
|
61
|
+
feature_id: "ai_generated"
|
|
62
|
+
providers: ["Encypher"]
|
|
63
|
+
pricing_options:
|
|
64
|
+
- pricing_option_id: "test-pricing-cpm"
|
|
65
|
+
pricing_model: "cpm"
|
|
66
|
+
rate: 5.00
|
|
67
|
+
currency: "USD"
|
|
68
|
+
|
|
69
|
+
phases:
|
|
70
|
+
- id: discover_verifier
|
|
71
|
+
title: "Discover the verifier allowlist"
|
|
72
|
+
narrative: |
|
|
73
|
+
The buyer reads creative_policy.accepted_verifiers from get_products
|
|
74
|
+
before submitting the creative, so it can reference an on-list verifier
|
|
75
|
+
in provenance metadata.
|
|
76
|
+
|
|
77
|
+
steps:
|
|
78
|
+
- id: get_products_with_accepted_verifiers
|
|
79
|
+
title: "Read accepted_verifiers from creative_policy"
|
|
80
|
+
task: get_products
|
|
81
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
82
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
83
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
84
|
+
stateful: false
|
|
85
|
+
expected: |
|
|
86
|
+
Return the seeded product with creative_policy.accepted_verifiers
|
|
87
|
+
populated. Buyer reads the agent_url for use on its verify_agent
|
|
88
|
+
reference in the next phase.
|
|
89
|
+
sample_request:
|
|
90
|
+
buying_mode: "brief"
|
|
91
|
+
# Brief intentionally surfaces "Provenance Audit Observation" so
|
|
92
|
+
# brief-mode keyword scoring places the seeded fixture product at
|
|
93
|
+
# products[0]. This mirrors the provenance_enforcement coupling; if
|
|
94
|
+
# the runner supports JSONPath predicates later, switch to wholesale
|
|
95
|
+
# mode plus product_id predicate matching.
|
|
96
|
+
brief: "Provenance audit-observation display inventory — verifier surfaces carve-out claims for audit"
|
|
97
|
+
brand:
|
|
98
|
+
domain: "acmeoutdoor.example"
|
|
99
|
+
account:
|
|
100
|
+
brand:
|
|
101
|
+
domain: "acmeoutdoor.example"
|
|
102
|
+
operator: "pinnacle-agency.example"
|
|
103
|
+
context:
|
|
104
|
+
correlation_id: "provenance_audit_observation--get_products"
|
|
105
|
+
validations:
|
|
106
|
+
- check: response_schema
|
|
107
|
+
description: "Response matches get-products-response.json schema"
|
|
108
|
+
- check: field_present
|
|
109
|
+
path: "products[0].creative_policy.accepted_verifiers[0].agent_url"
|
|
110
|
+
description: "Seller publishes at least one accepted verifier"
|
|
111
|
+
- check: field_value
|
|
112
|
+
path: "context.correlation_id"
|
|
113
|
+
value: "provenance_audit_observation--get_products"
|
|
114
|
+
description: "Context correlation_id returned unchanged"
|
|
115
|
+
|
|
116
|
+
- id: accept_carveout_claim
|
|
117
|
+
title: "Sync creative with audit-worthy carve-out claim"
|
|
118
|
+
narrative: |
|
|
119
|
+
The buyer submits AI-assisted creative and declares disclosure.required:
|
|
120
|
+
false because a human directed or edited the creative process. The seller
|
|
121
|
+
invokes the on-list verifier. The verifier's audit observation should be
|
|
122
|
+
retained for review, but the seller should not reject the creative solely because
|
|
123
|
+
OVERSIGHT_DISCLOSURE_CARVEOUT_CLAIMED is present.
|
|
124
|
+
|
|
125
|
+
steps:
|
|
126
|
+
- id: sync_creatives_carveout_claim
|
|
127
|
+
title: "Submit creative that carries an audit-worthy carve-out claim"
|
|
128
|
+
task: sync_creatives
|
|
129
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
130
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
131
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
132
|
+
stateful: true
|
|
133
|
+
expected: |
|
|
134
|
+
The seller invokes get_creative_features against an on-list verifier,
|
|
135
|
+
receives the verifier's OVERSIGHT_DISCLOSURE_CARVEOUT_CLAIMED audit
|
|
136
|
+
observation, and accepts the creative. Per-creative result: action
|
|
137
|
+
created or updated; no PROVENANCE_CLAIM_CONTRADICTED error.
|
|
138
|
+
sample_request:
|
|
139
|
+
account:
|
|
140
|
+
brand:
|
|
141
|
+
domain: "acmeoutdoor.example"
|
|
142
|
+
operator: "pinnacle-agency.example"
|
|
143
|
+
creatives:
|
|
144
|
+
- creative_id: "acme_provenance_audit_directed_001"
|
|
145
|
+
name: "Acme provenance audit observation probe — directed"
|
|
146
|
+
format_id:
|
|
147
|
+
agent_url: "https://your-platform.example.com"
|
|
148
|
+
id: "display_300x250"
|
|
149
|
+
assets:
|
|
150
|
+
headline:
|
|
151
|
+
asset_type: "text"
|
|
152
|
+
content: "Outdoor gear designed with expert guidance"
|
|
153
|
+
image:
|
|
154
|
+
asset_type: "image"
|
|
155
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/ai-generated-true.jpg"
|
|
156
|
+
width: 300
|
|
157
|
+
height: 250
|
|
158
|
+
click_url:
|
|
159
|
+
asset_type: "url"
|
|
160
|
+
url: "https://acmeoutdoor.example/spring"
|
|
161
|
+
provenance:
|
|
162
|
+
digital_source_type: "composite_with_trained_algorithmic_media"
|
|
163
|
+
ai_tool:
|
|
164
|
+
name: "Acme Creative Assist"
|
|
165
|
+
provider: "Acme Outdoor"
|
|
166
|
+
human_oversight: "directed"
|
|
167
|
+
declared_by:
|
|
168
|
+
role: "agency"
|
|
169
|
+
disclosure:
|
|
170
|
+
required: false
|
|
171
|
+
embedded_provenance:
|
|
172
|
+
- method: "provenance_markers"
|
|
173
|
+
provider: "Encypher"
|
|
174
|
+
verify_agent:
|
|
175
|
+
agent_url: "https://governance.encypher.seller.example"
|
|
176
|
+
feature_id: "ai_generated"
|
|
177
|
+
- creative_id: "acme_provenance_audit_edited_001"
|
|
178
|
+
name: "Acme provenance audit observation probe — edited"
|
|
179
|
+
format_id:
|
|
180
|
+
agent_url: "https://your-platform.example.com"
|
|
181
|
+
id: "display_300x250"
|
|
182
|
+
assets:
|
|
183
|
+
headline:
|
|
184
|
+
asset_type: "text"
|
|
185
|
+
content: "Outdoor gear refined with expert guidance"
|
|
186
|
+
image:
|
|
187
|
+
asset_type: "image"
|
|
188
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/ai-generated-true.jpg"
|
|
189
|
+
width: 300
|
|
190
|
+
height: 250
|
|
191
|
+
click_url:
|
|
192
|
+
asset_type: "url"
|
|
193
|
+
url: "https://acmeoutdoor.example/spring"
|
|
194
|
+
provenance:
|
|
195
|
+
digital_source_type: "composite_with_trained_algorithmic_media"
|
|
196
|
+
ai_tool:
|
|
197
|
+
name: "Acme Creative Assist"
|
|
198
|
+
provider: "Acme Outdoor"
|
|
199
|
+
human_oversight: "edited"
|
|
200
|
+
declared_by:
|
|
201
|
+
role: "agency"
|
|
202
|
+
disclosure:
|
|
203
|
+
required: false
|
|
204
|
+
embedded_provenance:
|
|
205
|
+
- method: "provenance_markers"
|
|
206
|
+
provider: "Encypher"
|
|
207
|
+
verify_agent:
|
|
208
|
+
agent_url: "https://governance.encypher.seller.example"
|
|
209
|
+
feature_id: "ai_generated"
|
|
210
|
+
idempotency_key: "$generate:uuid_v4#provenance_audit_observation_accept_carveout_sync"
|
|
211
|
+
context:
|
|
212
|
+
correlation_id: "provenance_audit_observation--accept_carveout"
|
|
213
|
+
validations:
|
|
214
|
+
- check: response_schema
|
|
215
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
216
|
+
- check: field_value
|
|
217
|
+
path: "creatives[0].action"
|
|
218
|
+
allowed_values: ["created", "updated"]
|
|
219
|
+
description: "Directed per-creative action is created or updated because the audit observation is non-blocking"
|
|
220
|
+
- check: field_absent
|
|
221
|
+
path: "creatives[0].errors[0].code"
|
|
222
|
+
description: "Directed creative has no rejection code solely for the audit-worthy carve-out claim"
|
|
223
|
+
- check: field_value
|
|
224
|
+
path: "creatives[1].action"
|
|
225
|
+
allowed_values: ["created", "updated"]
|
|
226
|
+
description: "Edited per-creative action is created or updated because the audit observation is non-blocking"
|
|
227
|
+
- check: field_absent
|
|
228
|
+
path: "creatives[1].errors[0].code"
|
|
229
|
+
description: "Edited creative has no rejection code solely for the audit-worthy carve-out claim"
|
|
230
|
+
- check: field_value
|
|
231
|
+
path: "context.correlation_id"
|
|
232
|
+
value: "provenance_audit_observation--accept_carveout"
|
|
233
|
+
description: "Context correlation_id returned unchanged"
|
|
234
|
+
- check: upstream_traffic
|
|
235
|
+
description: "Seller invoked an upstream verifier with the submitted directed carve-out claim"
|
|
236
|
+
min_count: 1
|
|
237
|
+
endpoint_pattern: "POST *"
|
|
238
|
+
payload_must_contain:
|
|
239
|
+
- path: "creative_manifest.provenance.human_oversight"
|
|
240
|
+
match: equals
|
|
241
|
+
value: "directed"
|
|
242
|
+
- path: "creative_manifest.provenance.disclosure.required"
|
|
243
|
+
match: equals
|
|
244
|
+
value: false
|
|
245
|
+
- check: upstream_traffic
|
|
246
|
+
description: "Seller invoked an upstream verifier with the submitted edited carve-out claim"
|
|
247
|
+
min_count: 1
|
|
248
|
+
endpoint_pattern: "POST *"
|
|
249
|
+
payload_must_contain:
|
|
250
|
+
- path: "creative_manifest.provenance.human_oversight"
|
|
251
|
+
match: equals
|
|
252
|
+
value: "edited"
|
|
253
|
+
- path: "creative_manifest.provenance.disclosure.required"
|
|
254
|
+
match: equals
|
|
255
|
+
value: false
|
|
256
|
+
|
|
257
|
+
- id: query_directed_audit_observation
|
|
258
|
+
title: "Assert directed carve-out audit observation"
|
|
259
|
+
task: comply_test_controller
|
|
260
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
261
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
262
|
+
doc_ref: "/building/implementation/comply-test-controller"
|
|
263
|
+
stateful: true
|
|
264
|
+
expected: |
|
|
265
|
+
The sandbox controller returns the audit observation recorded for the
|
|
266
|
+
accepted directed creative. Public seller responses are not required
|
|
267
|
+
to expose this internal audit log.
|
|
268
|
+
sample_request:
|
|
269
|
+
account:
|
|
270
|
+
sandbox: true
|
|
271
|
+
scenario: "query_provenance_audit_observations"
|
|
272
|
+
params:
|
|
273
|
+
creative_id: "acme_provenance_audit_directed_001"
|
|
274
|
+
context:
|
|
275
|
+
correlation_id: "provenance_audit_observation--query_directed"
|
|
276
|
+
validations:
|
|
277
|
+
- check: response_schema
|
|
278
|
+
description: "Response matches comply-test-controller-response.json schema"
|
|
279
|
+
- check: field_value
|
|
280
|
+
path: "success"
|
|
281
|
+
allowed_values: [true]
|
|
282
|
+
description: "Controller returned the creative's audit observations"
|
|
283
|
+
- check: field_value
|
|
284
|
+
path: "audit_observations[0].code"
|
|
285
|
+
value: "OVERSIGHT_DISCLOSURE_CARVEOUT_CLAIMED"
|
|
286
|
+
description: "Directed carve-out claim is surfaced as the standardized audit observation"
|
|
287
|
+
- check: field_value
|
|
288
|
+
path: "audit_observations[0].details.claimed_value.human_oversight"
|
|
289
|
+
value: "directed"
|
|
290
|
+
description: "Observation records the directed human_oversight claim"
|
|
291
|
+
- check: field_value
|
|
292
|
+
path: "audit_observations[0].details.claimed_value.disclosure_required"
|
|
293
|
+
value: false
|
|
294
|
+
description: "Observation records the disclosure.required false claim"
|
|
295
|
+
|
|
296
|
+
- id: query_edited_audit_observation
|
|
297
|
+
title: "Assert edited carve-out audit observation"
|
|
298
|
+
task: comply_test_controller
|
|
299
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
300
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
301
|
+
doc_ref: "/building/implementation/comply-test-controller"
|
|
302
|
+
stateful: true
|
|
303
|
+
expected: |
|
|
304
|
+
The sandbox controller returns the audit observation recorded for the
|
|
305
|
+
accepted edited creative, exercising the second documented
|
|
306
|
+
human_oversight value.
|
|
307
|
+
sample_request:
|
|
308
|
+
account:
|
|
309
|
+
sandbox: true
|
|
310
|
+
scenario: "query_provenance_audit_observations"
|
|
311
|
+
params:
|
|
312
|
+
creative_id: "acme_provenance_audit_edited_001"
|
|
313
|
+
context:
|
|
314
|
+
correlation_id: "provenance_audit_observation--query_edited"
|
|
315
|
+
validations:
|
|
316
|
+
- check: response_schema
|
|
317
|
+
description: "Response matches comply-test-controller-response.json schema"
|
|
318
|
+
- check: field_value
|
|
319
|
+
path: "success"
|
|
320
|
+
allowed_values: [true]
|
|
321
|
+
description: "Controller returned the creative's audit observations"
|
|
322
|
+
- check: field_value
|
|
323
|
+
path: "audit_observations[0].code"
|
|
324
|
+
value: "OVERSIGHT_DISCLOSURE_CARVEOUT_CLAIMED"
|
|
325
|
+
description: "Edited carve-out claim is surfaced as the standardized audit observation"
|
|
326
|
+
- check: field_value
|
|
327
|
+
path: "audit_observations[0].details.claimed_value.human_oversight"
|
|
328
|
+
value: "edited"
|
|
329
|
+
description: "Observation records the edited human_oversight claim"
|
|
330
|
+
- check: field_value
|
|
331
|
+
path: "audit_observations[0].details.claimed_value.disclosure_required"
|
|
332
|
+
value: false
|
|
333
|
+
description: "Observation records the disclosure.required false claim"
|