@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,450 @@
1
+ id: billing_gate_dispatch
2
+ version: "1.0.0"
3
+ title: "Billing-gate dispatch — sync_accounts capability vs per-buyer-agent gate"
4
+ category: error_compliance
5
+ summary: "Validates the two distinct billing-rejection paths on sync_accounts — seller-wide capability gate (BILLING_NOT_SUPPORTED) and per-buyer-agent commercial-relationship gate (BILLING_NOT_PERMITTED_FOR_AGENT) — and the clamped error.details shape that prevents the per-agent code from acting as a commercial-state oracle."
6
+ track: error_handling
7
+ required_tools:
8
+ - get_adcp_capabilities
9
+ - sync_accounts
10
+
11
+ narrative: |
12
+ Two distinct gates can reject `sync_accounts.billing`, and SDKs MUST
13
+ dispatch on the right code so recovery is autonomous-precise rather
14
+ than collapse-to-a-single-retry-loop:
15
+
16
+ - **`BILLING_NOT_SUPPORTED`** — seller-wide capability gate. The seller's
17
+ `supported_billing` capability does not include the requested value,
18
+ or the seller has no direct billing relationship with the operator on
19
+ this specific account. Recovery: pick a value from `supported_billing`
20
+ and retry. `error.details.scope` ∈ `{"capability", "account"}`
21
+ disambiguates which sub-gate fired (per
22
+ `error-details/billing-not-supported.json`).
23
+
24
+ - **`BILLING_NOT_PERMITTED_FOR_AGENT`** — per-buyer-agent commercial
25
+ gate. The seller's capability accepts the value, but the calling
26
+ buyer agent's commercial relationship does not — e.g., the agent is
27
+ onboarded as passthrough-only (no payments relationship — only the
28
+ operator can be invoiced). Recovery: submit a new request with the
29
+ seller's `error.details.suggested_billing` value (typically
30
+ `operator`) under a fresh `idempotency_key` — same key + different
31
+ payload would produce IDEMPOTENCY_CONFLICT per error-handling.mdx.
32
+ Surface to a human when `suggested_billing` is absent — the agent cannot extend
33
+ its own commercial relationship. `error.details` MUST conform to
34
+ `error-details/billing-not-permitted-for-agent.json` —
35
+ `additionalProperties: false`, `rejected_billing` plus optional
36
+ `suggested_billing`. The shape MUST NOT carry the agent's full
37
+ permitted-billing subset, rate cards, payment terms, credit limit,
38
+ billing entity, or any other per-agent commercial state.
39
+
40
+ Critical security invariant: sellers MUST emit
41
+ `BILLING_NOT_PERMITTED_FOR_AGENT` only after agent identity has been
42
+ established via signed-request derivation or a credential-to-agent
43
+ mapping in the seller's onboarding record. Callers without
44
+ established identity MUST receive `BILLING_NOT_SUPPORTED` instead —
45
+ emitting the per-agent code without established identity is a
46
+ cross-tenant onboarding oracle (same uniform-response shape required
47
+ by the `*_NOT_FOUND` family). This storyboard does not attempt to
48
+ exercise that branch directly because the runner authenticates with
49
+ the agent under test via `test_kit.auth.api_key` before the
50
+ per-agent phases run, so by construction it always operates under
51
+ established identity. The authenticated-vs-unauthenticated branch is
52
+ exercised by the universal `error_compliance` storyboard's
53
+ cross-tenant uniform-response phases.
54
+
55
+ Phase structure:
56
+
57
+ - **`capability_discovery`** reads `account.supported_billing` from
58
+ `get_adcp_capabilities` so subsequent phases can dispatch.
59
+
60
+ - **`capability_gate`** runs only when the test kit declares
61
+ `account.unsupported_billing_probe` (a value the seller does NOT
62
+ support at the capability level). The runner submits that value
63
+ and asserts `BILLING_NOT_SUPPORTED` with `error.details.scope:
64
+ "capability"` and `error.details.supported_billing` echoing the
65
+ seller's capability. Skipped when the field is absent (sellers
66
+ whose `supported_billing` is the full three-value set leave the
67
+ field unset).
68
+
69
+ - **`per_agent_gate_reject`** runs only when the test kit declares
70
+ `commercial_relationship: "passthrough_only"`. The runner submits
71
+ `billing: "agent"` (a value `supported_billing` accepts but the
72
+ per-agent record does not), and asserts
73
+ `BILLING_NOT_PERMITTED_FOR_AGENT` with the clamped
74
+ `error.details` shape. The seller's `suggested_billing` value is
75
+ captured into context for the recover phase.
76
+
77
+ - **`per_agent_gate_recover`** chains off the previous phase and
78
+ submits a NEW request — using the seller's nominated
79
+ `suggested_billing` as the `billing` value, under a fresh
80
+ `idempotency_key` — and asserts a successful provisioning. The
81
+ recover phase is NOT a replay; it's a separate request with a
82
+ different payload, so a fresh idempotency_key is required (same
83
+ key + different payload yields IDEMPOTENCY_CONFLICT per
84
+ error-handling.mdx). Skipped when the test kit does not declare
85
+ `commercial_relationship: "passthrough_only"`. Failure of the
86
+ reject phase cascades: recover does not assert on its own.
87
+
88
+ Storyboards-as-fixtures: a single specification artifact ratifies
89
+ the dispatch contract once for every SDK. Ahead of full controller
90
+ support for toggling per-agent commercial state programmatically
91
+ (out of scope for this storyboard — see "Follow-ups" below), the
92
+ per-agent phases are gated on a static test-kit declaration so
93
+ conformance can be measured against any seller whose test kit makes
94
+ the precondition explicit.
95
+
96
+ agent:
97
+ interaction_model: media_buy_seller
98
+ capabilities: []
99
+ examples:
100
+ - "Any AdCP agent that accepts sync_accounts"
101
+
102
+ caller:
103
+ role: buyer_agent
104
+ example: "Compliance test harness"
105
+
106
+ prerequisites:
107
+ description: |
108
+ The agent under test exposes `sync_accounts` and advertises an
109
+ `account` capability block in `get_adcp_capabilities` populated with
110
+ `supported_billing`.
111
+
112
+ Test-kit precondition fields (see `test-kits/billing-gate-runner.yaml`
113
+ for the canonical example):
114
+
115
+ account.unsupported_billing_probe — (optional) value the runner
116
+ submits on the capability-gate phase. MUST be absent from the
117
+ seller's `supported_billing`. When unset, capability_gate grades
118
+ `not_applicable`.
119
+
120
+ commercial_relationship — (optional) declares whether the calling
121
+ buyer agent is registered with the seller as passthrough-only.
122
+ When set to "passthrough_only", per_agent_gate_reject and
123
+ per_agent_gate_recover run. When unset or set to anything else,
124
+ both per-agent phases grade `not_applicable`.
125
+
126
+ Establishing the commercial relationship is offline — the
127
+ seller-under-test records the test caller's commercial state in its
128
+ onboarding system before the storyboard runs. A future extension
129
+ (`comply_test_controller` `seed_buyer_agent`) MAY let runners
130
+ establish the precondition programmatically; until then the test
131
+ kit declares it.
132
+ test_kit: "test-kits/billing-gate-runner.yaml"
133
+ controller_seeding: false
134
+
135
+ phases:
136
+ - id: capability_discovery
137
+ title: "Capability discovery"
138
+ narrative: |
139
+ Read `account.supported_billing` so subsequent phases can dispatch
140
+ on which gate is testable for this seller.
141
+
142
+ steps:
143
+ - id: get_capabilities
144
+ title: "Read supported_billing"
145
+ narrative: |
146
+ The runner inspects `account.supported_billing` to confirm the
147
+ seller advertises billing capabilities at all and to provide
148
+ context for downstream validators (e.g., the capability-gate
149
+ phase echoes the seller's capability list back in the error
150
+ response).
151
+ task: get_adcp_capabilities
152
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
153
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
154
+ doc_ref: "/protocol/get_adcp_capabilities"
155
+ comply_scenario: capability_discovery
156
+ stateful: false
157
+ expected: |
158
+ Return capabilities including `account.supported_billing` listing
159
+ which `billing` values the seller accepts at the wire-capability
160
+ level.
161
+
162
+ sample_request:
163
+ context:
164
+ correlation_id: "billing_gate_dispatch--get_capabilities"
165
+
166
+ context_outputs:
167
+ - path: "account.supported_billing"
168
+ key: "supported_billing"
169
+
170
+ validations:
171
+ - check: response_schema
172
+ description: "Response matches get-adcp-capabilities-response.json schema"
173
+ - check: field_present
174
+ path: "account.supported_billing"
175
+ description: "Seller declares supported_billing"
176
+ - check: field_present
177
+ path: "context"
178
+ description: "Response echoes back the context object"
179
+ - check: field_value
180
+ path: "context.correlation_id"
181
+ value: "billing_gate_dispatch--get_capabilities"
182
+ description: "Context correlation_id returned unchanged"
183
+
184
+ - id: capability_gate
185
+ title: "Capability gate — BILLING_NOT_SUPPORTED"
186
+ optional: true
187
+ skip_if: "!test_kit.account.unsupported_billing_probe"
188
+ narrative: |
189
+ When the test kit declares `account.unsupported_billing_probe` (a
190
+ value the seller does NOT support at the capability level), the
191
+ runner submits that value and asserts the seller-wide capability
192
+ gate fires with structured `error.details`. Skipped when the field
193
+ is absent (sellers whose `supported_billing` is the full
194
+ three-value set leave the kit field unset).
195
+
196
+ steps:
197
+ - id: sync_accounts_unsupported_billing
198
+ title: "Submit a billing value the seller does not support"
199
+ task: sync_accounts
200
+ schema_ref: "account/sync-accounts-request.json"
201
+ response_schema_ref: "account/sync-accounts-response.json"
202
+ doc_ref: "/accounts/tasks/sync_accounts"
203
+ # sync_accounts returns transport-level success with per-account
204
+ # errors in accounts[].errors[] — this is the per-account-error
205
+ # envelope, not a transport-layer failure. expect_error: true would
206
+ # incorrectly require an MCP isError / A2A failed marker.
207
+ stateful: false
208
+ expected: |
209
+ Reject the per-account upsert with:
210
+ - accounts[0].action: "failed"
211
+ - accounts[0].status: "rejected"
212
+ - accounts[0].errors[0].code: BILLING_NOT_SUPPORTED
213
+ - accounts[0].errors[0].recovery: "correctable"
214
+ - accounts[0].errors[0].details.scope: "capability"
215
+ - accounts[0].errors[0].details.supported_billing: echoes the seller's capability list
216
+
217
+ sample_request:
218
+ accounts:
219
+ - brand:
220
+ domain: "acmeoutdoor.example"
221
+ operator: "pinnacle-agency.example"
222
+ billing: "$test_kit.account.unsupported_billing_probe"
223
+ idempotency_key: "$generate:uuid_v4#billing_gate_dispatch_capability_probe"
224
+ context:
225
+ correlation_id: "billing_gate_dispatch--capability_gate"
226
+
227
+ validations:
228
+ - check: response_schema
229
+ description: "Response matches sync-accounts-response.json schema even on per-account failure"
230
+ - check: field_value
231
+ path: "accounts[0].action"
232
+ value: "failed"
233
+ description: "Per-account action is failed"
234
+ - check: field_value
235
+ path: "accounts[0].status"
236
+ value: "rejected"
237
+ description: "Per-account status is rejected"
238
+ - check: field_value
239
+ value: "BILLING_NOT_SUPPORTED"
240
+ path: "accounts[0].errors[0].code"
241
+ description: "Per-account error code is BILLING_NOT_SUPPORTED"
242
+ - check: field_value
243
+ path: "accounts[0].errors[0].recovery"
244
+ value: "correctable"
245
+ description: "error.recovery is correctable per the enum metadata for BILLING_NOT_SUPPORTED"
246
+ - check: field_value
247
+ path: "accounts[0].errors[0].details.scope"
248
+ value: "capability"
249
+ description: "error.details.scope identifies the capability gate"
250
+ - check: field_present
251
+ path: "accounts[0].errors[0].details.supported_billing"
252
+ description: "error.details.supported_billing echoes the seller's capability"
253
+ - check: field_value
254
+ path: "context.correlation_id"
255
+ value: "billing_gate_dispatch--capability_gate"
256
+ description: "Context correlation_id returned unchanged on error response"
257
+
258
+ - id: per_agent_gate_reject
259
+ title: "Per-agent gate — BILLING_NOT_PERMITTED_FOR_AGENT (reject)"
260
+ optional: true
261
+ skip_if: "test_kit.commercial_relationship != 'passthrough_only'"
262
+ narrative: |
263
+ The test kit declares the calling buyer agent is registered with
264
+ the seller as passthrough-only. The runner submits `billing:
265
+ "agent"` (which `supported_billing` accepts but the per-agent
266
+ record does not) and asserts the per-buyer-agent gate fires with
267
+ the clamped `error.details` shape. The seller's `suggested_billing`
268
+ value is captured into context for the recover phase, which
269
+ submits a new request (with a fresh idempotency_key) using the
270
+ suggested value.
271
+
272
+ steps:
273
+ - id: sync_accounts_passthrough_rejects_agent
274
+ title: "Passthrough-only buyer agent submits billing: agent"
275
+ task: sync_accounts
276
+ schema_ref: "account/sync-accounts-request.json"
277
+ response_schema_ref: "account/sync-accounts-response.json"
278
+ doc_ref: "/accounts/tasks/sync_accounts"
279
+ # sync_accounts returns transport-level success with per-account
280
+ # errors in accounts[].errors[] — this is the per-account-error
281
+ # envelope, not a transport-layer failure. expect_error: true would
282
+ # incorrectly require an MCP isError / A2A failed marker.
283
+ stateful: false
284
+ expected: |
285
+ Reject the per-account upsert with:
286
+ - accounts[0].action: "failed"
287
+ - accounts[0].status: "rejected"
288
+ - accounts[0].errors[0].code: BILLING_NOT_PERMITTED_FOR_AGENT
289
+ - accounts[0].errors[0].recovery: "correctable"
290
+ - accounts[0].errors[0].details.rejected_billing: "agent"
291
+ - accounts[0].errors[0].details.suggested_billing: a single value drawn from the billing-party enum
292
+ - accounts[0].errors[0].details MUST NOT carry permitted_billing,
293
+ rate_card, payment_terms, credit_limit, billing_entity, or any
294
+ other per-agent commercial state (additionalProperties: false on
295
+ error-details/billing-not-permitted-for-agent.json).
296
+
297
+ sample_request:
298
+ accounts:
299
+ - brand:
300
+ domain: "acmeoutdoor.example"
301
+ operator: "pinnacle-agency.example"
302
+ billing: "agent"
303
+ idempotency_key: "$generate:uuid_v4#billing_gate_dispatch_passthrough_retry"
304
+ context:
305
+ correlation_id: "billing_gate_dispatch--per_agent_reject"
306
+
307
+ context_outputs:
308
+ - path: "accounts[0].errors[0].details.suggested_billing"
309
+ key: "suggested_billing"
310
+
311
+ validations:
312
+ - check: response_schema
313
+ description: "Response matches sync-accounts-response.json schema even on per-account failure"
314
+ - check: field_value
315
+ path: "accounts[0].action"
316
+ value: "failed"
317
+ description: "Per-account action is failed"
318
+ - check: field_value
319
+ path: "accounts[0].status"
320
+ value: "rejected"
321
+ description: "Per-account status is rejected"
322
+ - check: field_value
323
+ value: "BILLING_NOT_PERMITTED_FOR_AGENT"
324
+ path: "accounts[0].errors[0].code"
325
+ description: "Per-account error code is BILLING_NOT_PERMITTED_FOR_AGENT"
326
+ - check: field_value
327
+ path: "accounts[0].errors[0].recovery"
328
+ value: "correctable"
329
+ description: "error.recovery is correctable per the enum metadata for BILLING_NOT_PERMITTED_FOR_AGENT"
330
+ - check: field_value
331
+ path: "accounts[0].errors[0].details.rejected_billing"
332
+ value: "agent"
333
+ description: "error.details.rejected_billing echoes the submitted value"
334
+ - check: field_present
335
+ path: "accounts[0].errors[0].details.suggested_billing"
336
+ description: "error.details.suggested_billing names a value the agent can retry with (typically operator). Recovery is asserted by the per_agent_gate_recover phase succeeding under the suggested value."
337
+ - check: field_absent
338
+ path: "accounts[0].errors[0].details.permitted_billing"
339
+ description: "Full permitted_billing subset MUST NOT be returned (commercial-state oracle)"
340
+ - check: field_absent
341
+ path: "accounts[0].errors[0].details.rate_card"
342
+ description: "rate_card MUST NOT leak through error.details"
343
+ - check: field_absent
344
+ path: "accounts[0].errors[0].details.payment_terms"
345
+ description: "payment_terms MUST NOT leak through error.details"
346
+ - check: field_absent
347
+ path: "accounts[0].errors[0].details.credit_limit"
348
+ description: "credit_limit MUST NOT leak through error.details"
349
+ - check: field_absent
350
+ path: "accounts[0].errors[0].details.billing_entity"
351
+ description: "billing_entity MUST NOT leak through error.details"
352
+ - check: field_absent
353
+ path: "accounts[0].errors[0].details.account_id"
354
+ description: "Per-account state MUST NOT leak through error.details"
355
+ - check: field_value
356
+ path: "context.correlation_id"
357
+ value: "billing_gate_dispatch--per_agent_reject"
358
+ description: "Context correlation_id returned unchanged on error response"
359
+
360
+ - id: per_agent_gate_recover
361
+ title: "Per-agent gate — autonomous recovery via suggested_billing"
362
+ optional: true
363
+ skip_if: "test_kit.commercial_relationship != 'passthrough_only'"
364
+ narrative: |
365
+ The runner submits a new request with the `billing` value the
366
+ seller suggested via `error.details.suggested_billing`, under a
367
+ fresh idempotency_key. The recover phase is NOT a replay of the
368
+ reject phase — same key + different payload would produce
369
+ IDEMPOTENCY_CONFLICT per error-handling.mdx semantics. A successful
370
+ provisioning validates two things: the seller's nominated fallback
371
+ genuinely works on retry (without it, the autonomous-recovery
372
+ branch is dead), and the per-agent gate's recovery is autonomous —
373
+ pivoting on `suggested_billing` produces a working retry without
374
+ human intervention. The recover phase passes only when the
375
+ reject phase passed; if the reject phase fails for a non-
376
+ precondition reason (e.g., 5xx from the agent), this phase's
377
+ assertions are still meaningful but the overall storyboard
378
+ surfaces the upstream failure first.
379
+
380
+ steps:
381
+ - id: sync_accounts_recover_with_suggested
382
+ title: "Retry with the seller's suggested_billing value"
383
+ task: sync_accounts
384
+ schema_ref: "account/sync-accounts-request.json"
385
+ response_schema_ref: "account/sync-accounts-response.json"
386
+ doc_ref: "/accounts/tasks/sync_accounts"
387
+ stateful: true
388
+ expected: |
389
+ Provision the account using `billing: $context.suggested_billing`.
390
+ accounts[0].action is `created` or `updated`; accounts[0].status
391
+ is `active` or `pending_approval`. The autonomous-retry branch of
392
+ BILLING_NOT_PERMITTED_FOR_AGENT recovery completes here. The
393
+ response echoes back the requested `billing` value so the runner
394
+ can confirm the seller honored the suggested fallback.
395
+
396
+ sample_request:
397
+ accounts:
398
+ - brand:
399
+ domain: "acmeoutdoor.example"
400
+ operator: "pinnacle-agency.example"
401
+ billing: "$context.suggested_billing"
402
+ # Fresh idempotency_key — the recover phase is a new request
403
+ # carrying a different payload (different `billing` value), not
404
+ # a replay. Reusing the reject phase's key would produce
405
+ # IDEMPOTENCY_CONFLICT per error-handling.mdx (same key + different
406
+ # payload within the replay window). Validated end-to-end against
407
+ # the training-agent reference implementation in #3851.
408
+ idempotency_key: "$generate:uuid_v4#billing_gate_dispatch_passthrough_recover"
409
+ context:
410
+ correlation_id: "billing_gate_dispatch--per_agent_recover"
411
+
412
+ validations:
413
+ - check: response_schema
414
+ description: "Response matches sync-accounts-response.json schema"
415
+ - check: field_present
416
+ path: "accounts[0].account_id"
417
+ description: "Account has a platform-assigned ID"
418
+ - check: field_value
419
+ path: "accounts[0].billing"
420
+ value: "$context.suggested_billing"
421
+ description: "Account is provisioned with the seller's suggested_billing value"
422
+ - check: field_value
423
+ path: "context.correlation_id"
424
+ value: "billing_gate_dispatch--per_agent_recover"
425
+ description: "Context correlation_id returned unchanged"
426
+
427
+ # Follow-ups (out of scope for this storyboard, tracked separately):
428
+ #
429
+ # 1. comply_test_controller `seed_buyer_agent` extension — toggling the
430
+ # test caller's commercial_relationship programmatically rather than
431
+ # via static test-kit declaration. Would let any seller exercise both
432
+ # branches of the per-agent gate without a manually-curated test
433
+ # kit. Requires extending the seed-DAG documented in the storyboard
434
+ # schema.
435
+ #
436
+ # 2. Account-scope sub-gate (BILLING_NOT_SUPPORTED with
437
+ # error.details.scope: "account") — tests that the seller-wide
438
+ # capability accepts a value but the seller has no direct billing
439
+ # relationship with the operator on the specific account. Out of
440
+ # scope here because it requires a test kit that declares both an
441
+ # operator the seller has no direct relationship with AND a
442
+ # seller-side onboarding state to that effect — a heavier
443
+ # coordination contract than this kit. Track when the test kit grows
444
+ # multi-operator support.
445
+ #
446
+ # 3. Cross-language naming alignment for BrandAuthorizationResolver
447
+ # (Python v3-identity-bundle-design.md). The Python SDK's in-flight
448
+ # Protocol uses `AdagentsResolver`, which names the wrong file
449
+ # (adagents.json is publisher-side). Coordination filed as
450
+ # adcp-client-python#346.