@adcp/sdk 7.10.2 → 7.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/index.json +356 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
- package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
- package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
- package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
- package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
- package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
- package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
- package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
- package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
- package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
- package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
- package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +9 -5
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/testing/storyboard/default-invariants.js +30 -1
- package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +84 -21
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +21 -0
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/types.js.map +1 -1
- package/dist/lib/testing/types.d.ts +9 -0
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.d.ts +6707 -12040
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +1 -1
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/utils/signal-id-builders.d.ts +19 -0
- package/dist/lib/utils/signal-id-builders.d.ts.map +1 -1
- package/dist/lib/utils/signal-id-builders.js +30 -0
- package/dist/lib/utils/signal-id-builders.js.map +1 -1
- package/dist/lib/utils/tool-request-schemas.d.ts.map +1 -1
- package/dist/lib/utils/tool-request-schemas.js +3 -0
- package/dist/lib/utils/tool-request-schemas.js.map +1 -1
- package/dist/lib/v2/projection/constants.d.ts +28 -0
- package/dist/lib/v2/projection/constants.d.ts.map +1 -0
- package/dist/lib/v2/projection/constants.js +31 -0
- package/dist/lib/v2/projection/constants.js.map +1 -0
- package/dist/lib/v2/projection/registry.d.ts.map +1 -1
- package/dist/lib/v2/projection/registry.js +9 -4
- package/dist/lib/v2/projection/registry.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
- package/skills/SHAPE-GOTCHAS.md +5 -0
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
id: media_buy_seller/provenance_enforcement
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller enforces provenance_requirements on sync_creatives"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Seller publishes provenance_requirements + accepted_verifiers on a product. Four structural rejections (no provenance, missing digital_source_type, off-list verifier, missing disclosure), then a corrected resubmission with on-list verifier is accepted."
|
|
6
|
+
track: creative
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- sync_creatives
|
|
10
|
+
|
|
11
|
+
narrative: |
|
|
12
|
+
creative_policy carries three load-bearing fields for provenance enforcement:
|
|
13
|
+
provenance_required (some provenance must be attached), provenance_requirements
|
|
14
|
+
(which fields must be present), and accepted_verifiers (which governance agents
|
|
15
|
+
the seller will call). The contract is three steps: the seller publishes via
|
|
16
|
+
get_products, the buyer represents on sync_creatives by attaching matching
|
|
17
|
+
provenance + an on-list verify_agent, and the seller confirms by structurally
|
|
18
|
+
cross-checking the submission and (when applicable) calling an on-list agent.
|
|
19
|
+
|
|
20
|
+
This scenario walks the structural-rejection contract end to end across the
|
|
21
|
+
PROVENANCE_* family. Phase 1: discover a product whose creative_policy declares
|
|
22
|
+
the requirements + accepted_verifiers. Phase 2: submit a creative with no
|
|
23
|
+
provenance object at all → PROVENANCE_REQUIRED. Phase 3: submit with provenance
|
|
24
|
+
but no digital_source_type → PROVENANCE_DIGITAL_SOURCE_TYPE_MISSING. Phase 4:
|
|
25
|
+
point verify_agent at a URL outside accepted_verifiers → PROVENANCE_VERIFIER_NOT_ACCEPTED
|
|
26
|
+
(the seller MUST cross-check before any outbound call, closing the buyer-
|
|
27
|
+
controlled-URL trust gap). Phase 5: provenance present with on-list verifier
|
|
28
|
+
but no disclosure block → PROVENANCE_DISCLOSURE_MISSING. Phase 6: corrected
|
|
29
|
+
submission with disclosure and on-list verify_agent — accepted.
|
|
30
|
+
|
|
31
|
+
The truth-of-claim contract (PROVENANCE_CLAIM_CONTRADICTED, surfaced via
|
|
32
|
+
get_creative_features when the on-list verifier returns a result that contradicts
|
|
33
|
+
the buyer's claim) is a separate scenario; this one tests only the structural
|
|
34
|
+
surface a buyer's orchestrator can self-correct against without negotiating with
|
|
35
|
+
the seller.
|
|
36
|
+
|
|
37
|
+
agent:
|
|
38
|
+
interaction_model: stateful_push
|
|
39
|
+
capabilities:
|
|
40
|
+
- has_creative_library
|
|
41
|
+
examples:
|
|
42
|
+
- "Publishers and SSPs that require AI disclosure metadata for EU AI Act / CA SB 942 compliance"
|
|
43
|
+
|
|
44
|
+
caller:
|
|
45
|
+
role: buyer_agent
|
|
46
|
+
example: "Pinnacle Agency (buyer)"
|
|
47
|
+
|
|
48
|
+
prerequisites:
|
|
49
|
+
description: |
|
|
50
|
+
Seller publishes at least one product whose creative_policy carries
|
|
51
|
+
provenance_required: true and provenance_requirements.require_disclosure_metadata: true.
|
|
52
|
+
The buyer discovers the product via get_products and reads the requirement before
|
|
53
|
+
submitting creatives.
|
|
54
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
55
|
+
controller_seeding: true
|
|
56
|
+
|
|
57
|
+
fixtures:
|
|
58
|
+
products:
|
|
59
|
+
- product_id: "test-product-disclosure-required"
|
|
60
|
+
name: "Provenance Enforcement Test Product"
|
|
61
|
+
description: "Sandbox display inventory exercising AI disclosure provenance enforcement and accepted verifier allowlist"
|
|
62
|
+
delivery_type: "non_guaranteed"
|
|
63
|
+
channels: ["display"]
|
|
64
|
+
creative_policy:
|
|
65
|
+
co_branding: "optional"
|
|
66
|
+
landing_page: "any"
|
|
67
|
+
templates_available: false
|
|
68
|
+
provenance_required: true
|
|
69
|
+
provenance_requirements:
|
|
70
|
+
require_digital_source_type: true
|
|
71
|
+
require_disclosure_metadata: true
|
|
72
|
+
accepted_verifiers:
|
|
73
|
+
- agent_url: "https://governance.encypher.seller.example"
|
|
74
|
+
feature_id: "encypher.markers_present_v2"
|
|
75
|
+
providers: ["Encypher"]
|
|
76
|
+
pricing_options:
|
|
77
|
+
- pricing_option_id: "test-pricing-cpm"
|
|
78
|
+
pricing_model: "cpm"
|
|
79
|
+
rate: 5.00
|
|
80
|
+
currency: "USD"
|
|
81
|
+
|
|
82
|
+
phases:
|
|
83
|
+
- id: discover_requirement
|
|
84
|
+
title: "Discover the disclosure requirement"
|
|
85
|
+
narrative: |
|
|
86
|
+
The buyer calls get_products and inspects the returned product's creative_policy.
|
|
87
|
+
An orchestrator that reads provenance_requirements upfront can pre-flight the
|
|
88
|
+
creative shape before paying the round-trip cost of a rejection.
|
|
89
|
+
|
|
90
|
+
steps:
|
|
91
|
+
- id: get_products_with_disclosure_policy
|
|
92
|
+
title: "Read provenance_requirements and accepted_verifiers from creative_policy"
|
|
93
|
+
task: get_products
|
|
94
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
95
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
96
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
97
|
+
stateful: false
|
|
98
|
+
expected: |
|
|
99
|
+
Return the seeded product with creative_policy.provenance_required: true,
|
|
100
|
+
creative_policy.provenance_requirements.require_disclosure_metadata: true,
|
|
101
|
+
and creative_policy.accepted_verifiers populated with at least one entry,
|
|
102
|
+
so the buyer's orchestrator can read both the structural requirement and
|
|
103
|
+
the seller's verifier allowlist before submission.
|
|
104
|
+
sample_request:
|
|
105
|
+
buying_mode: "brief"
|
|
106
|
+
# Brief intentionally surfaces "Provenance Enforcement" so brief-mode
|
|
107
|
+
# keyword scoring places the seeded fixture product (which carries
|
|
108
|
+
# creative_policy.{provenance_required, provenance_requirements,
|
|
109
|
+
# accepted_verifiers}) at products[0]. This is a known coupling
|
|
110
|
+
# between the storyboard and brief-mode scoring; if the runner ever
|
|
111
|
+
# supports JSONPath predicates (`products[?(@.product_id=='...')]`),
|
|
112
|
+
# switch to wholesale mode + a predicate path so the assertion
|
|
113
|
+
# doesn't depend on scoring weights.
|
|
114
|
+
brief: "Provenance Enforcement display inventory — AI disclosure metadata required, accepted verifier allowlist published"
|
|
115
|
+
brand:
|
|
116
|
+
domain: "acmeoutdoor.example"
|
|
117
|
+
account:
|
|
118
|
+
brand:
|
|
119
|
+
domain: "acmeoutdoor.example"
|
|
120
|
+
operator: "pinnacle-agency.example"
|
|
121
|
+
context:
|
|
122
|
+
correlation_id: "provenance_enforcement--get_products"
|
|
123
|
+
validations:
|
|
124
|
+
- check: response_schema
|
|
125
|
+
description: "Response matches get-products-response.json schema"
|
|
126
|
+
- check: field_value
|
|
127
|
+
path: "products[0].creative_policy.provenance_required"
|
|
128
|
+
value: true
|
|
129
|
+
description: "Seller declares provenance_required on the product"
|
|
130
|
+
- check: field_value
|
|
131
|
+
path: "products[0].creative_policy.provenance_requirements.require_disclosure_metadata"
|
|
132
|
+
value: true
|
|
133
|
+
description: "Seller declares require_disclosure_metadata as a structural requirement"
|
|
134
|
+
- check: field_present
|
|
135
|
+
path: "products[0].creative_policy.accepted_verifiers[0].agent_url"
|
|
136
|
+
description: "Seller publishes at least one accepted verifier so buyers can represent against it"
|
|
137
|
+
- check: field_value
|
|
138
|
+
path: "context.correlation_id"
|
|
139
|
+
value: "provenance_enforcement--get_products"
|
|
140
|
+
description: "Context correlation_id returned unchanged"
|
|
141
|
+
|
|
142
|
+
- id: reject_no_provenance
|
|
143
|
+
title: "Sync with no provenance object — rejected"
|
|
144
|
+
narrative: |
|
|
145
|
+
The buyer submits a creative with no provenance object anywhere on
|
|
146
|
+
the manifest. Because the seller's creative_policy.provenance_required
|
|
147
|
+
is true, the seller MUST reject the per-creative entry with
|
|
148
|
+
PROVENANCE_REQUIRED. This is the cheapest, most likely buyer mistake:
|
|
149
|
+
the orchestrator forgot to attach provenance at all.
|
|
150
|
+
|
|
151
|
+
steps:
|
|
152
|
+
- id: sync_creatives_no_provenance
|
|
153
|
+
title: "Submit creative with no provenance object"
|
|
154
|
+
task: sync_creatives
|
|
155
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
156
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
157
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
158
|
+
stateful: true
|
|
159
|
+
expected: |
|
|
160
|
+
The seller accepts the request envelope but rejects the per-creative
|
|
161
|
+
entry with action: failed and an error code PROVENANCE_REQUIRED.
|
|
162
|
+
sample_request:
|
|
163
|
+
account:
|
|
164
|
+
brand:
|
|
165
|
+
domain: "acmeoutdoor.example"
|
|
166
|
+
operator: "pinnacle-agency.example"
|
|
167
|
+
creatives:
|
|
168
|
+
- creative_id: "acme_no_provenance_probe_001"
|
|
169
|
+
name: "Acme no-provenance probe"
|
|
170
|
+
format_id:
|
|
171
|
+
agent_url: "https://your-platform.example.com"
|
|
172
|
+
id: "display_300x250"
|
|
173
|
+
assets:
|
|
174
|
+
headline:
|
|
175
|
+
asset_type: "text"
|
|
176
|
+
content: "Outdoor gear, photographed live"
|
|
177
|
+
image:
|
|
178
|
+
asset_type: "image"
|
|
179
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero.jpg"
|
|
180
|
+
width: 300
|
|
181
|
+
height: 250
|
|
182
|
+
click_url:
|
|
183
|
+
asset_type: "url"
|
|
184
|
+
url: "https://acmeoutdoor.example/spring"
|
|
185
|
+
idempotency_key: "$generate:uuid_v4#provenance_enforcement_reject_no_provenance_sync"
|
|
186
|
+
context:
|
|
187
|
+
correlation_id: "provenance_enforcement--reject_no_provenance"
|
|
188
|
+
validations:
|
|
189
|
+
- check: response_schema
|
|
190
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
191
|
+
- check: field_value
|
|
192
|
+
path: "creatives[0].action"
|
|
193
|
+
value: "failed"
|
|
194
|
+
description: "Per-creative action is failed for the no-provenance submission"
|
|
195
|
+
# Per-creative error assertions read errors[0].code positionally.
|
|
196
|
+
# The handler emits errors in the cascade order documented on
|
|
197
|
+
# enforceProvenancePolicy (PROVENANCE_REQUIRED first), so [0] is
|
|
198
|
+
# stable. If a future implementation accumulates errors, the same
|
|
199
|
+
# cascade priority should drive the array order.
|
|
200
|
+
- check: field_value
|
|
201
|
+
path: "creatives[0].errors[0].code"
|
|
202
|
+
value: "PROVENANCE_REQUIRED"
|
|
203
|
+
description: "Per-creative error code is PROVENANCE_REQUIRED — provenance object absent on a creative under a policy that requires it"
|
|
204
|
+
- check: field_value
|
|
205
|
+
path: "context.correlation_id"
|
|
206
|
+
value: "provenance_enforcement--reject_no_provenance"
|
|
207
|
+
description: "Context correlation_id returned unchanged on rejection"
|
|
208
|
+
|
|
209
|
+
- id: reject_missing_digital_source_type
|
|
210
|
+
title: "Sync with provenance but no digital_source_type — rejected"
|
|
211
|
+
narrative: |
|
|
212
|
+
The buyer's provenance object is present but omits digital_source_type.
|
|
213
|
+
The seller's creative_policy.provenance_requirements.require_digital_source_type
|
|
214
|
+
is true, so the seller MUST reject the per-creative entry with
|
|
215
|
+
PROVENANCE_DIGITAL_SOURCE_TYPE_MISSING. Distinct from PROVENANCE_REQUIRED
|
|
216
|
+
(no provenance at all) — provenance is present, just missing this field.
|
|
217
|
+
|
|
218
|
+
steps:
|
|
219
|
+
- id: sync_creatives_no_digital_source_type
|
|
220
|
+
title: "Submit creative with provenance but no digital_source_type"
|
|
221
|
+
task: sync_creatives
|
|
222
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
223
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
224
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
225
|
+
stateful: true
|
|
226
|
+
expected: |
|
|
227
|
+
The seller accepts the request envelope but rejects the per-creative
|
|
228
|
+
entry with action: failed and an error code
|
|
229
|
+
PROVENANCE_DIGITAL_SOURCE_TYPE_MISSING.
|
|
230
|
+
sample_request:
|
|
231
|
+
account:
|
|
232
|
+
brand:
|
|
233
|
+
domain: "acmeoutdoor.example"
|
|
234
|
+
operator: "pinnacle-agency.example"
|
|
235
|
+
creatives:
|
|
236
|
+
- creative_id: "acme_no_dst_probe_001"
|
|
237
|
+
name: "Acme no-digital_source_type probe"
|
|
238
|
+
format_id:
|
|
239
|
+
agent_url: "https://your-platform.example.com"
|
|
240
|
+
id: "display_300x250"
|
|
241
|
+
assets:
|
|
242
|
+
headline:
|
|
243
|
+
asset_type: "text"
|
|
244
|
+
content: "Outdoor gear, photographed live"
|
|
245
|
+
image:
|
|
246
|
+
asset_type: "image"
|
|
247
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero.jpg"
|
|
248
|
+
width: 300
|
|
249
|
+
height: 250
|
|
250
|
+
click_url:
|
|
251
|
+
asset_type: "url"
|
|
252
|
+
url: "https://acmeoutdoor.example/spring"
|
|
253
|
+
provenance:
|
|
254
|
+
# Provenance present, but digital_source_type intentionally absent
|
|
255
|
+
# so the require_digital_source_type policy gate fires.
|
|
256
|
+
declared_by:
|
|
257
|
+
role: "agency"
|
|
258
|
+
idempotency_key: "$generate:uuid_v4#provenance_enforcement_reject_no_dst_sync"
|
|
259
|
+
context:
|
|
260
|
+
correlation_id: "provenance_enforcement--reject_no_digital_source_type"
|
|
261
|
+
validations:
|
|
262
|
+
- check: response_schema
|
|
263
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
264
|
+
- check: field_value
|
|
265
|
+
path: "creatives[0].action"
|
|
266
|
+
value: "failed"
|
|
267
|
+
description: "Per-creative action is failed for the no-digital_source_type submission"
|
|
268
|
+
- check: field_value
|
|
269
|
+
path: "creatives[0].errors[0].code"
|
|
270
|
+
value: "PROVENANCE_DIGITAL_SOURCE_TYPE_MISSING"
|
|
271
|
+
description: "Per-creative error code identifies the missing digital_source_type field"
|
|
272
|
+
- check: field_value
|
|
273
|
+
path: "context.correlation_id"
|
|
274
|
+
value: "provenance_enforcement--reject_no_digital_source_type"
|
|
275
|
+
description: "Context correlation_id returned unchanged on rejection"
|
|
276
|
+
|
|
277
|
+
- id: reject_off_list_verifier
|
|
278
|
+
title: "Sync with off-list verify_agent — rejected"
|
|
279
|
+
narrative: |
|
|
280
|
+
The buyer attaches a verify_agent.agent_url that is not on the seller's
|
|
281
|
+
accepted_verifiers list. The seller MUST cross-check the URL before any
|
|
282
|
+
outbound call and reject the per-creative entry with
|
|
283
|
+
PROVENANCE_VERIFIER_NOT_ACCEPTED. This closes the buyer-controlled-URL
|
|
284
|
+
trust gap: the seller does not call buyer-asserted endpoints outside its
|
|
285
|
+
allowlist. The buyer self-corrects by replacing verify_agent.agent_url
|
|
286
|
+
with one drawn from the published accepted_verifiers list.
|
|
287
|
+
|
|
288
|
+
steps:
|
|
289
|
+
- id: sync_creatives_off_list_verifier
|
|
290
|
+
title: "Submit creative pointing at an off-list verifier"
|
|
291
|
+
task: sync_creatives
|
|
292
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
293
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
294
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
295
|
+
stateful: true
|
|
296
|
+
expected: |
|
|
297
|
+
The seller accepts the request envelope but rejects the per-creative entry
|
|
298
|
+
with action: failed and an error carrying:
|
|
299
|
+
- code: PROVENANCE_VERIFIER_NOT_ACCEPTED
|
|
300
|
+
- field pointing at the offending verify_agent.agent_url path
|
|
301
|
+
- recovery: correctable
|
|
302
|
+
The seller MUST NOT call the off-list URL.
|
|
303
|
+
sample_request:
|
|
304
|
+
account:
|
|
305
|
+
brand:
|
|
306
|
+
domain: "acmeoutdoor.example"
|
|
307
|
+
operator: "pinnacle-agency.example"
|
|
308
|
+
creatives:
|
|
309
|
+
- creative_id: "acme_off_list_verifier_probe_001"
|
|
310
|
+
name: "Acme off-list verifier probe"
|
|
311
|
+
format_id:
|
|
312
|
+
agent_url: "https://your-platform.example.com"
|
|
313
|
+
id: "display_300x250"
|
|
314
|
+
assets:
|
|
315
|
+
headline:
|
|
316
|
+
asset_type: "text"
|
|
317
|
+
content: "Outdoor gear, photographed live"
|
|
318
|
+
image:
|
|
319
|
+
asset_type: "image"
|
|
320
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero.jpg"
|
|
321
|
+
width: 300
|
|
322
|
+
height: 250
|
|
323
|
+
click_url:
|
|
324
|
+
asset_type: "url"
|
|
325
|
+
url: "https://acmeoutdoor.example/spring"
|
|
326
|
+
provenance:
|
|
327
|
+
digital_source_type: "trained_algorithmic_media"
|
|
328
|
+
ai_tool:
|
|
329
|
+
name: "DALL-E 3"
|
|
330
|
+
provider: "OpenAI"
|
|
331
|
+
declared_by:
|
|
332
|
+
role: "agency"
|
|
333
|
+
disclosure:
|
|
334
|
+
required: true
|
|
335
|
+
jurisdictions:
|
|
336
|
+
- country: "US"
|
|
337
|
+
region: "CA"
|
|
338
|
+
regulation: "ca_sb_942"
|
|
339
|
+
label_text: "Created with AI"
|
|
340
|
+
embedded_provenance:
|
|
341
|
+
- method: "provenance_markers"
|
|
342
|
+
provider: "Encypher"
|
|
343
|
+
verify_agent:
|
|
344
|
+
agent_url: "https://attacker-controlled.example"
|
|
345
|
+
feature_id: "encypher.markers_present_v2"
|
|
346
|
+
idempotency_key: "$generate:uuid_v4#provenance_enforcement_reject_off_list_verifier_sync"
|
|
347
|
+
context:
|
|
348
|
+
correlation_id: "provenance_enforcement--reject_off_list_verifier"
|
|
349
|
+
validations:
|
|
350
|
+
- check: response_schema
|
|
351
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
352
|
+
- check: field_value
|
|
353
|
+
path: "creatives[0].action"
|
|
354
|
+
value: "failed"
|
|
355
|
+
description: "Per-creative action is failed for the off-list verifier submission"
|
|
356
|
+
- check: field_value
|
|
357
|
+
path: "creatives[0].errors[0].code"
|
|
358
|
+
value: "PROVENANCE_VERIFIER_NOT_ACCEPTED"
|
|
359
|
+
description: "Per-creative error code is PROVENANCE_VERIFIER_NOT_ACCEPTED — buyer-asserted URL was outside the seller's accepted_verifiers allowlist"
|
|
360
|
+
- check: field_value
|
|
361
|
+
path: "context.correlation_id"
|
|
362
|
+
value: "provenance_enforcement--reject_off_list_verifier"
|
|
363
|
+
description: "Context correlation_id returned unchanged on rejection"
|
|
364
|
+
|
|
365
|
+
- id: reject_missing_disclosure
|
|
366
|
+
title: "Sync without disclosure — rejected"
|
|
367
|
+
narrative: |
|
|
368
|
+
The buyer submits a creative whose provenance has digital_source_type but no
|
|
369
|
+
disclosure object. The seller MUST reject the per-creative entry with
|
|
370
|
+
PROVENANCE_DISCLOSURE_MISSING and error.field pointing at the resolved
|
|
371
|
+
provenance.disclosure path. This is the structural-rejection contract: the
|
|
372
|
+
seller does not need to call any verifier, only inspect the submitted
|
|
373
|
+
manifest against the published provenance_requirements.
|
|
374
|
+
|
|
375
|
+
steps:
|
|
376
|
+
- id: sync_creatives_missing_disclosure
|
|
377
|
+
title: "Submit creative with provenance but no disclosure"
|
|
378
|
+
task: sync_creatives
|
|
379
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
380
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
381
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
382
|
+
stateful: true
|
|
383
|
+
expected: |
|
|
384
|
+
The seller accepts the request envelope but rejects the per-creative entry
|
|
385
|
+
with action: failed and an error carrying:
|
|
386
|
+
- code: PROVENANCE_DISCLOSURE_MISSING
|
|
387
|
+
- field pointing at the missing disclosure path on the resolved manifest
|
|
388
|
+
- recovery: correctable
|
|
389
|
+
sample_request:
|
|
390
|
+
account:
|
|
391
|
+
brand:
|
|
392
|
+
domain: "acmeoutdoor.example"
|
|
393
|
+
operator: "pinnacle-agency.example"
|
|
394
|
+
creatives:
|
|
395
|
+
- creative_id: "acme_disclosure_probe_001"
|
|
396
|
+
name: "Acme disclosure probe — missing block"
|
|
397
|
+
format_id:
|
|
398
|
+
agent_url: "https://your-platform.example.com"
|
|
399
|
+
id: "display_300x250"
|
|
400
|
+
assets:
|
|
401
|
+
headline:
|
|
402
|
+
asset_type: "text"
|
|
403
|
+
content: "Outdoor gear, photographed live"
|
|
404
|
+
image:
|
|
405
|
+
asset_type: "image"
|
|
406
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero.jpg"
|
|
407
|
+
width: 300
|
|
408
|
+
height: 250
|
|
409
|
+
click_url:
|
|
410
|
+
asset_type: "url"
|
|
411
|
+
url: "https://acmeoutdoor.example/spring"
|
|
412
|
+
provenance:
|
|
413
|
+
digital_source_type: "trained_algorithmic_media"
|
|
414
|
+
ai_tool:
|
|
415
|
+
name: "DALL-E 3"
|
|
416
|
+
provider: "OpenAI"
|
|
417
|
+
declared_by:
|
|
418
|
+
role: "agency"
|
|
419
|
+
idempotency_key: "$generate:uuid_v4#provenance_enforcement_reject_missing_disclosure_sync"
|
|
420
|
+
context:
|
|
421
|
+
correlation_id: "provenance_enforcement--reject_missing_disclosure"
|
|
422
|
+
validations:
|
|
423
|
+
- check: response_schema
|
|
424
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
425
|
+
- check: field_value
|
|
426
|
+
path: "creatives[0].action"
|
|
427
|
+
value: "failed"
|
|
428
|
+
description: "Per-creative action is failed for the missing-disclosure submission"
|
|
429
|
+
- check: field_value
|
|
430
|
+
path: "creatives[0].errors[0].code"
|
|
431
|
+
value: "PROVENANCE_DISCLOSURE_MISSING"
|
|
432
|
+
description: "Per-creative error code identifies the missing disclosure requirement; buyers can self-correct without negotiating"
|
|
433
|
+
- check: field_value
|
|
434
|
+
path: "context.correlation_id"
|
|
435
|
+
value: "provenance_enforcement--reject_missing_disclosure"
|
|
436
|
+
description: "Context correlation_id returned unchanged on rejection"
|
|
437
|
+
|
|
438
|
+
- id: accept_with_disclosure
|
|
439
|
+
title: "Resync with disclosure and on-list verifier — accepted"
|
|
440
|
+
narrative: |
|
|
441
|
+
The buyer reads the rejection error codes from the prior phases, attaches a
|
|
442
|
+
complete disclosure block, and represents an on-list verifier (an entry from
|
|
443
|
+
the seller's accepted_verifiers). The seller's structural and verifier-allowlist
|
|
444
|
+
checks both pass; the creative enters the seller's review lifecycle.
|
|
445
|
+
|
|
446
|
+
steps:
|
|
447
|
+
- id: sync_creatives_with_disclosure
|
|
448
|
+
title: "Resubmit with disclosure metadata populated and an on-list verify_agent"
|
|
449
|
+
task: sync_creatives
|
|
450
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
451
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
452
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
453
|
+
stateful: true
|
|
454
|
+
expected: |
|
|
455
|
+
The seller accepts the corrected creative. The per-creative result has
|
|
456
|
+
action created or updated and a status from creative-status (processing,
|
|
457
|
+
pending_review, or approved).
|
|
458
|
+
sample_request:
|
|
459
|
+
account:
|
|
460
|
+
brand:
|
|
461
|
+
domain: "acmeoutdoor.example"
|
|
462
|
+
operator: "pinnacle-agency.example"
|
|
463
|
+
creatives:
|
|
464
|
+
- creative_id: "acme_disclosure_probe_001"
|
|
465
|
+
name: "Acme disclosure probe — disclosure attached, on-list verifier"
|
|
466
|
+
format_id:
|
|
467
|
+
agent_url: "https://your-platform.example.com"
|
|
468
|
+
id: "display_300x250"
|
|
469
|
+
assets:
|
|
470
|
+
headline:
|
|
471
|
+
asset_type: "text"
|
|
472
|
+
content: "Outdoor gear, photographed live"
|
|
473
|
+
image:
|
|
474
|
+
asset_type: "image"
|
|
475
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero.jpg"
|
|
476
|
+
width: 300
|
|
477
|
+
height: 250
|
|
478
|
+
click_url:
|
|
479
|
+
asset_type: "url"
|
|
480
|
+
url: "https://acmeoutdoor.example/spring"
|
|
481
|
+
provenance:
|
|
482
|
+
digital_source_type: "trained_algorithmic_media"
|
|
483
|
+
ai_tool:
|
|
484
|
+
name: "DALL-E 3"
|
|
485
|
+
provider: "OpenAI"
|
|
486
|
+
declared_by:
|
|
487
|
+
role: "agency"
|
|
488
|
+
disclosure:
|
|
489
|
+
required: true
|
|
490
|
+
jurisdictions:
|
|
491
|
+
- country: "US"
|
|
492
|
+
region: "CA"
|
|
493
|
+
regulation: "ca_sb_942"
|
|
494
|
+
label_text: "Created with AI"
|
|
495
|
+
- country: "DE"
|
|
496
|
+
regulation: "eu_ai_act_article_50"
|
|
497
|
+
label_text: "KI-generiert"
|
|
498
|
+
embedded_provenance:
|
|
499
|
+
- method: "provenance_markers"
|
|
500
|
+
provider: "Encypher"
|
|
501
|
+
verify_agent:
|
|
502
|
+
agent_url: "https://governance.encypher.seller.example"
|
|
503
|
+
feature_id: "encypher.markers_present_v2"
|
|
504
|
+
idempotency_key: "$generate:uuid_v4#provenance_enforcement_accept_with_disclosure_sync"
|
|
505
|
+
context:
|
|
506
|
+
correlation_id: "provenance_enforcement--accept_with_disclosure"
|
|
507
|
+
validations:
|
|
508
|
+
- check: response_schema
|
|
509
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
510
|
+
- check: field_value
|
|
511
|
+
path: "creatives[0].action"
|
|
512
|
+
allowed_values: ["created", "updated"]
|
|
513
|
+
description: "Per-creative action is created or updated — not failed. Tighter than field_present, which would silently pass on action: failed"
|
|
514
|
+
- check: field_value
|
|
515
|
+
path: "context.correlation_id"
|
|
516
|
+
value: "provenance_enforcement--accept_with_disclosure"
|
|
517
|
+
description: "Context correlation_id returned unchanged"
|