@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,262 @@
1
+ # Nova Motors — Signal-Focused Advertiser Test Kit
2
+ #
3
+ # Entity definition: fictional-entities.yaml → advertisers[nova_motors]
4
+ # Data providers defined in this kit: see fictional-entities.yaml → data_providers
5
+ #
6
+ # This brand is registered as a sandbox brand in AgenticAdvertising.org (AAO).
7
+ # Agents resolve novamotors.example via the standard AAO brand resolution path.
8
+ # AAO returns the brand.json below but excludes sandbox brands from production
9
+ # brand discovery results.
10
+
11
+ id: nova_motors
12
+ name: "Nova Motors"
13
+ description: |
14
+ Signal-focused test kit for the Nova Motors Volta EV launch campaign.
15
+ Provides sample signal definitions, pricing options, and destination
16
+ configurations for testing signal agent storyboards.
17
+ sandbox: true
18
+
19
+ # security_baseline auth fixture — see acme-outdoor.yaml for semantics.
20
+ #
21
+ # probe_task is `get_signals` because this kit's primary consumers are
22
+ # signal agents (specialisms/signal-owned, specialisms/signal-marketplace)
23
+ # where list_creatives is not implemented. Non-signal storyboards that
24
+ # reuse this kit (collection-lists, sales-broadcast-tv, sponsored-
25
+ # intelligence) should select acme-outdoor for security_baseline, or
26
+ # override probe_task at the storyboard layer.
27
+ auth:
28
+ api_key: "demo-nova-motors-v1"
29
+ probe_task: get_signals
30
+
31
+ brand:
32
+ house:
33
+ domain: "novamotors.example"
34
+ name: "Nova Motors"
35
+ brand_id: "nova_motors"
36
+ names:
37
+ - en: "Nova Motors"
38
+ description: "Electric vehicles for the next generation. The Volta EV — performance meets sustainability."
39
+ industry: "automotive"
40
+ keller_type: "master"
41
+ logos:
42
+ - url: "https://test-assets.adcontextprotocol.org/nova-motors/logo-primary.png"
43
+ orientation: "horizontal"
44
+ background: "light-bg"
45
+ variant: "primary"
46
+ width: 400
47
+ height: 100
48
+ - url: "https://test-assets.adcontextprotocol.org/nova-motors/logo-icon.png"
49
+ orientation: "square"
50
+ background: "transparent-bg"
51
+ variant: "icon"
52
+ width: 200
53
+ height: 200
54
+ colors:
55
+ primary: "#0D47A1"
56
+ secondary: "#00BFA5"
57
+ accent: "#FF6D00"
58
+ background: "#F5F5F5"
59
+ text: "#1A1A1A"
60
+ fonts:
61
+ heading:
62
+ family: "Inter"
63
+ weight: 700
64
+ url: "https://fonts.googleapis.com/css2?family=Inter:wght@700"
65
+ body:
66
+ family: "Inter"
67
+ weight: 400
68
+ url: "https://fonts.googleapis.com/css2?family=Inter"
69
+ tone:
70
+ voice: "Forward-thinking and precise. We speak to drivers who care about engineering and the planet — no greenwashing, no hype."
71
+ attributes:
72
+ - "innovative"
73
+ - "precise"
74
+ - "optimistic"
75
+ dos:
76
+ - "Lead with performance specs"
77
+ - "Reference sustainability with evidence"
78
+ - "Use clean, modern language"
79
+ donts:
80
+ - "Greenwash or overstate environmental claims"
81
+ - "Use legacy automotive clichés"
82
+ - "Condescend about range anxiety"
83
+
84
+ campaign:
85
+ brand: "Nova Motors"
86
+ product: "Volta EV"
87
+ brief: "Reach in-market EV buyers with high purchase propensity, near dealerships, who haven't bought a Nova vehicle before."
88
+ budget: 250000
89
+ currency: "USD"
90
+ markets: ["US"]
91
+
92
+ signals:
93
+ marketplace:
94
+ - signal_agent_segment_id: "trident_likely_ev_buyers"
95
+ name: "Likely EV Buyers"
96
+ data_provider_domain: "tridentauto.example"
97
+ signal_id: "likely_ev_buyers"
98
+ value_type: "binary"
99
+ signal_type: "marketplace"
100
+ coverage_percentage: 8
101
+ pricing:
102
+ - pricing_option_id: "po_trident_ev_cpm"
103
+ model: "cpm"
104
+ cpm: 3.50
105
+ currency: "USD"
106
+
107
+ - signal_agent_segment_id: "trident_purchase_propensity"
108
+ name: "Purchase Propensity"
109
+ data_provider_domain: "tridentauto.example"
110
+ signal_id: "purchase_propensity"
111
+ value_type: "numeric"
112
+ signal_type: "marketplace"
113
+ range:
114
+ min: 0
115
+ max: 1
116
+ coverage_percentage: 55
117
+ pricing:
118
+ - pricing_option_id: "po_trident_propensity_cpm"
119
+ model: "cpm"
120
+ cpm: 4.00
121
+ currency: "USD"
122
+
123
+ - signal_agent_segment_id: "meridian_competitor_visitors"
124
+ name: "Competitor Visitors"
125
+ data_provider_domain: "meridiangeo.example"
126
+ signal_id: "competitor_visitors"
127
+ value_type: "binary"
128
+ signal_type: "marketplace"
129
+ coverage_percentage: 6
130
+ pricing:
131
+ - pricing_option_id: "po_meridian_visitors_cpm"
132
+ model: "cpm"
133
+ cpm: 5.00
134
+ currency: "USD"
135
+
136
+ - signal_agent_segment_id: "shopgrid_new_to_brand"
137
+ name: "New to Brand"
138
+ data_provider_domain: "shopgrid.example"
139
+ signal_id: "new_to_brand"
140
+ value_type: "binary"
141
+ signal_type: "marketplace"
142
+ coverage_percentage: 25
143
+ pricing:
144
+ - pricing_option_id: "po_shopgrid_retail_cpm"
145
+ model: "cpm"
146
+ cpm: 3.50
147
+ currency: "USD"
148
+
149
+ owned:
150
+ - signal_agent_segment_id: "prism_high_ltv"
151
+ name: "High LTV Customers"
152
+ value_type: "binary"
153
+ signal_type: "owned"
154
+ coverage_percentage: 12
155
+ pricing:
156
+ - pricing_option_id: "po_prism_flat_monthly"
157
+ model: "flat_fee"
158
+ amount: 5000
159
+ period: "monthly"
160
+ currency: "USD"
161
+
162
+ - signal_agent_segment_id: "prism_cart_abandoner"
163
+ name: "Cart Abandoners"
164
+ value_type: "binary"
165
+ signal_type: "owned"
166
+ coverage_percentage: 18
167
+ pricing:
168
+ - pricing_option_id: "po_prism_abandoner_cpm"
169
+ model: "cpm"
170
+ cpm: 8.00
171
+ currency: "USD"
172
+
173
+ - signal_agent_segment_id: "prism_engagement_score"
174
+ name: "Engagement Score"
175
+ value_type: "numeric"
176
+ signal_type: "owned"
177
+ range:
178
+ min: 0
179
+ max: 100
180
+ coverage_percentage: 65
181
+ pricing:
182
+ - pricing_option_id: "po_prism_engagement_cpm"
183
+ model: "cpm"
184
+ cpm: 2.50
185
+ currency: "USD"
186
+
187
+ - signal_agent_segment_id: "prism_churn_risk"
188
+ name: "Churn Risk"
189
+ value_type: "categorical"
190
+ signal_type: "owned"
191
+ categories: ["low_risk", "medium_risk", "high_risk", "churned"]
192
+ coverage_percentage: 70
193
+ pricing:
194
+ - pricing_option_id: "po_prism_churn_pom"
195
+ model: "percent_of_media"
196
+ percent: 12
197
+ max_cpm: 3.00
198
+ currency: "USD"
199
+
200
+ assets:
201
+ images:
202
+ - id: "hero_300x250"
203
+ url: "https://test-assets.adcontextprotocol.org/nova-motors/hero-300x250.jpg"
204
+ width: 300
205
+ height: 250
206
+ mime_type: "image/jpeg"
207
+ description: "Medium rectangle hero — Volta EV on coastal highway"
208
+
209
+ - id: "hero_728x90"
210
+ url: "https://test-assets.adcontextprotocol.org/nova-motors/hero-728x90.jpg"
211
+ width: 728
212
+ height: 90
213
+ mime_type: "image/jpeg"
214
+ description: "Leaderboard hero — Volta EV front profile with charging station"
215
+
216
+ - id: "hero_320x50"
217
+ url: "https://test-assets.adcontextprotocol.org/nova-motors/hero-320x50.jpg"
218
+ width: 320
219
+ height: 50
220
+ mime_type: "image/jpeg"
221
+ description: "Mobile banner hero — Volta EV dashboard detail"
222
+
223
+ - id: "hero_160x600"
224
+ url: "https://test-assets.adcontextprotocol.org/nova-motors/hero-160x600.jpg"
225
+ width: 160
226
+ height: 600
227
+ mime_type: "image/jpeg"
228
+ description: "Wide skyscraper hero — vertical Volta EV silhouette"
229
+
230
+ - id: "hero_master"
231
+ url: "https://test-assets.adcontextprotocol.org/nova-motors/hero-master.jpg"
232
+ width: 1200
233
+ height: 628
234
+ mime_type: "image/jpeg"
235
+ description: "Master hero image — high-res Volta EV in motion"
236
+
237
+ text:
238
+ headlines:
239
+ - "The Volta EV — 0 to 60 in 3.2s"
240
+ - "Performance Meets Sustainability"
241
+ - "Drive Electric. Drive Nova."
242
+ descriptions:
243
+ - "340 miles of range. 15-minute fast charge. The Volta EV is engineered for drivers who refuse to compromise."
244
+ - "Zero emissions, zero compromises. Test drive the Volta EV at your nearest Nova Motors dealer."
245
+ cta:
246
+ - "Reserve Yours"
247
+ - "Schedule a Test Drive"
248
+ - "Explore the Volta"
249
+
250
+ click_url: "https://novamotors.example/volta-ev"
251
+
252
+ destinations:
253
+ platforms:
254
+ - type: "platform"
255
+ platform: "the-trade-desk"
256
+ account: "agency-123-ttd"
257
+ - type: "platform"
258
+ platform: "streamhaus"
259
+ account: "agency-ctv-seat-456"
260
+ agents:
261
+ - type: "agent"
262
+ agent_url: "https://wonderstruck.salesagents.example"
@@ -0,0 +1,126 @@
1
+ # Osei Natural — Beauty Advertiser Test Kit
2
+ #
3
+ # Entity definition: fictional-entities.yaml → advertisers[osei_natural]
4
+ #
5
+ # 8-person natural skincare company based in Nairobi. Represents the small
6
+ # business that advertising should serve but currently doesn't.
7
+ #
8
+ # This brand is registered as a sandbox brand in AgenticAdvertising.org (AAO).
9
+ # Agents resolve oseinatural.example via the standard AAO brand resolution path.
10
+ # AAO returns the brand.json below but excludes sandbox brands from production
11
+ # brand discovery results.
12
+
13
+ id: osei_natural
14
+ name: "Osei Natural"
15
+ description: "Natural skincare brand for small-business advertiser storyboard testing"
16
+ sandbox: true
17
+
18
+ # security_baseline auth fixture — see acme-outdoor.yaml for semantics.
19
+ auth:
20
+ api_key: "demo-osei-natural-v1"
21
+ probe_task: list_creatives
22
+
23
+ brand:
24
+ house:
25
+ domain: "oseinatural.example"
26
+ name: "Osei Natural"
27
+ brand_id: "osei_natural"
28
+ names:
29
+ - en: "Osei Natural"
30
+ description: "Natural skincare rooted in East African botanicals. Small-batch, founder-led, and unapologetically simple."
31
+ industry: "beauty"
32
+ keller_type: "master"
33
+ logos:
34
+ - url: "https://test-assets.adcontextprotocol.org/osei-natural/logo-primary.png"
35
+ orientation: "horizontal"
36
+ background: "light-bg"
37
+ variant: "primary"
38
+ width: 400
39
+ height: 100
40
+ - url: "https://test-assets.adcontextprotocol.org/osei-natural/logo-icon.png"
41
+ orientation: "square"
42
+ background: "transparent-bg"
43
+ variant: "icon"
44
+ width: 200
45
+ height: 200
46
+ colors:
47
+ primary: "#5D4037"
48
+ secondary: "#C8E6C9"
49
+ accent: "#FF8F00"
50
+ background: "#FBF7F4"
51
+ text: "#2E2E2E"
52
+ fonts:
53
+ heading:
54
+ family: "Cormorant Garamond"
55
+ weight: 600
56
+ url: "https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@600"
57
+ body:
58
+ family: "Lato"
59
+ weight: 400
60
+ url: "https://fonts.googleapis.com/css2?family=Lato"
61
+ tone:
62
+ voice: "Calm, grounded, and personal. Amara speaks directly to customers like a trusted friend sharing what works."
63
+ attributes:
64
+ - "authentic"
65
+ - "gentle"
66
+ - "personal"
67
+ dos:
68
+ - "Name specific botanicals and their origins"
69
+ - "Use first-person when appropriate — the founder is the brand"
70
+ - "Keep it warm and conversational"
71
+ donts:
72
+ - "Use clinical or pharmaceutical language"
73
+ - "Make anti-aging claims — Osei Natural is about care, not correction"
74
+ - "Erase the brand's Kenyan identity — it's a feature, not a detail"
75
+
76
+ assets:
77
+ images:
78
+ - id: "hero_300x250"
79
+ url: "https://test-assets.adcontextprotocol.org/osei-natural/hero-300x250.jpg"
80
+ width: 300
81
+ height: 250
82
+ mime_type: "image/jpeg"
83
+ description: "Medium rectangle hero — product jars with botanical ingredients"
84
+
85
+ - id: "hero_728x90"
86
+ url: "https://test-assets.adcontextprotocol.org/osei-natural/hero-728x90.jpg"
87
+ width: 728
88
+ height: 90
89
+ mime_type: "image/jpeg"
90
+ description: "Leaderboard hero — Amara in workshop with shea butter"
91
+
92
+ - id: "hero_320x50"
93
+ url: "https://test-assets.adcontextprotocol.org/osei-natural/hero-320x50.jpg"
94
+ width: 320
95
+ height: 50
96
+ mime_type: "image/jpeg"
97
+ description: "Mobile banner hero — close-up of baobab oil serum"
98
+
99
+ - id: "hero_160x600"
100
+ url: "https://test-assets.adcontextprotocol.org/osei-natural/hero-160x600.jpg"
101
+ width: 160
102
+ height: 600
103
+ mime_type: "image/jpeg"
104
+ description: "Wide skyscraper hero — vertical product lineup on linen"
105
+
106
+ - id: "hero_master"
107
+ url: "https://test-assets.adcontextprotocol.org/osei-natural/hero-master.jpg"
108
+ width: 1200
109
+ height: 628
110
+ mime_type: "image/jpeg"
111
+ description: "Master hero image — high-res flat lay of full product range"
112
+
113
+ text:
114
+ headlines:
115
+ - "Your Skin Deserves Better Ingredients"
116
+ - "Small-Batch Skincare from Nairobi"
117
+ - "Rooted in East African Botanicals"
118
+ descriptions:
119
+ - "Shea butter, baobab oil, and aloe — sourced from East African growers, blended by hand in Nairobi. Osei Natural."
120
+ - "Eight people, twelve products, zero compromises. Natural skincare that actually works."
121
+ cta:
122
+ - "Shop the Collection"
123
+ - "Meet the Founder"
124
+ - "Try a Sample Kit"
125
+
126
+ click_url: "https://oseinatural.example/shop"
@@ -0,0 +1,196 @@
1
+ # Parallel Dispatch Runner — Harness Contract Test Kit
2
+ #
3
+ # Applies to:
4
+ # - universal/idempotency.yaml (concurrent-retry phase — verifies the
5
+ # first-insert-wins rule under L1/security.mdx#idempotency rule 9 by firing
6
+ # two requests with the same idempotency_key in parallel and grading the
7
+ # outcome).
8
+ # - Any future storyboard that needs to verify behavior under concurrent
9
+ # dispatch (e.g., racing webhook deliveries, racing sync calls).
10
+ #
11
+ # Storyboards are sequential by default — steps run one after another in YAML
12
+ # order, with each step's response observed before the next is dispatched.
13
+ # That model cannot exercise rule 9 (concurrent retry / first-insert-wins),
14
+ # because the second request would always arrive after the first's response
15
+ # has been observed.
16
+ #
17
+ # This test-kit defines the coordination contract between a runner that
18
+ # supports firing N requests in parallel and storyboards that need that
19
+ # capability. The runner's parallel dispatch happens at the @adcp/client
20
+ # layer (or its Python/Go equivalents) using the SDK's batch-call primitive,
21
+ # NOT at the YAML-step boundary — the storyboard author MUST NOT try to
22
+ # express parallelism via separate sequential steps.
23
+
24
+ id: parallel_dispatch_runner
25
+ applies_to:
26
+ universals:
27
+ - idempotency
28
+
29
+ description: |
30
+ Coordination contract between a runner that supports parallel request
31
+ dispatch and a storyboard step that needs to exercise concurrent-retry
32
+ semantics. The runner fires N >= 2 logically-simultaneous requests (same
33
+ `idempotency_key`, same canonical payload) and observes all responses, then
34
+ asserts on the cross-response invariants the storyboard step declares.
35
+
36
+ endpoint_scope: sandbox
37
+ # Concurrent-retry tests on storyboards that drive spend-committing operations
38
+ # (create_media_buy in particular) would create real commitments on retry-
39
+ # replay-success paths. Graders MUST target a sandbox/staging endpoint. Agents
40
+ # claiming the specialism SHOULD expose a dedicated grading endpoint.
41
+
42
+ harness_mode: black_box
43
+
44
+ # --- Parallelism mechanism ---
45
+ #
46
+ # Two viable shapes with different observation properties. The runner selects
47
+ # per run mode; storyboard authors SHOULD NOT assume a specific mode.
48
+ #
49
+ # process_local (default for lint/fast runs):
50
+ # The runner calls the SDK's batch-call primitive (Promise.all in JS,
51
+ # asyncio.gather in Python, sync.WaitGroup in Go) to dispatch N requests
52
+ # from the same process before awaiting any of their responses.
53
+ # Inter-request scheduling is at the SDK/transport level, NOT at the YAML-
54
+ # step level. Sufficient to exercise the seller's INSERT race; not
55
+ # sufficient to exercise true network-level interleaving (the runner's
56
+ # event loop still drains in deterministic order under most schedulers).
57
+ #
58
+ # distributed (optional, full-conformance runs):
59
+ # The runner dispatches the N requests from N independent worker processes
60
+ # (or N independent CI shards) using a barrier-wait synchronization point.
61
+ # All workers block on the barrier and unblock simultaneously, producing
62
+ # true network-level concurrency. Materially more expensive operationally;
63
+ # reserved for AdCP Verified grading and rule-9-specific deep checks.
64
+ #
65
+ # The specialism grades observable seller behavior; the dispatch mechanism is
66
+ # an implementation detail below the conformance seam. A seller that passes
67
+ # under process_local MUST also pass under distributed for the same storyboard
68
+ # — any divergence is a conformance bug in the runner, not a legitimate
69
+ # seller-behavior difference.
70
+
71
+ # --- Step-level coordination keys ---
72
+ #
73
+ # A storyboard step requiring this contract declares:
74
+ #
75
+ # requires_contract: parallel_dispatch_runner
76
+ # parallel_dispatch:
77
+ # count: 2 # required, integer >= 2, <= 10
78
+ # same_idempotency_key: true # required for rule-9 tests; future
79
+ # # non-idempotency parallel tests MAY
80
+ # # set this false
81
+ # barrier_timeout_ms: 5000 # optional; default 5000ms — how long the
82
+ # # runner waits at the barrier before
83
+ # # firing requests anyway (covers slow
84
+ # # distributed workers)
85
+ #
86
+ # The runner injects identical sample_request bodies on all N dispatches —
87
+ # specifically including the same expansion of any `$generate:uuid_v4#alias`
88
+ # placeholder, so the seller sees the same canonical hash on every replica.
89
+ # Distinct correlation_ids per dispatch ARE allowed (and recommended) because
90
+ # `context` is excluded from the canonical hash (see L1/security.mdx Payload
91
+ # equivalence) — using distinct correlation_ids lets the runner trace which
92
+ # response came from which dispatch in its output.
93
+
94
+ parallel_dispatch_step_contract:
95
+ required_step_fields:
96
+ - parallel_dispatch.count
97
+ - parallel_dispatch.same_idempotency_key
98
+ optional_step_fields:
99
+ - parallel_dispatch.barrier_timeout_ms
100
+ count_min: 2
101
+ count_max: 10
102
+ # 10 is a soft ceiling: every runner mode (process_local, distributed) MUST
103
+ # support up to 10 parallel dispatches. Storyboards needing higher fan-out
104
+ # SHOULD justify it in a step comment; the runner MAY reject counts above
105
+ # 10 to bound test runtime.
106
+
107
+ # --- Validation primitives ---
108
+ #
109
+ # Steps requiring parallel dispatch declare validations against the array of
110
+ # responses, not a single response. The storyboard step's validations[] block
111
+ # acquires two cross-response check kinds that are not available in
112
+ # sequential-dispatch steps:
113
+ #
114
+ # - check: cross_response_field_equal
115
+ # path: "media_buy_id"
116
+ # description: |
117
+ # All N responses (including IDEMPOTENCY_IN_FLIGHT-then-retried
118
+ # responses, resolved to their eventual cached response) MUST carry the
119
+ # same value at the named path. A divergence is a rule-9 violation —
120
+ # the seller produced two distinct resources for the same key.
121
+ #
122
+ # - check: cross_response_count_distinct
123
+ # path: "media_buy_id"
124
+ # allowed_values: [1]
125
+ # description: |
126
+ # The set of distinct values observed at the named path across all N
127
+ # responses MUST have cardinality equal to one of allowed_values. For
128
+ # rule-9 tests, allowed_values: [1] — exactly one resource was created.
129
+ #
130
+ # Standard per-response checks (response_schema, field_present, error_code,
131
+ # etc.) apply to each response individually; the runner runs them N times
132
+ # and aggregates pass/fail per the storyboard's existing severity rules.
133
+
134
+ cross_response_check_kinds:
135
+ - cross_response_field_equal
136
+ - cross_response_count_distinct
137
+
138
+ # --- Resolution of IDEMPOTENCY_IN_FLIGHT in cross-response checks ---
139
+ #
140
+ # A seller adopting the reject-and-redirect policy under rule 9 may return
141
+ # IDEMPOTENCY_IN_FLIGHT on the second (or later) dispatched request rather
142
+ # than wait-and-replay. The runner MUST resolve IDEMPOTENCY_IN_FLIGHT
143
+ # responses to their eventual cached response before applying cross-response
144
+ # checks: when the runner observes IDEMPOTENCY_IN_FLIGHT, it waits the
145
+ # `error.details.retry_after` seconds and retries the SAME idempotency_key
146
+ # (per the buyer-side normative behavior). The cross-response check then
147
+ # operates on the resolved response set, not the raw initial set.
148
+ #
149
+ # Maximum total wall-time for one in-flight resolution is bounded by the
150
+ # runner's overall step-timeout budget. Sellers returning IDEMPOTENCY_IN_FLIGHT
151
+ # with a retry_after that exceeds the runner's budget will fail the step on
152
+ # timeout — graded as `step_timeout`, not `rule_9_violation`. Sellers tuning
153
+ # retry_after for production traffic SHOULD test their values against the
154
+ # runner's documented timeout (default 60s; CI configurable).
155
+
156
+ # --- What the contract does NOT cover ---
157
+ #
158
+ # Network-level packet timing / ordering. process_local mode delivers requests
159
+ # in deterministic event-loop order; distributed mode introduces real
160
+ # interleaving but does not synthesize adversarial packet schedules. Sellers
161
+ # whose correctness depends on adversarial network conditions need additional
162
+ # fault-injection harnesses outside this contract.
163
+ #
164
+ # Multi-account / multi-agent racing. The contract dispatches N requests
165
+ # within a single (authenticated_agent, account) scope — the same scope as
166
+ # the idempotency key itself. Storyboards needing to exercise cross-scope
167
+ # races (e.g., agency-vs-direct-buyer collisions on a shared natural key)
168
+ # require a separate contract.
169
+ #
170
+ # Crash injection. The contract does not interrupt the seller mid-request.
171
+ # Storyboards testing seller behavior under crashes / restarts / failovers
172
+ # need a separate fault-injection harness — out of scope here.
173
+
174
+ # --- Reviewer checks ---
175
+ #
176
+ # Some properties of rule 9 cannot be programmatically graded by this
177
+ # contract and MUST be confirmed by reviewer inspection of the seller's
178
+ # implementation and runbook:
179
+ #
180
+ # - The seller's claim-row / unique-constraint pattern actually backs the
181
+ # observed first-insert-wins behavior (not a happy-path race that
182
+ # coincidentally avoided the conflict in the test run).
183
+ # - The seller's downstream reconciliation pattern (rule 10) is documented
184
+ # in the operational runbook. The contract observes only the buyer-
185
+ # visible response surface; the downstream-side behavior is not directly
186
+ # observable from a black-box harness.
187
+ # - The seller's in-flight detection does NOT leak across scope boundaries
188
+ # — an attacker authenticated as agent B with a stolen key from agent A
189
+ # receives the same response shape and timing whether agent A's row is
190
+ # in flight, completed, or never existed. Verified by manual probing,
191
+ # not by this contract.
192
+
193
+ reviewer_checks:
194
+ - "Confirm the seller's claim-row / unique-constraint implementation backs the observed first-insert-wins behavior, rather than a happy-path race the test happened to avoid (review code or runbook describing the INSERT … ON CONFLICT pattern on the scope tuple)."
195
+ - "Confirm the seller's downstream-reconciliation pattern (rule 10) is documented in their operational runbook: which downstream calls use write-claim-before-invoke and which thread the buyer-key (or a derivative)."
196
+ - "Confirm the seller's in-flight state does NOT leak across (authenticated_agent, account_id) scope boundaries — probe with a stolen key from a different scope and verify the response shape and timing match the never-seen-key path."