@adcp/sdk 7.10.2 → 7.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
  2. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  3. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
  4. package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
  5. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
  6. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
  7. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  8. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
  9. package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
  10. package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
  11. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  12. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
  13. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  14. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
  15. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  16. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  17. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  18. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  19. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
  20. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
  21. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
  22. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  23. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  24. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  25. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
  26. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
  27. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
  28. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  29. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
  30. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  31. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  32. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
  33. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  34. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  35. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  36. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  37. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  38. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  39. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  40. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
  41. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  42. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  43. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  44. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  45. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  46. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  47. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  48. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
  49. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  50. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  51. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  52. package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
  53. package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
  54. package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
  55. package/compliance/cache/3.1.0-rc.2/index.json +356 -0
  56. package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
  57. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  58. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
  59. package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
  60. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
  61. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
  62. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  63. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
  64. package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
  65. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
  66. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  67. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
  68. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  69. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
  70. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  71. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  72. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  73. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  74. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
  75. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
  76. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
  77. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  78. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  79. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  80. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
  81. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
  82. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
  83. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  84. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
  85. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  86. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  87. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
  88. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  89. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  90. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  91. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  92. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  93. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  94. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  95. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
  96. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  97. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  98. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  99. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  100. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  101. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  102. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  103. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  104. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  105. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  106. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  107. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
  108. package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
  109. package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
  110. package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
  111. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
  112. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
  113. package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
  114. package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
  115. package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
  116. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
  117. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
  118. package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
  119. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
  120. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
  121. package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
  122. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
  123. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
  124. package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
  125. package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
  126. package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
  127. package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
  128. package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
  129. package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
  130. package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
  131. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
  132. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
  133. package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
  134. package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
  135. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
  136. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
  137. package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
  138. package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
  139. package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
  140. package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
  141. package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
  142. package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
  143. package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
  144. package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
  145. package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
  146. package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
  147. package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
  148. package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
  149. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  150. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
  151. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  152. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  153. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  154. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  155. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  156. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  157. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  158. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  159. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  160. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
  161. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
  162. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
  163. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  164. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  165. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  166. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  167. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  168. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  169. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  170. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  171. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  172. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  173. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  174. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  175. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  176. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  177. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  178. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  179. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  180. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  181. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  182. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  183. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  184. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  185. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  186. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  187. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  188. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  189. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  190. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
  191. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  192. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  193. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  194. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  195. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  196. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  197. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  198. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  199. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  200. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  201. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  202. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  203. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
  204. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
  205. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  206. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  207. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  208. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  209. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  210. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  211. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  212. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  213. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  214. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  215. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  216. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  217. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  218. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  219. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  220. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  221. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  222. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  223. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  224. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  225. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  226. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  227. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  228. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  229. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  230. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  231. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  232. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  233. package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
  234. package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
  235. package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
  236. package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
  237. package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
  238. package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
  239. package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
  240. package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
  241. package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
  242. package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
  243. package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
  244. package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
  245. package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
  246. package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
  247. package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
  248. package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
  249. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
  250. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
  251. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
  252. package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
  253. package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
  254. package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
  255. package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
  256. package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
  257. package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
  258. package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
  259. package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
  260. package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
  261. package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
  262. package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
  263. package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
  264. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
  265. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
  266. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
  267. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
  268. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
  269. package/dist/lib/index.d.ts +1 -1
  270. package/dist/lib/index.d.ts.map +1 -1
  271. package/dist/lib/index.js +9 -5
  272. package/dist/lib/index.js.map +1 -1
  273. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  274. package/dist/lib/testing/storyboard/default-invariants.js +30 -1
  275. package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
  276. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  277. package/dist/lib/testing/storyboard/runner.js +84 -21
  278. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  279. package/dist/lib/testing/storyboard/types.d.ts +21 -0
  280. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  281. package/dist/lib/testing/storyboard/types.js.map +1 -1
  282. package/dist/lib/testing/types.d.ts +9 -0
  283. package/dist/lib/testing/types.d.ts.map +1 -1
  284. package/dist/lib/types/schemas.generated.d.ts +6707 -12040
  285. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  286. package/dist/lib/types/schemas.generated.js +1 -1
  287. package/dist/lib/types/schemas.generated.js.map +1 -1
  288. package/dist/lib/utils/signal-id-builders.d.ts +19 -0
  289. package/dist/lib/utils/signal-id-builders.d.ts.map +1 -1
  290. package/dist/lib/utils/signal-id-builders.js +30 -0
  291. package/dist/lib/utils/signal-id-builders.js.map +1 -1
  292. package/dist/lib/utils/tool-request-schemas.d.ts.map +1 -1
  293. package/dist/lib/utils/tool-request-schemas.js +3 -0
  294. package/dist/lib/utils/tool-request-schemas.js.map +1 -1
  295. package/dist/lib/v2/projection/constants.d.ts +28 -0
  296. package/dist/lib/v2/projection/constants.d.ts.map +1 -0
  297. package/dist/lib/v2/projection/constants.js +31 -0
  298. package/dist/lib/v2/projection/constants.js.map +1 -0
  299. package/dist/lib/v2/projection/registry.d.ts.map +1 -1
  300. package/dist/lib/v2/projection/registry.js +9 -4
  301. package/dist/lib/v2/projection/registry.js.map +1 -1
  302. package/dist/lib/version.d.ts +3 -3
  303. package/dist/lib/version.js +3 -3
  304. package/package.json +1 -1
  305. package/skills/SHAPE-GOTCHAS.md +5 -0
