@adcp/sdk 16.0.0-beta.9 → 16.0.0

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 (34) hide show
  1. package/README.md +2 -2
  2. package/dist/lib/identity-3.3/revocation.js +6 -7
  3. package/dist/lib/identity-3.3/revocation.mjs +6 -7
  4. package/dist/lib/server/create-adcp-server.js +1 -1
  5. package/dist/lib/server/create-adcp-server.mjs +1 -1
  6. package/dist/lib/signing/crypto.d.mts +1 -1
  7. package/dist/lib/signing/crypto.d.ts +1 -1
  8. package/dist/lib/signing/crypto.js +2 -45
  9. package/dist/lib/signing/crypto.mjs +2 -46
  10. package/dist/lib/signing/web-bot-auth.d.mts +18 -10
  11. package/dist/lib/signing/web-bot-auth.d.ts +18 -10
  12. package/dist/lib/signing/web-bot-auth.js +29 -24
  13. package/dist/lib/signing/web-bot-auth.mjs +29 -24
  14. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  15. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  16. package/dist/lib/v2/projection/catalog.d.mts +4 -0
  17. package/dist/lib/v2/projection/catalog.d.ts +4 -0
  18. package/dist/lib/v2/projection/creative-delivery.d.mts +15 -9
  19. package/dist/lib/v2/projection/creative-delivery.d.ts +15 -9
  20. package/dist/lib/v2/projection/creative-delivery.js +71 -10
  21. package/dist/lib/v2/projection/creative-delivery.mjs +71 -10
  22. package/dist/lib/version.d.mts +3 -3
  23. package/dist/lib/version.d.ts +3 -3
  24. package/dist/lib/version.js +3 -3
  25. package/dist/lib/version.mjs +3 -3
  26. package/docs/TYPE-SUMMARY.md +1 -1
  27. package/docs/guides/CREATIVE-DELIVERY.md +18 -1
  28. package/docs/guides/REPORTING-STABILITY.md +7 -7
  29. package/docs/llms.txt +2 -2
  30. package/docs/migration-14.x-rc-worksheet.md +4 -4
  31. package/docs/migration-agent-identity-3.3.md +44 -19
  32. package/docs/migration-reporting-storage-package.md +3 -3
  33. package/docs/releases/16.0.0.md +20 -0
  34. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * AdCP SDK library version
3
3
  */
4
- export declare const LIBRARY_VERSION = "16.0.0-beta.9";
4
+ export declare const LIBRARY_VERSION = "16.0.0";
5
5
  /**
6
6
  * AdCP specification version this library is built for
7
7
  */
@@ -33,10 +33,10 @@ export type AdcpVersion = (typeof COMPATIBLE_ADCP_VERSIONS)[number];
33
33
  * Full version information
34
34
  */
35
35
  export declare const VERSION_INFO: {
36
- readonly library: "16.0.0-beta.9";
36
+ readonly library: "16.0.0";
37
37
  readonly adcp: "3.2.5";
38
38
  readonly compatibleVersions: readonly ["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.1.25", "3.1.26", "3.1.27", "3.1.28", "3.1.29", "3.2.1", "3.2", "3.2.2", "3.2.3", "3.2.4", "3.2.5"];
39
- readonly generatedAt: "2026-10-19T19:41:05.601Z";
39
+ readonly generatedAt: "2026-10-19T23:27:30.750Z";
40
40
  };
