@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,424 @@
1
+ id: signal_marketplace
2
+ version: "1.0.0"
3
+ title: "Marketplace signal agent"
4
+ protocol: signals
5
+ category: signal_marketplace
6
+ summary: "Signal agent that resells third-party data provider signals with verifiable provider-published provenance."
7
+ track: signals
8
+ required_tools:
9
+ - get_signals
10
+ requires_scenarios:
11
+ - signal_marketplace/governance_denied
12
+
13
+ narrative: |
14
+ You operate a signal marketplace — an intermediary that aggregates audience data from
15
+ multiple third-party providers and makes it available to buyers through a single interface.
16
+ Think LiveRamp Data Marketplace, Oracle Data Cloud, or Lotame.
17
+
18
+ Your agent searches across signal definitions published by data providers in their
19
+ adagents.json files. Buyers discover signals through natural language queries, verify
20
+ provenance by checking the data provider's published definitions directly, and
21
+ activate signals on DSPs or sales agents for campaign targeting.
22
+
23
+ The key property of marketplace signals: provenance is independently verifiable. Each
24
+ signal traces back to a data_provider_domain whose adagents.json lists your agent as
25
+ authorized. Buyers can (and should) verify this before spending.
26
+
27
+ This storyboard walks through discovery, verification, and both activation patterns —
28
+ activating directly on a DSP (buyer manages targeting) and activating on a sales agent
29
+ (SA handles downstream coordination).
30
+
31
+ Pricing is hard-required for signal marketplaces. Signals are rate-carded goods by
32
+ definition — the value exchange is paying for access to audience data. Unlike creative
33
+ ad servers (where billing can be handled via out-of-band enterprise contracts), a signal
34
+ marketplace without pricing_options is either non-commercial or misconfigured; buyers
35
+ cannot activate without a pricing_option_id to anchor billing.
36
+
37
+ agent:
38
+ interaction_model: marketplace_catalog
39
+ capabilities: []
40
+ examples:
41
+ - "LiveRamp Data Marketplace"
42
+ - "Oracle Data Cloud"
43
+ - "Lotame"
44
+
45
+ caller:
46
+ role: buyer_agent
47
+ example: "Pinnacle Agency (buyer)"
48
+
49
+ prerequisites:
50
+ description: |
51
+ The buyer has a campaign brief with targeting objectives. The test kit provides
52
+ sample signal definitions, pricing options, and destination configurations that
53
+ match the training agent's signal providers.
54
+ test_kit: "test-kits/nova-motors.yaml"
55
+
56
+ phases:
57
+ - id: capability_discovery
58
+ title: "Capability discovery"
59
+ narrative: |
60
+ The buyer calls get_adcp_capabilities to confirm the agent supports signals before discovering or activating audience data.
61
+
62
+ steps:
63
+ - id: get_capabilities
64
+ title: "Check agent capabilities"
65
+ narrative: |
66
+ Verify that the agent declares the expected protocol support before
67
+ proceeding with domain-specific operations.
68
+ task: get_adcp_capabilities
69
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
70
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
71
+ doc_ref: "/protocol/get_adcp_capabilities"
72
+ comply_scenario: capability_discovery
73
+ stateful: false
74
+ expected: |
75
+ Return capabilities declaring signals in supported_protocols, confirming the agent serves audience signals.
76
+ sample_request:
77
+ context:
78
+ correlation_id: "signal_marketplace--get_capabilities"
79
+ validations:
80
+ - check: response_schema
81
+ description: "Response matches get-adcp-capabilities-response.json schema"
82
+ - check: field_present
83
+ path: "supported_protocols"
84
+ description: "Agent declares supported protocols"
85
+
86
+ - check: field_present
87
+ path: "context"
88
+ description: "Response echoes back the context object"
89
+ - check: field_value
90
+ path: "context.correlation_id"
91
+ value: "signal_marketplace--get_capabilities"
92
+ description: "Context correlation_id returned unchanged"
93
+ - id: discovery
94
+ title: "Signal discovery"
95
+ narrative: |
96
+ The buyer describes what they need in natural language. Your agent searches
97
+ across all authorized data provider signal definitions and returns matching signals with
98
+ pricing, coverage estimates, and value types.
99
+
100
+ This is where marketplace agents earn their keep — the buyer doesn't need to
101
+ know which providers exist or what taxonomies they use. One query, many sources.
102
+
103
+ steps:
104
+ - id: search_by_spec
105
+ title: "Discover signals from a campaign brief"
106
+ narrative: |
107
+ The buyer's platform translates a campaign brief into a get_signals call.
108
+ Your agent searches definitions from every authorized data provider and returns
109
+ what matches — automotive intent from one provider, geo data from another,
110
+ retail purchase history from a third.
111
+ task: get_signals
112
+ schema_ref: "signals/get-signals-request.json"
113
+ response_schema_ref: "signals/get-signals-response.json"
114
+ doc_ref: "/signals/tasks/get_signals"
115
+ comply_scenario: signals_flow
116
+ stateful: false
117
+ expected: |
118
+ Return matching signals from multiple data providers. Each signal must include:
119
+ - signal_agent_segment_id for activation
120
+ - legacy signal_id with source, data_provider_domain, and id
121
+ - name, description, and value_type (binary, categorical, or numeric)
122
+ - coverage_forecast when detailed availability is disclosed; deprecated coverage_percentage may be present as a legacy scalar fallback
123
+ - pricing_options with at least one pricing model
124
+ - signal_type: "marketplace"
125
+
126
+ sample_request:
127
+ account:
128
+ brand:
129
+ domain: "novamotors.example"
130
+ operator: "pinnacle-agency.example"
131
+ signal_spec: "In-market EV buyers with high purchase propensity, near auto dealerships"
132
+
133
+ context:
134
+ correlation_id: "signal_marketplace--search_by_spec"
135
+
136
+ context_outputs:
137
+ - name: first_signal_id
138
+ path: "signals[0].signal_id"
139
+ - name: first_signal_agent_segment_id
140
+ path: "signals[0].signal_agent_segment_id"
141
+ - name: first_signal_pricing_option_id
142
+ path: "signals[0].pricing_options[0].pricing_option_id"
143
+ - name: second_signal_id
144
+ path: "signals[1].signal_id"
145
+ validations:
146
+ - check: response_schema
147
+ description: "Response matches get-signals-response.json schema"
148
+ - check: field_present
149
+ path: "signals[0].signal_agent_segment_id"
150
+ description: "Each signal has a signal_agent_segment_id"
151
+ - check: field_present
152
+ path: "signals[0].signal_id.data_provider_domain"
153
+ description: "Each signal traces to a data provider domain"
154
+ - check: field_present
155
+ path: "signals[0].pricing_options"
156
+ description: "Each signal has pricing options"
157
+ - check: field_present
158
+ path: "context"
159
+ description: "Response echoes back the context object"
160
+ - check: field_value
161
+ path: "context.correlation_id"
162
+ value: "signal_marketplace--search_by_spec"
163
+ description: "Context correlation_id returned unchanged"
164
+ - check: field_present
165
+ path: "signals[0].signal_id.source"
166
+ description: "Legacy Signal ID includes source discriminator"
167
+ - check: field_present
168
+ path: "signals[0].signal_id.data_provider_domain"
169
+ description: "Signal ID includes data_provider_domain for provenance"
170
+ - id: search_by_ids
171
+ title: "Look up specific signals by ID"
172
+ narrative: |
173
+ The buyer already knows which signals they want — discovered in the prior
174
+ step. They pass signal_ids directly instead of a natural language query.
175
+ task: get_signals
176
+ schema_ref: "signals/get-signals-request.json"
177
+ response_schema_ref: "signals/get-signals-response.json"
178
+ doc_ref: "/signals/tasks/get_signals"
179
+ comply_scenario: signals_flow
180
+ stateful: true
181
+ expected: |
182
+ Return the exact signals requested, with full metadata and pricing.
183
+ If a signal_id doesn't exist, omit it from results — don't error.
184
+
185
+ sample_request:
186
+ account:
187
+ brand:
188
+ domain: "novamotors.example"
189
+ operator: "pinnacle-agency.example"
190
+ signal_ids:
191
+ - "$context.first_signal_id"
192
+
193
+ context:
194
+ correlation_id: "signal_marketplace--search_by_ids"
195
+ validations:
196
+ - check: response_schema
197
+ description: "Response matches schema"
198
+ - check: field_present
199
+ path: "signals"
200
+ description: "Response contains a signals array"
201
+
202
+ - check: field_present
203
+ path: "context"
204
+ description: "Response echoes back the context object"
205
+ - check: field_value
206
+ path: "context.correlation_id"
207
+ value: "signal_marketplace--search_by_ids"
208
+ description: "Context correlation_id returned unchanged"
209
+ - id: verification
210
+ title: "Provider verification"
211
+ narrative: |
212
+ Before activating third-party data, the buyer verifies provenance. They fetch
213
+ the data provider's adagents.json directly and confirm the signal exists and
214
+ your agent is authorized. This independent check is outside the AdCP protocol —
215
+ but your agent must return the metadata that makes it possible.
216
+
217
+ This phase tests that your get_signals responses include verifiable provenance
218
+ data: the legacy signal_id.source value is "catalog" and
219
+ signal_id.data_provider_domain points to a real domain whose adagents.json the
220
+ buyer can fetch independently.
221
+
222
+ steps:
223
+ - id: verify_provenance_metadata
224
+ title: "Confirm signals carry verifiable provenance"
225
+ narrative: |
226
+ The buyer looks up a specific signal by ID (discovered earlier) and checks
227
+ that the response includes the metadata needed for independent verification —
228
+ the legacy source value is "catalog" and data_provider_domain points to a fetchable adagents.json.
229
+ The actual HTTP fetch of adagents.json is the buyer's responsibility, but
230
+ your agent must provide the domain to fetch from.
231
+ task: get_signals
232
+ schema_ref: "signals/get-signals-request.json"
233
+ response_schema_ref: "signals/get-signals-response.json"
234
+ doc_ref: "/signals/data-providers"
235
+ comply_scenario: signals_flow
236
+ stateful: true
237
+ expected: |
238
+ Return the requested signal with verifiable provenance metadata:
239
+ - legacy signal_id.source is "catalog"
240
+ - signal_id.data_provider_domain matches a real domain
241
+ The buyer will independently fetch that domain's adagents.json to confirm
242
+ your agent is listed in authorized_agents.
243
+
244
+ sample_request:
245
+ account:
246
+ brand:
247
+ domain: "novamotors.example"
248
+ operator: "pinnacle-agency.example"
249
+ signal_ids:
250
+ - "$context.first_signal_id"
251
+
252
+ context:
253
+ correlation_id: "signal_marketplace--verify_provenance_metadata"
254
+ validations:
255
+ - check: field_value
256
+ path: "signals[0].signal_id.source"
257
+ value: "catalog"
258
+ description: "Legacy signal source is 'catalog' (verifiable via adagents.json)"
259
+ - check: field_present
260
+ path: "signals[0].signal_id.data_provider_domain"
261
+ description: "Data provider domain is present for independent verification"
262
+
263
+ - check: field_present
264
+ path: "context"
265
+ description: "Response echoes back the context object"
266
+ - check: field_value
267
+ path: "context.correlation_id"
268
+ value: "signal_marketplace--verify_provenance_metadata"
269
+ description: "Context correlation_id returned unchanged"
270
+ - id: platform_activation
271
+ title: "Activate on a DSP"
272
+ narrative: |
273
+ The buyer activates a signal directly on a DSP platform. The signal agent pushes
274
+ segment data to the platform, and the buyer gets back a segment_id they can
275
+ reference when configuring campaign targeting.
276
+
277
+ Use platform destinations when the buyer is managing DSP campaigns directly —
278
+ not through a sales agent.
279
+
280
+ steps:
281
+ - id: activate_on_platform
282
+ title: "Activate signal on a DSP"
283
+ narrative: |
284
+ The buyer selects a signal and a DSP destination. The signal agent pushes
285
+ the segment to the platform. This is typically asynchronous — the initial
286
+ response shows is_live: false with an estimated duration, and the buyer
287
+ polls for completion.
288
+ task: activate_signal
289
+ schema_ref: "signals/activate-signal-request.json"
290
+ response_schema_ref: "signals/activate-signal-response.json"
291
+ doc_ref: "/signals/tasks/activate_signal"
292
+ comply_scenario: signals_flow
293
+ stateful: true
294
+ expected: |
295
+ Return a deployment with:
296
+ - type: "platform" matching the requested destination
297
+ - is_live: false initially (async activation)
298
+ - estimated_activation_duration_minutes
299
+ After polling, the deployment should show:
300
+ - is_live: true
301
+ - activation_key with type: "segment_id" and a platform-native segment ID
302
+ - deployed_at timestamp
303
+
304
+ sample_request:
305
+ account:
306
+ brand:
307
+ domain: "novamotors.example"
308
+ operator: "pinnacle-agency.example"
309
+ signal_agent_segment_id: "$context.first_signal_agent_segment_id"
310
+ pricing_option_id: "$context.first_signal_pricing_option_id"
311
+ destinations:
312
+ - type: "platform"
313
+ platform: "pinnacle-dsp"
314
+ account: "agency-123-pd"
315
+ idempotency_key: "$generate:uuid_v4#signal_marketplace_activate_platform"
316
+ context:
317
+ correlation_id: "signal_marketplace--activate_on_platform"
318
+ ext:
319
+ test_platform:
320
+ test_run: true
321
+ validations:
322
+ - check: response_schema
323
+ description: "Response matches activate-signal-response.json schema"
324
+ - check: field_present
325
+ path: "deployments[0].type"
326
+ description: "Deployment includes type"
327
+ - check: field_value
328
+ path: "deployments[0].type"
329
+ value: "platform"
330
+ description: "Deployment type is 'platform'"
331
+
332
+ - check: field_present
333
+ path: "context"
334
+ description: "Response echoes back the context object"
335
+ - check: field_value
336
+ path: "context.correlation_id"
337
+ value: "signal_marketplace--activate_on_platform"
338
+ description: "Context correlation_id returned unchanged"
339
+ - check: field_present
340
+ path: "deployments[0].activation_key"
341
+ description: "Deployment includes activation_key for targeting"
342
+ # Anti-façade: a real activation calls the DSP's segment-deployment
343
+ # endpoint with the captured signal_agent_segment_id. An adapter
344
+ # returning a fabricated activation_key without touching the DSP
345
+ # fails this check. The since: search_by_spec window scopes the
346
+ # assertion to traffic caused after this storyboard captured the
347
+ # signal IDs, ignoring earlier discovery traffic.
348
+ - check: upstream_traffic
349
+ description: "activate_on_platform caused upstream traffic to a DSP carrying the signal_agent_segment_id"
350
+ min_count: 1
351
+ endpoint_pattern: "POST *"
352
+ since: search_by_spec
353
+ identifier_paths:
354
+ - "signal_agent_segment_id"
355
+ - id: agent_activation
356
+ title: "Activate on a sales agent"
357
+ narrative: |
358
+ The buyer activates a signal on a sales agent instead of a DSP. This is the
359
+ right pattern when the buyer is purchasing media through the SA — the SA handles
360
+ its own DSP coordination.
361
+
362
+ The buyer doesn't need to know which DSP the SA uses. The activation key confirms
363
+ the signal is live on the SA, and the SA applies targeting when fulfilling media
364
+ buys through create_media_buy.
365
+
366
+ steps:
367
+ - id: activate_on_agent
368
+ title: "Activate signal on a sales agent"
369
+ narrative: |
370
+ The buyer activates a signal with the sales agent's URL as the destination.
371
+ Agent activations are typically synchronous — the SA records the activation
372
+ immediately and returns a key_value activation key.
373
+ task: activate_signal
374
+ schema_ref: "signals/activate-signal-request.json"
375
+ response_schema_ref: "signals/activate-signal-response.json"
376
+ doc_ref: "/signals/tasks/activate_signal"
377
+ comply_scenario: signals_flow
378
+ stateful: true
379
+ expected: |
380
+ Return a deployment with:
381
+ - type: "agent" matching the requested destination
382
+ - agent_url matching the SA's URL
383
+ - is_live: true (sync activation)
384
+ - activation_key with type: "key_value"
385
+ - deployed_at timestamp
386
+
387
+ The SA records the activation internally. When the buyer later calls
388
+ create_media_buy through this SA, signal-based targeting is already
389
+ in place.
390
+
391
+ sample_request:
392
+ account:
393
+ brand:
394
+ domain: "novamotors.example"
395
+ operator: "pinnacle-agency.example"
396
+ signal_agent_segment_id: "$context.first_signal_agent_segment_id"
397
+ pricing_option_id: "$context.first_signal_pricing_option_id"
398
+ destinations:
399
+ - type: "agent"
400
+ agent_url: "https://wonderstruck.salesagents.example"
401
+ idempotency_key: "$generate:uuid_v4#signal_marketplace_activate_agent"
402
+ context:
403
+ correlation_id: "signal_marketplace--activate_on_agent"
404
+ ext:
405
+ test_platform:
406
+ test_run: true
407
+ validations:
408
+ - check: response_schema
409
+ description: "Response matches activate-signal-response.json schema"
410
+ - check: field_present
411
+ path: "deployments[0].activation_key"
412
+ description: "Deployment includes activation key"
413
+ - check: field_value
414
+ path: "deployments[0].type"
415
+ value: "agent"
416
+ description: "Deployment type is 'agent'"
417
+
418
+ - check: field_present
419
+ path: "context"
420
+ description: "Response echoes back the context object"
421
+ - check: field_value
422
+ path: "context.correlation_id"
423
+ value: "signal_marketplace--activate_on_agent"
424
+ description: "Context correlation_id returned unchanged"
@@ -0,0 +1,210 @@
1
+ id: signal_marketplace/governance_denied
2
+ version: "1.0.0"
3
+ title: "Signal agent rejects activation when governance denies"
4
+ category: signal_marketplace
5
+ summary: "Verifies that a signal agent propagates GOVERNANCE_DENIED when the buyer's governance plan denies activation."
6
+ track: signals
7
+ required_tools:
8
+ - sync_governance
9
+ - get_signals
10
+ - activate_signal
11
+
12
+ narrative: |
13
+ Signal activation is a spending event: activating a third-party segment costs per-user
14
+ or per-activation fees that must be authorized against the buyer's governance plan. The
15
+ signal agent must consult the registered governance agent before activation and deny
16
+ the request when governance returns denied.
17
+
18
+ This scenario sets up a strict $100 plan, registers that governance with the signal
19
+ agent via sync_governance, then attempts to activate a signal whose pricing exceeds
20
+ the plan. The signal agent must return GOVERNANCE_DENIED with findings propagated
21
+ from the governance agent.
22
+
23
+ By default, the governance agent is the training agent at test-agent.adcontextprotocol.org.
24
+ Override by supplying a different `governance_agent_url` in the run's initial context
25
+ (e.g., via `--context` on `adcp storyboard run` once the CLI supports it).
26
+
27
+ context:
28
+ governance_agent_url: "https://test-agent.adcontextprotocol.org"
29
+
30
+ agent:
31
+ interaction_model: marketplace_catalog
32
+ capabilities:
33
+ - governance_aware
34
+ examples:
35
+ - "Any signal agent that honors governance before activation"
36
+
37
+ caller:
38
+ role: buyer_agent
39
+ example: "Pinnacle Agency (buyer)"
40
+
41
+ prerequisites:
42
+ description: |
43
+ A governance agent that supports sync_plans and check_governance, and a signal
44
+ agent that supports sync_governance + activate_signal.
45
+ test_kit: "test-kits/acme-outdoor.yaml"
46
+
47
+ phases:
48
+ - id: governance_plan_setup
49
+ title: "Set up strict governance plan"
50
+ narrative: |
51
+ Create a governance plan with a $100 budget — enough to block even a single
52
+ activation at typical CPM-for-segment pricing.
53
+
54
+ steps:
55
+ - id: sync_plans
56
+ title: "Create strict governance plan"
57
+ task: sync_plans
58
+ schema_ref: "governance/sync-plans-request.json"
59
+ response_schema_ref: "governance/sync-plans-response.json"
60
+ doc_ref: "/governance/campaign/tasks/sync_plans"
61
+ stateful: true
62
+ expected: |
63
+ The governance agent acknowledges the plan.
64
+ sample_request:
65
+ plans:
66
+ - plan_id: "comply-signal-gov-denied"
67
+ brand:
68
+ domain: "acmeoutdoor.example"
69
+ objectives: "Restricted plan — signals activation test"
70
+ budget:
71
+ total: 100
72
+ currency: "USD"
73
+ reallocation_threshold: 50
74
+ flight:
75
+ start: "2026-04-01T00:00:00Z"
76
+ end: "2026-06-30T23:59:59Z"
77
+ countries: ["US"]
78
+ idempotency_key: "$generate:uuid_v4#signal_marketplace_governance_denied_governance_plan_setup_sync_plans"
79
+ validations:
80
+ - check: response_schema
81
+ description: "Response matches sync-plans-response.json schema"
82
+
83
+ - id: signal_agent_setup
84
+ title: "Register account and governance with the signal agent"
85
+ steps:
86
+ - id: sync_accounts
87
+ title: "Establish account with signal agent"
88
+ task: sync_accounts
89
+ schema_ref: "account/sync-accounts-request.json"
90
+ response_schema_ref: "account/sync-accounts-response.json"
91
+ doc_ref: "/accounts/tasks/sync_accounts"
92
+ stateful: true
93
+ expected: |
94
+ Signal agent returns the account with account_id active.
95
+ sample_request:
96
+ accounts:
97
+ - brand:
98
+ domain: "acmeoutdoor.example"
99
+ operator: "pinnacle-agency.example"
100
+ billing: "operator"
101
+ payment_terms: "net_30"
102
+ idempotency_key: "$generate:uuid_v4#signal_marketplace_governance_denied_signal_agent_setup_sync_accounts"
103
+ validations:
104
+ - check: response_schema
105
+ description: "Response matches sync-accounts-response.json schema"
106
+ - check: field_present
107
+ path: "accounts[0].account_id"
108
+ description: "Account has a platform-assigned ID"
109
+
110
+ - id: sync_governance
111
+ title: "Register governance agent with signal agent"
112
+ task: sync_governance
113
+ schema_ref: "account/sync-governance-request.json"
114
+ response_schema_ref: "account/sync-governance-response.json"
115
+ doc_ref: "/accounts/tasks/sync_governance"
116
+ stateful: true
117
+ expected: |
118
+ Signal agent acknowledges governance registration.
119
+ sample_request:
120
+ accounts:
121
+ - account:
122
+ brand:
123
+ domain: "acmeoutdoor.example"
124
+ operator: "pinnacle-agency.example"
125
+ governance_agents:
126
+ - url: "$context.governance_agent_url"
127
+ authentication:
128
+ schemes: ["Bearer"]
129
+ credentials: "gov-token-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
130
+ idempotency_key: "$generate:uuid_v4#signal_marketplace_governance_denied_signal_agent_setup_sync_governance"
131
+ validations:
132
+ - check: response_schema
133
+ description: "Response matches sync-governance-response.json schema"
134
+
135
+ - id: activation_denied
136
+ title: "Attempt activation — governance denies"
137
+ steps:
138
+ - id: get_signals_list
139
+ title: "Discover a signal to activate"
140
+ task: get_signals
141
+ schema_ref: "signals/get-signals-request.json"
142
+ response_schema_ref: "signals/get-signals-response.json"
143
+ doc_ref: "/signals/task-reference/get_signals"
144
+ comply_scenario: signal_discovery
145
+ stateful: false
146
+ expected: |
147
+ Return at least one signal with a signal_agent_segment_id and pricing.
148
+ sample_request:
149
+ signal_spec: "outdoor enthusiasts, age 25-54, US"
150
+ account:
151
+ brand:
152
+ domain: "acmeoutdoor.example"
153
+ operator: "pinnacle-agency.example"
154
+ context_outputs:
155
+ - path: "signals[0].signal_agent_segment_id"
156
+ key: "signal_agent_segment_id"
157
+ validations:
158
+ - check: response_schema
159
+ description: "Response matches get-signals-response.json schema"
160
+ - check: field_present
161
+ path: "signals[0].signal_agent_segment_id"
162
+ description: "Signal has an activation identifier"
163
+
164
+ - id: activate_signal_denied
165
+ title: "activate_signal — governance denies"
166
+ task: activate_signal
167
+ schema_ref: "signals/activate-signal-request.json"
168
+ response_schema_ref: "signals/activate-signal-response.json"
169
+ doc_ref: "/signals/task-reference/activate_signal"
170
+ comply_scenario: signal_activation
171
+ expect_error: true
172
+ negative_path: payload_well_formed
173
+ stateful: true
174
+ expected: |
175
+ Signal agent rejects with:
176
+ - code: GOVERNANCE_DENIED
177
+ - findings propagated from the governance agent
178
+
179
+ sample_request:
180
+ signal_agent_segment_id: "$context.signal_agent_segment_id"
181
+ destinations:
182
+ - type: "platform"
183
+ platform: "the-trade-desk"
184
+ account: "acmeoutdoor-ttd-seat"
185
+ account:
186
+ brand:
187
+ domain: "acmeoutdoor.example"
188
+ operator: "pinnacle-agency.example"
189
+ idempotency_key: "$generate:uuid_v4#signal-gov-denied"
190
+
191
+ context:
192
+ correlation_id: "signal_marketplace--governance_denied--activate"
193
+ sample_response:
194
+ status: "failed"
195
+ errors:
196
+ - code: "GOVERNANCE_DENIED"
197
+ message: "Signal activation requires governance approval. Call check_governance first — a governance plan is registered for this account."
198
+ details:
199
+ findings:
200
+ - category_id: "budget_authority"
201
+ severity: "critical"
202
+ explanation: "Signal activation requires governance approval. Call check_governance first — a governance plan is registered for this account."
203
+ plan_id: "comply-signal-gov-denied"
204
+ validations:
205
+ - check: error_code
206
+ value: "GOVERNANCE_DENIED"
207
+ description: "Error code is GOVERNANCE_DENIED"
208
+ - check: field_present
209
+ path: "context"
210
+ description: "Response echoes back the context object even on errors"