@adcp/sdk 7.11.0 → 7.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
  2. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  3. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
  4. package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
  5. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
  6. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
  7. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  8. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
  9. package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
  10. package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
  11. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  12. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
  13. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  14. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
  15. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  16. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  17. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  18. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  19. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
  20. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
  21. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
  22. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  23. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  24. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  25. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
  26. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
  27. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
  28. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  29. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
  30. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  31. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  32. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
  33. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  34. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  35. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  36. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  37. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  38. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  39. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  40. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
  41. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  42. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  43. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  44. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  45. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  46. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  47. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  48. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
  49. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  50. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  51. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  52. package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
  53. package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
  54. package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
  55. package/compliance/cache/3.1.0-rc.2/index.json +356 -0
  56. package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
  57. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  58. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
  59. package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
  60. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
  61. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
  62. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  63. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
  64. package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
  65. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
  66. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  67. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
  68. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  69. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
  70. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  71. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  72. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  73. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  74. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
  75. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
  76. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
  77. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  78. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  79. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  80. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
  81. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
  82. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
  83. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  84. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
  85. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  86. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  87. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
  88. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  89. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  90. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  91. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  92. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  93. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  94. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  95. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
  96. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  97. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  98. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  99. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  100. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  101. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  102. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  103. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  104. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  105. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  106. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  107. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
  108. package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
  109. package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
  110. package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
  111. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
  112. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
  113. package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
  114. package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
  115. package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
  116. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
  117. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
  118. package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
  119. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
  120. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
  121. package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
  122. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
  123. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
  124. package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
  125. package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
  126. package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
  127. package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
  128. package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
  129. package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
  130. package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
  131. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
  132. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
  133. package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
  134. package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
  135. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
  136. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
  137. package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
  138. package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
  139. package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
  140. package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
  141. package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
  142. package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
  143. package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
  144. package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
  145. package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
  146. package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
  147. package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
  148. package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
  149. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  150. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
  151. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  152. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  153. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  154. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  155. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  156. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  157. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  158. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  159. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  160. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
  161. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
  162. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
  163. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  164. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  165. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  166. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  167. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  168. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  169. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  170. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  171. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  172. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  173. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  174. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  175. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  176. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  177. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  178. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  179. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  180. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  181. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  182. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  183. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  184. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  185. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  186. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  187. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  188. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  189. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  190. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
  191. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  192. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  193. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  194. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  195. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  196. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  197. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  198. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  199. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  200. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  201. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  202. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  203. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
  204. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
  205. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  206. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  207. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  208. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  209. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  210. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  211. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  212. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  213. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  214. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  215. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  216. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  217. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  218. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  219. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  220. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  221. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  222. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  223. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  224. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  225. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  226. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  227. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  228. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  229. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  230. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  231. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  232. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  233. package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
  234. package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
  235. package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
  236. package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
  237. package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
  238. package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
  239. package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
  240. package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
  241. package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
  242. package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
  243. package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
  244. package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
  245. package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
  246. package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
  247. package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
  248. package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
  249. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
  250. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
  251. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
  252. package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
  253. package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
  254. package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
  255. package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
  256. package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
  257. package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
  258. package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
  259. package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
  260. package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
  261. package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
  262. package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
  263. package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
  264. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
  265. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
  266. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
  267. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
  268. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
  269. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  270. package/dist/lib/testing/storyboard/default-invariants.js +23 -0
  271. package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
  272. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  273. package/dist/lib/testing/storyboard/runner.js +84 -21
  274. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  275. package/dist/lib/testing/storyboard/types.d.ts +21 -0
  276. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  277. package/dist/lib/testing/storyboard/types.js.map +1 -1
  278. package/dist/lib/testing/types.d.ts +9 -0
  279. package/dist/lib/testing/types.d.ts.map +1 -1
  280. package/dist/lib/version.d.ts +3 -3
  281. package/dist/lib/version.js +3 -3
  282. package/package.json +1 -1
