@adcp/sdk 15.9.1 → 16.0.0-beta.2

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 (321) hide show
  1. package/bin/adcp-identity.js +74 -0
  2. package/bin/adcp.js +2 -0
  3. package/dist/lib/adapters/keyed-account-backend.d.mts +37 -0
  4. package/dist/lib/adapters/keyed-account-backend.d.ts +37 -0
  5. package/dist/lib/adapters/keyed-account-backend.js +121 -0
  6. package/dist/lib/adapters/keyed-account-backend.mjs +94 -0
  7. package/dist/lib/adapters/keyed-account-store.d.mts +28 -0
  8. package/dist/lib/adapters/keyed-account-store.d.ts +28 -0
  9. package/dist/lib/adapters/keyed-account-store.js +227 -0
  10. package/dist/lib/adapters/keyed-account-store.mjs +203 -0
  11. package/dist/lib/core/SingleAgentClient.d.mts +25 -2
  12. package/dist/lib/core/SingleAgentClient.d.ts +25 -2
  13. package/dist/lib/core/SingleAgentClient.js +280 -62
  14. package/dist/lib/core/SingleAgentClient.mjs +282 -57
  15. package/dist/lib/core/TaskExecutor.d.mts +6 -0
  16. package/dist/lib/core/TaskExecutor.d.ts +6 -0
  17. package/dist/lib/core/TaskExecutor.js +66 -5
  18. package/dist/lib/core/TaskExecutor.mjs +71 -5
  19. package/dist/lib/core/postgres-webhook-registration-store.js +32 -5
  20. package/dist/lib/core/postgres-webhook-registration-store.mjs +32 -5
  21. package/dist/lib/core/redis-webhook-registration-store.js +23 -1
  22. package/dist/lib/core/redis-webhook-registration-store.mjs +23 -1
  23. package/dist/lib/core/webhook-registration.d.mts +7 -1
  24. package/dist/lib/core/webhook-registration.d.ts +7 -1
  25. package/dist/lib/core/webhook-registration.js +24 -2
  26. package/dist/lib/core/webhook-registration.mjs +23 -2
  27. package/dist/lib/identity-3.3/generated-compat.d.mts +34 -0
  28. package/dist/lib/identity-3.3/generated-compat.d.ts +34 -0
  29. package/dist/lib/identity-3.3/generated-compat.js +16 -0
  30. package/dist/lib/identity-3.3/generated-compat.mjs +0 -0
  31. package/dist/lib/identity-3.3/index.d.mts +10 -0
  32. package/dist/lib/identity-3.3/index.d.ts +10 -0
  33. package/dist/lib/identity-3.3/index.js +79 -0
  34. package/dist/lib/identity-3.3/index.mjs +50 -0
  35. package/dist/lib/identity-3.3/lifecycle.d.mts +125 -0
  36. package/dist/lib/identity-3.3/lifecycle.d.ts +125 -0
  37. package/dist/lib/identity-3.3/lifecycle.js +294 -0
  38. package/dist/lib/identity-3.3/lifecycle.mjs +272 -0
  39. package/dist/lib/identity-3.3/revocation.d.mts +86 -0
  40. package/dist/lib/identity-3.3/revocation.d.ts +86 -0
  41. package/dist/lib/identity-3.3/revocation.js +308 -0
  42. package/dist/lib/identity-3.3/revocation.mjs +286 -0
  43. package/dist/lib/identity-3.3/schemas.draft.d.mts +2472 -0
  44. package/dist/lib/identity-3.3/schemas.draft.d.ts +2472 -0
  45. package/dist/lib/identity-3.3/schemas.draft.js +1448 -0
  46. package/dist/lib/identity-3.3/schemas.draft.mjs +1428 -0
  47. package/dist/lib/identity-3.3/server.d.mts +46 -0
  48. package/dist/lib/identity-3.3/server.d.ts +46 -0
  49. package/dist/lib/identity-3.3/server.js +279 -0
  50. package/dist/lib/identity-3.3/server.mjs +260 -0
  51. package/dist/lib/identity-3.3/store.d.mts +24 -0
  52. package/dist/lib/identity-3.3/store.d.ts +24 -0
  53. package/dist/lib/identity-3.3/store.js +191 -0
  54. package/dist/lib/identity-3.3/store.mjs +169 -0
  55. package/dist/lib/identity-3.3/trust.d.mts +155 -0
  56. package/dist/lib/identity-3.3/trust.d.ts +155 -0
  57. package/dist/lib/identity-3.3/trust.js +383 -0
  58. package/dist/lib/identity-3.3/trust.mjs +342 -0
  59. package/dist/lib/identity-3.3/types.d.mts +155 -0
  60. package/dist/lib/identity-3.3/types.d.ts +155 -0
  61. package/dist/lib/identity-3.3/types.js +16 -0
  62. package/dist/lib/identity-3.3/types.mjs +0 -0
  63. package/dist/lib/identity-3.3/validation.d.mts +2 -0
  64. package/dist/lib/identity-3.3/validation.d.ts +2 -0
  65. package/dist/lib/identity-3.3/validation.js +125 -0
  66. package/dist/lib/identity-3.3/validation.mjs +91 -0
  67. package/dist/lib/index.d.mts +1 -1
  68. package/dist/lib/index.d.ts +1 -1
  69. package/dist/lib/index.js +2 -0
  70. package/dist/lib/index.mjs +2 -0
  71. package/dist/lib/protocols/index.d.mts +1 -1
  72. package/dist/lib/protocols/index.d.ts +1 -1
  73. package/dist/lib/protocols/index.js +2 -2
  74. package/dist/lib/protocols/index.mjs +2 -2
  75. package/dist/lib/reporting/azure/index.d.mts +5 -0
  76. package/dist/lib/reporting/azure/index.d.ts +5 -0
  77. package/dist/lib/reporting/azure/index.js +26 -7
  78. package/dist/lib/reporting/azure/index.mjs +26 -7
  79. package/dist/lib/reporting/bigquery/index.d.mts +39 -5
  80. package/dist/lib/reporting/bigquery/index.d.ts +39 -5
  81. package/dist/lib/reporting/bigquery/index.js +26 -20
  82. package/dist/lib/reporting/bigquery/index.mjs +26 -20
  83. package/dist/lib/reporting/gcs/adapter.d.mts +8 -1
  84. package/dist/lib/reporting/gcs/adapter.d.ts +8 -1
  85. package/dist/lib/reporting/gcs/errors.d.mts +6 -0
  86. package/dist/lib/reporting/gcs/errors.d.ts +6 -0
  87. package/dist/lib/reporting/gcs/fence.d.mts +5 -0
  88. package/dist/lib/reporting/gcs/fence.d.ts +5 -0
  89. package/dist/lib/reporting/gcs/index.d.mts +9 -0
  90. package/dist/lib/reporting/gcs/index.d.ts +9 -0
  91. package/dist/lib/reporting/gcs/reader.d.mts +27 -3
  92. package/dist/lib/reporting/gcs/reader.d.ts +27 -3
  93. package/dist/lib/reporting/gcs/row-provider.d.mts +7 -0
  94. package/dist/lib/reporting/gcs/row-provider.d.ts +7 -0
  95. package/dist/lib/reporting/gcs/row-provider.js +34 -14
  96. package/dist/lib/reporting/gcs/row-provider.mjs +34 -14
  97. package/dist/lib/reporting/ledger/change-feed.d.mts +22 -1
  98. package/dist/lib/reporting/ledger/change-feed.d.ts +22 -1
  99. package/dist/lib/reporting/ledger/index.d.mts +11 -0
  100. package/dist/lib/reporting/ledger/index.d.ts +11 -0
  101. package/dist/lib/reporting/ledger/managed-postgres.d.mts +8 -0
  102. package/dist/lib/reporting/ledger/managed-postgres.d.ts +8 -0
  103. package/dist/lib/reporting/ledger/managed-router.d.mts +27 -2
  104. package/dist/lib/reporting/ledger/managed-router.d.ts +27 -2
  105. package/dist/lib/reporting/ledger/managed.d.mts +86 -6
  106. package/dist/lib/reporting/ledger/managed.d.ts +86 -6
  107. package/dist/lib/reporting/ledger/notification-activity.d.mts +65 -3
  108. package/dist/lib/reporting/ledger/notification-activity.d.ts +65 -3
  109. package/dist/lib/reporting/ledger/object-writes.d.mts +64 -5
  110. package/dist/lib/reporting/ledger/object-writes.d.ts +64 -5
  111. package/dist/lib/reporting/ledger/postgres.d.mts +43 -9
  112. package/dist/lib/reporting/ledger/postgres.d.ts +43 -9
  113. package/dist/lib/reporting/ledger/postgres.js +43 -27
  114. package/dist/lib/reporting/ledger/postgres.mjs +43 -27
  115. package/dist/lib/reporting/ledger/row-encoding.d.mts +92 -6
  116. package/dist/lib/reporting/ledger/row-encoding.d.ts +92 -6
  117. package/dist/lib/reporting/ledger/row-encoding.js +8 -4
  118. package/dist/lib/reporting/ledger/row-encoding.mjs +6 -3
  119. package/dist/lib/reporting/ledger/row-storage-errors.d.mts +11 -1
  120. package/dist/lib/reporting/ledger/row-storage-errors.d.ts +11 -1
  121. package/dist/lib/reporting/ledger/row-storage-migration.d.mts +19 -1
  122. package/dist/lib/reporting/ledger/row-storage-migration.d.ts +19 -1
  123. package/dist/lib/reporting/ledger/row-storage-migration.js +133 -18
  124. package/dist/lib/reporting/ledger/row-storage-migration.mjs +133 -18
  125. package/dist/lib/reporting/ledger/row-storage-object.d.mts +103 -12
  126. package/dist/lib/reporting/ledger/row-storage-object.d.ts +103 -12
  127. package/dist/lib/reporting/ledger/row-storage-object.js +106 -31
  128. package/dist/lib/reporting/ledger/row-storage-object.mjs +104 -31
  129. package/dist/lib/reporting/ledger/row-storage.d.mts +87 -20
  130. package/dist/lib/reporting/ledger/row-storage.d.ts +87 -20
  131. package/dist/lib/reporting/ledger/row-storage.js +126 -66
  132. package/dist/lib/reporting/ledger/row-storage.mjs +129 -67
  133. package/dist/lib/reporting/ledger/schedule.d.mts +13 -0
  134. package/dist/lib/reporting/ledger/schedule.d.ts +13 -0
  135. package/dist/lib/reporting/ledger/schedule.js +24 -0
  136. package/dist/lib/reporting/ledger/schedule.mjs +23 -0
  137. package/dist/lib/reporting/ledger/types.d.mts +23 -1
  138. package/dist/lib/reporting/ledger/types.d.ts +23 -1
  139. package/dist/lib/reporting/s3/index.d.mts +5 -0
  140. package/dist/lib/reporting/s3/index.d.ts +5 -0
  141. package/dist/lib/reporting/s3/index.js +37 -14
  142. package/dist/lib/reporting/s3/index.mjs +37 -14
  143. package/dist/lib/reporting/service/index.d.mts +10 -0
  144. package/dist/lib/reporting/service/index.d.ts +10 -0
  145. package/dist/lib/reporting/service/maintenance.d.mts +28 -2
  146. package/dist/lib/reporting/service/maintenance.d.ts +28 -2
  147. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  148. package/dist/lib/server/account-sync-contract.d.mts +14 -0
  149. package/dist/lib/server/account-sync-contract.d.ts +14 -0
  150. package/dist/lib/server/account-sync-contract.js +225 -0
  151. package/dist/lib/server/account-sync-contract.mjs +197 -0
  152. package/dist/lib/server/adcp-server.js +5 -0
  153. package/dist/lib/server/adcp-server.mjs +10 -0
  154. package/dist/lib/server/auth-signature.d.mts +15 -0
  155. package/dist/lib/server/auth-signature.d.ts +15 -0
  156. package/dist/lib/server/auth-signature.js +72 -2
  157. package/dist/lib/server/auth-signature.mjs +81 -2
  158. package/dist/lib/server/auth.d.mts +6 -0
  159. package/dist/lib/server/auth.d.ts +6 -0
  160. package/dist/lib/server/auth.js +6 -0
  161. package/dist/lib/server/auth.mjs +6 -0
  162. package/dist/lib/server/create-adcp-server.d.mts +19 -5
  163. package/dist/lib/server/create-adcp-server.d.ts +19 -5
  164. package/dist/lib/server/create-adcp-server.js +259 -19
  165. package/dist/lib/server/create-adcp-server.mjs +266 -10
  166. package/dist/lib/server/decisioning/account.d.mts +24 -1
  167. package/dist/lib/server/decisioning/account.d.ts +24 -1
  168. package/dist/lib/server/decisioning/index.d.mts +1 -1
  169. package/dist/lib/server/decisioning/index.d.ts +1 -1
  170. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +0 -50
  171. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +0 -50
  172. package/dist/lib/server/decisioning/runtime/from-platform.js +61 -11
  173. package/dist/lib/server/decisioning/runtime/from-platform.mjs +65 -12
  174. package/dist/lib/server/index.d.mts +2 -0
  175. package/dist/lib/server/index.d.ts +2 -0
  176. package/dist/lib/server/index.js +12 -0
  177. package/dist/lib/server/index.mjs +12 -0
  178. package/dist/lib/server/notification-subscriptions/runtime.js +9 -1
  179. package/dist/lib/server/notification-subscriptions/runtime.mjs +9 -1
  180. package/dist/lib/server/notification-subscriptions/types.d.mts +5 -0
  181. package/dist/lib/server/notification-subscriptions/types.d.ts +5 -0
  182. package/dist/lib/server/principal/types.d.mts +1 -1
  183. package/dist/lib/server/principal/types.d.ts +1 -1
  184. package/dist/lib/server/serve.js +5 -0
  185. package/dist/lib/server/serve.mjs +5 -0
  186. package/dist/lib/server/webhook-delivery/recovery.d.mts +1 -0
  187. package/dist/lib/server/webhook-delivery/recovery.d.ts +1 -0
  188. package/dist/lib/server/webhook-delivery/recovery.js +4 -0
  189. package/dist/lib/server/webhook-delivery/recovery.mjs +4 -0
  190. package/dist/lib/server/webhook-emitter.d.mts +10 -0
  191. package/dist/lib/server/webhook-emitter.d.ts +10 -0
  192. package/dist/lib/server/webhook-emitter.js +22 -0
  193. package/dist/lib/server/webhook-emitter.mjs +22 -0
  194. package/dist/lib/signing/agent-context.d.mts +0 -5
  195. package/dist/lib/signing/agent-context.d.ts +0 -5
  196. package/dist/lib/signing/agent-context.js +9 -1
  197. package/dist/lib/signing/agent-context.mjs +9 -1
  198. package/dist/lib/signing/agent-fetch.js +27 -2
  199. package/dist/lib/signing/agent-fetch.mjs +32 -2
  200. package/dist/lib/signing/agent-resolver/canonicalize.d.mts +10 -15
  201. package/dist/lib/signing/agent-resolver/canonicalize.d.ts +10 -15
  202. package/dist/lib/signing/agent-resolver/canonicalize.js +17 -5
  203. package/dist/lib/signing/agent-resolver/canonicalize.mjs +16 -5
  204. package/dist/lib/signing/agent-resolver/index.d.mts +1 -0
  205. package/dist/lib/signing/agent-resolver/index.d.ts +1 -0
  206. package/dist/lib/signing/agent-resolver/index.js +5 -0
  207. package/dist/lib/signing/agent-resolver/index.mjs +3 -0
  208. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.mts +3 -2
  209. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.ts +3 -2
  210. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.js +30 -3
  211. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.mjs +30 -3
  212. package/dist/lib/signing/agent-resolver/strict-json.d.mts +2 -2
  213. package/dist/lib/signing/agent-resolver/strict-json.d.ts +2 -2
  214. package/dist/lib/signing/agent-resolver/strict-json.js +5 -3
  215. package/dist/lib/signing/agent-resolver/strict-json.mjs +5 -3
  216. package/dist/lib/signing/brand-jwks.d.mts +2 -2
  217. package/dist/lib/signing/brand-jwks.d.ts +2 -2
  218. package/dist/lib/signing/brand-jwks.js +4 -4
  219. package/dist/lib/signing/brand-jwks.mjs +4 -4
  220. package/dist/lib/signing/client.d.mts +1 -0
  221. package/dist/lib/signing/client.d.ts +1 -0
  222. package/dist/lib/signing/client.js +5 -0
  223. package/dist/lib/signing/client.mjs +3 -0
  224. package/dist/lib/signing/crypto.js +8 -0
  225. package/dist/lib/signing/crypto.mjs +9 -1
  226. package/dist/lib/signing/fetch-async.js +1 -1
  227. package/dist/lib/signing/fetch-async.mjs +1 -1
  228. package/dist/lib/signing/fetch.js +1 -1
  229. package/dist/lib/signing/fetch.mjs +1 -1
  230. package/dist/lib/signing/jwks-https.d.mts +1 -1
  231. package/dist/lib/signing/jwks-https.d.ts +1 -1
  232. package/dist/lib/signing/jwks-https.js +1 -1
  233. package/dist/lib/signing/jwks-https.mjs +1 -1
  234. package/dist/lib/signing/jwks.d.mts +11 -3
  235. package/dist/lib/signing/jwks.d.ts +11 -3
  236. package/dist/lib/signing/jwks.js +1 -1
  237. package/dist/lib/signing/jwks.mjs +1 -1
  238. package/dist/lib/signing/middleware.js +9 -0
  239. package/dist/lib/signing/middleware.mjs +14 -0
  240. package/dist/lib/signing/parser.d.mts +9 -6
  241. package/dist/lib/signing/parser.d.ts +9 -6
  242. package/dist/lib/signing/parser.js +82 -64
  243. package/dist/lib/signing/parser.mjs +83 -65
  244. package/dist/lib/signing/revocation.d.mts +4 -1
  245. package/dist/lib/signing/revocation.d.ts +4 -1
  246. package/dist/lib/signing/revocation.js +36 -3
  247. package/dist/lib/signing/revocation.mjs +34 -2
  248. package/dist/lib/signing/server.d.mts +1 -1
  249. package/dist/lib/signing/server.d.ts +1 -1
  250. package/dist/lib/signing/server.js +4 -0
  251. package/dist/lib/signing/server.mjs +4 -0
  252. package/dist/lib/signing/types.d.mts +3 -0
  253. package/dist/lib/signing/types.d.ts +3 -0
  254. package/dist/lib/signing/verifier.js +1 -1
  255. package/dist/lib/signing/verifier.mjs +1 -1
  256. package/dist/lib/signing/web-bot-auth.d.mts +191 -0
  257. package/dist/lib/signing/web-bot-auth.d.ts +191 -0
  258. package/dist/lib/signing/web-bot-auth.js +837 -0
  259. package/dist/lib/signing/web-bot-auth.mjs +796 -0
  260. package/dist/lib/signing/webhook-verifier.js +1 -1
  261. package/dist/lib/signing/webhook-verifier.mjs +1 -1
  262. package/dist/lib/testing/client.d.mts +1 -4
  263. package/dist/lib/testing/client.d.ts +1 -4
  264. package/dist/lib/testing/client.js +141 -20
  265. package/dist/lib/testing/client.mjs +137 -19
  266. package/dist/lib/testing/compliance/comply.js +29 -10
  267. package/dist/lib/testing/compliance/comply.mjs +37 -11
  268. package/dist/lib/testing/storyboard/account-sync-contract.d.mts +3 -0
  269. package/dist/lib/testing/storyboard/account-sync-contract.d.ts +3 -0
  270. package/dist/lib/testing/storyboard/account-sync-contract.js +79 -0
  271. package/dist/lib/testing/storyboard/account-sync-contract.mjs +55 -0
  272. package/dist/lib/testing/storyboard/default-invariants.js +2 -0
  273. package/dist/lib/testing/storyboard/default-invariants.mjs +2 -0
  274. package/dist/lib/testing/storyboard/runner.js +23 -8
  275. package/dist/lib/testing/storyboard/runner.mjs +24 -8
  276. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  277. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  278. package/dist/lib/types/adcp.d.mts +4 -0
  279. package/dist/lib/types/adcp.d.ts +4 -0
  280. package/dist/lib/types/schemas.generated.d.ts +6 -6
  281. package/dist/lib/utils/capabilities.d.mts +1 -0
  282. package/dist/lib/utils/capabilities.d.ts +1 -0
  283. package/dist/lib/utils/capabilities.js +5 -0
  284. package/dist/lib/utils/capabilities.mjs +5 -0
  285. package/dist/lib/v2/projection/catalog-snapshot.js +3 -1
  286. package/dist/lib/v2/projection/catalog-snapshot.mjs +3 -1
  287. package/dist/lib/v2/projection/creative-delivery.d.mts +34 -10
  288. package/dist/lib/v2/projection/creative-delivery.d.ts +34 -10
  289. package/dist/lib/v2/projection/creative-delivery.js +26 -10
  290. package/dist/lib/v2/projection/creative-delivery.mjs +26 -10
  291. package/dist/lib/v2/projection/index.d.mts +1 -1
  292. package/dist/lib/v2/projection/index.d.ts +1 -1
  293. package/dist/lib/v2/projection/index.js +2 -0
  294. package/dist/lib/v2/projection/index.mjs +2 -0
  295. package/dist/lib/v2/projection/legacy-routes.d.mts +34 -2
  296. package/dist/lib/v2/projection/legacy-routes.d.ts +34 -2
  297. package/dist/lib/v2/projection/legacy-routes.js +35 -2
  298. package/dist/lib/v2/projection/legacy-routes.mjs +32 -2
  299. package/dist/lib/validation/schema-loader.d.mts +2 -0
  300. package/dist/lib/validation/schema-loader.d.ts +2 -0
  301. package/dist/lib/validation/schema-loader.js +43 -4
  302. package/dist/lib/validation/schema-loader.mjs +39 -3
  303. package/dist/lib/version.d.mts +3 -3
  304. package/dist/lib/version.d.ts +3 -3
  305. package/dist/lib/version.js +3 -3
  306. package/dist/lib/version.mjs +3 -3
  307. package/docs/TYPE-SUMMARY.md +2 -2
  308. package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +4 -0
  309. package/docs/guides/REPORTING-LEDGER-CUTOVER.md +1 -1
  310. package/docs/guides/REPORTING-LEDGER.md +99 -29
  311. package/docs/guides/REPORTING-OPERATIONS.md +29 -13
  312. package/docs/guides/REPORTING-STABILITY.md +76 -0
  313. package/docs/guides/account-resolution.md +101 -0
  314. package/docs/llms.txt +3 -2
  315. package/docs/migration-12-to-13.md +15 -0
  316. package/docs/migration-14.x-rc-worksheet.md +4 -4
  317. package/docs/migration-agent-identity-3.3.md +494 -0
  318. package/docs/migration-agent-resolution-3.3.md +5 -0
  319. package/docs/migration-reporting-row-storage-alignment.md +137 -0
  320. package/examples/storyboards/account-sync-contract.yaml +57 -0
  321. package/package.json +17 -1
