@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,115 @@
1
+ # Billing-Gate Runner — Harness Contract Test Kit
2
+ #
3
+ # Applies to: universal/billing-gate-dispatch.yaml.
4
+ #
5
+ # The billing-gate-dispatch storyboard validates the two-gate dispatch on
6
+ # `sync_accounts.billing` rejection — seller-wide capability gate
7
+ # (BILLING_NOT_SUPPORTED) vs per-buyer-agent commercial-relationship gate
8
+ # (BILLING_NOT_PERMITTED_FOR_AGENT). Two of the four phases depend on
9
+ # preconditions the runner cannot establish via the protocol:
10
+ #
11
+ # capability_gate — runner needs a `billing` value the seller does
12
+ # NOT support, so it can probe a rejection. Skipped
13
+ # if the seller supports all three values
14
+ # ("operator", "agent", "advertiser") at the
15
+ # capability level.
16
+ # per_agent_gate_reject — runner needs the calling buyer agent to be
17
+ # registered with the seller as passthrough-only
18
+ # (no payments relationship). The seller's
19
+ # onboarding system records the commercial state
20
+ # offline; the protocol has no surface for
21
+ # toggling it from outside.
22
+ #
23
+ # This kit is the coordination contract between the runner and a seller-under-
24
+ # test that wants the per-agent-gate phases graded. Sellers that do not ship
25
+ # a passthrough-only test caller leave `commercial_relationship` unset and
26
+ # the per-agent phases grade `not_applicable`.
27
+
28
+ id: billing_gate_runner
29
+ applies_to:
30
+ universal_storyboard: billing-gate-dispatch
31
+
32
+ description: |
33
+ Coordination contract between the billing-gate-dispatch runner and a seller
34
+ agent under test.
35
+
36
+ The runner reads two precondition fields from this kit:
37
+
38
+ account.unsupported_billing_probe — (optional) the value the runner will
39
+ submit on the capability-gate phase. MUST be a value the seller's
40
+ `account.supported_billing` does NOT include, so the seller rejects
41
+ with BILLING_NOT_SUPPORTED. Sellers whose `supported_billing` is the
42
+ full set of three values omit this field; the capability-gate phase
43
+ grades `not_applicable` in that case.
44
+
45
+ commercial_relationship — (optional) declares the calling buyer agent's
46
+ onboarded commercial state with the seller. When set to
47
+ "passthrough_only", the runner submits `billing: "agent"` on the
48
+ per-agent-gate-reject phase and asserts BILLING_NOT_PERMITTED_FOR_AGENT
49
+ with the clamped error.details shape. When unset, both per-agent
50
+ phases grade `not_applicable`.
51
+
52
+ Establishing the commercial relationship is offline (the same posture as
53
+ operator account creation): the seller-under-test records the test
54
+ caller's commercial state in its onboarding system before the storyboard
55
+ runs. A future extension (`comply_test_controller` `seed_buyer_agent`)
56
+ MAY let runners establish the precondition programmatically; until then
57
+ the test kit declares it.
58
+
59
+ endpoint_scope: sandbox
60
+ # The per_agent_gate_recover phase provisions a real account on the seller's
61
+ # books once `BILLING_NOT_PERMITTED_FOR_AGENT` recovers via the seller's
62
+ # `error.details.suggested_billing` value. Run against a sandbox endpoint or
63
+ # a designated test caller whose account creations the seller cleans up
64
+ # post-grading.
65
+
66
+ harness_mode: black_box
67
+
68
+ # Authentication fixture. Validated end-to-end against the training-agent
69
+ # reference implementation (#3851), which recognizes the
70
+ # `demo-billing-passthrough-*` family as the spoofable test principal
71
+ # mapping to `commercial_relationship: passthrough_only` — see
72
+ # server/src/training-agent/commercial-relationships.ts. Sellers running
73
+ # their own conformance harness substitute their own bearer convention
74
+ # for the same precondition.
75
+ #
76
+ # IMPORTANT — runner invocation: today's storyboard runner does not
77
+ # auto-extract `auth.api_key` from the test kit. Pass it explicitly:
78
+ #
79
+ # npx adcp storyboard run <agent-url> \
80
+ # --auth demo-billing-passthrough-v1 \
81
+ # --file static/compliance/source/universal/billing-gate-dispatch.yaml
82
+ #
83
+ # The kit declares the bearer the seller's harness expects to be
84
+ # authenticated under; the CLI carries the bearer onto the wire.
85
+ auth:
86
+ api_key: "demo-billing-passthrough-v1"
87
+ probe_task: list_accounts
88
+
89
+ # Brand identity for the storyboard's sample_request payloads. Reuses the Acme
90
+ # Outdoor sandbox brand so the brand-resolution path is the same as for
91
+ # adjacent universal storyboards (acmeoutdoor.example resolves via AAO sandbox
92
+ # brand resolution).
93
+ brand:
94
+ house:
95
+ domain: "acmeoutdoor.example"
96
+ name: "Acme Outdoor"
97
+ brand_id: "acme_outdoor"
98
+
99
+ # Account-shape preconditions for the capability-gate phase. Sellers whose
100
+ # `account.supported_billing` is a strict subset of ["operator", "agent",
101
+ # "advertiser"] declare the unsupported value here. Sellers whose capability
102
+ # is the full set leave this commented out and the capability-gate phase
103
+ # grades not_applicable.
104
+ account:
105
+ # unsupported_billing_probe: "advertiser" # uncomment + set for capability-gate
106
+
107
+ # Per-buyer-agent commercial-relationship precondition for the per-agent
108
+ # gate phases. When set to "passthrough_only", the runner exercises the
109
+ # per-agent gate. Other values reserved for future commercial-state shapes
110
+ # (e.g., "agent_billable", "advertiser_billable_only").
111
+ #
112
+ # Sellers that ship a passthrough-only test caller declare it here.
113
+ # Sellers that don't, comment this out and the per-agent phases grade
114
+ # not_applicable.
115
+ commercial_relationship: "passthrough_only"
@@ -0,0 +1,126 @@
1
+ # Bistro Oranje — Hospitality Advertiser Test Kit
2
+ #
3
+ # Entity definition: fictional-entities.yaml → advertisers[bistro_oranje]
4
+ #
5
+ # Dutch restaurant chain used in rights licensing scenarios.
6
+ #
7
+ # This brand is registered as a sandbox brand in AgenticAdvertising.org (AAO).
8
+ # Agents resolve bistro-oranje.example via the standard AAO brand resolution path.
9
+ # AAO returns the brand.json below but excludes sandbox brands from production
10
+ # brand discovery results.
11
+
12
+ id: bistro_oranje
13
+ name: "Bistro Oranje"
14
+ description: "Dutch restaurant chain for rights licensing storyboard testing"
15
+ sandbox: true
16
+
17
+ # security_baseline auth fixture — see acme-outdoor.yaml for semantics.
18
+ auth:
19
+ api_key: "demo-bistro-oranje-v1"
20
+ probe_task: list_creatives
21
+
22
+ brand:
23
+ house:
24
+ domain: "bistro-oranje.example"
25
+ name: "Bistro Oranje"
26
+ brand_id: "bistro_oranje"
27
+ names:
28
+ - en: "Bistro Oranje"
29
+ - nl: "Bistro Oranje"
30
+ description: "Modern Dutch dining — seasonal menus inspired by the Netherlands, served with warmth."
31
+ industry: "hospitality"
32
+ keller_type: "master"
33
+ logos:
34
+ - url: "https://test-assets.adcontextprotocol.org/bistro-oranje/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/bistro-oranje/logo-icon.png"
41
+ orientation: "square"
42
+ background: "transparent-bg"
43
+ variant: "icon"
44
+ width: 200
45
+ height: 200
46
+ colors:
47
+ primary: "#E65100"
48
+ secondary: "#1B5E20"
49
+ accent: "#FFC107"
50
+ background: "#FFF8E1"
51
+ text: "#212121"
52
+ fonts:
53
+ heading:
54
+ family: "Playfair Display"
55
+ weight: 700
56
+ url: "https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700"
57
+ body:
58
+ family: "Source Sans Pro"
59
+ weight: 400
60
+ url: "https://fonts.googleapis.com/css2?family=Source+Sans+Pro"
61
+ tone:
62
+ voice: "Warm and inviting, with understated confidence. We let the food speak — no excess, no pretension."
63
+ attributes:
64
+ - "welcoming"
65
+ - "seasonal"
66
+ - "unpretentious"
67
+ dos:
68
+ - "Mention seasonal ingredients by name"
69
+ - "Reference Dutch culinary traditions"
70
+ - "Keep descriptions sensory and specific"
71
+ donts:
72
+ - "Use fine-dining jargon"
73
+ - "Overuse superlatives"
74
+ - "Promise exclusivity — Bistro Oranje is for everyone"
75
+
76
+ assets:
77
+ images:
78
+ - id: "hero_300x250"
79
+ url: "https://test-assets.adcontextprotocol.org/bistro-oranje/hero-300x250.jpg"
80
+ width: 300
81
+ height: 250
82
+ mime_type: "image/jpeg"
83
+ description: "Medium rectangle hero — seasonal dish on rustic table"
84
+
85
+ - id: "hero_728x90"
86
+ url: "https://test-assets.adcontextprotocol.org/bistro-oranje/hero-728x90.jpg"
87
+ width: 728
88
+ height: 90
89
+ mime_type: "image/jpeg"
90
+ description: "Leaderboard hero — bistro exterior with canal backdrop"
91
+
92
+ - id: "hero_320x50"
93
+ url: "https://test-assets.adcontextprotocol.org/bistro-oranje/hero-320x50.jpg"
94
+ width: 320
95
+ height: 50
96
+ mime_type: "image/jpeg"
97
+ description: "Mobile banner hero — close-up of signature stamppot"
98
+
99
+ - id: "hero_160x600"
100
+ url: "https://test-assets.adcontextprotocol.org/bistro-oranje/hero-160x600.jpg"
101
+ width: 160
102
+ height: 600
103
+ mime_type: "image/jpeg"
104
+ description: "Wide skyscraper hero — vertical dining room scene"
105
+
106
+ - id: "hero_master"
107
+ url: "https://test-assets.adcontextprotocol.org/bistro-oranje/hero-master.jpg"
108
+ width: 1200
109
+ height: 628
110
+ mime_type: "image/jpeg"
111
+ description: "Master hero image — high-res chef plating seasonal dish"
112
+
113
+ text:
114
+ headlines:
115
+ - "Taste the Season at Bistro Oranje"
116
+ - "Dutch Comfort, Modern Kitchen"
117
+ - "Reserve Your Table Tonight"
118
+ descriptions:
119
+ - "Seasonal menus inspired by Dutch tradition, made with ingredients sourced within 50km. Bistro Oranje — Amsterdam, Rotterdam, Utrecht."
120
+ - "From stamppot to stroopwafel, every dish tells a story. Book your table at Bistro Oranje."
121
+ cta:
122
+ - "Reserve a Table"
123
+ - "View the Menu"
124
+ - "Find a Location"
125
+
126
+ click_url: "https://bistro-oranje.example/reservations"
@@ -0,0 +1,281 @@
1
+ # Distributed Brand Runner — Harness Contract Test Kit
2
+ #
3
+ # Applies to:
4
+ # - protocols/brand/scenarios/distributed_brand_resolution.yaml
5
+ #
6
+ # The distributed-brand scenario is a consumer-conformance test. It grades a
7
+ # crawler, registry, buyer-side DSP, governance platform, or membership system
8
+ # that reads static `brand.json` documents and decides whether relationship
9
+ # trust can propagate from a house to a child brand.
10
+ #
11
+ # Runner-side implementation is pending. Until adcp-client lands a general
12
+ # consumer-under-test dispatch primitive, scenario steps declare
13
+ # `requires_contract: distributed_brand_runner` and grade `not_applicable`
14
+ # unless the consumer advertises the controller scenario below.
15
+
16
+ id: distributed_brand_runner
17
+ applies_to:
18
+ protocol_scenarios:
19
+ - distributed_brand_resolution
20
+
21
+ description: |
22
+ Coordination contract between a black-box runner and a consumer under test
23
+ for distributed `brand.json` resolution. The runner hosts fixture static
24
+ documents, dispatches the consumer through comply_test_controller scenario
25
+ `evaluate_distributed_brand_resolution`, and records the consumer's outbound
26
+ fetches and result report through `query_upstream_traffic`.
27
+
28
+ endpoint_scope: sandbox
29
+ harness_mode: black_box
30
+
31
+ fixtures:
32
+ result_observation_endpoint:
33
+ url: "https://runner.example/distributed-brand-resolution/result"
34
+ method: POST
35
+ description: |
36
+ The consumer posts one JSON result per dispatch. This is a harness
37
+ observation surface, not a production protocol endpoint. The runner
38
+ records the call and applies storyboard `upstream_traffic`
39
+ `payload_must_contain` assertions against it.
40
+
41
+ mutual_assertion:
42
+ house:
43
+ domain: "nova-house.example"
44
+ brand_json_url: "https://nova-house.example/.well-known/brand.json"
45
+ brand_json_shape:
46
+ house:
47
+ domain: "nova-house.example"
48
+ name: "Nova House"
49
+ contact:
50
+ email: "brand-ops@nova-house.example"
51
+ data_subject_contestation:
52
+ contact:
53
+ email: "privacy@nova-house.example"
54
+ domain: "nova-house.example"
55
+ compliance_policies:
56
+ - policy_id: "house_art22_review"
57
+ enforcement: "must"
58
+ policy: "Human review is required for automated eligibility or opportunity decisions."
59
+ policy_categories:
60
+ - "regulated_decisioning"
61
+ brand_refs:
62
+ - domain: "leaf-brand.example"
63
+ brand_id: "leaf_brand"
64
+ managed_by: "aurora-agency.example"
65
+ effective_at: "2026-05-01T00:00:00Z"
66
+ trademarks:
67
+ - registry: "USPTO"
68
+ number: "90000001"
69
+ mark: "NOVA HOUSE"
70
+ status: "active"
71
+ license_type: "owned"
72
+ countries: ["US"]
73
+ nice_classes: [35]
74
+ leaf:
75
+ domain: "leaf-brand.example"
76
+ brand_json_url: "https://leaf-brand.example/.well-known/brand.json"
77
+ brand_json_shape:
78
+ id: "leaf_brand"
79
+ names:
80
+ - en: "Leaf Brand"
81
+ tagline: "Built by Leaf Brand"
82
+ description: "Self-published child brand identity for distributed brand.json testing."
83
+ house_domain: "nova-house.example"
84
+ keller_type: "endorsed"
85
+ colors:
86
+ primary: "#176B87"
87
+ secondary: "#E9C46A"
88
+ tone:
89
+ voice: "Clear, exact, and practical."
90
+ attributes:
91
+ - "clear"
92
+ - "practical"
93
+ data_subject_contestation:
94
+ contact:
95
+ email: "privacy@leaf-brand.example"
96
+ domain: "leaf-brand.example"
97
+ compliance_policies:
98
+ - policy_id: "leaf_no_sensitive_segments"
99
+ enforcement: "must"
100
+ policy: "Do not target sensitive health, finance, or employment inference segments."
101
+ policy_categories:
102
+ - "brand_suitability"
103
+ trademarks:
104
+ - registry: "USPTO"
105
+ number: "90000002"
106
+ mark: "LEAF BRAND"
107
+ status: "active"
108
+ license_type: "owned"
109
+ countries: ["US"]
110
+ nice_classes: [35]
111
+
112
+ leaf_only:
113
+ description: |
114
+ Leaf claims `house_domain: nova-house.example`, but the house document
115
+ served for this variant omits the leaf from `brand_refs[]`. Identity is
116
+ still trusted from the leaf's TLS document; relationship trust is not.
117
+ house:
118
+ domain: "nova-house.example"
119
+ brand_json_url: "https://nova-house.example/.well-known/brand.json"
120
+ brand_json_shape:
121
+ house:
122
+ domain: "nova-house.example"
123
+ name: "Nova House"
124
+ contact:
125
+ email: "brand-ops@nova-house.example"
126
+ data_subject_contestation:
127
+ contact:
128
+ email: "privacy@nova-house.example"
129
+ domain: "nova-house.example"
130
+ compliance_policies:
131
+ - policy_id: "house_art22_review"
132
+ enforcement: "must"
133
+ policy: "Human review is required for automated eligibility or opportunity decisions."
134
+ brand_refs: []
135
+ leaf:
136
+ domain: "leaf-only-brand.example"
137
+ brand_json_url: "https://leaf-only-brand.example/.well-known/brand.json"
138
+ brand_json_shape:
139
+ id: "leaf_only_brand"
140
+ names:
141
+ - en: "Leaf Only Brand"
142
+ tagline: "Leaf identity remains authoritative"
143
+ house_domain: "nova-house.example"
144
+ keller_type: "independent"
145
+ trademarks:
146
+ - registry: "USPTO"
147
+ number: "90000003"
148
+ mark: "LEAF ONLY BRAND"
149
+ status: "pending"
150
+ countries: ["US"]
151
+ nice_classes: [35]
152
+
153
+ managed_by_only:
154
+ description: |
155
+ House declares a pointer child with `managed_by`, but the leaf omits
156
+ `house_domain`. Consumers may surface the manager in directory views,
157
+ but MUST NOT use it as a trust edge.
158
+ house:
159
+ domain: "nova-house.example"
160
+ brand_json_url: "https://nova-house.example/.well-known/brand.json"
161
+ brand_json_shape:
162
+ house:
163
+ domain: "nova-house.example"
164
+ name: "Nova House"
165
+ contact:
166
+ email: "brand-ops@nova-house.example"
167
+ brand_refs:
168
+ - domain: "managed-leaf.example"
169
+ brand_id: "managed_leaf"
170
+ managed_by: "aurora-agency.example"
171
+ effective_at: "2026-05-01T00:00:00Z"
172
+ leaf:
173
+ domain: "managed-leaf.example"
174
+ brand_json_url: "https://managed-leaf.example/.well-known/brand.json"
175
+ brand_json_shape:
176
+ id: "managed_leaf"
177
+ names:
178
+ - en: "Managed Leaf"
179
+ tagline: "Managed operationally, not trust delegated"
180
+ keller_type: "independent"
181
+ trademarks:
182
+ - registry: "USPTO"
183
+ number: "90000004"
184
+ mark: "MANAGED LEAF"
185
+ status: "active"
186
+ countries: ["US"]
187
+ nice_classes: [35]
188
+
189
+ invalid_trademark:
190
+ description: |
191
+ Static document used only for schema-rejection validation. The runner
192
+ intentionally serves invalid typed trademark values so the consumer can
193
+ prove it rejects them before promoting the document into a resolved graph.
194
+ leaf:
195
+ domain: "invalid-mark-brand.example"
196
+ brand_json_url: "https://invalid-mark-brand.example/.well-known/brand.json"
197
+ invalid_fields:
198
+ - "trademarks[0].status"
199
+ - "trademarks[0].countries[0]"
200
+ - "trademarks[0].nice_classes[0]"
201
+ brand_json_shape:
202
+ id: "invalid_mark_brand"
203
+ names:
204
+ - en: "Invalid Mark Brand"
205
+ tagline: "Invalid marks should not promote"
206
+ house_domain: "nova-house.example"
207
+ keller_type: "endorsed"
208
+ trademarks:
209
+ - registry: "USPTO"
210
+ number: "90000005"
211
+ mark: "INVALID MARK BRAND"
212
+ status: "registered"
213
+ countries: ["USA"]
214
+ nice_classes: [99]
215
+
216
+ consumer_test_controller_scenario:
217
+ name: evaluate_distributed_brand_resolution
218
+ request_shape:
219
+ scenario: evaluate_distributed_brand_resolution
220
+ params:
221
+ variant: mutual_assertion | leaf_only | managed_by_only | invalid_trademark
222
+ house_domain: "<runner-supplied house domain>"
223
+ house_brand_json_url: "<runner-supplied URL>"
224
+ leaf_domain: "<runner-supplied leaf domain>"
225
+ leaf_brand_json_url: "<runner-supplied URL>"
226
+ brand_id: "<runner-supplied brand_id>"
227
+ manager_domain: "<runner-supplied manager domain, when variant=managed_by_only>"
228
+ result_endpoint: "https://runner.example/distributed-brand-resolution/result"
229
+
230
+ expected_consumer_behavior:
231
+ - Fetch the leaf Brand Canonical Document.
232
+ - Fetch the named house document when evaluating a schema-valid parent relationship claim.
233
+ - Fetch the house document first when the dispatch variant starts from a house-side `brand_refs[]` claim.
234
+ - Stop before relationship promotion when the leaf document fails brand.json schema validation.
235
+ - Compare `leaf.house_domain` with `house.brand_refs[]` by domain and brand_id.
236
+ - Report leaf identity as trusted whenever the leaf document is schema-valid and TLS-served.
237
+ - Report relationship trust as `mutual` only when both sides reciprocate.
238
+ - Merge governance and compliance fields strictest-of when returning a resolved graph.
239
+ - Treat `managed_by` as directory metadata only.
240
+ - Validate typed `trademarks[]` fields against the 3.1 brand.json schema before promoting them.
241
+
242
+ result_report_contract:
243
+ content_type: "application/json"
244
+ required_fields:
245
+ variant: "mutual_assertion | leaf_only | managed_by_only | invalid_trademark"
246
+ identity:
247
+ trusted: boolean
248
+ source_domain: string
249
+ brand_id: string
250
+ tagline: string
251
+ relationship:
252
+ trust_tier: "mutual | leaf_only | house_only | standalone | invalid"
253
+ trust_extending: boolean
254
+ managed_by_trust_edge: false
255
+ compliance:
256
+ policy_ids: "array of resolved policy_id values after strictest-of merge"
257
+ data_subject_contestation_contacts: "array of { domain, email } contacts retained from both house and leaf when present"
258
+ directory:
259
+ managed_by: "manager domain when present on house brand_refs[]"
260
+ trademark_validation:
261
+ valid_fixture_schema: boolean
262
+ error_paths: "array of field paths when valid_fixture_schema is false"
263
+ trademarks: "array of accepted brand-level trademark records when valid_fixture_schema is true"
264
+
265
+ upstream_traffic_contract:
266
+ required_fetches:
267
+ mutual_assertion:
268
+ - "GET *://nova-house.example/.well-known/brand.json"
269
+ - "GET *://leaf-brand.example/.well-known/brand.json"
270
+ leaf_only:
271
+ - "GET *://nova-house.example/.well-known/brand.json"
272
+ - "GET *://leaf-only-brand.example/.well-known/brand.json"
273
+ managed_by_only:
274
+ - "GET *://nova-house.example/.well-known/brand.json"
275
+ - "GET *://managed-leaf.example/.well-known/brand.json"
276
+ invalid_trademark:
277
+ - "GET *://invalid-mark-brand.example/.well-known/brand.json"
278
+ forbidden_trust_extension_patterns:
279
+ - "POST */governance/auto-provision"
280
+ - "POST */governance/contexts"
281
+ - "POST */billing/seats/auto-add"