41
41
  /**
42
42
  * Get the AdCP specification version this library is built for
@@ -31,7 +31,7 @@ __export(version_exports, {
31
31
  toReleasePrecisionVersion: () => toReleasePrecisionVersion
32
32
  });
33
33
  module.exports = __toCommonJS(version_exports);
34
- const LIBRARY_VERSION = "16.0.0-beta.9";
34
+ const LIBRARY_VERSION = "16.0.0";
35
35
  const ADCP_VERSION = "3.2.5";
36
36
  const ADCP_MAJOR_VERSION = 3;
37
37
  const COMPATIBLE_ADCP_VERSIONS = [
@@ -102,10 +102,10 @@ const COMPATIBLE_ADCP_VERSIONS = [
102
102
  "3.2.5"
103
103
  ];
104
104
  const VERSION_INFO = {
105
- library: "16.0.0-beta.9",
105
+ library: "16.0.0",
106
106
  adcp: "3.2.5",
107
107
  compatibleVersions: COMPATIBLE_ADCP_VERSIONS,
108
- generatedAt: "2026-10-19T19:41:05.601Z"
108
+ generatedAt: "2026-10-19T23:27:30.750Z"
109
109
  };
110
110
  function getAdcpVersion() {
111
111
  return ADCP_VERSION;
@@ -1,4 +1,4 @@
1
- const LIBRARY_VERSION = "16.0.0-beta.9";
1
+ const LIBRARY_VERSION = "16.0.0";
2
2
  const ADCP_VERSION = "3.2.5";
3
3
  const ADCP_MAJOR_VERSION = 3;
4
4
  const COMPATIBLE_ADCP_VERSIONS = [
@@ -69,10 +69,10 @@ const COMPATIBLE_ADCP_VERSIONS = [
69
69
  "3.2.5"
70
70
  ];
71
71
  const VERSION_INFO = {
72
- library: "16.0.0-beta.9",
72
+ library: "16.0.0",
73
73
  adcp: "3.2.5",
74
74
  compatibleVersions: COMPATIBLE_ADCP_VERSIONS,
75
- generatedAt: "2026-10-19T19:41:05.601Z"
75
+ generatedAt: "2026-10-19T23:27:30.750Z"
76
76
  };
77
77
  function getAdcpVersion() {
78
78
  return ADCP_VERSION;
@@ -1,7 +1,7 @@
1
1
  # AdCP Type Summary
2
2
 
3
3
  > Generated at: 2026-10-19
4
- > @adcp/sdk v16.0.0-beta.9
4
+ > @adcp/sdk v16.0.0
5
5
 
6
6
  Curated reference of the types that matter for using the AdCP client. For full generated types see `src/lib/types/tools.generated.ts` and `src/lib/types/core.generated.ts`.
7
7
 
@@ -124,7 +124,24 @@ await agent.syncCreatives(
124
124
  The same pure functions are available from the explicit
125
125
  `@adcp/sdk/v2/projection` migration subpath for composition outside a client call:
126
126
  `projectCreativeForDelivery()`, `projectMediaBuyCreativesForDelivery()`, and
127
- `projectSyncCreativesForDelivery()`. Capability resolution uses the client's
127
+ `projectSyncCreativesForDelivery()`.
128
+
129
+ When these helpers emit a legacy `format_id`, they also map assets to the
130
+ definition's `asset_id` keys. Definitions come from the bundled reference
131
+ catalog, or from an optional final `legacyFormatDefinitions` array supplied to
132
+ any of the three helpers. Caller definitions take precedence and must match
133
+ both the format agent URL and ID. No network lookup occurs during projection.
134
+
135
+ Existing declared asset keys keep their values. Other assets move only to one
136
+ unoccupied slot with the same `asset_type`; URL assets must also match
137
+ `requirements.url_type`, and pixel trackers must match the slot's `event`.
138
+ Custom tracker events also match `custom_event_name`. Definitions containing
139
+ repeatable groups retain all asset keys; projection does not infer group membership.
140
+ Unmatched assets, ambiguous matches, and assets competing for the same slot
141
+ keep their original keys. Unknown definitions leave assets unchanged. Canonical
142
+ delivery retains its asset keys, and projection never mutates the caller's data.
143
+
144
+ Capability resolution uses the client's
128
145
  emitted wire release pin: AdCP 3.2+ is canonical by contract, 3.0 is legacy, and 3.1
129
146
  checks the explicit `media_buy.features.canonical_creatives` declaration. A
130
147
  3.1 peer without the feature is deliberately
@@ -44,7 +44,7 @@ If you are unsure about a symbol, read its TSDoc. An `@experimental` tag means i
44
44
 
45
45
  ## How the two packages line up
46
46
 
47
- `@adcp/reporting-storage` declares `@adcp/sdk` as a **peer dependency** (`^16.0.0-beta.0` while SDK 16 is in beta), not a dependency. The store, its errors and the handlers share types and symbol-keyed guards, so the host must hold one copy of `@adcp/sdk`. A change to a storage interface in the SDK ships with a matching storage release; the changeset for each says which pair to install. The cloud SDKs (`@aws-sdk/client-s3`, `@azure/storage-blob`, `@google-cloud/storage`) are optional peers of the storage package. `@adcp/sdk` does not import `@adcp/reporting-storage`, and a test and a lint rule keep it that way.
47
+ `@adcp/reporting-storage` declares `@adcp/sdk` as a **peer dependency** (`^16.0.0` for SDK 16), not a dependency. The store, its errors and the handlers share types and symbol-keyed guards, so the host must hold one copy of `@adcp/sdk`. A change to a storage interface in the SDK ships with a matching storage release; the changeset for each says which pair to install. The cloud SDKs (`@aws-sdk/client-s3`, `@azure/storage-blob`, `@google-cloud/storage`) are optional peers of the storage package. `@adcp/sdk` does not import `@adcp/reporting-storage`, and a test and a lint rule keep it that way.
48
48
 
49
49
  ## How to pin
50
50
 
@@ -53,19 +53,19 @@ Pin the storage package with a tilde range. A caret range on a `0.x` version alr
53
53
  ```json
54
54
  {
55
55
  "dependencies": {
56
- "@adcp/sdk": "^16.0.0-beta.0",
57
- "@adcp/reporting-storage": "~0.1.0-beta.0"
56
+ "@adcp/sdk": "^16.0.0",
57
+ "@adcp/reporting-storage": "~0.1.0"
58
58
  }
59
59
  }
60
60
  ```
61
61
 
62
- Those are the beta pins. A prerelease range such as `~0.1.0` does not match `0.1.0-beta.0`, so use the `-beta.0` form until stable releases exist, then move to `^16.0.0` and `~0.1.0`.
62
+ These pins select SDK 16 and storage 0.1 stable versions. A stable range such as `~0.1.0` does not match `0.1.0-beta.0`; migrate both packages from their beta pins together.
63
63
 
64
- - `~0.1.0` (after the first stable release) takes patches only (recommended).
65
- - An exact version (`"0.1.0-beta.0"`) is stricter still.
64
+ - `~0.1.0` takes patches only (recommended).
65
+ - An exact version (`"0.1.0"`) is stricter still.
66
66
  - Read the changelog before widening to a new minor, and apply any migration it names.
67
67
 
68
- `@adcp/sdk` itself can use a caret range as usual, because the SDK's own surface follows semver. While SDK 16 is in beta, install both packages with the `beta` dist-tag (`npm install @adcp/sdk@beta @adcp/reporting-storage@beta`) until stable releases exist.
68
+ `@adcp/sdk` itself can use a caret range as usual, because the SDK's own surface follows semver. Install the stable pair with `npm install @adcp/sdk@^16.0.0 @adcp/reporting-storage@~0.1.0`. The storage API remains experimental under the policy above.
69
69
 
70
70
  ## Migrations
71
71
 
package/docs/llms.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  # Ad Context Protocol (AdCP)
2
2
 
3
3
  > Generated at: 2026-10-19
4
- > Library: @adcp/sdk v16.0.0-beta.9
4
+ > Library: @adcp/sdk v16.0.0
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.
@@ -13,7 +13,7 @@ AdCP is an open protocol for AI agents to buy, manage, and optimize advertising
13
13
 
14
14
  ## Start here: AdCP 3.2
15
15
 
16
- The SDK requires Node.js `^20.19.0 || >=22.12.0`. Install this reference's release train with `npm install @adcp/sdk@beta`; use the documentation from the exact published SDK version you install. For reproducible CLI runs, pin that exact SDK version. After installation, `node -p "require('@adcp/sdk').ADCP_VERSION"` reports its protocol pin; `ls node_modules/@adcp/sdk/compliance/cache` lists its packaged compliance versions. The legacy `adcp-3.2` npm tag selects SDK 14 and does not receive the refreshed compliance caches.
16
+ The SDK requires Node.js `^20.19.0 || >=22.12.0`. Install this reference's release train with `npm install @adcp/sdk@16.0`; use the documentation from the exact published SDK version you install. For reproducible CLI runs, pin that exact SDK version. After installation, `node -p "require('@adcp/sdk').ADCP_VERSION"` reports its protocol pin; `ls node_modules/@adcp/sdk/compliance/cache` lists its packaged compliance versions. The legacy `adcp-3.2` npm tag selects SDK 14 and does not receive the refreshed compliance caches.
17
17
 
18
18
  The SDK is compact-lifecycle first: `list_products → buy_products → control_media_buy`, with `request_proposals → refine_proposals → accept_proposal` when terms need negotiation.
19
19
 
@@ -16,8 +16,8 @@ pin using `ADCP_VERSION` inside that tarball.
16
16
 
17
17
  | Fact | Value |
18
18
  | --- | --- |
19
- | Checkout `package.json` version | `@adcp/sdk@16.0.0-beta.9` |
20
- | npm integrity | registry-derived after publication; run `npm view @adcp/sdk@16.0.0-beta.9 dist.integrity` |
19
+ | Checkout `package.json` version | `@adcp/sdk@16.0.0` |
20
+ | npm integrity | registry-derived after publication; run `npm view @adcp/sdk@16.0.0 dist.integrity` |
21
21
  | Node.js runtime | `^20.19.0 || >=22.12.0` |
22
22
  | Default AdCP wire release | `3.2.5` |
23
23
  | Maintained wire releases | `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.1.25`, `3.1.26`, `3.1.27`, `3.1.28`, `3.1.29`, `3.2.1`, `3.2`, `3.2.2`, `3.2.3`, `3.2.4`, `3.2.5` |
@@ -26,8 +26,8 @@ pin using `ADCP_VERSION` inside that tarball.
26
26
  For a checkout at the published release commit, install the exact package version:
27
27
 
28
28
  ```bash
29
- npm install --save-exact '@adcp/sdk@16.0.0-beta.9'
30
- npm view '@adcp/sdk@16.0.0-beta.9' dist.integrity
29
+ npm install --save-exact '@adcp/sdk@16.0.0'
30
+ npm view '@adcp/sdk@16.0.0' dist.integrity
31
31
  ```
32
32
 
33
33
  ### Required and optional peers
@@ -3,7 +3,7 @@
3
3
  The experimental identity rollout is tracked in
4
4
  [adcp-client#3233](https://github.com/adcontextprotocol/adcp-client/issues/3233).
5
5
  This release implements the rollout behind explicit experimental configuration.
6
- The SDK's default `ADCP_VERSION` remains **3.2.4**. Experimental client/server
6
+ The SDK's default `ADCP_VERSION` remains **3.2.5**. Experimental client/server
7
7
  instances select the 3.3 carrier and apply the pinned draft overlays to the
8
8
  released bundle; they do not regenerate or replace the public 3.2 types.
9
9
  Upstream PRs remain open, so the experiment can change before graduation.
@@ -126,18 +126,42 @@ final UTF-8 body, covers the selected `Signature-Agent` member and digest,
126
126
  uses a fresh 64-byte nonce, and refuses automatic HTTP redirects. A request
127
127
  carries exactly one `web-bot-auth` signature and one `Signature-Agent` member:
128
128
  relays were removed from the profile, `signWebBotAuth` throws on `relay: true`
129
- and on a request that already carries signature fields, and the verifier
130
- answers a second signature (of any profile) or a second `Signature-Agent`
131
- member with 403. Signing keys are Ed25519 or RSA-PSS-SHA512 (2048 to 4096
132
- bits, e = 65537); ES256 stays on the AdCP RFC 9421 profile, and
129
+ and on a request that already carries signature fields. The verifier reads
130
+ only the `Signature-Input` member tagged `web-bot-auth` and ignores members
131
+ with other tags, such as a CDN's own signature. It answers a second
132
+ `web-bot-auth` signature or a second `Signature-Agent` member with 403.
133
+ Signing keys are Ed25519 only; ES256 stays on the AdCP RFC 9421 profile, and
133
134
  `createWebBotAuthFetch`, `createWebhookEmitter` and `createAdcpServer` refuse
134
- a P-256 Web Bot Auth key at wire-up.
135
+ a P-256 or RSA Web Bot Auth key at wire-up.
136
+
137
+ This also changes two helpers outside the experiment. `verifySignature` and
138
+ `verifySignatureAsync`, which `@adcp/sdk/signing/server` exports, no longer
139
+ verify `rsa-pss-sha512`: they return `false` for it, as for any algorithm they
140
+ don't support. Only Web Bot Auth used it, and the AdCP RFC 9421 profile allows
141
+ only `ed25519` and `ecdsa-p256-sha256`. A caller that verifies RSA-PSS
142
+ signatures with these helpers needs to verify them with `node:crypto` or
143
+ WebCrypto instead.
144
+
145
+ The covered `Signature-Agent` member must be exactly the canonical https origin
146
+ string, compared as received: a lowercase host, no default port, and no path
147
+ (not even `/`), query, fragment, or userinfo. Any other value, including an
148
+ `http://` origin, is a 403 before any directory fetch. The signers apply the
149
+ same rule: `signWebBotAuth`, `createSignedSignatureDirectory` and
150
+ `createWebBotAuthFetch` canonicalize the agent origin they are given and throw a
151
+ `TypeError` when it is not https, such as `http://localhost:3000`. There is no
152
+ http opt-in. The member's `type`
153
+ parameter is a Token (WBA section 5.2.1), and the verifier accepts
154
+ `type=directory` as a Token or as a String. It ignores a member of any other
155
+ type, which leaves no member to resolve (403).
135
156
 
136
157
  `SignatureDirectoryResolver` derives the directory from the covered canonical
137
158
  origin. Directories must be signed (WBA Appendix B.1): it validates a
138
- possession signature for every key, covering `"@authority";req` and
139
- `content-digest`, and the exact body digest before caching keys. An unsigned
140
- directory is a discovery failure. Its audit proof retains the signed body and
159
+ possession signature for every key the profile can use, covering
160
+ `"@authority";req` and `content-digest`, and the exact body digest before
161
+ caching keys. It ignores keys the profile cannot use, such as a P-256 key, and
162
+ any signature they made (RFC 7517 section 5). An unsigned directory, one
163
+ with no usable key, or one that publishes private key material for any key,
164
+ usable or not, is a discovery failure. Its audit proof retains the signed body and
141
165
  headers. Verification requires this resolver so context-free JWKS adapters cannot
142
166
  attribute a key to an arbitrary origin. Discovery uses HTTPS, DNS pinning, no redirects, a 256 KiB cap, a
143
167
  5-second connect bound and 10-second total bound, at most 64 keys, and bounded
@@ -155,8 +179,7 @@ Serve the exact JWS at `/.well-known/governance-revocations.json` and refresh it
155
179
  before `next_update` (the command defaults to five minutes). Pass `--snapshot`
156
180
  to sign a list of revoked key thumbprints and optional reasons/dates.
157
181
  `createSignedOriginRevocationList` provides the same authoring API. The SDK
158
- signs and verifies revocation lists with directory keys: EdDSA for Ed25519 keys
159
- and PS512 for RSA keys (a P-256 key cannot be published in a key directory). Observed key revocations are permanent;
182
+ signs and verifies revocation lists with Ed25519 directory keys, as EdDSA. Observed key revocations are permanent;
160
183
  refresh failures use the last verified list only within the published grace
161
184
  window. Staleness follows the list's signed `next_update`, never the polling
162
185
  interval: the verifier re-polls at least every polling interval (at most 30
@@ -379,7 +402,7 @@ released schemas:
379
402
 
380
403
  | PR | Pinned head | Surface |
381
404
  | --- | --- | --- |
382
- | [7894](https://github.com/adcontextprotocol/adcp/pull/7894) | `e24eeb090c4365707641099cbbb45f9945c6d6e0` | WBA wire profile (`wba-profile.mdx`), profile selectors, directory and request vectors |
405
+ | [7894](https://github.com/adcontextprotocol/adcp/pull/7894) | `e59294701d733b0ea2a004a2f0c091c8eccdcaae` | WBA wire profile (`wba-profile.mdx`), profile selectors, directory and request vectors |
383
406
  | [8121](https://github.com/adcontextprotocol/adcp/pull/8121) | `f5973ac0267b1b94d714c55fc4e3ad8fc2511350` | Origin identity and key-free trust v1 |
384
407
  | [8162](https://github.com/adcontextprotocol/adcp/pull/8162) | `5c9914c5c382cc32f3d2ad7842942e548c414705` | Ratified identity, coexistence, revocation |
385
408
  | [8168](https://github.com/adcontextprotocol/adcp/pull/8168) | `45540941dfd61e80ab8a463f780cb147c82a32f0` | Relationship and principal response arms |
@@ -388,7 +411,9 @@ released schemas:
388
411
  | [8177](https://github.com/adcontextprotocol/adcp/pull/8177) | `b663f8e4235fe4276c73fb9bac6db491b2252bbf` | Reporting authentication omission |
389
412
 
390
413
  The vectors in `test/fixtures/wba-profile/` are byte-identical to #7894 at that
391
- head and are all graded except the governance-token vectors (see `PINNED.json`).
414
+ head (see `PINNED.json`). Every vendored request and directory vector is
415
+ graded, and the interop harness (adcontextprotocol/adcp#8298) grades
416
+ `scenarios.json`.
392
417
 
393
418
  Verification runs in Cloudflare's `http-message-sig` (signature base, coverage,
394
419
  window, algorithm and cryptographic checks); the SDK adds the profile rules in
@@ -413,7 +438,7 @@ so verification can run in a CDN or middleware in front of the AdCP server.
413
438
  reason is logged, never sent. A 429 for local load shedding (directory fetch
414
439
  limiter, replay-store `rate_abuse`) carries `Retry-After` instead.
415
440
  - Every signed request carries `created`, `expires` (at most 300 seconds
416
- later), `keyid`, `alg` (`ed25519` or `rsa-pss-sha512`) and a `nonce` of 64
441
+ later), `keyid`, `alg` (`ed25519`) and a `nonce` of 64
417
442
  bytes, unpadded Base64URL or canonical padded Base64 (Cloudflare's default).
418
443
  The former 16-byte floor is gone: a shorter nonce is a 403. Replay state is
419
444
  keyed on the nonce bytes, so the two encodings of one nonce collide.
@@ -454,14 +479,14 @@ so verification can run in a CDN or middleware in front of the AdCP server.
454
479
  back off on 429 or 503.
455
480
  - `@target-uri` and `@authority` are taken from the target URI as received
456
481
  (RFC 9421 §2.2.2), never canonicalized; canonical origins identify the signer
457
- only. Ed25519 and RSA-PSS-SHA512 keys are supported; RSA-PSS uses WebCrypto
458
- where the runtime has it, so it also works on Cloudflare workerd.
482
+ only. Web Bot Auth is Ed25519 only, and it also works on Cloudflare workerd.
459
483
  `test/fixtures/wba-interop/` holds fixtures verified in both directions against
460
484
  Cloudflare's `web-bot-auth`; they already used signed directories and are
461
485
  unchanged.
462
- The #7894 governance-token vectors are vendored but not graded: ratified R4
463
- keeps the RFC 9421 discovery chain for governance through 3.3, and the profile
464
- page leaves document signing to a separate decision. `PINNED.json` records this.
486
+ #7894 drops the governance-token checks and the `governance/` vectors from the
487
+ WBA profile. Governance moves to the AdCP layer under a separate R4 erratum,
488
+ which moves JWS artifacts, governance included, to the identity's WBA key
489
+ directory in 3.3. This change leaves the SDK's governance code as it is.
465
490
  The buyer default onboarding field is `profiles.adcp.onboarding`, matching the
466
491
  schema; the design's `record_profiles` wording names the schema definition.
467
492
 
@@ -1,6 +1,6 @@
1
1
  # Reliable Reporting storage moved to `@adcp/reporting-storage`
2
2
 
3
- **Applies to:** SDK 16 beta. **Kind:** breaking, by design. There are no re-export shims: the moved subpaths are gone from `@adcp/sdk`.
3
+ **Applies to:** SDK 16. **Kind:** breaking, by design. There are no re-export shims: the moved subpaths are gone from `@adcp/sdk`.
4
4
 
5
5
  The Reliable Reporting storage implementations now ship as their own package, `@adcp/reporting-storage`, on its own version line. `@adcp/sdk` keeps the protocol layer. If you import anything from `@adcp/sdk/reporting/gcs`, `/s3`, `/azure` or `/bigquery`, or the PostgreSQL store, row storage, managed delivery or notification activity from `@adcp/sdk/reporting/ledger`, or `createPostgresReliableReportingProductionService` from `@adcp/sdk/reporting/service`, change those imports. Nothing else changes on the wire, in the database schema, or in the ledger's behavior.
6
6
 
@@ -11,10 +11,10 @@ Why: storage keeps its own release cadence, as Auth.js, LangGraph and OpenTeleme
11
11
  1. Install the package next to the SDK. `@adcp/sdk` is a peer dependency of it, so the host keeps exactly one copy:
12
12
 
13
13
  ```bash
14
- npm install @adcp/sdk@beta @adcp/reporting-storage@beta
14
+ npm install @adcp/sdk@^16.0.0 @adcp/reporting-storage@~0.1.0
15
15
  ```
16
16
 
17
- Pin the storage package with `~` (`"@adcp/reporting-storage": "~0.1.0-beta.0"` while SDK 16 is in beta, `"~0.1.0"` after a stable release; a prerelease version is not matched by `~0.1.0`): it is pre-1.0 and every export is experimental. The cloud SDKs are optional peers of the new package, not of `@adcp/sdk` any more, so keep `@aws-sdk/client-s3`, `@azure/storage-blob` and `@google-cloud/storage` in your own dependencies for the providers you use.
17
+ Pin the storage package with `~` (`"@adcp/reporting-storage": "~0.1.0"`; this stable range does not match the earlier `0.1.0-beta.0` prerelease): it is pre-1.0 and every export is experimental. The cloud SDKs are optional peers of the new package, not of `@adcp/sdk` any more, so keep `@aws-sdk/client-s3`, `@azure/storage-blob` and `@google-cloud/storage` in your own dependencies for the providers you use.
18
18
 
19
19
  2. Change the imports using the table below, then run `tsc --noEmit`. A moved name on `@adcp/sdk/reporting/ledger` or `/service` is `TS2305: Module '"@adcp/sdk/reporting/ledger"' has no exported member 'PostgresReportingLedgerStore'`; a deleted subpath is `TS2307: Cannot find module '@adcp/sdk/reporting/gcs'`. At runtime the deleted subpaths fail with `ERR_PACKAGE_PATH_NOT_EXPORTED`, and a stale CommonJS `require` of a moved name on a kept subpath destructures to `undefined` and fails later as `X is not a constructor`, so grep JavaScript too (see [Self-grade](#self-grade)).
20
20
 
@@ -0,0 +1,20 @@
1
+ # SDK 16.0.0
2
+
3
+ SDK 16 is the stable AdCP 3.2 release line. Its default protocol pin is **3.2.5**, with maintained AdCP 3.0 and 3.1 compatibility. Install it with `npm install @adcp/sdk@^16.0.0`.
4
+
5
+ ## Upgrade from SDK 15
6
+
7
+ - **AdCP 2 support is removed.** Sellers must support AdCP 3 capability discovery. Retired adapters, types, schema bundles and `allowV2` configuration are removed. See the [AdCP 2 retirement guide](../migration-drop-adcp-2.md).
8
+ - **Reliable Reporting storage has its own package.** Install `@adcp/reporting-storage@~0.1.0` alongside the SDK and update the moved imports. The storage package remains experimental and pre-1.0 even though SDK 16 is stable. See the [package migration](../migration-reporting-storage-package.md) and [stability policy](../guides/REPORTING-STABILITY.md).
9
+ - **Reporting row storage uses the protocol field names and source-timezone period dates.** Apply the migration and update custom object providers as described in the [row storage alignment guide](../migration-reporting-row-storage-alignment.md). Re-apply the warehouse sink migration when upgrading existing BigQuery sinks; see the [SDK changelog](https://github.com/adcontextprotocol/adcp-client/blob/main/CHANGELOG.md#1600).
10
+ - **Compliance notice codes use the canonical names.** Replace `request_signing.required` with `request_signing_required_in_4_0` and `webhook_signing.legacy_hmac_fallback.removed` with `legacy_hmac_fallback_removed_in_4_0` in comparisons and dashboard keys.
11
+
12
+ The [changelog](https://github.com/adcontextprotocol/adcp-client/blob/main/CHANGELOG.md#1600) includes the complete SDK 16 changes, including creative wire selection, account sync, property-list workflows and reporting fixes. Use the [release-bound upgrade worksheet](../migration-14.x-rc-worksheet.md) to check the exact package, runtime, peers and protocol bundle.
13
+
14
+ SDK 16.0.0 also includes [#3350](https://github.com/adcontextprotocol/adcp-client/pull/3350): legacy creative delivery maps asset keys to the selected format's declared asset IDs, including image, click URL and tracker slots, while preserving occupied or ambiguous keys. See [creative delivery](../guides/CREATIVE-DELIVERY.md).
15
+
16
+ ## AdCP 3.3 preview
17
+
18
+ The explicit `@adcp/sdk/identity-3.3` opt-in remains experimental. Promoting SDK 16 does not graduate that API or change the default wire pin to AdCP 3.3. See the [experimental identity guide](../migration-agent-identity-3.3.md).
19
+
20
+ SDK 17 beta is the next release line for adopting the published AdCP 3.3 beta bundle. SDK 16 stays on AdCP 3.2 while that work proceeds. The `latest` channel stays on stable releases and `beta` carries the SDK 17 previews; a preview is published only once its protocol bundle is available and its integration passes validation.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adcp/sdk",
3
- "version": "16.0.0-beta.9",
3
+ "version": "16.0.0",
4
4
  "description": "AdCP SDK — client, server, and compliance harnesses for the AdContext Protocol (MCP + A2A)",
5
5
  "workspaces": [
6
6
  ".",