@@ -5,6 +5,8 @@ consumer runtime. Reliable Reporting controls evidence used for billing and
5
5
  large media-spend decisions. Treat its PostgreSQL state, destination objects,
6
6
  signing keys, and authentication registry as financial infrastructure.
7
7
 
8
+ > **Stability:** the storage subpaths this runbook operates are experimental. Pin `@adcp/sdk` with `~` and read each minor's changeset before upgrading. See the [Reliable Reporting stability policy](REPORTING-STABILITY.md).
9
+
8
10
  ## Production topology
9
11
 
10
12
  Use one PostgreSQL primary with synchronous durability appropriate to the
@@ -90,6 +92,9 @@ service runs for you. See
90
92
  verified chunks. Existing revisions keep their inline rows, and every
91
93
  binary built with row storage reads both forms. Do not run a writer older
92
94
  than this release once chunked revisions exist: it cannot read them.
95
+ Upgrading from 15.8.x? Row storage renamed its stored fields to AdCP's
96
+ names; re-apply the migration before starting new binaries (see
97
+ [Breaking: reporting row storage field alignment](../migration-reporting-row-storage-alignment.md)).
93
98
  2. **Existing inline rows (optional).** Run `migrateInlineRows` in bounded
94
99
  batches from a maintenance job until it returns no cursor. Alert on any
