@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,217 @@
1
+ id: signed_requests
2
+ version: "1.0.0"
3
+ title: "Signed requests — RFC 9421 transport-layer verification"
4
+ category: signed_requests
5
+ summary: "Agent verifies RFC 9421 HTTP Signatures on incoming AdCP requests per the transport-layer profile. Universal capability-gated storyboard — runs for any agent advertising `request_signing.supported: true` regardless of `supported_protocols`. Graded against conformance vectors covering every checklist step and canonicalization-edge rule."
6
+ track: security_transport
7
+ required_tools:
8
+ - get_adcp_capabilities
9
+ # Additional tool families are exercised transport-layer only — the runner signs
10
+ # requests targeting any mutating AdCP operation (create_media_buy, update_media_buy,
11
+ # acquire_*, activate_signal, sync_creatives) and grades the verifier's response.
12
+ # The runner picks operations available given the agent's `supported_protocols`;
13
+ # operations the agent does not implement are skipped, not failed. Runner
14
+ # implementation tracked at adcontextprotocol/adcp#2331.
15
+
16
+ narrative: |
17
+ Request signing is a transport-layer claim that applies to every AdCP agent regardless
18
+ of which protocols it speaks. RFC 9421 verification behavior is identical whether the
19
+ agent is a media-buy seller, a signals agent, a governance agent, a creative agent, or
20
+ a brand agent. This universal storyboard certifies that an agent correctly implements
21
+ the AdCP RFC 9421 request-signing verifier per
22
+ [`docs/building/by-layer/L1/security.mdx#signed-requests-transport-layer`](/docs/building/by-layer/L1/security#signed-requests-transport-layer).
23
+
24
+ **Gating.** This storyboard runs for any agent advertising `request_signing.supported: true`
25
+ in `get_adcp_capabilities`. Agents that do not advertise support are not tested against
26
+ this storyboard — absence of advertisement is not a failure, it is a declaration that
27
+ the agent does not offer verified signed requests. Same gating model as
28
+ `deterministic_testing` (gated on `compliance_testing.supported: true`).
29
+
30
+ **Backward-compatible specialism claims.** The deprecated `signed-requests` specialism
31
+ enum value remains in the schema for back-compat (see
32
+ [#3075](https://github.com/adcontextprotocol/adcp/issues/3075)). Agents that still
33
+ advertise `specialisms: ["signed-requests"]` are graded via this universal storyboard;
34
+ the runner SHOULD emit the `signed_requests_specialism_deprecated` notice (severity
35
+ `deprecation`, see `runner-output-contract.yaml` > `notice` > `canonical_codes`) advising
36
+ the agent to drop the now-redundant specialism claim and rely solely on
37
+ `request_signing.supported: true`. The notice MUST NOT change `step_result.passed` —
38
+ it is an advisory, not a failure. 4.0 removes the enum value entirely — see
39
+ [#3078](https://github.com/adcontextprotocol/adcp/issues/3078).
40
+
41
+ **Composition with other storyboards.** This storyboard runs independently of any
42
+ specialism a seller also claims. A seller advertising `request_signing.supported: true`
43
+ AND `specialisms: ["sales-guaranteed"]` is graded on both — universal failure does not
44
+ exempt the specialism's pass, and a specialism pass does not paper over universal
45
+ failure. The overall AAO Verified verdict requires all gated storyboards to pass; the
46
+ runner reports per-storyboard outcomes so operators can isolate failures.
47
+
48
+ **Grading.** Observable-behavior only. The runner constructs signed HTTP requests
49
+ exactly as documented in the conformance vectors at
50
+ `/compliance/{version}/test-vectors/request-signing/` and sends them to the agent. The
51
+ agent's responses are compared against the vectors' `expected_outcome`:
52
+
53
+ - Positive vectors MUST produce a non-4xx response — the agent accepted the signed request.
54
+ - Negative vectors MUST produce `401` with `WWW-Authenticate: Signature error="<code>"`,
55
+ where the `<code>` matches the vector's `expected_outcome.error_code` byte-for-byte.
56
+ The checklist step number is informational; grading is on the stable error code only.
57
+
58
+ The runner supplies signed requests; the agent is the verifier. A separate signer-side
59
+ storyboard may follow but is out of scope here — signers are easier to get right, and a
60
+ signer that produces valid signatures is proven correct by a conformant verifier
61
+ accepting them.
62
+
63
+ **Stateful vectors.** Three negative vectors — 016 (replayed nonce), 017 (key revoked),
64
+ and 020 (per-keyid cap) — assert verifier state the runner cannot set from the outside.
65
+ Those vectors declare `requires_contract` and are gated on the `signed_requests_runner`
66
+ test-kit contract at `test-kits/signed-requests-runner.yaml`, which specifies the
67
+ runner's signing keyids, a dedicated pre-revoked keyid (`test-revoked-2026`), and the
68
+ grading-time per-keyid cap the runner will target. Agents advertising
69
+ `request_signing.supported: true` MUST pre-configure their verifier per that contract
70
+ before the negative phase runs. If the agent does not satisfy the contract (e.g., the
71
+ runner can't coordinate the pre-state), the affected vectors grade as FAIL, never as
72
+ SKIP — the contract is a prerequisite for the capability claim, not an optional
73
+ extension.
74
+
75
+ agent:
76
+ interaction_model: request_verifier
77
+ capabilities:
78
+ - verifies_request_signatures
79
+ examples:
80
+ - "Any AdCP agent advertising `request_signing.supported: true` — sales agent, signals agent, governance agent, creative agent, or brand agent"
81
+
82
+ caller:
83
+ role: compliance_runner
84
+ example: "AdCP Verified runner (or equivalent signed-request grader)"
85
+
86
+ prerequisites:
87
+ description: |
88
+ The agent MUST advertise `request_signing.supported: true` in `get_adcp_capabilities`.
89
+ The agent's verifier MUST be configured to accept requests signed by the test keypairs
90
+ published in `keys.json` alongside the conformance vectors — specifically, the runner's
91
+ signing keys (`test-ed25519-2026`, `test-es256-2026`) should be treated as coming from
92
+ a registered test counterparty whose JWKS contains those public keys with
93
+ `adcp_use: "request-signing"`.
94
+ test_kit: "test-kits/signed-requests-runner.yaml"
95
+
96
+ phases:
97
+ - id: capability_discovery
98
+ title: "Capability discovery"
99
+ narrative: |
100
+ Confirm the agent advertises request-signing support before grading the verifier.
101
+
102
+ steps:
103
+ - id: get_capabilities
104
+ title: "Verify the agent declares request_signing.supported"
105
+ narrative: |
106
+ The runner calls `get_adcp_capabilities` and confirms that the agent declares
107
+ support for the request-signing capability. Absence of `request_signing.supported: true`
108
+ means the agent has not opted into this storyboard; the runner SHOULD skip the
109
+ remaining phases.
110
+ task: get_adcp_capabilities
111
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
112
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
113
+ doc_ref: "/protocol/get_adcp_capabilities"
114
+ comply_scenario: capability_discovery
115
+ stateful: false
116
+ expected: |
117
+ Return capabilities declaring request_signing.supported: true. If false or absent,
118
+ this storyboard does not apply and grading skips to a non-applicable outcome.
119
+ sample_request:
120
+ context:
121
+ correlation_id: "signed_requests--get_capabilities"
122
+ validations:
123
+ - check: field_present
124
+ path: "request_signing"
125
+ description: "Agent declares request_signing capability block"
126
+ - check: field_value
127
+ path: "request_signing.supported"
128
+ value: true
129
+ description: "Agent verifies request signatures"
130
+
131
+ - id: positive_vectors
132
+ title: "Positive conformance vectors"
133
+ narrative: |
134
+ The runner sends each positive vector as a signed HTTP request to the agent and
135
+ expects the agent to accept it. Vectors exercise the happy path plus every
136
+ canonicalization-edge rule in the profile:
137
+
138
+ 001 basic Ed25519 POST
139
+ 002 Ed25519 POST with content-digest covered
140
+ 003 ES256 POST (edge-runtime profile)
141
+ 004 multiple Signature-Input labels (verifier processes sig1 only)
142
+ 005 default-port strip (URL has :443)
143
+ 006 dot-segment path normalization
144
+ 007 query-string byte preservation (no alphabetization)
145
+ 008 percent-encoded path normalization (lowercase → uppercase hex)
146
+
147
+ Vectors and test keys live at
148
+ `/compliance/{version}/test-vectors/request-signing/positive/` and
149
+ `/compliance/{version}/test-vectors/request-signing/keys.json`.
150
+
151
+ $comment: |
152
+ Step-level YAML entries for each positive vector will be generated from the vector
153
+ fixtures at runtime by the compliance runner; we do not duplicate them in this file.
154
+ The runner loads the vector, constructs the HTTP request, sends it to the agent,
155
+ and validates the response against expected_outcome.success. Runner implementation
156
+ tracked at adcontextprotocol/adcp#2331.
157
+
158
+ - id: negative_vectors
159
+ title: "Negative conformance vectors"
160
+ narrative: |
161
+ The runner sends each negative vector and expects the agent to reject with the
162
+ stable error code in `expected_outcome.error_code`. Negative vectors cover every
163
+ failure mode in the verifier checklist (13 numbered steps plus sub-step 9a for
164
+ the per-keyid cap) plus the pre-check:
165
+
166
+ 001 unsigned + required_for → request_signature_required
167
+ 002 wrong tag → request_signature_tag_invalid
168
+ 003 expired signature → request_signature_window_invalid
169
+ 004 window > 300s → request_signature_window_invalid
170
+ 005 alg not allowed → request_signature_alg_not_allowed
171
+ 006 missing covered component → request_signature_components_incomplete
172
+ 007 missing content-digest (required) → request_signature_components_incomplete
173
+ 008 unknown keyid → request_signature_key_unknown
174
+ 009 wrong adcp_use → request_signature_key_purpose_invalid
175
+ 010 content-digest mismatch → request_signature_digest_mismatch
176
+ 011 malformed Signature-Input → request_signature_header_malformed
177
+ 012 missing expires param → request_signature_params_incomplete
178
+ 013 expires ≤ created → request_signature_window_invalid
179
+ 014 missing nonce param → request_signature_params_incomplete
180
+ 015 signature cryptographically invalid → request_signature_invalid
181
+ 016 replayed nonce → request_signature_replayed
182
+ 017 key revoked → request_signature_key_revoked
183
+ 018 content-digest when forbidden → request_signature_components_unexpected
184
+ 019 Signature without Signature-Input → request_signature_header_malformed
185
+ 020 per-keyid replay cache cap → request_signature_rate_abuse
186
+ 028 unsigned tasks/cancel + protocol_methods_required_for → request_signature_required
187
+
188
+ Vector 028 is gated on `request_signing.protocol_methods_required_for`
189
+ being non-empty: the runner skips when the agent does not declare the
190
+ bucket, and FAILs (not SKIPs) when it declares it but doesn't enforce.
191
+ It's the only vector that targets a JSON-RPC protocol method rather
192
+ than a `tools/call` AdCP envelope. Vectors 021-027 (enumerated in the
193
+ negative/ directory but not in the summary above) cover later
194
+ additions to the checklist that share the `tools/call` envelope shape
195
+ with vectors 001-020.
196
+
197
+ Vectors live at `/compliance/{version}/test-vectors/request-signing/negative/`.
198
+ Grading requires byte-for-byte match on the error code; the failed_step value is
199
+ informational. The runner reads the error code from the agent's
200
+ `WWW-Authenticate: Signature error="<code>"` response header on 401.
201
+
202
+ $comment: |
203
+ As with positive_vectors, step-level entries are synthesized by the runner from
204
+ the vector fixtures. Runner implementation at adcontextprotocol/adcp#2331.
205
+
206
+ grading:
207
+ pass_criteria: |
208
+ All vectors in positive/ produce 2xx, and all vectors in negative/ produce 401 with
209
+ the expected error code byte-for-byte. Any single vector's failure to produce its
210
+ expected outcome fails the storyboard. Vectors that declare `requires_contract`
211
+ whose contract the runner cannot satisfy grade as FAIL, never as SKIP — the
212
+ signed-requests-runner contract is a prerequisite for the capability claim, not an
213
+ optional extension.
214
+ report_format: |
215
+ Pass/fail per vector, with the response's error code (if any) and a diff against
216
+ the vector's expected_outcome. Operators receive specific per-vector diagnostics
217
+ so they can debug without re-running the full suite.
@@ -0,0 +1,295 @@
1
+ id: stale_response_advisory
2
+ version: "1.0.0"
3
+ title: "STALE_RESPONSE advisory-success wire placement"
4
+ category: stale_response_advisory
5
+ summary: "Validates that STALE_RESPONSE rides in errors[] on a populated success response with transport success preserved, and that STALE_RESPONSE is absent on healthy upstream responses."
6
+ track: error_handling
7
+ required_tools:
8
+ - get_products
9
+
10
+ narrative: |
11
+ STALE_RESPONSE is a non-fatal advisory emitted when the seller served cached data past its
12
+ freshness target because an upstream dependency failed. It rides in errors[] on a populated
13
+ success response — transport stays success (MCP isError: false, HTTP 200, A2A succeeded),
14
+ the response payload is non-empty, and the advisory is never promoted to adcp_error on the
15
+ envelope.
16
+
17
+ This is easy for implementations to get wrong: returning SERVICE_UNAVAILABLE instead of a
18
+ stale-cache success, flipping transport failure, or emitting an empty payload all fail the
19
+ spec. STALE_RESPONSE is distinct from SERVICE_UNAVAILABLE: STALE_RESPONSE means the seller's
20
+ service is fine but one upstream is temporarily unreachable and the seller chose to honor the
21
+ request from cache. SERVICE_UNAVAILABLE means no usable response is available at all.
22
+
23
+ This storyboard verifies three properties:
24
+ 1. Wire placement: STALE_RESPONSE appears in errors[] on a success response with a populated
25
+ payload — not as adcp_error, not with transport failure.
26
+ 2. Details shape: error.details conforms to error-details/stale-response.json —
27
+ served_from_cache (required, always true), cache_age_seconds (required).
28
+ 3. Non-emission guard: STALE_RESPONSE is NOT emitted when the upstream is healthy (normal
29
+ get_products call against a working upstream).
30
+
31
+ The stale-cache forcing phases require comply_test_controller with the
32
+ force_upstream_unavailable scenario. Steps requiring the controller grade not_applicable for
33
+ agents that do not advertise it. The non-emission guard (Phase 3) runs for all agents.
34
+
35
+ agent:
36
+ interaction_model: media_buy_seller
37
+ capabilities:
38
+ - sells_media
39
+ examples:
40
+ - "Any AdCP seller agent that caches upstream responses"
41
+
42
+ caller:
43
+ role: buyer_agent
44
+ example: "Compliance test harness"
45
+
46
+ prerequisites:
47
+ description: |
48
+ Phase 2 (stale-cache forcing) requires comply_test_controller with
49
+ force_upstream_unavailable support. Phase 3 (non-emission guard) runs for all agents.
50
+ test_kit: "test-kits/acme-outdoor.yaml"
51
+
52
+ phases:
53
+ - id: capability_discovery
54
+ title: "Capability discovery"
55
+ narrative: |
56
+ The buyer calls get_adcp_capabilities to confirm the agent supports media buying before
57
+ testing STALE_RESPONSE wire placement.
58
+
59
+ steps:
60
+ - id: get_capabilities
61
+ title: "Check agent capabilities"
62
+ narrative: |
63
+ Verify that the agent declares the expected protocol support before
64
+ proceeding with domain-specific operations.
65
+ task: get_adcp_capabilities
66
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
67
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
68
+ doc_ref: "/protocol/get_adcp_capabilities"
69
+ comply_scenario: capability_discovery
70
+ stateful: false
71
+ expected: |
72
+ Return capabilities declaring media_buy in supported_protocols.
73
+ sample_request:
74
+ context:
75
+ correlation_id: "stale_response_advisory--get_capabilities"
76
+ validations:
77
+ - check: response_schema
78
+ description: "Response matches get-adcp-capabilities-response.json schema"
79
+ - check: field_present
80
+ path: "supported_protocols"
81
+ description: "Agent declares supported protocols"
82
+ - check: field_present
83
+ path: "context"
84
+ description: "Response echoes back the context object"
85
+ - check: field_value
86
+ path: "context.correlation_id"
87
+ value: "stale_response_advisory--get_capabilities"
88
+ description: "Context correlation_id returned unchanged"
89
+
90
+ - id: stale_response_forcing
91
+ title: "Force stale-cache condition and verify advisory-success wire placement"
92
+ narrative: |
93
+ The test controller forces an upstream dependency unavailable while a stale cache entry
94
+ exists. The seller must respond to get_products with a populated payload from cache and
95
+ emit STALE_RESPONSE in errors[], while keeping transport success.
96
+
97
+ All steps in this phase require comply_test_controller with force_upstream_unavailable
98
+ support. Steps grade not_applicable for agents that do not advertise the controller.
99
+ Validations in this phase carry severity: advisory — a seller that has the controller
100
+ but whose runner contract does not yet support force_upstream_unavailable will fail
101
+ advisory rather than blocking compliance, consistent with the acceptance criteria in
102
+ issue #4934.
103
+
104
+ steps:
105
+ - id: force_upstream_unavailable
106
+ title: "Force upstream dependency unavailable (seed stale-cache condition)"
107
+ narrative: |
108
+ The compliance harness calls comply_test_controller with force_upstream_unavailable
109
+ to signal that the seller's upstream dependency is currently unreachable. The seller
110
+ is expected to have (or synthesize) a stale cache entry for the subsequent
111
+ get_products call. On receipt, the seller MUST mark the named upstream as unavailable
112
+ for the duration of the compliance session (or until explicitly reset), so that the
113
+ next get_products request falls back to the cache entry.
114
+ task: comply_test_controller
115
+ schema_ref: "compliance/comply-test-controller-request.json"
116
+ response_schema_ref: "compliance/comply-test-controller-response.json"
117
+ doc_ref: "/building/by-layer/L3/comply-test-controller"
118
+ comply_scenario: force_upstream_unavailable
119
+ requires_tool: comply_test_controller
120
+ stateful: true
121
+ expected: |
122
+ Controller acknowledges the upstream-unavailable state transition. The seller
123
+ confirms the named upstream is now marked unreachable for subsequent calls.
124
+ sample_request:
125
+ scenario: force_upstream_unavailable
126
+ params:
127
+ tool: "get_products"
128
+ upstream_name: "inventory-service"
129
+ account:
130
+ sandbox: true
131
+ context:
132
+ correlation_id: "stale_response_advisory--force_upstream_unavailable"
133
+ validations:
134
+ - check: response_schema
135
+ description: "Controller response matches comply-test-controller-response.json"
136
+ severity: advisory
137
+ permanent_advisory:
138
+ reason: "Gated on force_upstream_unavailable being advertised in the seller's comply_test_controller scenarios. Promote to required when force_upstream_unavailable is widely adopted — remove the permanent_advisory block and set severity: required (or remove severity to use the default). See issue #4934."
139
+ - check: field_present
140
+ path: "context"
141
+ description: "Response echoes back the context object"
142
+ severity: advisory
143
+ permanent_advisory:
144
+ reason: "Gated on force_upstream_unavailable being advertised in the seller's comply_test_controller scenarios. Promote to required when force_upstream_unavailable is widely adopted. See issue #4934."
145
+ - check: field_value
146
+ path: "context.correlation_id"
147
+ value: "stale_response_advisory--force_upstream_unavailable"
148
+ description: "Context correlation_id returned unchanged"
149
+ severity: advisory
150
+ permanent_advisory:
151
+ reason: "Gated on force_upstream_unavailable being advertised in the seller's comply_test_controller scenarios. Promote to required when force_upstream_unavailable is widely adopted. See issue #4934."
152
+
153
+ - id: stale_response_wire_placement
154
+ title: "STALE_RESPONSE in errors[] on populated success response"
155
+ narrative: |
156
+ With the upstream forced unavailable and a stale cache entry present, the seller
157
+ responds to get_products with a populated payload and STALE_RESPONSE in errors[].
158
+ Transport MUST stay success (isError: false, no adcp_error envelope) — the advisory
159
+ rides in the payload's errors[] and MUST NOT be promoted to a transport-level error.
160
+
161
+ The seller MUST include the required details fields: served_from_cache: true and
162
+ cache_age_seconds (integer >= 0). Optionally: freshness_target_seconds, upstream
163
+ (name and/or url of the failed dependency), original_error (code/message of the
164
+ underlying failure).
165
+ task: get_products
166
+ schema_ref: "media-buy/get-products-request.json"
167
+ response_schema_ref: "media-buy/get-products-response.json"
168
+ doc_ref: "/media-buy/task-reference/get_products"
169
+ comply_scenario: stale_response_advisory
170
+ requires_tool: comply_test_controller
171
+ stateful: true
172
+ expected: |
173
+ Return a populated product list from stale cache with:
174
+ - errors[] containing a STALE_RESPONSE entry
175
+ - errors[0].details.served_from_cache: true
176
+ - errors[0].details.cache_age_seconds present (integer >= 0)
177
+ - Transport success: no adcp_error on the envelope (isError: false)
178
+ - Response payload non-empty (products[] with at least one entry)
179
+
180
+ sample_request:
181
+ buying_mode: "brief"
182
+ brief: "Display advertising"
183
+ account:
184
+ brand:
185
+ domain: "acmeoutdoor.example"
186
+ operator: "pinnacle-agency.example"
187
+ context:
188
+ correlation_id: "stale_response_advisory--stale_response_wire_placement"
189
+ validations:
190
+ - check: response_schema
191
+ description: "Response matches get-products-response.json schema even under stale cache"
192
+ severity: advisory
193
+ permanent_advisory:
194
+ reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted — remove permanent_advisory and severity fields. See issue #4934."
195
+ - check: field_present
196
+ path: "errors"
197
+ description: "errors[] is present on a stale-cache response"
198
+ severity: advisory
199
+ permanent_advisory:
200
+ reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
201
+ - check: field_value
202
+ path: "errors[0].code"
203
+ value: "STALE_RESPONSE"
204
+ description: "First errors[] entry carries STALE_RESPONSE code"
205
+ severity: advisory
206
+ permanent_advisory:
207
+ reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
208
+ - check: field_value
209
+ path: "errors[0].details.served_from_cache"
210
+ value: true
211
+ description: "details.served_from_cache is true per error-details/stale-response.json"
212
+ severity: advisory
213
+ permanent_advisory:
214
+ reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
215
+ - check: field_present
216
+ path: "errors[0].details.cache_age_seconds"
217
+ description: "details.cache_age_seconds is present (required details field)"
218
+ severity: advisory
219
+ permanent_advisory:
220
+ reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
221
+ - check: field_present
222
+ path: "context"
223
+ description: "Response echoes back the context object on stale-cache advisory"
224
+ severity: advisory
225
+ permanent_advisory:
226
+ reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
227
+ - check: field_value
228
+ path: "context.correlation_id"
229
+ value: "stale_response_advisory--stale_response_wire_placement"
230
+ description: "Context correlation_id returned unchanged"
231
+ severity: advisory
232
+ permanent_advisory:
233
+ reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
234
+ - check: field_present
235
+ path: "products[0]"
236
+ description: "Response payload is non-empty (products[] has at least one entry from stale cache)"
237
+ severity: advisory
238
+ permanent_advisory:
239
+ reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
240
+
241
+ - id: non_emission_guard
242
+ title: "No STALE_RESPONSE on healthy upstream response"
243
+ narrative: |
244
+ STALE_RESPONSE MUST NOT be emitted when the upstream is healthy. Per the normative
245
+ error-code description, sellers MUST NOT emit STALE_RESPONSE when the cache hit is
246
+ within freshness target or when no cached payload exists — the correct code for a
247
+ completely unavailable upstream with no cache is SERVICE_UNAVAILABLE.
248
+
249
+ This phase sends a normal get_products request and verifies no STALE_RESPONSE appears.
250
+ Runs for all agents — no controller required.
251
+
252
+ steps:
253
+ - id: no_stale_on_healthy_upstream
254
+ title: "STALE_RESPONSE absent on healthy upstream response"
255
+ narrative: |
256
+ A normal get_products request against a healthy upstream MUST NOT emit
257
+ STALE_RESPONSE. Sellers that unconditionally emit STALE_RESPONSE on every
258
+ get_products response are non-conformant — the code is only valid when a
259
+ specific cache-fallback condition is active.
260
+
261
+ NOTE: No machine-enforced absence check for STALE_RESPONSE exists today — the
262
+ `field_absent` primitive rejects errors[] entirely, but other error codes are
263
+ valid. The schema and correlation_id checks below prove conformance for
264
+ non-STALE_RESPONSE flows; a dedicated `error_code_absent` check kind would
265
+ close this gap. TODO: add check primitive when runner contract supports it.
266
+ task: get_products
267
+ schema_ref: "media-buy/get-products-request.json"
268
+ response_schema_ref: "media-buy/get-products-response.json"
269
+ doc_ref: "/media-buy/task-reference/get_products"
270
+ comply_scenario: stale_response_non_emission
271
+ stateful: false
272
+ expected: |
273
+ Return products normally. errors[] may be absent or present with codes other
274
+ than STALE_RESPONSE. STALE_RESPONSE MUST NOT appear unless the seller is
275
+ actively serving from a stale cache entry past its freshness target.
276
+
277
+ sample_request:
278
+ buying_mode: "brief"
279
+ brief: "Display advertising for outdoor lifestyle campaign"
280
+ account:
281
+ brand:
282
+ domain: "acmeoutdoor.example"
283
+ operator: "pinnacle-agency.example"
284
+ context:
285
+ correlation_id: "stale_response_advisory--no_stale_on_healthy"
286
+ validations:
287
+ - check: response_schema
288
+ description: "Response matches get-products-response.json schema on healthy upstream"
289
+ - check: field_present
290
+ path: "context"
291
+ description: "Response echoes back the context object"
292
+ - check: field_value
293
+ path: "context.correlation_id"
294
+ value: "stale_response_advisory--no_stale_on_healthy"
295
+ description: "Context correlation_id returned unchanged"