@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,307 @@
1
+ # Fictional Entities for AdCP Storyboards & Training
2
+ #
3
+ # Canonical source: specs/character-bible.md at docs.adcontextprotocol.org
4
+ #
5
+ # This file mirrors the character bible's fictional companies for use in
6
+ # storyboards, test kits, and client-side testing. All entities use the
7
+ # IANA-reserved .example TLD.
8
+ #
9
+ # Rules:
10
+ # - Every fictional company MUST match the character bible
11
+ # - Do not invent new entities here — add them to the bible first
12
+ # - Test kits in test-kits/ expand on entities with full brand identity,
13
+ # sample assets, and signal definitions
14
+ # - Sandbox brands (advertisers) are resolvable via AgenticAdvertising.org
15
+ # because the registry imports getSandboxEntities() from @adcp/client
16
+ # directly — no seeding needed, these files are the single source of truth
17
+ #
18
+ # Adding a new entity:
19
+ # 1. Add it to specs/character-bible.md in the adcp docs repo
20
+ # 2. Mirror it here with domain and role
21
+ # 3. If it's an advertiser, create a test kit in test-kits/ with sandbox: true
22
+ # 4. Reference by id in storyboards
23
+
24
+ # ============================================================
25
+ # ADVERTISERS — brands that buy media through the protocol
26
+ # ============================================================
27
+
28
+ advertisers:
29
+ - id: acme_outdoor
30
+ name: "Acme Outdoor"
31
+ domain: "acmeoutdoor.example"
32
+ industry: retail
33
+ sandbox_brand: true
34
+ test_kit: "test-kits/acme-outdoor.yaml"
35
+ description: >
36
+ Premium outdoor gear company. The default advertiser for most storyboards.
37
+ Used in media buy, creative, governance, and compliance scenarios.
38
+ characters:
39
+ - "Sam Adeyemi (campaigns)"
40
+ - "Jordan Ochoa (governance)"
41
+
42
+ - id: nova_motors
43
+ name: "Nova Motors"
44
+ domain: "novamotors.example"
45
+ industry: automotive
46
+ sandbox_brand: true
47
+ test_kit: "test-kits/nova-motors.yaml"
48
+ description: >
49
+ Electric vehicle manufacturer launching the Volta EV. Used for signal,
50
+ brand protocol, and sponsored intelligence storyboards.
51
+ characters:
52
+ - "Tomoko Hara (brand operations)"
53
+ - "Sam Adeyemi (buyer)"
54
+
55
+ - id: bistro_oranje
56
+ name: "Bistro Oranje"
57
+ domain: "bistro-oranje.example"
58
+ industry: hospitality
59
+ sandbox_brand: true
60
+ test_kit: "test-kits/bistro-oranje.yaml"
61
+ description: >
62
+ Dutch restaurant chain. Used in rights licensing scenarios where
63
+ Carlos manages programmatic rights for ad campaigns.
64
+ characters:
65
+ - "Carlos (rights licensing)"
66
+
67
+ - id: summit_foods
68
+ name: "Summit Foods"
69
+ domain: "summitfoods.example"
70
+ industry: cpg
71
+ sandbox_brand: true
72
+ test_kit: "test-kits/summit-foods.yaml"
73
+ description: >
74
+ Organic food / CPG brand. Buys retail media inventory on ShopGrid
75
+ in commerce media scenarios.
76
+ characters: []
77
+
78
+ - id: osei_natural
79
+ name: "Osei Natural"
80
+ domain: "oseinatural.example"
81
+ industry: beauty
82
+ sandbox_brand: true
83
+ test_kit: "test-kits/osei-natural.yaml"
84
+ description: >
85
+ 8-person natural skincare company based in Nairobi. Represents the
86
+ small business that advertising should serve but currently doesn't.
87
+ characters:
88
+ - "Amara Osei (founder)"
89
+
90
+ # ============================================================
91
+ # AGENCIES — media buying agencies that operate on behalf of advertisers
92
+ # ============================================================
93
+
94
+ agencies:
95
+ - id: pinnacle_agency
96
+ name: "Pinnacle Agency"
97
+ domain: "pinnacle-agency.example"
98
+ size: "~200 employees"
99
+ description: >
100
+ Full-service mid-size media buying agency. Acts as the operator (buyer)
101
+ in most storyboards, executing campaigns on behalf of Acme Outdoor and
102
+ other clients. Runs its own governance agent and hosts creative assets
103
+ on its CDN.
104
+ services:
105
+ cdn: "cdn.pinnacle-agency.example"
106
+ governance_agent: "governance.pinnacle-agency.example"
107
+ characters:
108
+ - "Alex Reeves (VP of media operations)"
109
+ - "Sam Adeyemi (senior media buyer)"
110
+ - "Jordan Ochoa (campaign operations manager)"
111
+ - "Maya Johal (creative strategist)"
112
+ - "Dayo Mensah (ad tech fellow)"
113
+ - "Carlos (programmatic buyer, Amsterdam office)"
114
+
115
+ # ============================================================
116
+ # PUBLISHERS & PLATFORMS — sell inventory or serve ads
117
+ # ============================================================
118
+
119
+ publishers:
120
+ - id: streamhaus
121
+ name: "StreamHaus"
122
+ domain: "streamhaus.example"
123
+ type: "CTV publisher / SSP"
124
+ size: "~80 employees"
125
+ description: >
126
+ Mid-size streaming video platform. Exposes inventory to buyer agents
127
+ through AdCP rather than building a self-serve dashboard. Validates
128
+ creatives and fulfills media buys.
129
+ characters:
130
+ - "Priya Nair (director of ad products)"
131
+
132
+ - id: outdoornet
133
+ name: "OutdoorNet"
134
+ domain: "outdoornet.example"
135
+ type: "Display ad network"
136
+ description: >
137
+ Display advertising network. One of Sam's multiple sellers in
138
+ multi-platform media buying scenarios.
139
+
140
+ - id: podtrail
141
+ name: "PodTrail"
142
+ domain: "podtrail.example"
143
+ type: "Podcast ad platform"
144
+ description: >
145
+ Podcast-specific seller platform. One of Sam's distribution partners
146
+ in multi-platform campaigns.
147
+
148
+ - id: commhub
149
+ name: "CommHub"
150
+ domain: "commhub.example"
151
+ type: "Social platform"
152
+ description: >
153
+ Social media network used in creative strategy and distribution
154
+ scenarios. Maya's creative channel.
155
+ characters:
156
+ - "Maya Johal (creative strategist)"
157
+
158
+ - id: shopgrid
159
+ name: "ShopGrid"
160
+ domain: "shopgrid.example"
161
+ type: "Retail marketplace + media network"
162
+ size: "~3,000 employees"
163
+ description: >
164
+ E-commerce marketplace that also operates a retail media network.
165
+ Summit Foods buys inventory here. Also provides retail purchase
166
+ data signals (new-to-brand identification).
167
+ characters:
168
+ - "Daniel Park (VP of retail media)"
169
+
170
+ # --- Property governance fixtures ---
171
+ # These publishers appear in property governance storyboards as
172
+ # allow/block list entries. They are thematically consistent with
173
+ # Acme Outdoor's target audience.
174
+
175
+ - id: outdoor_magazine
176
+ name: "Outdoor Magazine"
177
+ domain: "outdoormagazine.example"
178
+ type: "Publisher property"
179
+ description: "Outdoor lifestyle publication. Allow-listed in property governance."
180
+
181
+ - id: hiking_trails
182
+ name: "Hiking Trails"
183
+ domain: "hikingtrails.example"
184
+ type: "Publisher property"
185
+ description: "Hiking trail guide and community site. Allow-listed in property governance."
186
+
187
+ - id: camping_gear
188
+ name: "Camping Gear Reviews"
189
+ domain: "campinggear.example"
190
+ type: "Publisher property"
191
+ description: "Camping equipment review site. Used in property governance."
192
+
193
+ - id: mountaineering
194
+ name: "Mountaineering Weekly"
195
+ domain: "mountaineering.example"
196
+ type: "Publisher property"
197
+ description: "Mountaineering news and community. Used in property governance."
198
+
199
+ - id: test_publisher
200
+ name: "Test Publisher"
201
+ domain: "test-publisher.example"
202
+ type: "Publisher property"
203
+ description: "Generic publisher for content standards validation."
204
+
205
+ # ============================================================
206
+ # DATA PROVIDERS — companies that sell audience/signal data
207
+ # ============================================================
208
+
209
+ data_providers:
210
+ - id: trident_auto
211
+ name: "Trident Auto Data"
212
+ domain: "tridentauto.example"
213
+ description: >
214
+ Automotive purchase intent data provider. Supplies EV buyer likelihood
215
+ and purchase propensity signals for the Nova Motors campaign.
216
+ characters:
217
+ - "Kai Lindgren (signals walkthrough)"
218
+
219
+ - id: meridian_geo
220
+ name: "Meridian Geo"
221
+ domain: "meridiangeo.example"
222
+ size: "~25 employees"
223
+ description: >
224
+ Geolocation data startup. Supplies competitor visitor signals
225
+ based on physical location data.
226
+ characters:
227
+ - "Kai Lindgren (head of partnerships)"
228
+
229
+ - id: prism
230
+ name: "Prism"
231
+ domain: "prism.example"
232
+ description: >
233
+ Nova Motors' first-party data platform. Provides owned signals from
234
+ CRM and behavioral data: customer lifetime value, cart abandonment,
235
+ engagement scoring, and churn risk.
236
+
237
+ # ============================================================
238
+ # RIGHTS & LICENSING
239
+ # ============================================================
240
+
241
+ rights:
242
+ - id: loti_entertainment
243
+ name: "Loti Entertainment"
244
+ domain: "loti-entertainment.example"
245
+ type: "Talent agency"
246
+ description: >
247
+ Represents talent and manages rights in the licensing ecosystem.
248
+ Used in rights licensing scenarios alongside Bistro Oranje.
249
+
250
+ # ============================================================
251
+ # COLLECTIONS — addressable content catalogs for collection_list targeting
252
+ # ============================================================
253
+ #
254
+ # These collections back the CollectionListReference fixtures used in
255
+ # media buy targeting scenarios. Thematically consistent with the
256
+ # advertisers above: outdoor programming for Acme Outdoor, automotive
257
+ # content for Nova Motors.
258
+ #
259
+ # distribution_ids use realistic identifier types (imdb_id, gracenote_id)
260
+ # so matching logic can be exercised against the same shapes a production
261
+ # collection agent would return.
262
+
263
+ collections:
264
+ # --- Outdoor programming (matches Acme Outdoor campaigns) ---
265
+ - id: trail_life_series
266
+ name: "Trail Life"
267
+ kind: "series"
268
+ genre: "outdoor"
269
+ collection_rid: "rid:outdoor:trail_life"
270
+ distribution_ids:
271
+ - type: imdb_id
272
+ value: "tt9100001"
273
+ - type: gracenote_id
274
+ value: "SH_OUTDOOR_TRAIL_LIFE"
275
+ description: "Multi-part outdoor adventure series. Used as matching inventory for outdoor campaigns."
276
+
277
+ - id: summit_stories_series
278
+ name: "Summit Stories"
279
+ kind: "series"
280
+ genre: "outdoor"
281
+ collection_rid: "rid:outdoor:summit_stories"
282
+ distribution_ids:
283
+ - type: imdb_id
284
+ value: "tt9100002"
285
+ description: "Mountaineering documentary series. Used as matching inventory for outdoor campaigns."
286
+
287
+ # --- Automotive programming (matches Nova Motors campaigns) ---
288
+ - id: ev_insider_series
289
+ name: "EV Insider"
290
+ kind: "series"
291
+ genre: "automotive"
292
+ collection_rid: "rid:auto:ev_insider"
293
+ distribution_ids:
294
+ - type: gracenote_id
295
+ value: "SH_AUTO_EV_INSIDER"
296
+ description: "Electric vehicle review series. Used as matching inventory for Nova Motors campaigns."
297
+
298
+ # --- Unrelated programming (used to validate no-match scenarios) ---
299
+ - id: cooking_bistros_series
300
+ name: "Bistro Kitchen"
301
+ kind: "series"
302
+ genre: "food"
303
+ collection_rid: "rid:food:bistro_kitchen"
304
+ distribution_ids:
305
+ - type: imdb_id
306
+ value: "tt9200001"
307
+ description: "Cooking show. Used to validate that unrelated collections do NOT match outdoor targeting."
@@ -0,0 +1,160 @@
1
+ id: get_media_buys_pagination_integrity
2
+ version: "1.0.0"
3
+ title: "Pagination shape — get_media_buys"
4
+ category: schema_validation
5
+ summary: "Validates that get_media_buys responses carry a well-formed pagination envelope honoring the cursor↔has_more invariant."
6
+ track: core
7
+ required_tools:
8
+ - get_media_buys
9
+
10
+ narrative: |
11
+ Every paginated read in AdCP returns a `pagination` envelope satisfying
12
+ the cursor↔has_more invariant: `has_more=true` carries a `cursor`,
13
+ `has_more=false` omits it. The full multi-page round-trip is exercised
14
+ against `list_creatives` (`pagination_integrity.yaml`); this storyboard
15
+ verifies the simpler invariant — that `get_media_buys` emits a valid
16
+ pagination block on every successful response.
17
+
18
+ The runner seeds three media buys via `controller_seeding: true`. The
19
+ storyboard's get_media_buys call lands on an ID-lookup path because the
20
+ current `@adcp/client` request-builder injects `media_buy_ids` from
21
+ context (see adcp-client request-builder.js — broad-list queries
22
+ through the SDK are not yet supported for `get_media_buys`). On the
23
+ ID-lookup path the agent MUST still emit `pagination`, with
24
+ `has_more: false` and no cursor, and SHOULD volunteer `total_count`
25
+ reflecting the matched set.
26
+
27
+ An agent that omits the `pagination` block entirely on this call —
28
+ triage's pre-#3122 behavior — fails the first-page assertion. The
29
+ multi-page round-trip is parked under adcontextprotocol/adcp-client
30
+ for the request-builder gap; once that lands, this storyboard becomes
31
+ a candidate for upgrade to a seeded continuation+terminal walk like
32
+ `pagination_integrity.yaml`.
33
+
34
+ agent:
35
+ interaction_model: stateful_preloaded
36
+ capabilities:
37
+ - sells_media
38
+ examples:
39
+ - "Any AdCP media buy seller exposing get_media_buys"
40
+
41
+ caller:
42
+ role: buyer_agent
43
+ example: "Compliance test harness"
44
+
45
+ prerequisites:
46
+ description: |
47
+ The runner seeds three media buys via `controller_seeding: true`.
48
+ Each fixture only needs media_buy_id, status, and currency for
49
+ get_media_buys to surface the entry. The full multi-page walk is
50
+ deferred until the SDK supports broad-list queries on
51
+ get_media_buys (see request-builder.js gap).
52
+ test_kit: "test-kits/acme-outdoor.yaml"
53
+ controller_seeding: true
54
+
55
+ fixtures:
56
+ media_buys:
57
+ - media_buy_id: "pagination_integrity_mb_1"
58
+ status: "active"
59
+ currency: "USD"
60
+ - media_buy_id: "pagination_integrity_mb_2"
61
+ status: "active"
62
+ currency: "USD"
63
+ - media_buy_id: "pagination_integrity_mb_3"
64
+ status: "active"
65
+ currency: "USD"
66
+
67
+ phases:
68
+ - id: capability_discovery
69
+ title: "Capability discovery"
70
+ narrative: |
71
+ Confirm the agent supports the media buy protocol before
72
+ exercising get_media_buys.
73
+ steps:
74
+ - id: get_capabilities
75
+ title: "Check agent capabilities"
76
+ narrative: |
77
+ Verify the agent declares media_buy in supported_protocols
78
+ before driving get_media_buys.
79
+ task: get_adcp_capabilities
80
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
81
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
82
+ doc_ref: "/protocol/get_adcp_capabilities"
83
+ comply_scenario: capability_discovery
84
+ stateful: false
85
+ expected: |
86
+ Return capabilities declaring media_buy in supported_protocols.
87
+
88
+ sample_request:
89
+ context:
90
+ correlation_id: "get_media_buys_pagination_integrity--get_capabilities"
91
+ validations:
92
+ - check: response_schema
93
+ description: "Response matches get-adcp-capabilities-response.json schema"
94
+ - check: field_present
95
+ path: "supported_protocols"
96
+ description: "Agent declares supported protocols"
97
+
98
+ - check: field_present
99
+ path: "context"
100
+ description: "Response echoes back the context object"
101
+ - check: field_value
102
+ path: "context.correlation_id"
103
+ value: "get_media_buys_pagination_integrity--get_capabilities"
104
+ description: "Context correlation_id returned unchanged"
105
+
106
+ - id: pagination_shape
107
+ title: "Verify pagination envelope on get_media_buys"
108
+ narrative: |
109
+ With three media buys seeded, the agent's response MUST carry a
110
+ well-formed `pagination` envelope. On the ID-lookup path
111
+ (current SDK request-builder default), the envelope is terminal:
112
+ `has_more=false`, no cursor. Agents that omit the envelope
113
+ altogether fail this assertion — that's the dishonest shape this
114
+ storyboard catches.
115
+
116
+ steps:
117
+ - id: list_call
118
+ title: "Call get_media_buys and verify pagination shape"
119
+ narrative: |
120
+ The buyer requests media buys. Whatever path the SDK
121
+ request-builder selects (today: ID-lookup with the most
122
+ recently seeded media_buy_id), the agent MUST emit a valid
123
+ `pagination` envelope satisfying the cursor↔has_more
124
+ invariant.
125
+ task: get_media_buys
126
+ schema_ref: "media-buy/get-media-buys-request.json"
127
+ response_schema_ref: "media-buy/get-media-buys-response.json"
128
+ doc_ref: "/media-buy/task-reference/get_media_buys"
129
+ comply_scenario: get_media_buys_pagination_integrity
130
+ stateful: true
131
+ expected: |
132
+ Return media_buys with a `pagination` envelope:
133
+ - pagination.has_more is a boolean (false on terminal ID-lookup)
134
+ - pagination.cursor absent or null when has_more is false
135
+
136
+ sample_request:
137
+ account:
138
+ brand:
139
+ domain: "acmeoutdoor.example"
140
+ operator: "pinnacle-agency.example"
141
+
142
+ context:
143
+ correlation_id: "get_media_buys_pagination_integrity--list_call"
144
+ validations:
145
+ - check: response_schema
146
+ description: "Response matches get-media-buys-response.json schema"
147
+ - check: field_present
148
+ path: "pagination"
149
+ description: "get_media_buys MUST emit a pagination envelope on every response"
150
+ - check: field_present
151
+ path: "pagination.has_more"
152
+ description: "pagination.has_more is REQUIRED per /schemas/core/pagination-response.json"
153
+
154
+ - check: field_present
155
+ path: "context"
156
+ description: "Response echoes back the context object"
157
+ - check: field_value
158
+ path: "context.correlation_id"
159
+ value: "get_media_buys_pagination_integrity--list_call"
160
+ description: "Context correlation_id returned unchanged"
@@ -0,0 +1,210 @@
1
+ id: get_signals_pagination_integrity
2
+ version: "1.0.0"
3
+ title: "get_signals pagination cursor integrity"
4
+ category: schema_validation
5
+ summary: "Validates the cursor↔has_more invariant on a paginated get_signals response by walking from a continuation page to the next page under a broad query."
6
+ track: signals
7
+ required_tools:
8
+ - get_signals
9
+
10
+ narrative: |
11
+ `get_signals` is the buyer's primary entry point into the signals
12
+ marketplace. The response carries the standard `pagination` envelope, so
13
+ the cursor↔has_more invariant that gates `list_creatives` (covered by
14
+ universal/pagination-integrity) gates this endpoint too.
15
+
16
+ This storyboard sends a deliberately broad `signal_spec` ("audience") so
17
+ any non-trivial signal set matches more than one entry, then asks
18
+ for `pagination.max_results: 1`. Conformant agents MUST report
19
+ `has_more: true` with a `cursor` on this page — an agent that caps
20
+ internally and reports `has_more: false` while more candidates match
21
+ fails the page-1 assertion. That's the dishonest-pagination shape this
22
+ storyboard exists to catch.
23
+
24
+ After capturing the cursor, the storyboard follows it on the second
25
+ call. The terminal state of that page depends on the agent's signal set
26
+ size and is not pinned — the second-page validations check
27
+ response-schema conformance only. The cursor↔has_more invariant on
28
+ any single page is enforced statically across all schema and storyboard
29
+ fixtures by `scripts/lint-pagination-invariant.cjs`; the storyboard's
30
+ job is the runtime catch on the page where the agent first decides
31
+ whether to honor `max_results`.
32
+
33
+ Signal set sizing: agents whose signal sets return zero or one match for
34
+ "audience" SHOULD avoid claiming signal-marketplace behavior rather than
35
+ passing this storyboard with a one-page result — a signal marketplace with
36
+ a single audience signal isn't a marketplace.
37
+ When such an agent runs the storyboard the first-page assertion fails
38
+ loud, which is the right grading: this is not a `not_applicable` case,
39
+ it's a too-thin signal set claiming behavior it can't honor.
40
+
41
+ agent:
42
+ interaction_model: marketplace_catalog
43
+ capabilities: []
44
+ examples:
45
+ - "Any AdCP agent that exposes a paginated get_signals over a non-trivial signal set"
46
+
47
+ caller:
48
+ role: buyer_agent
49
+ example: "Compliance test harness"
50
+
51
+ prerequisites:
52
+ description: |
53
+ No fixtures required. The agent's signal set is treated as given —
54
+ the storyboard sends a broad query and asserts pagination shape
55
+ invariants on whatever match set the agent returns. Any agent
56
+ claiming signal-marketplace behavior SHOULD have a non-trivial signal set matching
57
+ "audience".
58
+ test_kit: "test-kits/acme-outdoor.yaml"
59
+
60
+ phases:
61
+ - id: capability_discovery
62
+ title: "Capability discovery"
63
+ narrative: |
64
+ Confirm the agent supports the signals protocol before exercising
65
+ get_signals.
66
+ steps:
67
+ - id: get_capabilities
68
+ title: "Check agent capabilities"
69
+ narrative: |
70
+ Verify that the agent declares signals in supported_protocols
71
+ before driving paginated get_signals.
72
+ task: get_adcp_capabilities
73
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
74
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
75
+ doc_ref: "/protocol/get_adcp_capabilities"
76
+ comply_scenario: capability_discovery
77
+ stateful: false
78
+ expected: |
79
+ Return capabilities declaring signals in supported_protocols.
80
+
81
+ sample_request:
82
+ context:
83
+ correlation_id: "get_signals_pagination_integrity--get_capabilities"
84
+ validations:
85
+ - check: response_schema
86
+ description: "Response matches get-adcp-capabilities-response.json schema"
87
+ - check: field_present
88
+ path: "supported_protocols"
89
+ description: "Agent declares supported protocols"
90
+
91
+ - check: field_present
92
+ path: "context"
93
+ description: "Response echoes back the context object"
94
+ - check: field_value
95
+ path: "context.correlation_id"
96
+ value: "get_signals_pagination_integrity--get_capabilities"
97
+ description: "Context correlation_id returned unchanged"
98
+
99
+ - id: pagination_walk
100
+ title: "Walk pages with a small max_results"
101
+ narrative: |
102
+ A broad `signal_spec` ("audience") against any non-trivial signals
103
+ signal set matches more than one entry. With `max_results: 1` the
104
+ first call MUST return a continuation page; the second call follows
105
+ the captured cursor.
106
+
107
+ steps:
108
+ - id: first_page
109
+ title: "Request the first page with max_results=1"
110
+ narrative: |
111
+ The buyer asks for up to one signal under a broad
112
+ natural-language query. Agents whose signal sets contain more than
113
+ one match (the expected case for any agent claiming
114
+ signal-marketplace behavior) MUST report `has_more=true` and a `cursor` the
115
+ buyer can follow.
116
+
117
+ The runner captures `pagination.cursor` into
118
+ `$context.signals_next_cursor` for the follow-up step. If the
119
+ agent reports `has_more=false` while more matches exist (the
120
+ dishonest pagination case), the field_value check on
121
+ `pagination.has_more` fires — surfacing the bug class this
122
+ storyboard exists to catch.
123
+ task: get_signals
124
+ schema_ref: "signals/get-signals-request.json"
125
+ response_schema_ref: "signals/get-signals-response.json"
126
+ doc_ref: "/signals/tasks/get_signals"
127
+ comply_scenario: get_signals_pagination_integrity
128
+ stateful: true
129
+ context_outputs:
130
+ - name: signals_next_cursor
131
+ path: "pagination.cursor"
132
+ expected: |
133
+ Return up to one signal matching the broad audience query with:
134
+ - pagination.has_more = true
135
+ - pagination.cursor present (an opaque continuation token)
136
+
137
+ sample_request:
138
+ account:
139
+ brand:
140
+ domain: "acmeoutdoor.example"
141
+ operator: "pinnacle-agency.example"
142
+ signal_spec: "audience"
143
+ pagination:
144
+ max_results: 1
145
+
146
+ context:
147
+ correlation_id: "get_signals_pagination_integrity--first_page"
148
+ validations:
149
+ - check: response_schema
150
+ description: "Response matches get-signals-response.json schema"
151
+ - check: field_value
152
+ path: "pagination.has_more"
153
+ value: true
154
+ description: "A broad query against any non-trivial signal set must yield more than one match — first page is non-terminal"
155
+ - check: field_present
156
+ path: "pagination.cursor"
157
+ description: "has_more=true requires a cursor — without one the caller cannot continue"
158
+
159
+ - check: field_present
160
+ path: "context"
161
+ description: "Response echoes back the context object"
162
+ - check: field_value
163
+ path: "context.correlation_id"
164
+ value: "get_signals_pagination_integrity--first_page"
165
+ description: "Context correlation_id returned unchanged"
166
+
167
+ - id: next_page
168
+ title: "Follow the cursor"
169
+ narrative: |
170
+ The buyer follows the captured cursor under the same broad
171
+ query. The terminal state of this page depends on the agent's
172
+ signal set size — some agents exhaust the result set in two
173
+ pages, others continue paginating — so we do not pin
174
+ `has_more` here. Schema conformance MUST hold; the
175
+ cursor↔has_more invariant on this page is enforced by
176
+ `scripts/lint-pagination-invariant.cjs` against any sample
177
+ fixture and by the round-trip on `universal/
178
+ pagination-integrity.yaml`.
179
+ task: get_signals
180
+ schema_ref: "signals/get-signals-request.json"
181
+ response_schema_ref: "signals/get-signals-response.json"
182
+ doc_ref: "/signals/tasks/get_signals"
183
+ comply_scenario: get_signals_pagination_integrity
184
+ stateful: true
185
+ expected: |
186
+ Return the next page of signals with a schema-valid response.
187
+
188
+ sample_request:
189
+ account:
190
+ brand:
191
+ domain: "acmeoutdoor.example"
192
+ operator: "pinnacle-agency.example"
193
+ signal_spec: "audience"
194
+ pagination:
195
+ cursor: "$context.signals_next_cursor"
196
+ max_results: 1
197
+
198
+ context:
199
+ correlation_id: "get_signals_pagination_integrity--next_page"
200
+ validations:
201
+ - check: response_schema
202
+ description: "Response matches get-signals-response.json schema"
203
+
204
+ - check: field_present
205
+ path: "context"
206
+ description: "Response echoes back the context object"
207
+ - check: field_value
208
+ path: "context.correlation_id"
209
+ value: "get_signals_pagination_integrity--next_page"
210
+ description: "Context correlation_id returned unchanged"