95
100
  `quarantined` IDs: those revisions no longer reproduce their committed
@@ -116,7 +121,14 @@ service runs for you. See
116
121
  cannot hold the table indefinitely.
117
122
  5. **Warehouse sink.** Apply `REPORTING_WAREHOUSE_SINK_MIGRATION`, create the
118
123
  tables, and the `current_rows` view, then schedule `runOnce`. Point analysts
119
- at `current_rows`.
124
+ at `current_rows`. Set the sink's `location` to the dataset's location: replay
125
+ lookups of load jobs need it outside the US and EU multi-regions, and the sink
126
+ warns once per process when it is unset. When upgrading from 15.9.0, stop
127
+ every 15.9.0 sink worker before starting newer ones, then re-apply
128
+ `REPORTING_WAREHOUSE_SINK_MIGRATION`. A 15.9.0 worker cancels a load at its
129
+ deadline, so one running beside a newer worker on the same sink can cancel a
130
+ job the newer worker is waiting on; the job ends `DONE` with an error and the
131
+ attempt advances. Rows do not duplicate, but convergence slows.
120
132
  6. **Retention.** Enable `retention` last, after confirming the advertised
121
133
  `status_retention_days` is the window you intend to keep. Retirement deletes
122
134
  rows and ledger records for whole periods and cannot be undone. Keep backups