@@ -0,0 +1,399 @@
1
+ id: media_buy_seller/proposal_finalize
2
+ version: "1.0.0"
3
+ title: "Seller handles proposal refinement and finalize"
4
+ category: media_buy_seller
5
+ summary: "Verifies the full proposal lifecycle: brief with proposals, refine a proposal, finalize to committed, and accept via create_media_buy."
6
+ track: media_buy
7
+ required_tools:
8
+ - get_products
9
+ - create_media_buy
10
+
11
+ requires_capability:
12
+ path: media_buy.supports_proposals
13
+ equals: true
14
+
15
+ narrative: |
16
+ Proposals are curated media plans that the seller generates alongside products. The buyer
17
+ reviews proposals, refines them (adjust budget splits, swap products, add constraints),
18
+ and then finalizes a proposal to get firm pricing and an inventory hold. Once committed,
19
+ the buyer accepts the proposal via create_media_buy.
20
+
21
+ The proposal lifecycle is: draft (indicative pricing) -> refine -> finalize (firm pricing,
22
+ inventory hold) -> create_media_buy (accept and go live).
23
+
24
+ This scenario exercises the complete proposal flow including the finalize action, which
25
+ transitions a proposal from draft to committed status with an expires_at hold window.
26
+
27
+ agent:
28
+ interaction_model: media_buy_seller
29
+ capabilities:
30
+ - sells_media
31
+ - accepts_briefs
32
+ - generates_proposals
33
+ examples:
34
+ - "Full-service publisher with proposal engine"
35
+ - "Retail media network with curated packages"
36
+
37
+ caller:
38
+ role: buyer_agent
39
+ example: "Pinnacle Agency (buyer)"
40
+
41
+ prerequisites:
42
+ description: |
43
+ The caller needs a brand identity and operator credentials. The seller must support
44
+ proposal generation (return proposals alongside products in get_products responses).
45
+ test_kit: "test-kits/acme-outdoor.yaml"
46
+
47
+ phases:
48
+ - id: setup
49
+ title: "Account setup"
50
+ steps:
51
+ - id: sync_accounts
52
+ title: "Establish account"
53
+ task: sync_accounts
54
+ schema_ref: "account/sync-accounts-request.json"
55
+ response_schema_ref: "account/sync-accounts-response.json"
56
+ doc_ref: "/accounts/tasks/sync_accounts"
57
+ stateful: true
58
+ expected: |
59
+ Return the account with account_id and status active.
60
+
61
+ sample_request:
62
+ accounts:
63
+ - brand:
64
+ domain: "acmeoutdoor.example"
65
+ operator: "pinnacle-agency.example"
66
+ billing: "operator"
67
+ payment_terms: "net_30"
68
+
69
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_setup_sync_accounts"
70
+ validations:
71
+ - check: response_schema
72
+ description: "Response matches sync-accounts-response.json schema"
73
+ - check: field_present
74
+ path: "accounts[0].account_id"
75
+ description: "Account has a platform-assigned ID"
76
+
77
+ - id: brief_with_proposals
78
+ title: "Brief with proposals"
79
+ narrative: |
80
+ Send a brief and receive proposals alongside products. Proposals are curated
81
+ media plans with budget allocations the buyer can review and refine.
82
+
83
+ steps:
84
+ - id: get_products_brief
85
+ title: "Send a brief and receive proposals"
86
+ task: get_products
87
+ schema_ref: "media-buy/get-products-request.json"
88
+ response_schema_ref: "media-buy/get-products-response.json"
89
+ doc_ref: "/media-buy/task-reference/get_products"
90
+ comply_scenario: full_sales_flow
91
+ stateful: false
92
+ expected: |
93
+ Return products and proposals matching the brief:
94
+ - products: individual products with pricing and forecasts
95
+ - proposals: curated media plans with proposal_id, budget_allocations, rationale
96
+
97
+ sample_request:
98
+ buying_mode: "brief"
99
+ brief: "Premium video and display across outdoor lifestyle and sports. Q2 flight, $50K budget. Adults 25-54, US and Canada."
100
+ account:
101
+ brand:
102
+ domain: "acmeoutdoor.example"
103
+ operator: "pinnacle-agency.example"
104
+
105
+ context_outputs:
106
+ - path: "proposals[0].proposal_id"
107
+ key: "proposal_id"
108
+
109
+ validations:
110
+ - check: response_schema
111
+ description: "Response matches get-products-response.json schema"
112
+ - check: field_present
113
+ path: "products"
114
+ description: "Response contains products"
115
+ - check: field_present
116
+ path: "proposals"
117
+ description: "Response contains proposals"
118
+ - check: field_present
119
+ path: "proposals[0].proposal_id"
120
+ description: "Proposals have IDs"
121
+
122
+ - id: refine_proposal
123
+ title: "Refine the proposal"
124
+ narrative: |
125
+ The buyer reviews the proposals and wants to adjust one. They call get_products in
126
+ refine mode targeting a specific proposal_id with changes. The seller applies the
127
+ refinements and returns the updated proposal.
128
+
129
+ steps:
130
+ - id: get_products_refine
131
+ title: "Refine a specific proposal"
132
+ task: get_products
133
+ schema_ref: "media-buy/get-products-request.json"
134
+ response_schema_ref: "media-buy/get-products-response.json"
135
+ doc_ref: "/media-buy/task-reference/get_products"
136
+ comply_scenario: full_sales_flow
137
+ stateful: true
138
+ expected: |
139
+ Return the refined proposal:
140
+ - proposals: updated proposal reflecting the requested changes
141
+ - refinement_applied: how each refinement was handled
142
+ - Updated budget allocations, product selections, and forecasts
143
+
144
+ sample_request:
145
+ buying_mode: "refine"
146
+ refine:
147
+ - scope: "proposal"
148
+ proposal_id: "$context.proposal_id"
149
+ ask: "Shift 60% of budget to CTV. Drop the display product and redistribute that budget to video."
150
+ - scope: "request"
151
+ ask: "All products must support frequency capping at 3 per day."
152
+ account:
153
+ brand:
154
+ domain: "acmeoutdoor.example"
155
+ operator: "pinnacle-agency.example"
156
+
157
+ validations:
158
+ - check: response_schema
159
+ description: "Response matches get-products-response.json schema"
160
+ - check: field_present
161
+ path: "proposals"
162
+ description: "Response contains updated proposals"
163
+
164
+ - id: unknown_proposal_finalize
165
+ title: "Reject unknown proposals during finalization"
166
+ narrative: |
167
+ The buyer asks to finalize a proposal reference that was never issued by
168
+ the seller. The request is schema-valid; the rejection is semantic and
169
+ must use the canonical proposal-not-found code.
170
+
171
+ steps:
172
+ - id: get_products_finalize_unknown_proposal
173
+ title: "Reject finalize against an unknown proposal"
174
+ task: get_products
175
+ schema_ref: "media-buy/get-products-request.json"
176
+ response_schema_ref: "media-buy/get-products-response.json"
177
+ doc_ref: "/media-buy/task-reference/get_products"
178
+ expect_error: true
179
+ negative_path: payload_well_formed
180
+ stateful: true
181
+ expected: |
182
+ Reject with:
183
+ - code: PROPOSAL_NOT_FOUND
184
+ - recovery: correctable
185
+ - field: refine[0].proposal_id
186
+
187
+ sample_request:
188
+ buying_mode: "refine"
189
+ refine:
190
+ - scope: "proposal"
191
+ proposal_id: "prop_unknown_proposal_not_found"
192
+ action: "finalize"
193
+ account:
194
+ brand:
195
+ domain: "acmeoutdoor.example"
196
+ operator: "pinnacle-agency.example"
197
+
198
+ validations:
199
+ - check: error_code
200
+ value: "PROPOSAL_NOT_FOUND"
201
+ description: "Unknown proposal finalize returns the canonical proposal-not-found code"
202
+ - check: field_value
203
+ path: "adcp_error.recovery"
204
+ value: "correctable"
205
+ description: "Recovery is correctable"
206
+ - check: field_value
207
+ path: "adcp_error.field"
208
+ value: "refine[0].proposal_id"
209
+ description: "Error field identifies the missing proposal reference"
210
+
211
+ - id: finalize_proposal
212
+ title: "Finalize the proposal"
213
+ narrative: |
214
+ The buyer is satisfied with the refined proposal and requests finalization. This
215
+ triggers the transition from draft (indicative pricing) to committed (firm pricing
216
+ with inventory hold). The seller may need time to process this — the buyer should
217
+ not set a time_budget to signal willingness to wait.
218
+
219
+ After finalization, the proposal has firm pricing and an expires_at timestamp.
220
+ The buyer must create the media buy before the hold expires.
221
+
222
+ steps:
223
+ - id: get_products_finalize
224
+ title: "Finalize the proposal"
225
+ task: get_products
226
+ schema_ref: "media-buy/get-products-request.json"
227
+ response_schema_ref: "media-buy/get-products-response.json"
228
+ doc_ref: "/media-buy/task-reference/get_products"
229
+ comply_scenario: full_sales_flow
230
+ stateful: true
231
+ expected: |
232
+ Return the finalized proposal with committed status:
233
+ - proposals[0].proposal_status: committed
234
+ - proposals[0].expires_at: timestamp for the inventory hold window
235
+ - Firm pricing (not indicative)
236
+ - The proposal is ready to accept via create_media_buy
237
+
238
+ sample_request:
239
+ buying_mode: "refine"
240
+ refine:
241
+ - scope: "proposal"
242
+ proposal_id: "$context.proposal_id"
243
+ action: "finalize"
244
+ account:
245
+ brand:
246
+ domain: "acmeoutdoor.example"
247
+ operator: "pinnacle-agency.example"
248
+
249
+ context_outputs:
250
+ - path: "proposals[0].insertion_order.io_id"
251
+ key: "io_id"
252
+
253
+ validations:
254
+ - check: response_schema
255
+ description: "Response matches get-products-response.json schema"
256
+ - check: field_present
257
+ path: "proposals"
258
+ description: "Response contains the finalized proposal"
259
+
260
+ - id: accept_proposal
261
+ title: "Accept the committed proposal"
262
+ narrative: |
263
+ The buyer accepts the committed proposal by creating a media buy with the
264
+ proposal_id. The seller converts the proposal's product selections and budget
265
+ allocations into active packages.
266
+
267
+ steps:
268
+ - id: create_media_buy
269
+ title: "Create media buy from proposal"
270
+ task: create_media_buy
271
+ schema_ref: "media-buy/create-media-buy-request.json"
272
+ response_schema_ref: "media-buy/create-media-buy-response.json"
273
+ doc_ref: "/media-buy/task-reference/create_media_buy"
274
+ comply_scenario: create_media_buy
275
+ stateful: true
276
+ expected: |
277
+ Convert the committed proposal into an active media buy:
278
+ - media_buy_id: the seller's identifier
279
+ - status: active
280
+ - confirmed_at: timestamp
281
+ - packages: line items derived from the proposal's budget allocations
282
+ - proposal_id: echoed back to confirm which proposal was accepted
283
+
284
+ sample_request:
285
+ brand:
286
+ domain: "acmeoutdoor.example"
287
+ account:
288
+ brand:
289
+ domain: "acmeoutdoor.example"
290
+ operator: "pinnacle-agency.example"
291
+ sandbox: true
292
+ proposal_id: "$context.proposal_id"
293
+ total_budget:
294
+ amount: 50000
295
+ currency: "USD"
296
+ start_time: "2026-04-01T00:00:00Z"
297
+ end_time: "2026-06-30T23:59:59Z"
298
+ io_acceptance:
299
+ io_id: "$context.io_id"
300
+ accepted_at: "2026-03-15T14:30:00Z"
301
+ signatory: "ops@acmeoutdoor.example"
302
+
303
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_accept_proposal_create_media_buy"
304
+ validations:
305
+ - check: response_schema
306
+ description: "Response matches create-media-buy-response.json schema"
307
+
308
+ - id: unknown_proposal_references
309
+ title: "Reject unknown proposal references"
310
+ narrative: |
311
+ The buyer references proposal IDs that were never issued by the seller.
312
+ These requests are schema-valid; the rejection is semantic. The seller
313
+ must return the canonical PROPOSAL_NOT_FOUND code rather than generic
314
+ NOT_FOUND, INVALID_REQUEST, or platform-specific proposal errors.
315
+
316
+ steps:
317
+ - id: get_products_refine_unknown_proposal
318
+ title: "Reject refine against an unknown proposal"
319
+ task: get_products
320
+ schema_ref: "media-buy/get-products-request.json"
321
+ response_schema_ref: "media-buy/get-products-response.json"
322
+ doc_ref: "/media-buy/task-reference/get_products"
323
+ expect_error: true
324
+ negative_path: payload_well_formed
325
+ stateful: true
326
+ expected: |
327
+ Reject with:
328
+ - code: PROPOSAL_NOT_FOUND
329
+ - recovery: correctable
330
+ - field: refine[0].proposal_id
331
+
332
+ sample_request:
333
+ buying_mode: "refine"
334
+ refine:
335
+ - scope: "proposal"
336
+ proposal_id: "prop_unknown_proposal_not_found"
337
+ ask: "Shift budget toward premium video."
338
+ account:
339
+ brand:
340
+ domain: "acmeoutdoor.example"
341
+ operator: "pinnacle-agency.example"
342
+
343
+ validations:
344
+ - check: error_code
345
+ value: "PROPOSAL_NOT_FOUND"
346
+ description: "Unknown proposal refine returns the canonical proposal-not-found code"
347
+ - check: field_value
348
+ path: "adcp_error.recovery"
349
+ value: "correctable"
350
+ description: "Recovery is correctable"
351
+ - check: field_value
352
+ path: "adcp_error.field"
353
+ value: "refine[0].proposal_id"
354
+ description: "Error field identifies the missing proposal reference"
355
+
356
+ - id: create_media_buy_unknown_proposal
357
+ title: "Reject create_media_buy from an unknown proposal"
358
+ task: create_media_buy
359
+ schema_ref: "media-buy/create-media-buy-request.json"
360
+ response_schema_ref: "media-buy/create-media-buy-response.json"
361
+ doc_ref: "/media-buy/task-reference/create_media_buy"
362
+ comply_scenario: create_media_buy
363
+ expect_error: true
364
+ negative_path: payload_well_formed
365
+ stateful: true
366
+ expected: |
367
+ Reject with:
368
+ - code: PROPOSAL_NOT_FOUND
369
+ - recovery: correctable
370
+ - field: proposal_id
371
+
372
+ sample_request:
373
+ brand:
374
+ domain: "acmeoutdoor.example"
375
+ account:
376
+ brand:
377
+ domain: "acmeoutdoor.example"
378
+ operator: "pinnacle-agency.example"
379
+ sandbox: true
380
+ proposal_id: "prop_unknown_proposal_not_found"
381
+ total_budget:
382
+ amount: 50000
383
+ currency: "USD"
384
+ start_time: "2026-04-01T00:00:00Z"
385
+ end_time: "2026-06-30T23:59:59Z"
386
+
387
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_unknown_proposal_create_media_buy"
388
+ validations:
389
+ - check: error_code
390
+ value: "PROPOSAL_NOT_FOUND"
391
+ description: "Unknown proposal create returns the canonical proposal-not-found code"
392
+ - check: field_value
393
+ path: "adcp_error.recovery"
394
+ value: "correctable"
395
+ description: "Recovery is correctable"
396
+ - check: field_value
397
+ path: "adcp_error.field"
398
+ value: "proposal_id"
399
+ description: "Error field identifies the missing proposal reference"
@@ -0,0 +1,264 @@
1
+ id: media_buy_seller/proposal_finalize_asap_timing
2
+ version: "1.0.0"
3
+ title: "Seller handles proposal finalize — asap start_time form"
4
+ category: media_buy_seller
5
+ summary: "Variant of proposal_finalize that exercises start_time: 'asap' on create_media_buy, catching wrapper-layer rejections of the spec-defined string literal form."
6
+ track: media_buy
7
+ required_tools:
8
+ - get_products
9
+ - create_media_buy
10
+
11
+ requires_capability:
12
+ path: media_buy.supports_proposals
13
+ equals: true
14
+
15
+ narrative: |
16
+ Mirrors the proposal_finalize scenario but passes start_time: "asap" (the spec-defined
17
+ string literal from start-timing.json) when accepting the committed proposal. This arm
18
+ catches implementations that accept ISO 8601 dates but reject the "asap" string form
19
+ at the wrapper/validation layer before the handler's date-carry-forward logic runs.
20
+
21
+ The AdCP spec defines start_time as a oneOf over two string variants: the literal "asap"
22
+ and an ISO 8601 date-time string. Both must be accepted by conformant sellers.
23
+
24
+ Background: an adopter identified that their Pydantic wrapper was rejecting
25
+ "asap" at the input-validation layer. The current proposal_finalize scenario only tests
26
+ the ISO date form; this variant provides coverage for the "asap" form.
27
+
28
+ agent:
29
+ interaction_model: media_buy_seller
30
+ capabilities:
31
+ - sells_media
32
+ - accepts_briefs
33
+ - generates_proposals
34
+ examples:
35
+ - "Full-service publisher with proposal engine"
36
+ - "Retail media network with curated packages"
37
+
38
+ caller:
39
+ role: buyer_agent
40
+ example: "Pinnacle Agency (buyer)"
41
+
42
+ prerequisites:
43
+ description: |
44
+ The caller needs a brand identity and operator credentials. The seller must support
45
+ proposal generation (return proposals alongside products in get_products responses).
46
+ test_kit: "test-kits/acme-outdoor.yaml"
47
+
48
+ phases:
49
+ - id: setup
50
+ title: "Account setup"
51
+ steps:
52
+ - id: sync_accounts
53
+ title: "Establish account"
54
+ task: sync_accounts
55
+ schema_ref: "account/sync-accounts-request.json"
56
+ response_schema_ref: "account/sync-accounts-response.json"
57
+ doc_ref: "/accounts/tasks/sync_accounts"
58
+ stateful: true
59
+ expected: |
60
+ Return the account with account_id and status active.
61
+
62
+ sample_request:
63
+ accounts:
64
+ - brand:
65
+ domain: "acmeoutdoor.example"
66
+ operator: "pinnacle-agency.example"
67
+ billing: "operator"
68
+ payment_terms: "net_30"
69
+
70
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_asap_timing_setup_sync_accounts"
71
+ validations:
72
+ - check: response_schema
73
+ description: "Response matches sync-accounts-response.json schema"
74
+ - check: field_present
75
+ path: "accounts[0].account_id"
76
+ description: "Account has a platform-assigned ID"
77
+
78
+ - id: brief_with_proposals
79
+ title: "Brief with proposals"
80
+ narrative: |
81
+ Send a brief and receive proposals alongside products.
82
+
83
+ steps:
84
+ - id: get_products_brief
85
+ title: "Send a brief and receive proposals"
86
+ task: get_products
87
+ schema_ref: "media-buy/get-products-request.json"
88
+ response_schema_ref: "media-buy/get-products-response.json"
89
+ doc_ref: "/media-buy/task-reference/get_products"
90
+ comply_scenario: full_sales_flow
91
+ stateful: false
92
+ expected: |
93
+ Return products and proposals matching the brief:
94
+ - products: individual products with pricing and forecasts
95
+ - proposals: curated media plans with proposal_id, budget_allocations, rationale
96
+
97
+ sample_request:
98
+ buying_mode: "brief"
99
+ brief: "Premium video and display across outdoor lifestyle and sports. Q2 flight, $50K budget. Adults 25-54, US and Canada."
100
+ account:
101
+ brand:
102
+ domain: "acmeoutdoor.example"
103
+ operator: "pinnacle-agency.example"
104
+
105
+ context_outputs:
106
+ - path: "proposals[0].proposal_id"
107
+ key: "proposal_id"
108
+
109
+ validations:
110
+ - check: response_schema
111
+ description: "Response matches get-products-response.json schema"
112
+ - check: field_present
113
+ path: "products"
114
+ description: "Response contains products"
115
+ - check: field_present
116
+ path: "proposals"
117
+ description: "Response contains proposals"
118
+ - check: field_present
119
+ path: "proposals[0].proposal_id"
120
+ description: "Proposals have IDs"
121
+
122
+ - id: refine_proposal
123
+ title: "Refine the proposal"
124
+ narrative: |
125
+ The buyer reviews and refines the proposal before finalization.
126
+
127
+ steps:
128
+ - id: get_products_refine
129
+ title: "Refine a specific proposal"
130
+ task: get_products
131
+ schema_ref: "media-buy/get-products-request.json"
132
+ response_schema_ref: "media-buy/get-products-response.json"
133
+ doc_ref: "/media-buy/task-reference/get_products"
134
+ comply_scenario: full_sales_flow
135
+ stateful: true
136
+ expected: |
137
+ Return the refined proposal reflecting the requested changes.
138
+
139
+ sample_request:
140
+ buying_mode: "refine"
141
+ refine:
142
+ - scope: "proposal"
143
+ proposal_id: "$context.proposal_id"
144
+ ask: "Shift 60% of budget to CTV. Drop the display product and redistribute that budget to video."
145
+ - scope: "request"
146
+ ask: "All products must support frequency capping at 3 per day."
147
+ account:
148
+ brand:
149
+ domain: "acmeoutdoor.example"
150
+ operator: "pinnacle-agency.example"
151
+
152
+ validations:
153
+ - check: response_schema
154
+ description: "Response matches get-products-response.json schema"
155
+ - check: field_present
156
+ path: "proposals"
157
+ description: "Response contains updated proposals"
158
+
159
+ - id: finalize_proposal
160
+ title: "Finalize the proposal"
161
+ narrative: |
162
+ The buyer requests finalization to transition the proposal from draft to committed
163
+ with firm pricing and an inventory hold.
164
+
165
+ steps:
166
+ - id: get_products_finalize
167
+ title: "Finalize the proposal"
168
+ task: get_products
169
+ schema_ref: "media-buy/get-products-request.json"
170
+ response_schema_ref: "media-buy/get-products-response.json"
171
+ doc_ref: "/media-buy/task-reference/get_products"
172
+ comply_scenario: full_sales_flow
173
+ stateful: true
174
+ expected: |
175
+ Return the finalized proposal with committed status:
176
+ - proposals[0].proposal_status: committed
177
+ - proposals[0].expires_at: timestamp for the inventory hold window
178
+ - Firm pricing (not indicative)
179
+ - The proposal is ready to accept via create_media_buy
180
+
181
+ sample_request:
182
+ buying_mode: "refine"
183
+ refine:
184
+ - scope: "proposal"
185
+ proposal_id: "$context.proposal_id"
186
+ action: "finalize"
187
+ account:
188
+ brand:
189
+ domain: "acmeoutdoor.example"
190
+ operator: "pinnacle-agency.example"
191
+
192
+ context_outputs:
193
+ - path: "proposals[0].insertion_order.io_id"
194
+ key: "io_id"
195
+
196
+ validations:
197
+ - check: response_schema
198
+ description: "Response matches get-products-response.json schema"
199
+ - check: field_present
200
+ path: "proposals"
201
+ description: "Response contains the finalized proposal"
202
+
203
+ - id: accept_proposal
204
+ title: "Accept the committed proposal with start_time: asap"
205
+ narrative: |
206
+ The buyer accepts the committed proposal via create_media_buy, supplying
207
+ start_time as the string literal "asap" (the spec-defined form from
208
+ start-timing.json). This verifies the seller's input-validation layer
209
+ accepts this form without rejecting it before the handler runs.
210
+
211
+ io_acceptance is included so this scenario works against sellers that
212
+ finalize proposals with requires_signature: true (the common production
213
+ shape). The asap-vs-iso check is on start_time only — passing io_acceptance
214
+ keeps the IO gate satisfied so the start_time form is the discriminator.
215
+
216
+ Response field checks (media_buy_id, status, etc.) are intentionally limited
217
+ to response_schema here. Behavioral verification of the create_media_buy
218
+ response is the parent proposal_finalize scenario's job. This variant's sole
219
+ purpose is to confirm the seller's input layer does not reject start_time:
220
+ "asap" before the handler runs — a non-error response satisfies that.
221
+
222
+ steps:
223
+ - id: create_media_buy
224
+ title: "Create media buy from proposal — start_time: asap"
225
+ task: create_media_buy
226
+ schema_ref: "media-buy/create-media-buy-request.json"
227
+ response_schema_ref: "media-buy/create-media-buy-response.json"
228
+ doc_ref: "/media-buy/task-reference/create_media_buy"
229
+ comply_scenario: create_media_buy
230
+ stateful: true
231
+ expected: |
232
+ Convert the committed proposal into an active media buy:
233
+ - media_buy_id: the seller's identifier
234
+ - status: active
235
+ - confirmed_at: timestamp
236
+ - packages: line items derived from the proposal's budget allocations
237
+ - proposal_id: echoed back to confirm which proposal was accepted
238
+
239
+ The seller MUST accept start_time: "asap" (string literal) without
240
+ rejecting it at the wrapper/input-validation layer.
241
+
242
+ sample_request:
243
+ brand:
244
+ domain: "acmeoutdoor.example"
245
+ account:
246
+ brand:
247
+ domain: "acmeoutdoor.example"
248
+ operator: "pinnacle-agency.example"
249
+ sandbox: true
250
+ proposal_id: "$context.proposal_id"
251
+ total_budget:
252
+ amount: 50000
253
+ currency: "USD"
254
+ start_time: "asap"
255
+ end_time: "2026-06-30T23:59:59Z"
256
+ io_acceptance:
257
+ io_id: "$context.io_id"
258
+ accepted_at: "2026-03-15T14:30:00Z"
259
+ signatory: "ops@acmeoutdoor.example"
260
+
261
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_asap_timing_accept_proposal_create_media_buy"
262
+ validations:
263
+ - check: response_schema
264
+ description: "Response matches create-media-buy-response.json schema"