@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.
Files changed (305) hide show
  1. package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
  2. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  3. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
  4. package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
  5. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
  6. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
  7. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  8. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
  9. package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
  10. package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
  11. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  12. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
  13. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  14. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
  15. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  16. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  17. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  18. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  19. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
  20. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
  21. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
  22. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  23. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  24. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  25. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
  26. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
  27. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
  28. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  29. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
  30. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  31. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  32. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
  33. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  34. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  35. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  36. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  37. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  38. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  39. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  40. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
  41. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  42. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  43. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  44. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  45. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  46. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  47. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  48. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
  49. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  50. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  51. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  52. package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
  53. package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
  54. package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
  55. package/compliance/cache/3.1.0-rc.2/index.json +356 -0
  56. package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
  57. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  58. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
  59. package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
  60. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
  61. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
  62. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  63. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
  64. package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
  65. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
  66. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  67. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
  68. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  69. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
  70. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  71. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  72. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  73. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  74. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
  75. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
  76. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
  77. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  78. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  79. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  80. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
  81. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
  82. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
  83. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  84. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
  85. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  86. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  87. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
  88. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  89. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  90. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  91. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  92. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  93. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  94. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  95. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
  96. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  97. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  98. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  99. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  100. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  101. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  102. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  103. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  104. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  105. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  106. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  107. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
  108. package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
  109. package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
  110. package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
  111. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
  112. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
  113. package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
  114. package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
  115. package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
  116. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
  117. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
  118. package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
  119. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
  120. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
  121. package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
  122. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
  123. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
  124. package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
  125. package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
  126. package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
  127. package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
  128. package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
  129. package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
  130. package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
  131. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
  132. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
  133. package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
  134. package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
  135. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
  136. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
  137. package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
  138. package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
  139. package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
  140. package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
  141. package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
  142. package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
  143. package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
  144. package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
  145. package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
  146. package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
  147. package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
  148. package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
  149. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  150. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
  151. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  152. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  153. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  154. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  155. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  156. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  157. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  158. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  159. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  160. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
  161. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
  162. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
  163. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  164. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  165. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  166. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  167. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  168. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  169. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  170. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  171. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  172. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  173. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  174. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  175. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  176. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  177. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  178. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  179. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  180. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  181. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  182. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  183. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  184. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  185. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  186. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  187. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  188. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  189. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  190. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
  191. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  192. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  193. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  194. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  195. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  196. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  197. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  198. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  199. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  200. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  201. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  202. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  203. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
  204. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
  205. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  206. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  207. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  208. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  209. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  210. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  211. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  212. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  213. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  214. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  215. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  216. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  217. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  218. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  219. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  220. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  221. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  222. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  223. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  224. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  225. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  226. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  227. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  228. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  229. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  230. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  231. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  232. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  233. package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
  234. package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
  235. package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
  236. package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
  237. package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
  238. package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
  239. package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
  240. package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
  241. package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
  242. package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
  243. package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
  244. package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
  245. package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
  246. package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
  247. package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
  248. package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
  249. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
  250. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
  251. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
  252. package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
  253. package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
  254. package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
  255. package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
  256. package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
  257. package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
  258. package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
  259. package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
  260. package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
  261. package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
  262. package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
  263. package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
  264. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
  265. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
  266. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
  267. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
  268. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
  269. package/dist/lib/index.d.ts +1 -1
  270. package/dist/lib/index.d.ts.map +1 -1
  271. package/dist/lib/index.js +9 -5
  272. package/dist/lib/index.js.map +1 -1
  273. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  274. package/dist/lib/testing/storyboard/default-invariants.js +30 -1
  275. package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
  276. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  277. package/dist/lib/testing/storyboard/runner.js +84 -21
  278. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  279. package/dist/lib/testing/storyboard/types.d.ts +21 -0
  280. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  281. package/dist/lib/testing/storyboard/types.js.map +1 -1
  282. package/dist/lib/testing/types.d.ts +9 -0
  283. package/dist/lib/testing/types.d.ts.map +1 -1
  284. package/dist/lib/types/schemas.generated.d.ts +6707 -12040
  285. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  286. package/dist/lib/types/schemas.generated.js +1 -1
  287. package/dist/lib/types/schemas.generated.js.map +1 -1
  288. package/dist/lib/utils/signal-id-builders.d.ts +19 -0
  289. package/dist/lib/utils/signal-id-builders.d.ts.map +1 -1
  290. package/dist/lib/utils/signal-id-builders.js +30 -0
  291. package/dist/lib/utils/signal-id-builders.js.map +1 -1
  292. package/dist/lib/utils/tool-request-schemas.d.ts.map +1 -1
  293. package/dist/lib/utils/tool-request-schemas.js +3 -0
  294. package/dist/lib/utils/tool-request-schemas.js.map +1 -1
  295. package/dist/lib/v2/projection/constants.d.ts +28 -0
  296. package/dist/lib/v2/projection/constants.d.ts.map +1 -0
  297. package/dist/lib/v2/projection/constants.js +31 -0
  298. package/dist/lib/v2/projection/constants.js.map +1 -0
  299. package/dist/lib/v2/projection/registry.d.ts.map +1 -1
  300. package/dist/lib/v2/projection/registry.js +9 -4
  301. package/dist/lib/v2/projection/registry.js.map +1 -1
  302. package/dist/lib/version.d.ts +3 -3
  303. package/dist/lib/version.js +3 -3
  304. package/package.json +1 -1
  305. 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"