@@ -339,21 +351,22 @@ What it checks:
339
351
  and job ID unchanged and that table's persisted deadline grown, the job must
340
352
  end `DONE` without an error (the sink never cancels it), and later runs under
341
353
  the same sink name must converge with no duplicate rows, the same job ID and
342
- no second upload. A #3234 scenario runs a sink whose upload of a 50,000-row
354
+ no second upload. A slow-upload scenario runs a sink whose upload of a 50,000-row
343
355
  batch outlasts its 1-second deadline and asserts that it converges within 8
344
356
  runs, loads every row exactly once, never changes the job ID, and never
345
357
  starts an upload after the job exists (a link fast enough to beat the
346
- deadline passes and says so).
358
+ deadline passes and says so). A
359
+ `period_date` scenario checks that non-UTC periods land on their
360
+ source-timezone date.
347
361
  - **Cancel probe of the service** (`INFO`, never a failure). It cancels a
348
362
  5000-row load the moment it is created and reports whether BigQuery stopped
349
363
  it; in practice it accepts the cancel and lets the load finish, which is why
350
364
  the sink never cancels a load and finds it by job ID instead.
351
365
  - **Overlapping runs** (`INFO`, never a failure). Two concurrent `runOnce()`
352
- calls over one pending batch, and a deterministic reproduction of #3196: one
366
+ calls over one pending batch, and a deterministic reproduction of the stale-plan race: one
353
367
  run reads its sink state, another completes the batch and a new revision
