@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,586 @@
1
+ id: sales_proposal_mode
2
+ version: "1.0.0"
3
+ title: "Media buy via proposal acceptance"
4
+ protocol: media-buy
5
+ category: sales_proposal_mode
6
+ summary: "Seller agent that generates curated media plan proposals the buyer can review, refine, and accept."
7
+ track: media_buy
8
+ required_tools:
9
+ - get_products
10
+ - create_media_buy
11
+ requires_scenarios:
12
+ - media_buy_seller/proposal_finalize
13
+ - media_buy_seller/proposal_finalize_asap_timing
14
+ - media_buy_seller/proposal_not_found_errors
15
+ - media_buy_seller/delivery_reporting
16
+ - media_buy_seller/measurement_terms_rejected
17
+ - media_buy_seller/pending_creatives_to_start
18
+ - media_buy_seller/inventory_list_targeting
19
+ - media_buy_seller/inventory_list_no_match
20
+ - media_buy_seller/invalid_transitions
21
+
22
+ # Cross-step assertion (adcp#2664). status.monotonic rejects resource
23
+ # status transitions observed across steps that aren't on the spec
24
+ # lifecycle graph — e.g. committed → draft on a proposal or active →
25
+ # pending_creatives on a media_buy.
26
+ invariants:
27
+ - status.monotonic
28
+
29
+ narrative: |
30
+ **DEPRECATED in 3.1 — see https://github.com/adcontextprotocol/adcp/issues/3823**
31
+ Proposal-driven flows now grade under `sales-guaranteed`, capability-gated on
32
+ `media_buy.supports_proposals` (see #3844). Sellers that currently declare
33
+ `sales-proposal-mode` should drop it and declare `sales-guaranteed` plus
34
+ `media_buy.supports_proposals: true` instead. This storyboard is retained for
35
+ backward compat through 3.x and removed at 4.0. The `media_buy_seller/proposal_finalize`
36
+ scenario lives under `sales-guaranteed.requires_scenarios`.
37
+
38
+ Your seller generates curated media plan proposals. The buyer sends a brief, your platform
39
+ returns products alongside proposals — curated bundles with budget allocations and rationale
40
+ for each recommendation. The buyer reviews, optionally refines, and then accepts a proposal
41
+ as-is instead of manually building packages.
42
+
43
+ Proposal mode is the recommended flow for buyers who trust the seller's product
44
+ recommendations. Instead of the buyer cherry-picking individual products and assembling
45
+ packages, the seller's AI builds an optimized media plan that the buyer can accept with a
46
+ single call.
47
+
48
+ This storyboard walks through the proposal lifecycle: brief, proposal generation, optional
49
+ refinement, acceptance, creative sync, and delivery monitoring.
50
+
51
+ agent:
52
+ interaction_model: media_buy_seller
53
+ capabilities:
54
+ - sells_media
55
+ - accepts_briefs
56
+ - generates_proposals
57
+ examples:
58
+ - "Full-service publisher with AI planning"
59
+ - "Retail media network with curated packages"
60
+ - "Premium video platform with proposal engine"
61
+
62
+ caller:
63
+ role: buyer_agent
64
+ example: "Pinnacle Agency (buyer)"
65
+
66
+ prerequisites:
67
+ description: |
68
+ The caller needs a brand identity and operator credentials for account setup.
69
+ The test kit provides a sample brand (Acme Outdoor) with campaign parameters
70
+ suitable for testing the proposal acceptance flow.
71
+ test_kit: "test-kits/acme-outdoor.yaml"
72
+
73
+ phases:
74
+ - id: capability_discovery
75
+ title: "Capability discovery"
76
+ narrative: |
77
+ The buyer calls get_adcp_capabilities to confirm the agent supports media buying before sending briefs or creating buys.
78
+
79
+ steps:
80
+ - id: get_capabilities
81
+ title: "Check agent capabilities"
82
+ narrative: |
83
+ Verify that the agent declares the expected protocol support before
84
+ proceeding with domain-specific operations.
85
+ task: get_adcp_capabilities
86
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
87
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
88
+ doc_ref: "/protocol/get_adcp_capabilities"
89
+ comply_scenario: capability_discovery
90
+ stateful: false
91
+ expected: |
92
+ Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
93
+ sample_request:
94
+ context:
95
+ correlation_id: "sales_proposal_mode--get_capabilities"
96
+ validations:
97
+ - check: response_schema
98
+ description: "Response matches get-adcp-capabilities-response.json schema"
99
+ - check: field_present
100
+ path: "supported_protocols"
101
+ description: "Agent declares supported protocols"
102
+
103
+ - check: field_present
104
+ path: "context"
105
+ description: "Response echoes back the context object"
106
+ - check: field_value
107
+ path: "context.correlation_id"
108
+ value: "sales_proposal_mode--get_capabilities"
109
+ description: "Context correlation_id returned unchanged"
110
+ - id: account_setup
111
+ title: "Account setup"
112
+ narrative: |
113
+ The buyer establishes an account relationship with your platform before
114
+ requesting proposals.
115
+
116
+ steps:
117
+ - id: sync_accounts
118
+ title: "Establish account relationship"
119
+ narrative: |
120
+ The buyer registers their brand and operator with your platform.
121
+ task: sync_accounts
122
+ schema_ref: "account/sync-accounts-request.json"
123
+ response_schema_ref: "account/sync-accounts-response.json"
124
+ doc_ref: "/accounts/tasks/sync_accounts"
125
+ stateful: true
126
+ expected: |
127
+ Return the account with:
128
+ - account_id: your platform's identifier for this relationship
129
+ - action: created or updated
130
+ - status: active or pending_approval
131
+ - payment_terms: net_30, prepay, etc.
132
+
133
+ sample_request:
134
+ accounts:
135
+ - brand:
136
+ domain: "acmeoutdoor.example"
137
+ operator: "pinnacle-agency.example"
138
+ billing: "operator"
139
+ payment_terms: "net_30"
140
+
141
+ idempotency_key: "$generate:uuid_v4#sales_proposal_mode_account_setup_sync_accounts"
142
+ context:
143
+ correlation_id: "sales_proposal_mode--sync_accounts"
144
+ validations:
145
+ - check: response_schema
146
+ description: "Response matches sync-accounts-response.json schema"
147
+ - check: field_present
148
+ path: "accounts[0].account_id"
149
+ description: "Account has a platform-assigned ID"
150
+
151
+ - check: field_present
152
+ path: "context"
153
+ description: "Response echoes back the context object"
154
+ - check: field_value
155
+ path: "context.correlation_id"
156
+ value: "sales_proposal_mode--sync_accounts"
157
+ description: "Context correlation_id returned unchanged"
158
+ - id: brief_with_proposals
159
+ title: "Brief with proposals"
160
+ narrative: |
161
+ The buyer sends a brief. Your platform returns products and — because you support
162
+ proposal mode — also returns proposals: curated media plans with budget allocations,
163
+ product selections, and rationale for each recommendation. The buyer can review
164
+ multiple proposals side by side.
165
+
166
+ steps:
167
+ - id: get_products_brief
168
+ title: "Send a brief and receive proposals"
169
+ narrative: |
170
+ The buyer describes what they want. Your platform returns products alongside
171
+ one or more proposals. Each proposal bundles products with budget allocations
172
+ and explains why those products were selected and how the budget was distributed.
173
+
174
+ Proposals give the buyer a ready-to-accept media plan instead of requiring
175
+ manual package assembly.
176
+ task: get_products
177
+ schema_ref: "media-buy/get-products-request.json"
178
+ response_schema_ref: "media-buy/get-products-response.json"
179
+ doc_ref: "/media-buy/task-reference/get_products"
180
+ comply_scenario: full_sales_flow
181
+ stateful: false
182
+ expected: |
183
+ Return products and proposals matching the brief:
184
+ - products: individual products with pricing and forecasts
185
+ - proposals: curated media plans, each containing:
186
+ - proposal_id: unique identifier for this proposal
187
+ - name: descriptive label (e.g., "Balanced Reach Plan")
188
+ - budget_allocations: how the total budget is split across products
189
+ - rationale: why these products were selected and how the budget was distributed
190
+ - total_budget: sum of allocations
191
+ - forecast: aggregate impressions, reach, frequency
192
+
193
+ sample_request:
194
+ buying_mode: "brief"
195
+ brief: "Premium video and display across outdoor lifestyle and sports. Q2 flight, $50K total budget. Adults 25-54, US and Canada. Looking for a balanced plan across CTV, online video, and display."
196
+ account:
197
+ brand:
198
+ domain: "acmeoutdoor.example"
199
+ operator: "pinnacle-agency.example"
200
+
201
+ context:
202
+ correlation_id: "sales_proposal_mode--get_products_brief"
203
+ validations:
204
+ - check: response_schema
205
+ description: "Response matches get-products-response.json schema"
206
+ - check: field_present
207
+ path: "products"
208
+ description: "Response contains a products array"
209
+ - check: field_present
210
+ path: "proposals"
211
+ description: "Response contains a proposals array"
212
+ - check: field_present
213
+ path: "proposals[0].proposal_id"
214
+ description: "Each proposal has a proposal_id"
215
+
216
+ - check: field_present
217
+ path: "context"
218
+ description: "Response echoes back the context object"
219
+ - check: field_value
220
+ path: "context.correlation_id"
221
+ value: "sales_proposal_mode--get_products_brief"
222
+ description: "Context correlation_id returned unchanged"
223
+ - check: field_present
224
+ path: "products[0].format_ids"
225
+ description: "Products include format_ids for creative requirements"
226
+ - check: field_present
227
+ path: "products[0].format_ids[0].agent_url"
228
+ description: "Format IDs include agent_url — must match this agent's URL"
229
+ - check: field_present
230
+ path: "products[0].format_ids[0].id"
231
+ description: "Format IDs include id — must be accepted back in sync_creatives"
232
+ - id: review_refine
233
+ title: "Refine a proposal"
234
+ narrative: |
235
+ The buyer reviews the proposals and wants to adjust one. They call get_products
236
+ in refine mode targeting a specific proposal_id. The refinement might adjust
237
+ budget splits, swap a product, or add constraints. Your platform returns the
238
+ updated proposal.
239
+
240
+ steps:
241
+ - id: get_products_refine
242
+ title: "Refine a specific proposal"
243
+ narrative: |
244
+ The buyer targets a specific proposal for refinement. They reference the
245
+ proposal_id and describe what they want to change. Your platform applies
246
+ the refinements to that proposal and returns the updated version.
247
+ task: get_products
248
+ schema_ref: "media-buy/get-products-request.json"
249
+ response_schema_ref: "media-buy/get-products-response.json"
250
+ doc_ref: "/media-buy/task-reference/get_products"
251
+ comply_scenario: full_sales_flow
252
+ stateful: true
253
+ expected: |
254
+ Return the refined proposal:
255
+ - proposals: updated proposal reflecting the requested changes
256
+ - refinement_applied: how each refinement was handled
257
+ - Updated budget allocations, product selections, and forecasts
258
+ - products: updated product set if products were swapped
259
+
260
+ sample_request:
261
+ buying_mode: "refine"
262
+ refine:
263
+ - scope: "proposal"
264
+ proposal_id: "$context.proposal_id"
265
+ ask: "Shift 60% of budget to CTV. Drop the display product and redistribute that budget to video."
266
+ - scope: "request"
267
+ ask: "All products must support frequency capping at 3 per day."
268
+ account:
269
+ brand:
270
+ domain: "acmeoutdoor.example"
271
+ operator: "pinnacle-agency.example"
272
+
273
+ context:
274
+ correlation_id: "sales_proposal_mode--get_products_refine"
275
+ validations:
276
+ - check: response_schema
277
+ description: "Response matches get-products-response.json schema"
278
+ - check: field_present
279
+ path: "proposals"
280
+ description: "Response contains updated proposals"
281
+
282
+ - check: field_present
283
+ path: "context"
284
+ description: "Response echoes back the context object"
285
+ - check: field_value
286
+ path: "context.correlation_id"
287
+ value: "sales_proposal_mode--get_products_refine"
288
+ description: "Context correlation_id returned unchanged"
289
+ - check: field_present
290
+ path: "products[0].format_ids"
291
+ description: "Products include format_ids for creative requirements"
292
+ - check: field_present
293
+ path: "products[0].format_ids[0].agent_url"
294
+ description: "Format IDs include agent_url — must match this agent's URL"
295
+ - check: field_present
296
+ path: "products[0].format_ids[0].id"
297
+ description: "Format IDs include id — must be accepted back in sync_creatives"
298
+ - id: finalize_proposal
299
+ title: "Finalize the proposal"
300
+ narrative: |
301
+ Before accepting, the buyer requests finalization. This transitions the proposal from
302
+ draft (indicative pricing) to committed (firm pricing with inventory hold). For
303
+ guaranteed inventory, finalization also produces an insertion order the buyer
304
+ countersigns when calling create_media_buy.
305
+
306
+ steps:
307
+ - id: get_products_finalize
308
+ title: "Finalize the refined proposal"
309
+ narrative: |
310
+ The buyer requests finalization on the refined proposal. The seller commits
311
+ firm pricing and (for guaranteed inventory) returns an insertion order with
312
+ a signature requirement.
313
+ task: get_products
314
+ schema_ref: "media-buy/get-products-request.json"
315
+ response_schema_ref: "media-buy/get-products-response.json"
316
+ doc_ref: "/media-buy/task-reference/get_products"
317
+ comply_scenario: full_sales_flow
318
+ stateful: true
319
+ expected: |
320
+ Return the finalized proposal with committed status:
321
+ - proposals[0].proposal_status: committed
322
+ - proposals[0].expires_at: timestamp for the inventory hold window
323
+ - For guaranteed inventory, proposals[0].insertion_order with io_id
324
+ - The proposal is ready to accept via create_media_buy
325
+
326
+ sample_request:
327
+ buying_mode: "refine"
328
+ refine:
329
+ - scope: "proposal"
330
+ proposal_id: "$context.proposal_id"
331
+ action: "finalize"
332
+ account:
333
+ brand:
334
+ domain: "acmeoutdoor.example"
335
+ operator: "pinnacle-agency.example"
336
+
337
+ context:
338
+ correlation_id: "sales_proposal_mode--get_products_finalize"
339
+
340
+ context_outputs:
341
+ - path: "proposals[0].insertion_order.io_id"
342
+ key: "io_id"
343
+
344
+ validations:
345
+ - check: response_schema
346
+ description: "Response matches get-products-response.json schema"
347
+ - check: field_present
348
+ path: "proposals"
349
+ description: "Response contains the finalized proposal"
350
+ - id: accept_proposal
351
+ title: "Accept the proposal"
352
+ narrative: |
353
+ The buyer is satisfied with the refined proposal and accepts it by creating a
354
+ media buy with the proposal_id. Instead of specifying individual packages, the
355
+ buyer passes the proposal_id and total_budget. Your platform converts the proposal
356
+ into an active media buy with the exact product selections and budget allocations
357
+ from the proposal.
358
+
359
+ steps:
360
+ - id: create_media_buy
361
+ title: "Create a media buy from proposal"
362
+ narrative: |
363
+ The buyer accepts a proposal by passing proposal_id to create_media_buy. The
364
+ buyer does NOT specify a packages array — the platform uses the proposal's
365
+ product selections and budget allocations to build the packages automatically.
366
+
367
+ This is the key difference from manual package creation: the buyer trusts the
368
+ seller's recommendation and accepts the plan as-is.
369
+ task: create_media_buy
370
+ schema_ref: "media-buy/create-media-buy-request.json"
371
+ response_schema_ref: "media-buy/create-media-buy-response.json"
372
+ doc_ref: "/media-buy/task-reference/create_media_buy"
373
+ comply_scenario: create_media_buy
374
+ stateful: true
375
+ expected: |
376
+ Convert the proposal into an active media buy:
377
+ - media_buy_id: your platform's identifier
378
+ - status: active
379
+ - confirmed_at: timestamp
380
+ - packages: line items derived from the proposal's budget allocations
381
+ - proposal_id: echoed back to confirm which proposal was accepted
382
+ - valid_actions: creative sync, pause, get_delivery
383
+
384
+ sample_request:
385
+ brand:
386
+ domain: "acmeoutdoor.example"
387
+ account:
388
+ brand:
389
+ domain: "acmeoutdoor.example"
390
+ operator: "pinnacle-agency.example"
391
+ proposal_id: "$context.proposal_id"
392
+ total_budget:
393
+ amount: 50000
394
+ currency: "USD"
395
+ start_time: "2026-04-01T00:00:00Z"
396
+ end_time: "2026-06-30T23:59:59Z"
397
+ io_acceptance:
398
+ io_id: "$context.io_id"
399
+ accepted_at: "2026-03-15T14:30:00Z"
400
+ signatory: "ops@acmeoutdoor.example"
401
+
402
+ idempotency_key: "$generate:uuid_v4#sales_proposal_mode_accept_proposal_create_media_buy"
403
+ context:
404
+ correlation_id: "sales_proposal_mode--create_media_buy"
405
+ context_outputs:
406
+ - name: media_buy_id
407
+ path: "media_buy_id"
408
+ validations:
409
+ - check: response_schema
410
+ description: "Response matches create-media-buy-response.json schema"
411
+
412
+ - check: field_present
413
+ path: "context"
414
+ description: "Response echoes back the context object"
415
+ - check: field_value
416
+ path: "context.correlation_id"
417
+ value: "sales_proposal_mode--create_media_buy"
418
+ description: "Context correlation_id returned unchanged"
419
+ - id: creative_sync
420
+ title: "Creative sync"
421
+ narrative: |
422
+ With the proposal accepted and the media buy confirmed, the buyer syncs creative
423
+ assets. The buyer first checks what formats the accepted products require, then
424
+ pushes matching creative assets.
425
+
426
+ steps:
427
+ - id: list_formats
428
+ title: "Check creative format requirements"
429
+ narrative: |
430
+ The buyer confirms what creative formats the accepted proposal's products
431
+ require. Your platform returns format specs with asset requirements.
432
+ task: list_creative_formats
433
+ schema_ref: "creative/list-creative-formats-request.json"
434
+ response_schema_ref: "creative/list-creative-formats-response.json"
435
+ doc_ref: "/creative/task-reference/list_creative_formats"
436
+ comply_scenario: creative_lifecycle
437
+ stateful: false
438
+ expected: |
439
+ Return creative formats your platform accepts. Each format should define:
440
+ - format_id with your agent_url and unique id
441
+ - Asset requirements (dimensions, file sizes, mime types)
442
+ - Render dimensions
443
+
444
+ sample_request:
445
+ context:
446
+ correlation_id: "sales_proposal_mode--list_formats"
447
+
448
+ validations:
449
+ - check: response_schema
450
+ description: "Response matches list-creative-formats-response.json schema"
451
+ - check: field_present
452
+ path: "formats"
453
+ description: "Response contains formats array"
454
+
455
+ - check: field_present
456
+ path: "context"
457
+ description: "Response echoes back the context object"
458
+ - check: field_value
459
+ path: "context.correlation_id"
460
+ value: "sales_proposal_mode--list_formats"
461
+ description: "Context correlation_id returned unchanged"
462
+ - check: field_present
463
+ path: "formats[0].format_id.agent_url"
464
+ description: "Format IDs include agent_url"
465
+ - check: field_present
466
+ path: "formats[0].format_id.id"
467
+ description: "Format IDs include id — must match those in get_products"
468
+ - id: sync_creatives
469
+ title: "Push creative assets"
470
+ narrative: |
471
+ The buyer uploads creative assets for the products in the accepted proposal.
472
+ Your platform validates each creative against the format specs and returns
473
+ per-creative status.
474
+ task: sync_creatives
475
+ schema_ref: "creative/sync-creatives-request.json"
476
+ response_schema_ref: "creative/sync-creatives-response.json"
477
+ doc_ref: "/creative/task-reference/sync_creatives"
478
+ comply_scenario: creative_sync
479
+ stateful: true
480
+ expected: |
481
+ Accept and validate creatives:
482
+ - Per-creative action: created or updated
483
+ - Per-creative status: accepted, pending_review, or rejected
484
+ - Validation errors for rejected creatives
485
+
486
+ sample_request:
487
+ account:
488
+ brand:
489
+ domain: "acmeoutdoor.example"
490
+ operator: "pinnacle-agency.example"
491
+ creatives:
492
+ - creative_id: "video_30s_trail_pro"
493
+ name: "Trail Pro 3000 - 30s CTV Spot"
494
+ format_id:
495
+ agent_url: "https://your-platform.example.com"
496
+ id: "ssai_30s"
497
+ assets:
498
+ video:
499
+ asset_type: "video"
500
+ url: "https://cdn.pinnacle-agency.example/trail-pro-30s.mp4"
501
+ width: 1920
502
+ height: 1080
503
+ duration_ms: 30000
504
+ mime_type: "video/mp4"
505
+ - creative_id: "video_15s_trail_pro"
506
+ name: "Trail Pro 3000 - 15s Online Video"
507
+ format_id:
508
+ agent_url: "https://your-platform.example.com"
509
+ id: "preroll_15s"
510
+ assets:
511
+ video:
512
+ asset_type: "video"
513
+ url: "https://cdn.pinnacle-agency.example/trail-pro-15s.mp4"
514
+ width: 1920
515
+ height: 1080
516
+ duration_ms: 15000
517
+ mime_type: "video/mp4"
518
+
519
+ idempotency_key: "$generate:uuid_v4#sales_proposal_mode_creative_sync_sync_creatives"
520
+ context:
521
+ correlation_id: "sales_proposal_mode--sync_creatives"
522
+ validations:
523
+ - check: response_schema
524
+ description: "Response matches sync-creatives-response.json schema"
525
+ - check: field_present
526
+ path: "creatives[0].action"
527
+ description: "Each creative has an action (created/updated)"
528
+
529
+ - check: field_present
530
+ path: "context"
531
+ description: "Response echoes back the context object"
532
+ - check: field_value
533
+ path: "context.correlation_id"
534
+ value: "sales_proposal_mode--sync_creatives"
535
+ description: "Context correlation_id returned unchanged"
536
+ - id: delivery
537
+ title: "Delivery and reporting"
538
+ narrative: |
539
+ The campaign from the accepted proposal is live. The buyer monitors delivery
540
+ to verify the proposal's forecasts are tracking.
541
+
542
+ steps:
543
+ - id: get_delivery
544
+ title: "Check delivery metrics"
545
+ narrative: |
546
+ The buyer requests delivery data for the media buy created from the proposal.
547
+ Your platform returns performance metrics that the buyer can compare against
548
+ the proposal's original forecasts.
549
+ task: get_media_buy_delivery
550
+ schema_ref: "media-buy/get-media-buy-delivery-request.json"
551
+ response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
552
+ doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
553
+ comply_scenario: reporting_flow
554
+ stateful: true
555
+ expected: |
556
+ Return delivery metrics for the media buy:
557
+ - Per-package delivery: impressions, clicks, spend, completion rates
558
+ - Pacing against the proposal's original forecast
559
+ - Budget utilization: spent vs. committed per package
560
+ - Daily breakdown if requested
561
+
562
+ sample_request:
563
+ account:
564
+ brand:
565
+ domain: "acmeoutdoor.example"
566
+ operator: "pinnacle-agency.example"
567
+ media_buy_ids:
568
+ - "$context.media_buy_id"
569
+ include_package_daily_breakdown: true
570
+
571
+ context:
572
+ correlation_id: "sales_proposal_mode--get_delivery"
573
+ validations:
574
+ - check: response_schema
575
+ description: "Response matches get-media-buy-delivery-response.json schema"
576
+ - check: field_present
577
+ path: "media_buy_deliveries"
578
+ description: "Response contains media buy delivery data"
579
+
580
+ - check: field_present
581
+ path: "context"
582
+ description: "Response echoes back the context object"
583
+ - check: field_value
584
+ path: "context.correlation_id"
585
+ value: "sales_proposal_mode--get_delivery"
586
+ description: "Context correlation_id returned unchanged"