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