354
368
  commits, then the first resumes. Without the fence the first run reloads
355
- revisions the second already loaded (duplicate rows); with the fence from
356
- PR #3197 it rejects as stale and nothing duplicates. Read the verdict in the
369
+ revisions the second already loaded (duplicate rows); with the plan fence it rejects as stale and nothing duplicates. Read the verdict in the
357
370
  report; the exit status does not depend on it.
358
371
  - **Cross-project.** Set `GCP_CLIENT_PROJECT` to a project other than
359
372
  `GCP_BQ_PROJECT`. Load jobs are then created in the destination project, and
@@ -364,7 +377,10 @@ What it checks:
364
377
  prevention, lifecycle rules) and `runReportingRowObjectProviderConformanceV1`,
365
378
  then commits a revision through an object binding on the bucket and reads it
366
379
  back verified (full read, ranged page, a second store instance, and a replayed
367
- commit that uploads nothing).
380
+ commit that uploads nothing). It also commits revisions for non-UTC periods and
381
+ checks that each object key has one `{period_date}` segment holding the
382
+ source-timezone date, and that each chunk's `native_version_ref` and
383
+ `size_bytes` match the stored object's generation and size.
368
384
 
369
385
  Everything it creates carries a per-run id: a dataset named
370
386
  `<GCP_DATASET_PREFIX><run id>`, objects under `<GCS_PREFIX>/<run id>/`, and
@@ -436,15 +452,15 @@ export GCS_BUCKET=my-test-bucket GCS_PREFIX=adcp-reporting-validation
436
452
  npm run validate:reporting-gcp -- --yes
437
453
  ```
438
454
 
439
- Against a pull request branch (for example #3197), keep running the script from
455
+ Against a pull request branch (replace `<n>` with its number), keep running the script from
440
456
  `main` and point it at a second built checkout, so a branch cut before this
441
457
  script existed still works:
442
458
 
443
459
  ```bash
