@adcp/sdk 7.11.0 → 7.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) 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/schemas-data/v2.5/_provenance.json +1 -1
  270. package/dist/lib/testing/storyboard/default-invariants.js +23 -0
  271. package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
  272. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  273. package/dist/lib/testing/storyboard/runner.js +84 -21
  274. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  275. package/dist/lib/testing/storyboard/types.d.ts +21 -0
  276. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  277. package/dist/lib/testing/storyboard/types.js.map +1 -1
  278. package/dist/lib/testing/types.d.ts +9 -0
  279. package/dist/lib/testing/types.d.ts.map +1 -1
  280. package/dist/lib/version.d.ts +3 -3
  281. package/dist/lib/version.js +3 -3
  282. package/package.json +1 -1
@@ -0,0 +1,800 @@
1
+ id: media_buy_seller/dependency_impairment_cardinality
2
+ version: "1.0.0"
3
+ title: "Dependency impairment cardinality — impairments[] tracks each offline resource independently"
4
+ category: media_buy_seller
5
+ summary: "Two creatives on two packages of the same buy. Rejects them sequentially and verifies impairments[] grows 0 → 1 → 2; recovers them sequentially via swap-assignment and verifies impairments[] shrinks 2 → 1 → 0. Pressure-tests the inverse rule under cardinality — a seller emitting any impairment entry rather than the right one fails."
6
+ track: media_buy
7
+ required_tools:
8
+ - get_products
9
+ - create_media_buy
10
+ - get_media_buys
11
+ - sync_creatives
12
+ - update_media_buy
13
+ - comply_test_controller
14
+
15
+ narrative: |
16
+ The base dependency_impairment scenario tests forward + inverse + health-iff
17
+ with one creative on one package — a malicious or buggy seller can pass the
18
+ inverse rule there by emitting any impairment entry whose resource_id
19
+ happens to match a known-rejected creative. This scenario pressure-tests
20
+ inverse-rule **cardinality**: the seller MUST emit the right number of
21
+ entries, each pointing at the right resource.
22
+
23
+ Five phases:
24
+
25
+ 1. **setup** — discover a product, create a buy with TWO packages, sync two
26
+ creatives (A bound to package_a, B bound to package_b), force both to
27
+ approved baseline. `impairments[]` is empty; `health: ok`.
28
+ 2. **reject_first** — force creative A to rejected. Read the buy: exactly
29
+ ONE impairment entry, resource_id A, package_ids contains package_a (NOT
30
+ package_b — the assertion fails if the seller incorrectly inflates the
31
+ scope).
32
+ 3. **reject_second** — force creative B to rejected. Read the buy: TWO
33
+ impairment entries (one per creative), each pointing at its own package.
34
+ The assertion fails if the seller emits one merged entry or a single
35
+ entry with both package_ids — package scope is per-resource, not
36
+ per-buy.
37
+ 4. **recover_first** — swap package_a's binding from A to a fresh
38
+ replacement C. Read the buy: ONE impairment entry remaining (B on
39
+ package_b only). Verifies the seller decrements correctly when an
40
+ impairment clears partially.
41
+ 5. **recover_second** — swap package_b's binding from B to a fresh
42
+ replacement D. Read the buy: impairments[] empty, health: ok.
43
+ Cardinality returns to zero.
44
+
45
+ Failure modes this catches that the single-creative scenario can't:
46
+
47
+ - Seller emits an impairment for A when only B is rejected (wrong
48
+ resource_id, right cardinality) — caught in phase 2 (asserts resource_id).
49
+ - Seller emits ONE impairment entry with package_ids: [package_a,
50
+ package_b] when both creatives are rejected — caught in phase 3 (asserts
51
+ exactly two entries).
52
+ - Seller decrements impairments[] all the way to empty when only ONE
53
+ creative recovers — caught in phase 4 (asserts one entry remains).
54
+ - Seller never decrements impairments[] on swap recovery — caught in both
55
+ recovery phases.
56
+
57
+ Capability gating mirrors the base scenario: sellers whose
58
+ `capabilities.media_buy.propagation_surfaces` does NOT include
59
+ `"snapshot"` grade this scenario not_applicable. Sellers declaring
60
+ `["snapshot", "webhook"]` are graded here on the snapshot surface.
61
+
62
+ agent:
63
+ interaction_model: media_buy_seller
64
+ capabilities:
65
+ - sells_media
66
+ - has_creative_library
67
+ examples:
68
+ - "Any media buy seller that exposes comply_test_controller and propagates per-resource impairments independently"
69
+
70
+ caller:
71
+ role: buyer_agent
72
+ example: "Pinnacle Agency (buyer)"
73
+
74
+ prerequisites:
75
+ description: |
76
+ Seller MUST expose comply_test_controller with force_creative_status,
77
+ accept buys with multiple packages, and support update_media_buy with
78
+ packages[].creative_assignments (replacement semantics). Sellers
79
+ without per-resource impairment cardinality (e.g., bundles all rejected
80
+ creatives into one impairment entry) fail this scenario — that's the
81
+ point.
82
+ test_kit: "test-kits/acme-outdoor.yaml"
83
+
84
+ phases:
85
+ - id: setup
86
+ title: "Create a buy with two packages, two creatives, two assignments"
87
+ narrative: |
88
+ Discover a product, create a buy with two packages (same product is
89
+ fine — packages are independent line items), sync two creatives each
90
+ assigned to its own package, and force both to approved baseline.
91
+
92
+ steps:
93
+ - id: get_products_brief
94
+ title: "Discover a product"
95
+ task: get_products
96
+ schema_ref: "media-buy/get-products-request.json"
97
+ response_schema_ref: "media-buy/get-products-response.json"
98
+ doc_ref: "/media-buy/task-reference/get_products"
99
+ comply_scenario: full_sales_flow
100
+ stateful: false
101
+ expected: |
102
+ Return at least one product with a pricing option and at least one format_id.
103
+ sample_request:
104
+ buying_mode: "brief"
105
+ brief: "Display inventory on outdoor lifestyle content for dependency-impairment cardinality testing."
106
+ filters:
107
+ is_fixed_price: true
108
+ account:
109
+ brand:
110
+ domain: "acmeoutdoor.example"
111
+ operator: "pinnacle-agency.example"
112
+ context:
113
+ correlation_id: "dependency_impairment_cardinality--get_products"
114
+ context_outputs:
115
+ - path: "products[0].product_id"
116
+ key: "product_id"
117
+ - path: "products[0].pricing_options[0].pricing_option_id"
118
+ key: "pricing_option_id"
119
+ - path: "products[0].format_ids[0].agent_url"
120
+ key: "format_agent_url"
121
+ - path: "products[0].format_ids[0].id"
122
+ key: "format_id"
123
+ validations:
124
+ - check: response_schema
125
+ description: "Response matches get-products-response.json schema"
126
+ - check: field_present
127
+ path: "products[0].format_ids[0].id"
128
+ description: "Product exposes at least one format_id for creative sync"
129
+ - check: field_present
130
+ path: "products[0].pricing_options[0].fixed_price"
131
+ description: "The captured pricing option is fixed-price; fixed-price storyboards do not send bid_price"
132
+
133
+ - id: create_buy_two_packages
134
+ title: "Create a media buy with two packages"
135
+ task: create_media_buy
136
+ schema_ref: "media-buy/create-media-buy-request.json"
137
+ response_schema_ref: "media-buy/create-media-buy-response.json"
138
+ doc_ref: "/media-buy/task-reference/create_media_buy"
139
+ comply_scenario: create_media_buy
140
+ stateful: true
141
+ expected: |
142
+ Buy created with media_buy_id and two distinct packages. Both
143
+ package_ids captured for the impairment-per-package assertions.
144
+
145
+ sample_request:
146
+ brand:
147
+ domain: "acmeoutdoor.example"
148
+ account:
149
+ brand:
150
+ domain: "acmeoutdoor.example"
151
+ operator: "pinnacle-agency.example"
152
+ idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_create_buy"
153
+ start_time: "2026-11-01T00:00:00Z"
154
+ end_time: "2026-11-30T23:59:59Z"
155
+ packages:
156
+ - product_id: "$context.product_id"
157
+ budget: 3000
158
+ pricing_option_id: "$context.pricing_option_id"
159
+ - product_id: "$context.product_id"
160
+ budget: 3000
161
+ pricing_option_id: "$context.pricing_option_id"
162
+ context:
163
+ correlation_id: "dependency_impairment_cardinality--create_buy"
164
+ context_outputs:
165
+ - path: "media_buy_id"
166
+ key: "media_buy_id"
167
+ - path: "packages[0].package_id"
168
+ key: "package_a_id"
169
+ - path: "packages[1].package_id"
170
+ key: "package_b_id"
171
+ validations:
172
+ - check: response_schema
173
+ description: "Response matches create-media-buy-response.json schema"
174
+ - check: field_present
175
+ path: "media_buy_id"
176
+ description: "Seller returns media_buy_id"
177
+ - check: field_present
178
+ path: "packages[0].package_id"
179
+ description: "First package_id returned"
180
+ - check: field_present
181
+ path: "packages[1].package_id"
182
+ description: "Second package_id returned (multi-package buy is supported)"
183
+
184
+ - id: sync_two_creatives
185
+ title: "Sync creatives A and B into the library"
186
+ task: sync_creatives
187
+ schema_ref: "creative/sync-creatives-request.json"
188
+ response_schema_ref: "creative/sync-creatives-response.json"
189
+ doc_ref: "/creative/task-reference/sync_creatives"
190
+ comply_scenario: creative_sync
191
+ stateful: true
192
+ expected: |
193
+ Both creatives accepted (action: created). Assignments are done in
194
+ the next step via update_media_buy.
195
+
196
+ sample_request:
197
+ account:
198
+ brand:
199
+ domain: "acmeoutdoor.example"
200
+ operator: "pinnacle-agency.example"
201
+ creatives:
202
+ - creative_id: "acme_card_banner_a"
203
+ name: "Acme Outdoor cardinality A"
204
+ format_id:
205
+ agent_url: "$context.format_agent_url"
206
+ id: "$context.format_id"
207
+ assets:
208
+ image:
209
+ asset_type: "image"
210
+ url: "https://cdn.pinnacle-agency.example/acme-card-a.png"
211
+ width: 300
212
+ height: 250
213
+ mime_type: "image/png"
214
+ - creative_id: "acme_card_banner_b"
215
+ name: "Acme Outdoor cardinality B"
216
+ format_id:
217
+ agent_url: "$context.format_agent_url"
218
+ id: "$context.format_id"
219
+ assets:
220
+ image:
221
+ asset_type: "image"
222
+ url: "https://cdn.pinnacle-agency.example/acme-card-b.png"
223
+ width: 300
224
+ height: 250
225
+ mime_type: "image/png"
226
+ idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_sync_creatives"
227
+ context:
228
+ correlation_id: "dependency_impairment_cardinality--sync_creatives"
229
+ validations:
230
+ - check: response_schema
231
+ description: "Response matches sync-creatives-response.json schema"
232
+ - check: field_present
233
+ path: "creatives[0].creative_id"
234
+ description: "Creative A returned"
235
+ - check: field_present
236
+ path: "creatives[1].creative_id"
237
+ description: "Creative B returned"
238
+
239
+ - id: assign_creatives_to_packages
240
+ title: "Bind creative A → package_a and creative B → package_b"
241
+ narrative: |
242
+ The spec defines two equal canonical surfaces for the creative ↔
243
+ package binding: inline `sync_creatives.assignments[]` and
244
+ `update_media_buy.packages[].creative_assignments` (replacement
245
+ semantics). This scenario uses the update_media_buy surface; the
246
+ per-package impairment cardinality contract is identical regardless
247
+ of which path the buyer chose.
248
+ task: update_media_buy
249
+ schema_ref: "media-buy/update-media-buy-request.json"
250
+ response_schema_ref: "media-buy/update-media-buy-response.json"
251
+ doc_ref: "/media-buy/task-reference/update_media_buy"
252
+ stateful: true
253
+ expected: |
254
+ Update accepted. Each package's creative_assignments now contains
255
+ its respective creative.
256
+
257
+ sample_request:
258
+ account:
259
+ brand:
260
+ domain: "acmeoutdoor.example"
261
+ operator: "pinnacle-agency.example"
262
+ media_buy_id: "$context.media_buy_id"
263
+ packages:
264
+ - package_id: "$context.package_a_id"
265
+ creative_assignments:
266
+ - creative_id: "acme_card_banner_a"
267
+ - package_id: "$context.package_b_id"
268
+ creative_assignments:
269
+ - creative_id: "acme_card_banner_b"
270
+ idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_assign_creatives"
271
+ context:
272
+ correlation_id: "dependency_impairment_cardinality--assign_creatives"
273
+ validations:
274
+ - check: response_schema
275
+ description: "Response matches update-media-buy-response.json schema"
276
+
277
+ - id: force_both_approved
278
+ title: "Baseline: force both creatives to approved"
279
+ task: comply_test_controller
280
+ schema_ref: "compliance/comply-test-controller-request.json"
281
+ response_schema_ref: "compliance/comply-test-controller-response.json"
282
+ doc_ref: "/building/implementation/comply-test-controller"
283
+ comply_scenario: full_sales_flow
284
+ stateful: true
285
+ expected: |
286
+ success: true. Creative A is at status: approved.
287
+ sample_request:
288
+ account:
289
+ sandbox: true
290
+ scenario: "force_creative_status"
291
+ params:
292
+ creative_id: "acme_card_banner_a"
293
+ status: "approved"
294
+ context:
295
+ correlation_id: "dependency_impairment_cardinality--force_a_approved"
296
+ validations:
297
+ - check: response_schema
298
+ description: "Response matches comply-test-controller-response.json schema"
299
+ - check: field_value
300
+ path: "success"
301
+ allowed_values: [true]
302
+ description: "Controller acknowledged the directive for creative A"
303
+
304
+ - id: force_b_approved
305
+ title: "Baseline (cont'd): force creative B to approved"
306
+ task: comply_test_controller
307
+ schema_ref: "compliance/comply-test-controller-request.json"
308
+ response_schema_ref: "compliance/comply-test-controller-response.json"
309
+ doc_ref: "/building/implementation/comply-test-controller"
310
+ comply_scenario: full_sales_flow
311
+ stateful: true
312
+ expected: |
313
+ success: true. Creative B is at status: approved.
314
+ sample_request:
315
+ account:
316
+ sandbox: true
317
+ scenario: "force_creative_status"
318
+ params:
319
+ creative_id: "acme_card_banner_b"
320
+ status: "approved"
321
+ context:
322
+ correlation_id: "dependency_impairment_cardinality--force_b_approved"
323
+ validations:
324
+ - check: response_schema
325
+ description: "Response matches comply-test-controller-response.json schema"
326
+ - check: field_value
327
+ path: "success"
328
+ allowed_values: [true]
329
+ description: "Controller acknowledged the directive for creative B"
330
+
331
+ - id: baseline_healthy
332
+ title: "Read the buy — health: ok, impairments[] empty"
333
+ task: get_media_buys
334
+ schema_ref: "media-buy/get-media-buys-request.json"
335
+ response_schema_ref: "media-buy/get-media-buys-response.json"
336
+ doc_ref: "/media-buy/task-reference/get_media_buys"
337
+ comply_scenario: media_buy_lifecycle
338
+ stateful: true
339
+ expected: |
340
+ health: ok, impairments[] empty. Baseline cardinality is zero.
341
+ sample_request:
342
+ account:
343
+ brand:
344
+ domain: "acmeoutdoor.example"
345
+ operator: "pinnacle-agency.example"
346
+ media_buy_ids:
347
+ - "$context.media_buy_id"
348
+ context:
349
+ correlation_id: "dependency_impairment_cardinality--baseline_healthy"
350
+ validations:
351
+ - check: response_schema
352
+ description: "Response matches get-media-buys-response.json schema"
353
+ - check: field_value
354
+ path: "media_buys[0].health"
355
+ allowed_values: ["ok"]
356
+ description: "Buy health is ok with both creatives approved"
357
+ - check: field_value_or_absent
358
+ path: "media_buys[0].impairments"
359
+ value: []
360
+ description: "impairments[] is empty (cardinality zero baseline)"
361
+
362
+ - id: reject_first_cardinality_one
363
+ title: "Reject creative A — impairments[] cardinality 1, scoped to package_a"
364
+ narrative: |
365
+ Force creative A to rejected. The buy MUST report exactly ONE
366
+ impairment entry, with resource_id matching A and package_ids
367
+ containing package_a only. A seller that inflates the impairment to
368
+ both packages (or emits an extra impairment for B) fails here.
369
+
370
+ steps:
371
+ - id: force_a_rejected
372
+ title: "Force creative A to rejected"
373
+ task: comply_test_controller
374
+ schema_ref: "compliance/comply-test-controller-request.json"
375
+ response_schema_ref: "compliance/comply-test-controller-response.json"
376
+ doc_ref: "/building/implementation/comply-test-controller"
377
+ comply_scenario: creative_lifecycle
378
+ stateful: true
379
+ expected: |
380
+ success: true. Creative A is at status: rejected.
381
+ sample_request:
382
+ account:
383
+ sandbox: true
384
+ scenario: "force_creative_status"
385
+ params:
386
+ creative_id: "acme_card_banner_a"
387
+ status: "rejected"
388
+ rejection_reason: "Cardinality scenario: first rejection."
389
+ context:
390
+ correlation_id: "dependency_impairment_cardinality--force_a_rejected"
391
+ validations:
392
+ - check: response_schema
393
+ description: "Response matches comply-test-controller-response.json schema"
394
+ - check: field_value
395
+ path: "success"
396
+ allowed_values: [true]
397
+ description: "Controller acknowledged the rejection directive"
398
+
399
+ - id: verify_cardinality_one
400
+ title: "Read the buy — exactly one impairment, scoped to package_a"
401
+ task: get_media_buys
402
+ schema_ref: "media-buy/get-media-buys-request.json"
403
+ response_schema_ref: "media-buy/get-media-buys-response.json"
404
+ doc_ref: "/media-buy/task-reference/get_media_buys"
405
+ comply_scenario: media_buy_lifecycle
406
+ stateful: true
407
+ expected: |
408
+ health: impaired. impairments[0] present, resource_type creative,
409
+ resource_id acme_card_banner_a, package_ids contains package_a
410
+ only. impairments[1] MUST NOT be present — only one creative is
411
+ rejected.
412
+ sample_request:
413
+ account:
414
+ brand:
415
+ domain: "acmeoutdoor.example"
416
+ operator: "pinnacle-agency.example"
417
+ media_buy_ids:
418
+ - "$context.media_buy_id"
419
+ context:
420
+ correlation_id: "dependency_impairment_cardinality--verify_cardinality_one"
421
+ validations:
422
+ - check: response_schema
423
+ description: "Response matches get-media-buys-response.json schema"
424
+ - check: field_value
425
+ path: "media_buys[0].health"
426
+ allowed_values: ["impaired"]
427
+ description: "Buy health flipped to impaired"
428
+ - check: field_present
429
+ path: "media_buys[0].impairments[0]"
430
+ description: "First impairment entry present"
431
+ - check: field_value
432
+ path: "media_buys[0].impairments[0].resource_id"
433
+ value: "acme_card_banner_a"
434
+ description: "Impairment[0] points at creative A (not B)"
435
+ - check: field_value
436
+ path: "media_buys[0].impairments[0].package_ids[0]"
437
+ value: "$context.package_a_id"
438
+ description: "Impairment[0].package_ids contains package_a — scope is per-resource, not per-buy. A seller emitting [package_a, package_b] when only A is rejected fails here."
439
+ # Cardinality enforcement note (adcp#4685 expert review): the
440
+ # exact-count assertion (no second entry) is not directly checkable
441
+ # with the current check vocabulary — `field_value_or_absent value:
442
+ # null` would pass on a seller emitting a literal-null padding,
443
+ # which is unsound. Exact cardinality is enforced by the
444
+ # cross-resource invariant (over-emission produces an impairment
445
+ # whose referenced resource is not offline, failing the forward
446
+ # rule). Direct array-length assertion lands when the runner adds
447
+ # an `array_length` check kind — tracked in a follow-up.
448
+
449
+ - id: reject_second_cardinality_two
450
+ title: "Reject creative B — impairments[] grows to cardinality 2"
451
+ narrative: |
452
+ Force creative B to rejected. The buy MUST report exactly TWO
453
+ impairment entries, one per creative, each scoped to its own package.
454
+ The assertion fails if the seller merges them, drops one, or
455
+ inflates either's package scope.
456
+
457
+ steps:
458
+ - id: force_b_rejected
459
+ title: "Force creative B to rejected"
460
+ task: comply_test_controller
461
+ schema_ref: "compliance/comply-test-controller-request.json"
462
+ response_schema_ref: "compliance/comply-test-controller-response.json"
463
+ doc_ref: "/building/implementation/comply-test-controller"
464
+ comply_scenario: creative_lifecycle
465
+ stateful: true
466
+ expected: |
467
+ success: true. Creative B is at status: rejected.
468
+ sample_request:
469
+ account:
470
+ sandbox: true
471
+ scenario: "force_creative_status"
472
+ params:
473
+ creative_id: "acme_card_banner_b"
474
+ status: "rejected"
475
+ rejection_reason: "Cardinality scenario: second rejection."
476
+ context:
477
+ correlation_id: "dependency_impairment_cardinality--force_b_rejected"
478
+ validations:
479
+ - check: response_schema
480
+ description: "Response matches comply-test-controller-response.json schema"
481
+ - check: field_value
482
+ path: "success"
483
+ allowed_values: [true]
484
+ description: "Controller acknowledged the rejection directive"
485
+
486
+ - id: verify_cardinality_two
487
+ title: "Read the buy — exactly two impairments, one per creative"
488
+ task: get_media_buys
489
+ schema_ref: "media-buy/get-media-buys-request.json"
490
+ response_schema_ref: "media-buy/get-media-buys-response.json"
491
+ doc_ref: "/media-buy/task-reference/get_media_buys"
492
+ comply_scenario: media_buy_lifecycle
493
+ stateful: true
494
+ expected: |
495
+ health: impaired. impairments[] has exactly two entries — one for
496
+ A on package_a, one for B on package_b. Order is unspecified but
497
+ both entries MUST be present and correctly scoped.
498
+ sample_request:
499
+ account:
500
+ brand:
501
+ domain: "acmeoutdoor.example"
502
+ operator: "pinnacle-agency.example"
503
+ media_buy_ids:
504
+ - "$context.media_buy_id"
505
+ context:
506
+ correlation_id: "dependency_impairment_cardinality--verify_cardinality_two"
507
+ validations:
508
+ - check: response_schema
509
+ description: "Response matches get-media-buys-response.json schema"
510
+ - check: field_value
511
+ path: "media_buys[0].health"
512
+ allowed_values: ["impaired"]
513
+ description: "Buy health remains impaired with both creatives rejected"
514
+ - check: field_present
515
+ path: "media_buys[0].impairments[0]"
516
+ description: "First impairment entry present"
517
+ - check: field_present
518
+ path: "media_buys[0].impairments[1]"
519
+ description: "Second impairment entry present — cardinality 2"
520
+ # Cardinality at 2: same enforcement story as the prior phase —
521
+ # exact-count enforcement comes from the cross-resource invariant
522
+ # via the forward rule. Over-emitting a third entry would point at
523
+ # a creative that isn't offline, failing the invariant.
524
+
525
+ - id: recover_first_via_swap
526
+ title: "Swap package_a's binding to a fresh creative C — cardinality back to 1"
527
+ narrative: |
528
+ Sync creative C (approved), then update_media_buy to swap
529
+ package_a's creative_assignments from A → C. Creative A stays rejected
530
+ in the library but is no longer a dependency of package_a. Read the
531
+ buy: impairments[] shrinks to exactly one entry (B on package_b);
532
+ A's impairment cleared.
533
+
534
+ steps:
535
+ - id: sync_replacement_c
536
+ title: "Sync replacement creative C"
537
+ task: sync_creatives
538
+ schema_ref: "creative/sync-creatives-request.json"
539
+ response_schema_ref: "creative/sync-creatives-response.json"
540
+ doc_ref: "/creative/task-reference/sync_creatives"
541
+ comply_scenario: creative_sync
542
+ stateful: true
543
+ expected: |
544
+ Replacement creative C accepted into the library.
545
+ sample_request:
546
+ account:
547
+ brand:
548
+ domain: "acmeoutdoor.example"
549
+ operator: "pinnacle-agency.example"
550
+ creatives:
551
+ - creative_id: "acme_card_banner_c"
552
+ name: "Acme Outdoor cardinality C"
553
+ format_id:
554
+ agent_url: "$context.format_agent_url"
555
+ id: "$context.format_id"
556
+ assets:
557
+ image:
558
+ asset_type: "image"
559
+ url: "https://cdn.pinnacle-agency.example/acme-card-c.png"
560
+ width: 300
561
+ height: 250
562
+ mime_type: "image/png"
563
+ idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_sync_c"
564
+ context:
565
+ correlation_id: "dependency_impairment_cardinality--sync_replacement_c"
566
+ validations:
567
+ - check: response_schema
568
+ description: "Response matches sync-creatives-response.json schema"
569
+ - check: field_present
570
+ path: "creatives[0].creative_id"
571
+ description: "Replacement creative C returned"
572
+
573
+ - id: force_c_approved
574
+ title: "Force creative C to approved"
575
+ task: comply_test_controller
576
+ schema_ref: "compliance/comply-test-controller-request.json"
577
+ response_schema_ref: "compliance/comply-test-controller-response.json"
578
+ doc_ref: "/building/implementation/comply-test-controller"
579
+ comply_scenario: full_sales_flow
580
+ stateful: true
581
+ expected: |
582
+ success: true.
583
+ sample_request:
584
+ account:
585
+ sandbox: true
586
+ scenario: "force_creative_status"
587
+ params:
588
+ creative_id: "acme_card_banner_c"
589
+ status: "approved"
590
+ context:
591
+ correlation_id: "dependency_impairment_cardinality--force_c_approved"
592
+ validations:
593
+ - check: response_schema
594
+ description: "Response matches comply-test-controller-response.json schema"
595
+ - check: field_value
596
+ path: "success"
597
+ allowed_values: [true]
598
+ description: "Controller acknowledged the directive"
599
+
600
+ - id: swap_package_a
601
+ title: "update_media_buy — swap package_a's creative_assignments to C"
602
+ task: update_media_buy
603
+ schema_ref: "media-buy/update-media-buy-request.json"
604
+ response_schema_ref: "media-buy/update-media-buy-response.json"
605
+ doc_ref: "/media-buy/task-reference/update_media_buy"
606
+ comply_scenario: media_buy_lifecycle
607
+ stateful: true
608
+ expected: |
609
+ The seller accepts the package update. Replacement semantics: the
610
+ new list (just C) fully replaces the old (just A) for package_a.
611
+ sample_request:
612
+ account:
613
+ brand:
614
+ domain: "acmeoutdoor.example"
615
+ operator: "pinnacle-agency.example"
616
+ media_buy_id: "$context.media_buy_id"
617
+ packages:
618
+ - package_id: "$context.package_a_id"
619
+ creative_assignments:
620
+ - creative_id: "acme_card_banner_c"
621
+ idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_swap_a"
622
+ context:
623
+ correlation_id: "dependency_impairment_cardinality--swap_package_a"
624
+ validations:
625
+ - check: response_schema
626
+ description: "Response matches update-media-buy-response.json schema"
627
+
628
+ - id: verify_cardinality_back_to_one
629
+ title: "Read the buy — exactly one impairment remaining (B on package_b)"
630
+ task: get_media_buys
631
+ schema_ref: "media-buy/get-media-buys-request.json"
632
+ response_schema_ref: "media-buy/get-media-buys-response.json"
633
+ doc_ref: "/media-buy/task-reference/get_media_buys"
634
+ comply_scenario: media_buy_lifecycle
635
+ stateful: true
636
+ expected: |
637
+ health: impaired (B still rejected and assigned to package_b).
638
+ impairments[0] present, resource_id B, package_ids contains
639
+ package_b. impairments[1] MUST NOT exist — the swap cleared A's
640
+ impairment. A seller that holds both entries fails the inverse
641
+ rule's decrement direction.
642
+ sample_request:
643
+ account:
644
+ brand:
645
+ domain: "acmeoutdoor.example"
646
+ operator: "pinnacle-agency.example"
647
+ media_buy_ids:
648
+ - "$context.media_buy_id"
649
+ context:
650
+ correlation_id: "dependency_impairment_cardinality--verify_back_to_one"
651
+ validations:
652
+ - check: response_schema
653
+ description: "Response matches get-media-buys-response.json schema"
654
+ - check: field_value
655
+ path: "media_buys[0].health"
656
+ allowed_values: ["impaired"]
657
+ description: "Buy health is still impaired — B remains rejected and assigned to package_b"
658
+ - check: field_present
659
+ path: "media_buys[0].impairments[0]"
660
+ description: "Exactly one impairment entry remains"
661
+ - check: field_value
662
+ path: "media_buys[0].impairments[0].resource_id"
663
+ value: "acme_card_banner_b"
664
+ description: "Remaining impairment points at creative B (not A — A is no longer a dependency after the swap)"
665
+ - check: field_value_or_absent
666
+ path: "media_buys[0].impairments[1]"
667
+ value: null
668
+ description: "impairments[1] MUST NOT exist — the swap recovered A's dependency; only B remains rejected. Cardinality decrement check."
669
+
670
+ - id: recover_second_via_swap
671
+ title: "Swap package_b's binding to a fresh creative D — cardinality back to 0"
672
+ narrative: |
673
+ Sync creative D (approved), swap package_b's binding from B → D, read
674
+ the buy: impairments[] empty, health: ok. Full cardinality round-trip
675
+ 0 → 1 → 2 → 1 → 0.
676
+
677
+ steps:
678
+ - id: sync_replacement_d
679
+ title: "Sync replacement creative D"
680
+ task: sync_creatives
681
+ schema_ref: "creative/sync-creatives-request.json"
682
+ response_schema_ref: "creative/sync-creatives-response.json"
683
+ doc_ref: "/creative/task-reference/sync_creatives"
684
+ comply_scenario: creative_sync
685
+ stateful: true
686
+ expected: |
687
+ Replacement creative D accepted into the library.
688
+ sample_request:
689
+ account:
690
+ brand:
691
+ domain: "acmeoutdoor.example"
692
+ operator: "pinnacle-agency.example"
693
+ creatives:
694
+ - creative_id: "acme_card_banner_d"
695
+ name: "Acme Outdoor cardinality D"
696
+ format_id:
697
+ agent_url: "$context.format_agent_url"
698
+ id: "$context.format_id"
699
+ assets:
700
+ image:
701
+ asset_type: "image"
702
+ url: "https://cdn.pinnacle-agency.example/acme-card-d.png"
703
+ width: 300
704
+ height: 250
705
+ mime_type: "image/png"
706
+ idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_sync_d"
707
+ context:
708
+ correlation_id: "dependency_impairment_cardinality--sync_replacement_d"
709
+ validations:
710
+ - check: response_schema
711
+ description: "Response matches sync-creatives-response.json schema"
712
+ - check: field_present
713
+ path: "creatives[0].creative_id"
714
+ description: "Replacement creative D returned"
715
+
716
+ - id: force_d_approved
717
+ title: "Force creative D to approved"
718
+ task: comply_test_controller
719
+ schema_ref: "compliance/comply-test-controller-request.json"
720
+ response_schema_ref: "compliance/comply-test-controller-response.json"
721
+ doc_ref: "/building/implementation/comply-test-controller"
722
+ comply_scenario: full_sales_flow
723
+ stateful: true
724
+ expected: |
725
+ success: true.
726
+ sample_request:
727
+ account:
728
+ sandbox: true
729
+ scenario: "force_creative_status"
730
+ params:
731
+ creative_id: "acme_card_banner_d"
732
+ status: "approved"
733
+ context:
734
+ correlation_id: "dependency_impairment_cardinality--force_d_approved"
735
+ validations:
736
+ - check: response_schema
737
+ description: "Response matches comply-test-controller-response.json schema"
738
+ - check: field_value
739
+ path: "success"
740
+ allowed_values: [true]
741
+ description: "Controller acknowledged the directive"
742
+
743
+ - id: swap_package_b
744
+ title: "update_media_buy — swap package_b's creative_assignments to D"
745
+ task: update_media_buy
746
+ schema_ref: "media-buy/update-media-buy-request.json"
747
+ response_schema_ref: "media-buy/update-media-buy-response.json"
748
+ doc_ref: "/media-buy/task-reference/update_media_buy"
749
+ comply_scenario: media_buy_lifecycle
750
+ stateful: true
751
+ expected: |
752
+ The seller accepts the swap.
753
+ sample_request:
754
+ account:
755
+ brand:
756
+ domain: "acmeoutdoor.example"
757
+ operator: "pinnacle-agency.example"
758
+ media_buy_id: "$context.media_buy_id"
759
+ packages:
760
+ - package_id: "$context.package_b_id"
761
+ creative_assignments:
762
+ - creative_id: "acme_card_banner_d"
763
+ idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_swap_b"
764
+ context:
765
+ correlation_id: "dependency_impairment_cardinality--swap_package_b"
766
+ validations:
767
+ - check: response_schema
768
+ description: "Response matches update-media-buy-response.json schema"
769
+
770
+ - id: verify_cardinality_zero
771
+ title: "Read the buy — impairments[] cleared, health: ok"
772
+ task: get_media_buys
773
+ schema_ref: "media-buy/get-media-buys-request.json"
774
+ response_schema_ref: "media-buy/get-media-buys-response.json"
775
+ doc_ref: "/media-buy/task-reference/get_media_buys"
776
+ comply_scenario: media_buy_lifecycle
777
+ stateful: true
778
+ expected: |
779
+ health: ok (both rejected creatives no longer dependencies of the
780
+ buy). impairments[] empty. Cardinality back to zero.
781
+ sample_request:
782
+ account:
783
+ brand:
784
+ domain: "acmeoutdoor.example"
785
+ operator: "pinnacle-agency.example"
786
+ media_buy_ids:
787
+ - "$context.media_buy_id"
788
+ context:
789
+ correlation_id: "dependency_impairment_cardinality--verify_cardinality_zero"
790
+ validations:
791
+ - check: response_schema
792
+ description: "Response matches get-media-buys-response.json schema"
793
+ - check: field_value
794
+ path: "media_buys[0].health"
795
+ allowed_values: ["ok"]
796
+ description: "Buy health returned to ok after both creatives swapped out"
797
+ - check: field_value_or_absent
798
+ path: "media_buys[0].impairments"
799
+ value: []
800
+ description: "impairments[] empty — cardinality back to zero"