@@ -0,0 +1,738 @@
1
+ id: sales_broadcast_tv
2
+ version: "1.0.0"
3
+ title: "Broadcast linear TV seller agent"
4
+ protocol: media-buy
5
+ category: sales_broadcast_tv
6
+ summary: "Seller agent for broadcast linear TV inventory — primetime and fringe spots with measurement windows, agency estimate numbers, Ad-ID-based creative sync, and delayed delivery reporting."
7
+ track: media_buy
8
+ required_tools:
9
+ - sync_governance
10
+ - get_products
11
+ - create_media_buy
12
+ requires_scenarios:
13
+ - media_buy_seller/refine_products
14
+ - media_buy_seller/delivery_reporting
15
+ - media_buy_seller/measurement_terms_rejected
16
+ - media_buy_seller/pending_creatives_to_start
17
+ - media_buy_seller/inventory_list_targeting
18
+ - media_buy_seller/inventory_list_no_match
19
+ - media_buy_seller/invalid_transitions
20
+ - governance_aware_seller/governance_multi_agent_rejected
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. active → pending_creatives on a media_buy.
25
+ invariants:
26
+ - status.monotonic
27
+
28
+ context:
29
+ governance_agent_url: "https://test-agent.adcontextprotocol.org"
30
+
31
+ narrative: |
32
+ You run a broadcast television platform — a local TV station group, network affiliate,
33
+ or television rep firm that sells linear advertising inventory. A buyer agent connects
34
+ to discover your dayparts and programs, negotiate guaranteed buys, sync broadcast spot
35
+ files, and monitor delivery against measurement windows.
36
+
37
+ Broadcast buying differs from digital in several ways. Products are organized by daypart
38
+ and program rather than audience segment. Pricing is unit-based (cost per spot) rather
39
+ than impression-based. Measurement accumulates over time through Live, C3, and C7
40
+ windows as DVR playback is counted. Creative assets are broadcast-grade video files
41
+ identified by Ad-ID — no VAST wrappers, no impression trackers, no click URLs.
42
+
43
+ Delivery data arrives on a delay. Live ratings are available within a day, but C3 and
44
+ C7 data take 4 and 8 days respectively after broadcast. Final reconciliation happens
45
+ against C7 numbers, which means billing data is not complete until ~15 days after the
46
+ last air date.
47
+
48
+ This storyboard walks through the broadcast buying cycle from product discovery through
49
+ reconciliation, exercising the protocol fields that distinguish linear TV from digital.
50
+
51
+ agent:
52
+ interaction_model: media_buy_seller
53
+ capabilities:
54
+ - sells_media
55
+ - accepts_briefs
56
+ - supports_guaranteed
57
+ examples:
58
+ - "Local TV station groups"
59
+ - "Broadcast network affiliates"
60
+ - "Television rep firms"
61
+
62
+ caller:
63
+ role: buyer_agent
64
+ example: "Pinnacle Agency"
65
+
66
+ prerequisites:
67
+ description: |
68
+ The caller needs an established account relationship with the seller. The test
69
+ kit provides the Nova Motors Volta EV launch campaign — an automotive brand with
70
+ national broadcast reach goals and budget appropriate for primetime linear TV.
71
+ test_kit: "test-kits/nova-motors.yaml"
72
+ controller_seeding: true
73
+
74
+ fixtures:
75
+ products:
76
+ - product_id: "primetime_30s_mf"
77
+ delivery_type: "guaranteed"
78
+ channels: ["video"]
79
+ format_ids:
80
+ - id: "broadcast_spot_30s"
81
+ - product_id: "late_fringe_15s_mf"
82
+ delivery_type: "guaranteed"
83
+ channels: ["video"]
84
+ format_ids:
85
+ - id: "broadcast_spot_15s"
86
+ pricing_options:
87
+ - product_id: "primetime_30s_mf"
88
+ pricing_option_id: "unit_primetime_30"
89
+ pricing_model: "flat_rate"
90
+ currency: "USD"
91
+ fixed_price: 4500.0
92
+ - product_id: "late_fringe_15s_mf"
93
+ pricing_option_id: "unit_fringe_15"
94
+ pricing_model: "flat_rate"
95
+ currency: "USD"
96
+ fixed_price: 1200.0
97
+
98
+ phases:
99
+ - id: capability_discovery
100
+ title: "Capability discovery"
101
+ narrative: |
102
+ The buyer calls get_adcp_capabilities to confirm the agent supports media buying before sending briefs or creating buys.
103
+
104
+ steps:
105
+ - id: get_capabilities
106
+ title: "Check agent capabilities"
107
+ narrative: |
108
+ Verify that the agent declares the expected protocol support before
109
+ proceeding with domain-specific operations.
110
+ task: get_adcp_capabilities
111
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
112
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
113
+ doc_ref: "/protocol/get_adcp_capabilities"
114
+ comply_scenario: capability_discovery
115
+ stateful: false
116
+ expected: |
117
+ Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
118
+ sample_request:
119
+ context:
120
+ correlation_id: "sales_broadcast_tv--get_capabilities"
121
+ validations:
122
+ - check: response_schema
123
+ description: "Response matches get-adcp-capabilities-response.json schema"
124
+ - check: field_present
125
+ path: "supported_protocols"
126
+ description: "Agent declares supported protocols"
127
+
128
+ - check: field_present
129
+ path: "context"
130
+ description: "Response echoes back the context object"
131
+ - check: field_value
132
+ path: "context.correlation_id"
133
+ value: "sales_broadcast_tv--get_capabilities"
134
+ description: "Context correlation_id returned unchanged"
135
+ - id: product_discovery
136
+ title: "Product discovery"
137
+ narrative: |
138
+ The buyer sends a brief describing what they want to buy on linear TV. The seller
139
+ interprets the brief against their program schedule, ratings estimates, and
140
+ available inventory to return products organized by daypart.
141
+
142
+ Broadcast products include measurement windows — Live, C3, and C7 — that describe
143
+ how ratings data accumulates over time. The buyer uses these windows to understand
144
+ when delivery data will be available and which window will serve as the guarantee
145
+ basis for reconciliation.
146
+
147
+ steps:
148
+ - id: get_products_brief
149
+ title: "Send a broadcast brief"
150
+ narrative: |
151
+ The buyer describes their linear TV goals in natural language. The seller
152
+ returns products representing available dayparts and programs, each with
153
+ unit-based pricing, audience delivery estimates, creative format requirements,
154
+ and measurement windows.
155
+
156
+ Measurement windows on each product tell the buyer: "Here is when data
157
+ becomes available and how it accumulates." Live ratings arrive within a day.
158
+ C3 (live + 3 days of DVR) arrives ~4 days after broadcast. C7 (live + 7 days
159
+ of DVR) arrives ~8 days after broadcast. The buyer decides which window to
160
+ use as the guarantee basis when creating the media buy.
161
+ task: get_products
162
+ schema_ref: "media-buy/get-products-request.json"
163
+ response_schema_ref: "media-buy/get-products-response.json"
164
+ doc_ref: "/media-buy/task-reference/get_products"
165
+ comply_scenario: full_sales_flow
166
+ stateful: false
167
+ expected: |
168
+ Return products matching the brief. Each product should include:
169
+ - product_id: unique identifier for the daypart or program package
170
+ - name: descriptive name (e.g., "Primetime :30 — M-F 8-11pm")
171
+ - delivery_type: guaranteed (standard for broadcast upfront and scatter)
172
+ - pricing_models: unit-based pricing (cost per spot or cost per unit)
173
+ - forecast: estimated impressions by demo, GRPs, reach
174
+ - creative_format_ids: broadcast spot formats (:15, :30, :60)
175
+ - reporting_capabilities with measurement_windows:
176
+ - live: real-time linear viewing, available within 24 hours
177
+ - c3: live + 3 days DVR playback, available ~4 days after air
178
+ - c7: live + 7 days DVR playback, available ~8 days after air
179
+
180
+ sample_request:
181
+ buying_mode: "brief"
182
+ brief: "Primetime and late fringe broadcast spots for an automotive EV launch. Q4 flight, $400K budget. Adults 25-54, national footprint. Need :30 and :15 spot lengths."
183
+ account:
184
+ brand:
185
+ domain: "novamotors.example"
186
+ operator: "pinnacle-agency.example"
187
+
188
+ context:
189
+ correlation_id: "sales_broadcast_tv--get_products_brief"
190
+ validations:
191
+ - check: response_schema
192
+ description: "Response matches get-products-response.json schema"
193
+ - check: field_present
194
+ path: "products"
195
+ description: "Response contains a products array"
196
+ - check: field_present
197
+ path: "products[0].product_id"
198
+ description: "Each product has a product_id"
199
+ - check: field_present
200
+ path: "products[0].delivery_type"
201
+ description: "Each product declares guaranteed delivery"
202
+
203
+ - check: field_present
204
+ path: "context"
205
+ description: "Response echoes back the context object"
206
+ - check: field_value
207
+ path: "context.correlation_id"
208
+ value: "sales_broadcast_tv--get_products_brief"
209
+ description: "Context correlation_id returned unchanged"
210
+ - check: field_present
211
+ path: "products[0].format_ids"
212
+ description: "Products include format_ids for creative requirements"
213
+ - check: field_present
214
+ path: "products[0].format_ids[0].agent_url"
215
+ description: "Format IDs include agent_url — must match this agent's URL"
216
+ - check: field_present
217
+ path: "products[0].format_ids[0].id"
218
+ description: "Format IDs include id — must be accepted back in sync_creatives"
219
+ - id: create_buy
220
+ title: "Create the media buy"
221
+ narrative: |
222
+ The buyer commits to specific daypart packages with unit counts and flight dates.
223
+ Broadcast buys carry an agency estimate number — the financial reference that links
224
+ the order to the agency's media plan and billing system. This number travels with
225
+ the order through traffic, delivery, and invoicing.
226
+
227
+ The buyer also specifies measurement terms, declaring which measurement window
228
+ (typically C7) serves as the guarantee basis. This tells the seller: "Bill me
229
+ based on C7 ratings, not live."
230
+
231
+ steps:
232
+ - id: sync_governance
233
+ title: "Register governance agent"
234
+ narrative: |
235
+ The buyer registers the configured governance agent on the account before
236
+ creating the broadcast media buy.
237
+ task: sync_governance
238
+ schema_ref: "account/sync-governance-request.json"
239
+ response_schema_ref: "account/sync-governance-response.json"
240
+ doc_ref: "/accounts/tasks/sync_governance"
241
+ stateful: true
242
+ expected: |
243
+ Acknowledge governance registration for the account:
244
+ - status: synced
245
+ - governance_agents[0].url echoes the configured governance agent
246
+
247
+ sample_request:
248
+ accounts:
249
+ - account:
250
+ brand:
251
+ domain: "novamotors.example"
252
+ operator: "pinnacle-agency.example"
253
+ governance_agents:
254
+ - url: "$context.governance_agent_url"
255
+ authentication:
256
+ schemes: ["Bearer"]
257
+ credentials: "gov-token-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
258
+
259
+ idempotency_key: "$generate:uuid_v4#sales_broadcast_tv_create_buy_sync_governance"
260
+ context:
261
+ correlation_id: "sales_broadcast_tv--sync_governance"
262
+ validations:
263
+ - check: response_schema
264
+ description: "Response matches sync-governance-response.json schema"
265
+ - check: field_value
266
+ path: "accounts[0].status"
267
+ value: "synced"
268
+ description: "Governance agent is registered on the account"
269
+ - check: field_present
270
+ path: "context"
271
+ description: "Response echoes back the context object"
272
+ - check: field_value
273
+ path: "context.correlation_id"
274
+ value: "sales_broadcast_tv--sync_governance"
275
+ description: "Context correlation_id returned unchanged"
276
+ - id: create_media_buy
277
+ title: "Create a broadcast media buy"
278
+ narrative: |
279
+ The buyer places the order with an agency estimate number at the buy level.
280
+ Each package references a product from discovery. The measurement_terms
281
+ specify C7 as the guarantee window — the seller will reconcile delivery
282
+ and billing against C7 ratings.
283
+
284
+ The response may be synchronous (buy confirmed) or — when traffic-manager
285
+ review is needed — the A2A task returns submitted with a task_id, and the
286
+ buyer waits on a webhook or tasks/get poll until the order is scheduled.
287
+ task: create_media_buy
288
+ schema_ref: "media-buy/create-media-buy-request.json"
289
+ response_schema_ref: "media-buy/create-media-buy-response.json"
290
+ doc_ref: "/media-buy/task-reference/create_media_buy"
291
+ comply_scenario: create_media_buy
292
+ stateful: true
293
+ expected: |
294
+ Process the broadcast media buy and return:
295
+ - media_buy_id: the seller's order identifier
296
+ - agency_estimate_number: echoed from the request
297
+ - status: pending_creatives (awaiting spot files) or active
298
+ - packages: line items with confirmed units, rates, and flight dates
299
+ - measurement_terms: confirmed guarantee window (c7)
300
+ - valid_actions: sync_creatives as the next step
301
+
302
+ If traffic-manager review is needed, return an A2A task envelope instead:
303
+ - status: submitted (task-level — not a MediaBuy status)
304
+ - task_id / taskId: handle the buyer polls or receives webhooks on
305
+ - message (optional): explanation that the traffic manager is reviewing
306
+
307
+ Do NOT use a "pending_approval" media buy status — that value is not in the
308
+ MediaBuy.status enum. IO / traffic-manager review is modelled at the task layer.
309
+
310
+ sample_request:
311
+ brand:
312
+ domain: "novamotors.example"
313
+ account:
314
+ brand:
315
+ domain: "novamotors.example"
316
+ operator: "pinnacle-agency.example"
317
+ agency_estimate_number: "PNNL-NM-2026-Q4-0847"
318
+ start_time: "2026-10-01T00:00:00Z"
319
+ end_time: "2026-12-31T23:59:59Z"
320
+ packages:
321
+ - product_id: "primetime_30s_mf"
322
+ budget: 280000
323
+ pricing_option_id: "unit_primetime_30"
324
+ creative_assignments:
325
+ - creative_id: "volta_ev_launch_30s"
326
+ measurement_terms:
327
+ billing_measurement:
328
+ vendor:
329
+ domain: "videoamp.example"
330
+ measurement_window: "c7"
331
+ max_variance_percent: 10
332
+ - product_id: "late_fringe_15s_mf"
333
+ budget: 120000
334
+ pricing_option_id: "unit_fringe_15"
335
+ creative_assignments:
336
+ - creative_id: "volta_ev_launch_15s"
337
+ measurement_terms:
338
+ billing_measurement:
339
+ vendor:
340
+ domain: "videoamp.example"
341
+ measurement_window: "c7"
342
+ max_variance_percent: 10
343
+ push_notification_config:
344
+ url: "{{runner.webhook_url:create_media_buy}}"
345
+ authentication:
346
+ schemes:
347
+ - "HMAC-SHA256"
348
+ credentials: "pinnacle-broadcast-tv-webhook-secret-token"
349
+
350
+ idempotency_key: "$generate:uuid_v4#sales_broadcast_tv_create_buy_create_media_buy"
351
+ context:
352
+ correlation_id: "sales_broadcast_tv--create_media_buy"
353
+ context_outputs:
354
+ - name: media_buy_id
355
+ path: "media_buy_id"
356
+ validations:
357
+ - check: response_schema
358
+ description: "Response matches create-media-buy-response.json schema"
359
+
360
+ - check: field_present
361
+ path: "context"
362
+ description: "Response echoes back the context object"
363
+ - check: field_value
364
+ path: "context.correlation_id"
365
+ value: "sales_broadcast_tv--create_media_buy"
366
+ description: "Context correlation_id returned unchanged"
367
+ - id: check_buy_status
368
+ title: "Check media buy status"
369
+ narrative: |
370
+ If create_media_buy returned working or submitted, the buyer polls for status
371
+ updates. For broadcast, the seller's traffic department may need to confirm
372
+ scheduling availability before the buy is active.
373
+ task: get_media_buys
374
+ schema_ref: "media-buy/get-media-buys-request.json"
375
+ response_schema_ref: "media-buy/get-media-buys-response.json"
376
+ doc_ref: "/media-buy/task-reference/get_media_buys"
377
+ comply_scenario: media_buy_lifecycle
378
+ stateful: true
379
+ expected: |
380
+ Return the current state of the media buy:
381
+ - media_buy_id: matches what was returned from create_media_buy
382
+ - status: pending_creatives, pending_start, active, paused, completed
383
+ - packages: line items with scheduling confirmation
384
+ - valid_actions: what operations are available in this state
385
+
386
+ If pending_creatives:
387
+ - Include message explaining that broadcast spot files are needed
388
+ - valid_actions should include sync_creatives
389
+
390
+ sample_request:
391
+ account:
392
+ brand:
393
+ domain: "novamotors.example"
394
+ operator: "pinnacle-agency.example"
395
+ media_buy_ids:
396
+ - "$context.media_buy_id"
397
+
398
+ context:
399
+ correlation_id: "sales_broadcast_tv--check_buy_status"
400
+ validations:
401
+ - check: response_schema
402
+ description: "Response matches get-media-buys-response.json schema"
403
+ - check: field_present
404
+ path: "media_buys[0].status"
405
+ description: "Each media buy has a status"
406
+
407
+ - check: field_present
408
+ path: "context"
409
+ description: "Response echoes back the context object"
410
+ - check: field_value
411
+ path: "context.correlation_id"
412
+ value: "sales_broadcast_tv--check_buy_status"
413
+ description: "Context correlation_id returned unchanged"
414
+ - id: creative_sync
415
+ title: "Creative sync"
416
+ narrative: |
417
+ Broadcast creative sync differs from digital in three ways. First, assets are
418
+ broadcast-grade video files — no VAST wrappers, no impression trackers, no click
419
+ URLs. The seller ingests the video file directly into their traffic and playout
420
+ system. Second, each creative carries an Ad-ID in industry_identifiers, which ties
421
+ the spot to rotation instructions and downstream traffic systems. Third, format
422
+ requirements are defined by spot length (:15, :30, :60) rather than pixel dimensions.
423
+
424
+ steps:
425
+ - id: list_formats
426
+ title: "Check broadcast format requirements"
427
+ narrative: |
428
+ The buyer confirms what broadcast spot formats the seller accepts. The seller
429
+ returns format specs defined by spot length, codec requirements, and file
430
+ delivery specifications. No VAST or tracker-related formats appear.
431
+ task: list_creative_formats
432
+ schema_ref: "creative/list-creative-formats-request.json"
433
+ response_schema_ref: "creative/list-creative-formats-response.json"
434
+ doc_ref: "/creative/task-reference/list_creative_formats"
435
+ comply_scenario: creative_lifecycle
436
+ stateful: false
437
+ expected: |
438
+ Return broadcast spot formats the platform accepts. Each format should define:
439
+ - format_id with your agent_url and unique id (e.g., "broadcast_30s", "broadcast_15s")
440
+ - Asset requirements: video codec, container format, bitrate, frame rate
441
+ - Duration constraints matching the spot length
442
+ - No VAST, VPAID, or tracker-related asset slots
443
+
444
+ sample_request:
445
+ context:
446
+ correlation_id: "sales_broadcast_tv--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_broadcast_tv--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 broadcast spot files"
470
+ narrative: |
471
+ The buyer uploads broadcast spot files with Ad-ID identifiers. Each creative
472
+ has a single video asset and one or more industry_identifiers with type ad_id.
473
+ There are no impression_tracker or click_url assets — broadcast spots are
474
+ self-contained video files that the seller loads into playout.
475
+
476
+ The Ad-ID is the critical link. It connects the creative asset to rotation
477
+ instructions, traffic logs, and post-log reconciliation. Without a valid
478
+ Ad-ID, the spot cannot be scheduled.
479
+ task: sync_creatives
480
+ schema_ref: "creative/sync-creatives-request.json"
481
+ response_schema_ref: "creative/sync-creatives-response.json"
482
+ doc_ref: "/creative/task-reference/sync_creatives"
483
+ comply_scenario: creative_sync
484
+ stateful: true
485
+ expected: |
486
+ Accept and validate broadcast spot files:
487
+ - Per-creative action: created or updated
488
+ - Per-creative status: accepted, pending_review, or rejected
489
+ - Validation of video technical specs (codec, bitrate, duration)
490
+ - Confirmation that Ad-ID is recognized and valid
491
+ - Rejection if Ad-ID is missing or malformed
492
+
493
+ sample_request:
494
+ account:
495
+ brand:
496
+ domain: "novamotors.example"
497
+ operator: "pinnacle-agency.example"
498
+ creatives:
499
+ - creative_id: "volta_ev_launch_30s"
500
+ name: "Nova Volta EV Launch - :30"
501
+ format_id:
502
+ agent_url: "https://your-station.example.com"
503
+ id: "broadcast_30s"
504
+ industry_identifiers:
505
+ - type: "ad_id"
506
+ value: "NOVA0042000H"
507
+ assets:
508
+ video_file:
509
+ asset_type: "video"
510
+ url: "https://cdn.pinnacle-agency.example/nova-volta-30s.mp4"
511
+ width: 1920
512
+ height: 1080
513
+ duration_ms: 30000
514
+ container_format: "mp4"
515
+ video_codec: "h264"
516
+ - creative_id: "volta_ev_launch_15s"
517
+ name: "Nova Volta EV Launch - :15"
518
+ format_id:
519
+ agent_url: "https://your-station.example.com"
520
+ id: "broadcast_15s"
521
+ industry_identifiers:
522
+ - type: "ad_id"
523
+ value: "NOVA0042001H"
524
+ assets:
525
+ video_file:
526
+ asset_type: "video"
527
+ url: "https://cdn.pinnacle-agency.example/nova-volta-15s.mp4"
528
+ width: 1920
529
+ height: 1080
530
+ duration_ms: 15000
531
+ container_format: "mp4"
532
+ video_codec: "h264"
533
+
534
+ idempotency_key: "$generate:uuid_v4#sales_broadcast_tv_creative_sync_sync_creatives"
535
+ context:
536
+ correlation_id: "sales_broadcast_tv--sync_creatives"
537
+ validations:
538
+ - check: response_schema
539
+ description: "Response matches sync-creatives-response.json schema"
540
+ - check: field_present
541
+ path: "creatives[0].action"
542
+ description: "Each creative has an action (created/updated)"
543
+
544
+ - check: field_present
545
+ path: "context"
546
+ description: "Response echoes back the context object"
547
+ - check: field_value
548
+ path: "context.correlation_id"
549
+ value: "sales_broadcast_tv--sync_creatives"
550
+ description: "Context correlation_id returned unchanged"
551
+ - id: delivery_monitoring
552
+ title: "Delivery and reporting"
553
+ narrative: |
554
+ Broadcast delivery reporting operates on a fundamentally different timeline than
555
+ digital. Live ratings are available within 24 hours, but the numbers that matter
556
+ for billing — C7 — are not final until 8 days after each air date. A buyer
557
+ checking delivery mid-flight will see data at different maturation stages: recent
558
+ airings show only live numbers, while airings from two weeks ago have full C7.
559
+
560
+ The seller sends delivery data with measurement window context so the buyer
561
+ understands which numbers are preliminary and which are final. As windows mature,
562
+ the seller sends window_update notifications with supersedes_window indicating
563
+ which prior data is being replaced. The buyer should not make pacing decisions
564
+ based on live-only data for a C7-guaranteed buy.
565
+
566
+ Window maturation is graded by observing the webhooks the seller emits to the
567
+ push_notification_config registered on create_media_buy. An agent that emits
568
+ no webhooks at all scores identically to one that emits the correct C3 and C7
569
+ progression — closing that gap requires the webhook_receiver_runner test-kit
570
+ contract (so the runner has somewhere to observe deliveries); without it, the
571
+ grading step below grades as not_applicable rather than failing.
572
+
573
+ steps:
574
+ - id: expect_window_update_webhook
575
+ title: "Seller emits at least one window_update delivery webhook"
576
+ narrative: |
577
+ After create_media_buy, the seller emits delivery-notification webhooks
578
+ as each measurement window matures (C3 superseding live with is_final:
579
+ false, then C7 superseding C3 with is_final: true). The envelope payload
580
+ MUST carry a valid idempotency_key and validate against the canonical
581
+ MCP webhook payload schema; the nested delivery result SHOULD carry
582
+ notification_type: window_update with the supersedes_window progression
583
+ appropriate to the window that has matured.
584
+
585
+ The filter currently matches on operation_id only — runner extensions
586
+ for nested payload matching (e.g. result.notification_type) will allow
587
+ separating the C3 and C7 deliveries into distinct assertions in a
588
+ follow-up. Runs only when the webhook_receiver_runner contract is in
589
+ scope.
590
+ task: expect_webhook
591
+ triggered_by: create_media_buy
592
+ filter:
593
+ operation_id: "{{prior_step.create_media_buy.operation_id}}"
594
+ timeout_seconds: 30
595
+ expect_idempotency_key: true
596
+ webhook_payload_schema_ref: "core/mcp-webhook-payload.json"
597
+ requires_contract: webhook_receiver_runner
598
+ stateful: true
599
+ expected: |
600
+ A webhook arrives within 30 seconds whose envelope validates against
601
+ mcp-webhook-payload.json and carries an idempotency_key matching
602
+ ^[A-Za-z0-9_.:-]{16,255}$. The nested delivery result (per
603
+ get-media-buy-delivery-response.json) SHOULD carry notification_type:
604
+ window_update with supersedes_window reflecting window progression
605
+ (e.g. "live" for C3, "c3" for C7). Sellers that emit no delivery
606
+ webhooks at all fail with no_webhook_received.
607
+
608
+ - id: get_delivery
609
+ title: "Check delivery metrics"
610
+ narrative: |
611
+ The buyer requests delivery data for the active broadcast buy. The seller
612
+ returns ratings-based metrics broken down by package, with each data point
613
+ tagged by measurement window.
614
+
615
+ Data arrives on a delay. For a spot that aired on October 15:
616
+ - Live data: available October 16
617
+ - C3 data: available ~October 19
618
+ - C7 data: available ~October 23
619
+
620
+ The buyer should expect that the most recent 8 days of the flight will not
621
+ have final C7 numbers. The response should make this clear through the
622
+ measurement window tagging on each data point.
623
+ task: get_media_buy_delivery
624
+ schema_ref: "media-buy/get-media-buy-delivery-request.json"
625
+ response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
626
+ doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
627
+ comply_scenario: reporting_flow
628
+ stateful: true
629
+ expected: |
630
+ Return delivery metrics for the broadcast buy:
631
+ - Per-package: impressions, GRPs, spots aired, spend
632
+ - measurement_window on each package (live, c3, or c7)
633
+ - is_final: false for packages with data still maturing
634
+ - Pacing information relative to the guaranteed unit count
635
+
636
+ For webhook delivery, use notification_type: window_update when
637
+ sending updated data for a period with a wider window. Include
638
+ supersedes_window to indicate which prior data is being replaced
639
+ (e.g., supersedes_window: "live" when sending C3 data).
640
+
641
+ The buyer uses this to understand:
642
+ - How many spots have aired vs. the guaranteed count
643
+ - What the preliminary (live) and final (C7) audience delivery looks like
644
+ - Whether makegoods may be needed if C7 delivery is under-performing
645
+
646
+ sample_request:
647
+ account:
648
+ brand:
649
+ domain: "novamotors.example"
650
+ operator: "pinnacle-agency.example"
651
+ media_buy_ids:
652
+ - "$context.media_buy_id"
653
+ include_package_daily_breakdown: true
654
+
655
+ context:
656
+ correlation_id: "sales_broadcast_tv--get_delivery"
657
+ validations:
658
+ - check: response_schema
659
+ description: "Response matches get-media-buy-delivery-response.json schema"
660
+ - check: field_present
661
+ path: "media_buy_deliveries"
662
+ description: "Response contains media buy delivery data"
663
+
664
+ - check: field_present
665
+ path: "context"
666
+ description: "Response echoes back the context object"
667
+ - check: field_value
668
+ path: "context.correlation_id"
669
+ value: "sales_broadcast_tv--get_delivery"
670
+ description: "Context correlation_id returned unchanged"
671
+ - id: reconciliation
672
+ title: "Post-flight reconciliation"
673
+ narrative: |
674
+ Broadcast reconciliation cannot happen until C7 data has matured for every air
675
+ date in the flight. For a flight ending December 31, final C7 data for the last
676
+ air dates arrives around January 8. The seller then has approximately one week to
677
+ compile final delivery numbers and issue a post-log.
678
+
679
+ The buyer pulls final delivery data ~15 days after the last air date. This is the
680
+ authoritative data set for billing reconciliation. If C7 delivery fell short of
681
+ the guaranteed audience levels, the buyer requests makegoods — additional spots
682
+ to close the delivery gap.
683
+
684
+ steps:
685
+ - id: get_final_delivery
686
+ title: "Pull final reconciliation data"
687
+ narrative: |
688
+ The buyer requests delivery data after C7 has fully matured for all air dates.
689
+ This is the same get_media_buy_delivery task used during monitoring, but now
690
+ all data points reflect final C7 measurement.
691
+
692
+ The buyer compares final C7 delivery against the guaranteed audience levels
693
+ from the media buy. If delivery is short, the buyer contacts the seller to
694
+ negotiate makegoods.
695
+ task: get_media_buy_delivery
696
+ schema_ref: "media-buy/get-media-buy-delivery-request.json"
697
+ response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
698
+ doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
699
+ comply_scenario: reporting_flow
700
+ stateful: true
701
+ expected: |
702
+ Return final delivery metrics with all data points at C7 maturation:
703
+ - Per-package: final impressions, GRPs, spots aired, spend
704
+ - measurement_window: "c7" on all packages
705
+ - is_final: true on all packages (all windows fully matured)
706
+ - supersedes_window: "c3" (this C7 data replaced the prior C3 data)
707
+ - Final pacing: delivered vs. guaranteed audience levels
708
+ - Budget reconciliation: actual spend vs. committed
709
+
710
+ If delivery fell short of guaranteed levels:
711
+ - Shortfall amount by package
712
+ - The buyer uses this data to negotiate makegoods with the seller
713
+
714
+ sample_request:
715
+ account:
716
+ brand:
717
+ domain: "novamotors.example"
718
+ operator: "pinnacle-agency.example"
719
+ media_buy_ids:
720
+ - "$context.media_buy_id"
721
+ include_package_daily_breakdown: true
722
+
723
+ context:
724
+ correlation_id: "sales_broadcast_tv--get_final_delivery"
725
+ validations:
726
+ - check: response_schema
727
+ description: "Response matches get-media-buy-delivery-response.json schema"
728
+ - check: field_present
729
+ path: "media_buy_deliveries"
730
+ description: "Response contains final delivery data"
731
+
732
+ - check: field_present
733
+ path: "context"
734
+ description: "Response echoes back the context object"
735
+ - check: field_value
736
+ path: "context.correlation_id"
737
+ value: "sales_broadcast_tv--get_final_delivery"
738
+ description: "Context correlation_id returned unchanged"