444
- git fetch origin pull/3197/head:pr-3197
445
- git worktree add ../adcp-client-pr-3197 pr-3197
446
- (cd ../adcp-client-pr-3197 && npm ci && npm run build)
447
- ADCP_SDK_ROOT=../adcp-client-pr-3197 npm run validate:reporting-gcp -- --yes
460
+ git fetch origin pull/<n>/head:pr-<n>
461
+ git worktree add ../adcp-client-pr-<n> pr-<n>
462
+ (cd ../adcp-client-pr-<n> && npm ci && npm run build)
463
+ ADCP_SDK_ROOT=../adcp-client-pr-<n> npm run validate:reporting-gcp -- --yes
448
464
  ```
449
465
 
450
466
  The same environment applies. The run ends with a `PASS`, `FAIL` and `INFO`
@@ -452,7 +468,7 @@ report and a markdown block (project and bucket names masked) to paste into
452
468
  the PR. The exit status is 0 with no `FAIL`, 1 with any `FAIL`, and 2 for a
453
469
  configuration problem or a missing `--yes`. Results of the overlap probes are
454
470
  `INFO` on purpose: on `main` expect the stale-run probe to report duplicates,
455
- and on PR #3197 expect it to report none.
471
+ and on a branch with the plan fence expect it to report none.
456
472
 
457
473
  `test/lib/reporting-gcp-validation-pg.test.js` drives the script's core against
458
474
  in-memory BigQuery and Storage doubles and a real PostgreSQL, so the logic,
@@ -0,0 +1,76 @@
1
+ # Reliable Reporting stability policy
2
+
3
+ The Reliable Reporting storage surface is **experimental**. It is new, it has not yet run in production at an adopter, and its shape is still being settled by real use. Marking it experimental lets breaking changes there ship in minor releases, with notice, instead of forcing a major release of the whole SDK.
4
+
5
+ This follows how the AdCP protocol treats experimental surfaces (`x-status: experimental` in the schemas, with advance notice of breaking changes).
6
+
7
+ ## What is experimental
8
+
9
+ An export is experimental when its TSDoc carries an `@experimental` tag that links to this page. Editors show the tag on hover, and some mark the symbol as unstable.
10
+
11
+ | Subpath | Status |
12
+ | ------------------------------ | --------------------------------------------------------------------------- |
13
+ | `@adcp/sdk/reporting/gcs` | Experimental (every export) |
14
+ | `@adcp/sdk/reporting/s3` | Experimental (every export) |
15
+ | `@adcp/sdk/reporting/azure` | Experimental (every export) |
16
+ | `@adcp/sdk/reporting/bigquery` | Experimental (every export) |
17
+ | `@adcp/sdk/reporting/ledger` | Partly experimental (see below) |
18
+ | `@adcp/sdk/reporting/service` | Partly experimental: retention, compaction and change-feed maintenance only |
19
+
20
+ Within `@adcp/sdk/reporting/ledger`, the experimental exports are:
21
+
22
+ - the PostgreSQL ledger store (`PostgresReportingLedgerStore`), its migrations and errors, and `sweepExpiredReportingLedgerState`;
23
+ - row storage (`ReportingRowStorageV1`, row bindings, row encoding, the row-storage migration and probe, and row-store errors) and object writes;
24
+ - the host change feed (`REPORTING_LEDGER_CHANGES_MIGRATION`, change records and cursors);
25
+ - managed delivery (the runtime, the store, the adapter contract, the adapter router and the PostgreSQL store);
26
+ - notification activity stores and checkpoints;
27
+ - the store, transaction, lease and row-read interfaces in `ledger/types`.
28
+
29
+ Within `@adcp/sdk/reporting/service`, the experimental exports are `ReportingRetentionOptionsV1`, `ReportingCompactionOptionsV1`, `ReportingChangeFeedMaintenanceOptionsV1`, `runReportingLedgerMaintenance` and the related maintenance types and error.
30
+
31
+ ### Not experimental
32
+
33
+ These follow normal semver. A breaking change to them ships in a major release.
34
+
35
+ - The protocol-facing handlers: `createReportingDeliveryHandler`, `createReportingStatusHandler`, `createSyncReportingStatusHandler`, `createSyncReportingReceiptsHandler`, and the status-ingest request and response schemas.
36
+ - `createReportingProducer`, `assertSupportedReportingAuthoritativeParty` and `UnsupportedReportingFeatureError`.
37
+ - The health, coverage, lifecycle, schedule and consumer-status-identity helpers in `@adcp/sdk/reporting/ledger`.
38
+ - `createReliableReportingService`, `createPostgresReliableReportingProductionService` and the service conformance runner in `@adcp/sdk/reporting/service`.
39
+ - `@adcp/sdk/reporting/consumer` (buyer reconciliation and worker) and `@adcp/sdk/reporting/source` (source contract and executor). They are separate subpaths with their own `V1` contract suffixes and are not covered by this policy.
40
+
41
+ If you are unsure about a symbol, read its TSDoc. An `@experimental` tag means it is covered. No tag means it is not.
42
+
43
+ ## What "experimental" means
44
+
45
+ - **Breaking changes may ship in minor releases.** That covers signatures, option names, stored field and column names, migrations, and defaults in the experimental exports.
46
+ - **Every such change is announced.** The changeset describes the break and includes a migration note, and the release notes carry it. Larger changes also get a `docs/migration-*.md` walkthrough.
47
+ - **The wire protocol is not affected.** Buyer-visible behavior these exports implement (reporting delivery, `revision_content_sha256`, status, receipts and so on) follows AdCP's own versioning, not this policy. A change to the SDK's storage layout does not change what a buyer sees.
48
+ - **Security and correctness fixes are not held back.** If a fix needs a breaking change, it ships in a minor.
49
+
50
+ ## How to pin
51
+
52
+ Adopters of the experimental subpaths should not use a caret range, which accepts every future minor.
53
+
54
+ ```json
55
+ {
56
+ "dependencies": {
57
+ "@adcp/sdk": "~16.0.0"
58
+ }
59
+ }
60
+ ```
61
+
62
+ - `~16.0.0` takes patches only (recommended).
63
+ - An exact version (`"16.0.0"`) is stricter still.
64
+ - Read the changelog before widening to a new minor, and apply any migration it names.
65
+
66
+ If you use only the stable surfaces, a caret range is fine as usual.
67
+
68
+ ## Migrations
69
+
70
+ Database migrations exported from experimental subpaths (`REPORTING_LEDGER_MIGRATION`, `REPORTING_ROW_STORAGE_MIGRATION` and the others) stay idempotent where practical, and a changeset says when you must re-apply one. See [Reliable Reporting production operations](REPORTING-OPERATIONS.md) and the [ledger guide](REPORTING-LEDGER.md).
71
+
72
+ ## When this will change
73
+
74
+ The surface is expected to stabilize after the first production adopter runs on SDK 16 stable. At that point the `@experimental` tags are removed in a minor release with a changelog note, and breaking changes need a major release from then on.
75
+
76
+ Related: [Seller reporting ledger](REPORTING-LEDGER.md), [Reliable Reporting production operations](REPORTING-OPERATIONS.md).
@@ -29,6 +29,101 @@ For buyer setup and opt-in lifecycle management, see
29
29
  For upgrading an existing integration, use the
30
30
  [14.0-to-14.1 checklist](../migration-14.0-to-14.1.md).
31
31
 
32
+ ### Account sync contracts
33
+
34
+ For platform `accounts.upsert`, the framework looks up accepted natural-key
35
+ entries with `provisioning: false` before calling the batch method. The optional
36
+ `ctx.existing` array is aligned with the entries passed to `upsert`; each element
37
+ is the pre-write account snapshot or `null`. All natural-key dimensions are
38
+ preserved, including brand countries, operator unit, currency, timezone and sandbox.
39
+ Natural-key snapshots require the resolved account's own brand and operator;
40
+ identity-free singleton resolvers supply no snapshot rather than matching every key.
41
+ Use these snapshots to update the existing ID instead of creating another account.
42
+ Snapshots are advisory: enforce uniqueness atomically in your own storage too.
43
+
44
+ The framework emits typed, server-side `accounts.onDiagnostic` events for
45
+ `ACCOUNT_SYNC_IDEMPOTENCY_VIOLATION`, `ACCOUNT_SYNC_PAYMENT_TERMS_MISMATCH`, and
46
+ `ACCOUNT_BILLING_FIELDS_MISSING`, plus `ACCOUNT_SYNC_BILLING_MISMATCH` when an
47
+ active result silently replaces requested agent billing with another party
48
+ (strict mode rejects it with `BILLING_NOT_SUPPORTED`). ID-only resolvers that reject natural-key
49
+ lookups remain usable and emit `ACCOUNT_SYNC_LOOKUP_UNSUPPORTED`; their
50
+ identity checks require store-level enforcement. Events contain only the code, tool and original
51
+ row index. Development logs also receive warnings. Callback exceptions do not
52
+ change the result of a committed write. The default behavior preserves existing
53
+ responses. Set `accounts.strictIdempotency: true` to return per-row failures for
54
+ changed IDs, `created` on an existing key, or an active account that omits or
55
+ changes requested terms (`PAYMENT_TERMS_NOT_SUPPORTED`). Identity violations
56
+ return `SERVICE_UNAVAILABLE`. These post-write checks cannot roll back adopter writes.
57
+
58
+ Missing sync billing/terms are filled only from a stored account whose ID matches
59
+ the result, never from the buyer's requested terms. Agent-billed list rows without
60
+ terms also emit a diagnostic. Low-level handler-bag overrides do not use this
61
+ platform-store guard.
62
+
63
+ ### Persistent keyed accounts
64
+
65
+ `createKeyedAccountStore` from `@adcp/sdk/server` supplies deterministic IDs and
66
+ additive, non-expiring account syncs. Choose `memoryKeyedAccountBackend()` for one
67
+ process, `pgKeyedAccountBackend(pool)` for PostgreSQL, or
68
+ `redisKeyedAccountBackend(client)` for a persistent Redis deployment with eviction
69
+ disabled. Custom KV backends can implement `KeyedAccountBackend` using native
70
+ atomic compare-and-swap; ordinary read followed by write is insufficient.
71
+
72
+ ```ts
73
+ import {
74
+ createKeyedAccountStore,
75
+ getKeyedAccountMigration,
76
+ pgKeyedAccountBackend,
77
+ } from '@adcp/sdk/server';
78
+
79
+ await pool.query(getKeyedAccountMigration());
80
+ const accounts = createKeyedAccountStore({
81
+ namespace: 'seller-production', // trusted deployment namespace
82
+ backend: pgKeyedAccountBackend(pool),
83
+ resolution: 'implicit',
84
+ buildAccount: async (entry, { accountId, existing, dryRun, ctx }) => {
85
+ // Your onboarding code accepts the requested terms or throws AdcpError.
86
+ // It must use accountId for idempotent upstream writes too.
87
+ return onboardAdvertiser(entry, { accountId, existing, dryRun, authInfo: ctx?.authInfo });
88
+ },
89
+ });
90
+ ```
91
+
92
+ `buildAccount` is required and returns the actual account, using the supplied
93
+ `accountId`. The store validates active payment terms before committing; a
94
+ rejected update leaves the stored account intact. It strips `authInfo` before
95
+ persistence; credentials must also stay out of `ctx_metadata`. By default the
96
+ store partitions accounts by stable OAuth client, API key ID or verified agent
97
+ URL. Override `principalKey` only with a trusted authorization partition, never
98
+ buyer-supplied request fields. Use distinct namespaces for different sellers.
99
+
100
+ Concurrent writes retry atomic CAS up to ten times, re-running `buildAccount`
101
+ against fresh state. Its external side effects must therefore be idempotent on
102
+ the supplied account ID. A crash between an upstream write and the local CAS
103
+ still requires that upstream idempotency. The backend stores one roster per
104
+ principal with a default `maxAccounts` limit of 1000 and suits modest rosters; large sellers should use indexed account
105
+ tables with unique natural-key constraints. Share the memory backend across
106
+ server factories; use persistent storage across restarts.
107
+
108
+ Dry runs do not persist; `buildAccount` receives `dryRun: true` and must preview
109
+ without upstream writes or other side effects. Only the seller-returned account
110
+ determines sandbox authority; the buyer's sandbox flag participates in identity
111
+ and never grants test-tool access. Settings updates cannot provision a missing natural-key
112
+ account. `delete_missing` and operator identity reconciliation are explicitly
113
+ unsupported; close accounts through your lifecycle code. List cursors are bound
114
+ to the principal, filters and roster revision and become stale after a write.
115
+ An unknown ID-keyed entry rejects the batch before any `buildAccount` callback:
116
+ this interface requires brand/operator on failed rows, and unauthorized account
117
+ identities must not be invented or exposed. Failed known-account updates retain
118
+ the account's actual status and leave persisted state intact.
119
+
120
+ Run [the account sync storyboard](../../examples/storyboards/account-sync-contract.yaml)
121
+ with one authenticated sandbox caller. Its `account.sync_contract` invariant
122
+ checks repeat syncs with fresh request keys, exact accepted terms and billing
123
+ fields on list rows. The fixture is SDK-authored; canonical protocol storyboards
124
+ remain unchanged. A seller rejecting the fixture's terms needs an accepted-terms
125
+ fixture to exercise successful repeat provisioning.
126
+
32
127
  Account resolvers receive `ctx.provisioning`. It is false on discovery and
33
128
  negotiation (`get_products`, `list_products`, `get_signals`, and proposal
34
129
  request/refine/decline); these tasks MUST use lookup only. It is true on spend
@@ -623,3 +718,9 @@ const accounts = {
623
718
  **Hand-rolled stores.** For stores that don't use `createRosterAccountStore`,
624
719
  handle `resolve(undefined, ctx)` in your own `resolve` implementation by
625
720
  checking `ref === undefined` before the id-arm branch.
721
+
722
+ ### Callback boundaries
723
+
724
+ A custom `principalKey` may be synchronous or asynchronous, and must return a nonempty primitive string derived from trusted authentication state. Missing, object, numeric, boolean, or blank values fail closed before backend access. Use a stable tenant identity, keep it deterministic across repeated calls in one request, and bound callback I/O durations.
725
+
726
+ `createKeyedAccountStore` captures dry-run intent before callbacks and gives each CAS retry fresh copies of sync entries and request input. Mutating callback request arguments cannot change the original request or turn a preview into a committed write. Framework commercial checks also retain an independent request snapshot. Async diagnostic hooks are fire-and-forget; their failures are isolated from dispatch.
package/docs/llms.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  # Ad Context Protocol (AdCP)
2
2
 
3
- > Generated at: 2026-10-14
4
- > Library: @adcp/sdk v15.9.1
3
+ > Generated at: 2026-10-15
4
+ > Library: @adcp/sdk v16.0.0-beta.2
5
5
  > AdCP major version: 3
6
6
  > Canonical URL: https://adcontextprotocol.github.io/adcp-client/llms.txt
7
7
  > Note: the `Library` stamp reflects the package.json version at doc-generation time. The narrative below describes the surface that lands on the next-published minor — including any 6.7 helpers documented here ahead of the release tag.
@@ -2143,6 +2143,7 @@ These docs are available locally in the repo and hosted at https://adcontextprot
2143
2143
  | Reporting ledger cutover from custom tables | docs/guides/REPORTING-LEDGER-CUTOVER.md | [link](https://adcontextprotocol.github.io/adcp-client/guides/REPORTING-LEDGER-CUTOVER.md) |
2144
2144
  | Buyer reporting reconciliation | docs/guides/REPORTING-RECONCILIATION.md | [link](https://adcontextprotocol.github.io/adcp-client/guides/REPORTING-RECONCILIATION.md) |
2145
2145
  | Reliable Reporting production operations | docs/guides/REPORTING-OPERATIONS.md | [link](https://adcontextprotocol.github.io/adcp-client/guides/REPORTING-OPERATIONS.md) |
2146
+ | Reliable Reporting stability policy (experimental storage subpaths) | docs/guides/REPORTING-STABILITY.md | [link](https://adcontextprotocol.github.io/adcp-client/guides/REPORTING-STABILITY.md) |
2146
2147
  | Validate your agent (5-command checklist) | docs/guides/VALIDATE-YOUR-AGENT.md | [link](https://adcontextprotocol.github.io/adcp-client/guides/VALIDATE-YOUR-AGENT.md) |
2147
2148
  | Async patterns (polling, webhooks, deferred) | docs/guides/ASYNC-DEVELOPER-GUIDE.md | [link](https://adcontextprotocol.github.io/adcp-client/guides/ASYNC-DEVELOPER-GUIDE.md) |
2148
2149
  | Async API reference | docs/guides/ASYNC-API-REFERENCE.md | [link](https://adcontextprotocol.github.io/adcp-client/guides/ASYNC-API-REFERENCE.md) |
@@ -400,6 +400,21 @@ resolve. An `AgentClient` given a resolver rebuilt from these routes applies
400
400
  that rewrite in another process, as it does after its own discovery. Routes
401
401
  without `seller_declared` leave canonical writes unchanged.
402
402
 
403
+ A buyer that stored the seller's raw `get_products` product, and projects it
404
+ again in a process that never ran discovery, can record the same origin by
405
+ passing that stored product: `legacyRoutesForProduct(productId,
406
+ projected.format_options, { sellerProduct: storedProduct })`. An option is then
407
+ seller-declared exactly when the stored product's own `format_options[]` names
408
+ it, which is the rule the SDK applies after its own discovery.
409
+
410
+ The client reads that origin from the resolver function that
411
+ `canonicalFormatLegacyResolverFromRoutes()` returns. A resolver you build around
412
+ it, for example one that tries the stored routes and then another source, is a
413
+ different function and carries no origin unless you pass it through
414
+ `carryFormatOptionOrigins(composedResolver, routesResolver)`.
415
+ `canonicalFormatLegacyResolverFromCatalogSnapshots(snapshots, fallback)` already
416
+ carries its fallback's origin.
417
+
403
418
  Compatibility consumers that must retain top-level `format_ids[]` while
404
419
  publishing URL-free canonical declarations can use the additive projection:
405
420
 
@@ -11,8 +11,8 @@ below as the publication/deployment gate.
11
11
 
12
12
  | Fact | Value |
13
13
  | --- | --- |
14
- | Exact npm package | `@adcp/sdk@15.9.1` |
15
- | npm integrity | registry-derived after publication; run `npm view @adcp/sdk@15.9.1 dist.integrity` |
14
+ | Exact npm package | `@adcp/sdk@16.0.0-beta.2` |
15
+ | npm integrity | registry-derived after publication; run `npm view @adcp/sdk@16.0.0-beta.2 dist.integrity` |
16
16
  | Node.js runtime | `^20.19.0 || >=22.12.0` |
17
17
  | Default AdCP wire release | `3.2.4` |
18
18
  | Maintained wire releases | `v2.5`, `v2.6`, `v3`, `3.0.0`, `3.0`, `3.0.1`, `3.0.2`, `3.0.3`, `3.0.4`, `3.0.5`, `3.0.6`, `3.0.7`, `3.0.8`, `3.0.9`, `3.0.10`, `3.0.11`, `3.0.12`, `3.0.13`, `3.0.14`, `3.0.15`, `3.0.16`, `3.0.17`, `3.0.18`, `3.0.19`, `3.0.20`, `3.0.21`, `3.0.22`, `3.0.23`, `3.0.24`, `3.0.25`, `3.1.0`, `3.1`, `3.1.1`, `3.1.2`, `3.1.3`, `3.1.4`, `3.1.5`, `3.1.6`, `3.1.7`, `3.1.8`, `3.1.9`, `3.1.10`, `3.1.11`, `3.1.12`, `3.1.13`, `3.1.14`, `3.1.15`, `3.1.16`, `3.1.17`, `3.1.18`, `3.1.19`, `3.1.20`, `3.1.21`, `3.1.22`, `3.1.23`, `3.1.24`, `3.2.1`, `3.2`, `3.2.2`, `3.2.3`, `3.2.4` |
@@ -21,8 +21,8 @@ below as the publication/deployment gate.
21
21
  Install exact production inputs rather than a moving range or dist-tag:
22
22
 
23
23
  ```bash
24
- npm install --save-exact '@adcp/sdk@15.9.1'
25
- npm view '@adcp/sdk@15.9.1' dist.integrity
24
+ npm install --save-exact '@adcp/sdk@16.0.0-beta.2'
25
+ npm view '@adcp/sdk@16.0.0-beta.2' dist.integrity
26
26
  ```
27
27
 
28
28
  ### Required and optional peers