Skip to content

feat(schemas): adopt the maintained AdCP 3.1.33 and 3.2.10 compliance corpora - #3698

Merged
bokelley merged 3 commits into
16.xfrom
chore/16.x-adopt-3.1.33-3.2.10
Nov 12, 2026
Merged

bokelley merged 3 commits into
16.xfrom
chore/16.x-adopt-3.1.33-3.2.10

Conversation

@bokelley

Copy link
Copy Markdown
Contributor

Why

A seller on @adcp/sdk 16.7.0 (npm latest and adcp-3.2) cannot select --compliance-version 3.1.33: 16.7.0 packages the 3.1.32 and 3.2.8 corpora only, and adcp storyboard list --compliance-version 3.1.33 fails with "Compliance cache not found". Hosted grading already uses AdCP 3.1.33 and 3.2.10. This patch packages both signed corpora so local runs can match hosted grading.

Replace or add: each line advances in place

Line Before (16.7.0) After Precedent
Primary 3.2 3.2.8 3.2.10 (replaces) Every primary adoption on 16.x replaced in place: 3.2.4 → 3.2.5 (#3314), 3.2.7 → 3.2.8 (#3484)
Maintained 3.1 3.1.32 3.1.33 (replaces) The maintained 3.1 slot replaced in place in #3314 (3.1.24 → 3.1.29) and #3484 (3.1.29 → 3.1.30)
Retained 3.1 3.1.30 3.1.30 (unchanged) #3631 kept 3.1.30 alongside because pinning 3.1.32 loses coverage: canonical_formats and pricing_currency_filter run under 3.1.30 but are gated behind collect_product_pages_runner from 3.1.32 on
3.0 3.0.25 3.0.25 (unchanged)

#3631's reason for adding alongside was specific to 3.1.30: it is the last 3.1 corpus where those storyboards still run on SDK 16. No such reason applies to 3.1.32. 3.1.33 carries the same four collect_product_pages_runner-gated storyboards and adds no new requirement this SDK lacks. Its storyboard changes narrow selection to agents that actually declare a capability: product_signal_targeting now requires wholesale on both feeds, and the image-creative phases skip when a seller offers no image formats. It also moves delivery reporting ahead of the creative phase, and builds sync_creatives assets from the product's own format through $build_assets_from_format, which 16.x already implements. So the maintained slot advances, as it did before #3631. This also keeps the package inside the existing budgets with no cap changes.

Adopter impact: explicit --compliance-version 3.1.32 or 3.2.8 flags now fail with the existing "Compliance cache not found" message. Move them to 3.1.33 and 3.2.10, or stay on 16.7.0 for those exact bytes. The changeset and docs/development/WIRE-VERSION-COMPAT.md both say this.

Verification of the signed bundles

Synced only through the ordinary route, with no mirror, --bundle, --protocol-commit, trust override or ADCP_REQUIRE_SIGNATURE=0:

echo 3.2.10 > ADCP_VERSION
ADCP_REQUIRE_SIGNATURE=1 npm run sync-schemas
ADCP_REQUIRE_SIGNATURE=1 npm run sync-schemas -- 3.1.33

Both syncs printed sha256 verified and cosign signature verified. I also verified the bundles separately from the sync script, using cosign v3.1.4 checked against the sigstore release checksums:

3.1.33 3.2.10
tarball 12,495,483 bytes 23,524,002 bytes
sha256 850f9ed9018548e5be6743cfb402ac8fedc4636bfe2aa75976237aa3da38e5ea 764e07b0f566d95e0e0d689a7d40c7a699b8f921d7415ef34f19ac09169b5a47
matches .sha256 sidecar yes yes
CDN bytes = GitHub release assets (.tgz, .sig, .crt, .sha256) identical identical
cosign verify-blob (repo identity regexp + token.actions.githubusercontent.com) Verified OK Verified OK
certificate SAN release.yml@refs/heads/3.1.x release.yml@refs/heads/3.2.x
repo / ref / trigger adcontextprotocol/adcp · refs/heads/3.1.x · push adcontextprotocol/adcp · refs/heads/3.2.x · push
signer source commit 7237866d283c02efa627cb540625cf512d4511c9 5541479a368cc5b678727c0b80d7dc9bf8d8daae
signing run 42620910821 attempt 1 42621225452 attempt 2
release tag commit v3.1.33 = 590bbf67… (signer commit + 1) v3.2.10 = a6163fb4… (signer commit + 2)

The built-in identity regexp accepts any ref under release.yml, so I checked the certificate fields above directly instead of relying on the gate passing. The synced compliance/cache/3.1.33 (295 files) and 3.2.10 (587 files) match the verified tarballs' compliance/ trees byte for byte. I compared the retained 3.0.25 and 3.1.30 caches file by file against a pre-sync inventory: compliance 182 and 289 files, schemas 587 and 762 files, all byte-identical.

Schema changes: none structural

With release identifiers and lastUpdated normalized away, the schema diffs for 3.1.32 → 3.1.33 (762 files) and 3.2.8 → 3.2.10 (1,577 files) are empty. Following #3484, I still regenerated the types for the primary pin. Every regenerated line in src/lib/types/* and src/lib/server/*.generated.ts is a provenance comment (version or timestamp); there are no type changes. generate-registry-types --sync pulled unrelated live-registry drift, which I left out.

What changed

  • ADCP_VERSION and package.json adcp_version: 3.2.8 → 3.2.10.
  • package.json files: compliance/cache/3.1.32 → 3.1.33 and 3.2.8 → 3.2.10. sync-schemas:all side sync: 3.1.32 → 3.1.33. 3.1.30 and 3.0.25 are kept.
  • scripts/schemas-ensure.ts: MAINTAINED_3_1_SCHEMA_VERSION = 3.1.33; the comment says this slot advances in place and 3.1.30 is the retained one.
  • scripts/check-publish-protocol-artifacts.mjs: MAINTAINED_COMPLIANCE_ROOTS = 3.0.25, 3.1.30, 3.1.33.
  • scripts/sync-version.ts: LAST_3_1_GA_PATCH 32 → 33, LAST_3_2_GA_PATCH 8 → 10.
  • Generated, not hand-edited: src/lib/version.ts (ADCP_VERSION 3.2.10; COMPATIBLE_ADCP_VERSIONS gains 3.1.33, 3.2.9, 3.2.10), docs/migration-14.x-rc-worksheet.md, docs/llms.txt, and the generated types (comments only, see above).
  • Canonical principal / reporting-core fixture provenance repinned to v3.2.10 (a6163fb4…, bundle 764e07b0…). --update re-downloaded both files from the immutable commit and verified them; the bytes are unchanged and equal the 3.2.10 cache.
  • src/lib/negotiation/commercial-terms-semantics.ts: adds the reviewed 3.2.10 entry, as fix(compliance): adopt signed AdCP 3.2.8 on SDK 16.x #3484 did for 3.2.8. The commercial-term schemas are structurally identical to 3.2.8. 3.2.9 stays unreviewed (never a primary pin, like 3.2.2).
  • Docs: WIRE-VERSION-COMPAT.md (bundle tree, in-place advance, adopter flag migration, packaged inventory, controller siblings), CLI.md, VALIDATE-YOUR-AGENT.md.
  • .changeset/brave-corpora-advance.md: patch for @adcp/sdk. 16.x has no .changeset/pre.json, and this is the only pending changeset.

Test updates

  • Version and path moves (3.1.32 → 3.1.33, 3.2.8 → 3.2.10): versioned-tool-schemas, schema-bundle-compliance-controller (closure sizes re-confirmed against the real corpora: 2 for 3.1.33, 4 for 3.2.10), storyboard-account-subject-identity, both creative build-probe tests, version-sync, compliance-storyboard-index, compliance-universal-metadata, integrator-discovery-regressions, storyboard-selector-route-equivalence, canonical-compliance-storyboard-fixtures (source commit and bundle digest), proposal-commercial-terms (3.2.10 reviewed; 3.2.9 and 3.2.11 must still fail as unreviewed).
  • Assertions added in check-publish-protocol-artifacts.test.js: 3.1.32 and 3.2.8 must not be in files, sync-schemas:all must not sync 3.1.32, and a packed 3.1.32 or 3.2.8 corpus is now rejected as an unsupported bundle.
  • Census update, not a weakened assertion (storyboard-capability-rollup.test.js): the exact count of root-capability-gated files in the primary corpus moves from 184 to 188, and the eligible count from 170 to 174. 3.2.10 adds a requires_capability: media_buy.buying_modes contains wholesale gate to collection_selection and owner_sold_channel_carriage, in both the domains/ and protocols/ copies. That is exactly +4 files, and I confirmed it by diffing the gated-file list between the 3.2.8 and 3.2.10 caches. The compliance_testing count stays at exactly 14. All three assertions are still exact equalities, and the test gets a ledger comment like the earlier 3.2.3 and 3.2.6 entries.

Results

  • format:check, typecheck, build, lint (0 errors), lint:boundaries, ci:doc-links and ci:docs-check all pass.
  • Full npm test: fast group 0 failures; the slow group's one failure was the census above (fixed and re-run green in isolation, 46/46). The final slow, workspace and check:package (publint, attw) runs will be added here when they finish.
  • CLI smoke test with the built bin/adcp.js:
    • storyboard list --compliance-version 3.1.33 lists 125 storyboards and --compliance-version 3.2.10 lists 214, both with no loader errors.
    • storyboard show media_buy_seller/product_signal_targeting under both versions loads the requires_all_capabilities gate (media_buy.buying_modes and signals.discovery_modes both contains: wholesale).
  • Behavioural gate smoke test: I ran the real 3.1.33 and 3.2.10 product_signal_targeting storyboards through runStoryboard against a stub client. A brief-only signals seller, which the 3.1.32/3.2.8 present: true gate would have selected, gets not_applicable with zero calls. A seller that declares wholesale on both feeds passes the gate.

Package size (real npm pack --dry-run, both sides)

base d857f18 (16.7.0) this PR cap
packed 21,175,732 21,184,449 (+8,717) 21,250,000
files 6,798 6,799 (+1: the new signal-marketplace/error_compliance.yaml) 6,877
unpacked 117,091,047 117,154,765 (+63,718) 125,829,120

No budget changed. check:package-size and check:publish-protocol-artifacts pass.

Scope

No manual version, lockfile or dist-tag edits. No release PR or publish. The release PR stays separate.

🤖 Generated with Claude Code

bokelley and others added 2 commits November 12, 2026 09:35
… corpora

SDK 16.7.0 packages the 3.1.32 and 3.2.8 corpora, so a seller cannot select
--compliance-version 3.1.33 or 3.2.10, the releases hosted grading uses.

Sync both signed bundles through the ordinary ADCP_REQUIRE_SIGNATURE=1 route
and advance each line in place, as earlier 16.x patch adoptions did: the
primary pin moves 3.2.8 -> 3.2.10 and the maintained 3.1 slot moves
3.1.32 -> 3.1.33. The retained 3.1.30 and 3.0.25 corpora are unchanged.

Schema trees differ only in release identifiers and lastUpdated dates, so
regenerated types change only provenance comments. Package size stays within
the existing budgets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AdCP 3.2.10 gates collection_selection and owner_sold_channel_carriage on
media_buy.buying_modes containing wholesale, in both domain and protocol
copies. The exact census moves from 184 to 188 gated files (174 eligible);
the compliance_testing count stays exactly 14.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ladon verdict: Approve

Approve — clean in-place compliance-corpus version adoption.

This PR advances compliance corpus versions (3.1.32→3.1.33 primary-maintained, 3.2.8→3.2.10 primary pin) consistently across version strings, generated artifacts, tests, docs, and the package files list.

Checked against repo-specific gates:

  • Changeset-vs-wire-impact: The patch changeset is honest. COMPATIBLE_ADCP_VERSIONS gains 3.1.33/3.2.9/3.2.10 additively — no exports removed, no required-param flips, no response-shape change. Matches every prior 16.x adoption.
  • Witness-not-translator: The one substantive code change (3.2.10 entry in COMMERCIAL_SEMANTIC_OVERRIDES_BY_RELEASE at commercial-terms-semantics.ts:303) carries byte-identical reviewed semantics forward — no fabrication or re-shaping at a seam.
  • Minor-release pathway: Additive coverage; covered by proposal-commercial-terms.test.js (3.2.10 reviewed; 3.2.9/3.2.11 deliberately unreviewed, mirroring existing 3.2.2 precedent).
  • Generated-file diffs confirmed comment-only (core.generated.ts L1-2).

No Critical/High/Medium findings. high_risk false, gated_paths false, no author team gate, no prior decision. Rows 1–8 do not fire → row 9 approve.

…; resync registry types

The AdCP 3.2.10 signal-marketplace specialism grades activate_signal on an
unresolvable signal_agent_segment_id, expecting REFERENCE_NOT_FOUND or
INVALID_REQUEST. SIGNAL_NOT_FOUND is reserved for unresolvable data-provider
signal_id references. Port main's fix to the 16.x example adapter.

Also regenerate the registry OpenAPI snapshot and types, which drifted from the
live registry spec after the registry logo-background change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@bokelley

Copy link
Copy Markdown
Contributor Author

Pushed 54058c8ef to fix the two CI failures:

  • Example Adapter Integration Tests: the 3.2.10 signal-marketplace specialism now grades activate_signal on an unresolvable signal_agent_segment_id and expects REFERENCE_NOT_FOUND or INVALID_REQUEST. The 16.x example adapter still returned SIGNAL_NOT_FOUND, which is reserved for unresolvable data-provider signal_id references. I ported main's fix (feat: adopt signed AdCP 3.3.0-beta.2 for SDK 17 beta #3541). test/examples/hello-signals-adapter-marketplace.test.js passes locally, 7/7.
  • Generated, Docs & Formatting: schemas/registry/registry.yaml and src/lib/registry/types.generated.ts had drifted from the live registry OpenAPI after the registry logo-background deploy (adcp#8916). I regenerated them with npm run generate-registry-types -- --sync. This is unrelated to the corpus adoption, so any 16.x PR would have hit it.

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ladon verdict: Approve

Approve.

Subsequent pass over a 3-file delta on top of a prior clean approve. The single current finding is Medium and example-only; no critical/high findings exist, no author-team gate, gated_paths is false (and review_decision is APPROVED regardless). high_risk is true only via schemas/registry/registry.yaml (modified), but the reviewer confirmed those changes are purely additive, the generated types mirror them faithfully, and the existing patch changeset holds — no medium-or-higher finding on the modified high-risk file, so row 5 does not fire. With exactly one medium finding and no escalation trigger, rows 1–8 do not match; outcome falls through to row 9.

Medium findings

  • examples/hello_signals_adapter_marketplace.ts:646 — activate_signal example swaps resource-specific SIGNAL_NOT_FOUND for generic REFERENCE_NOT_FOUND on an unresolvable signal handle, with a rationale that inverts both codes' manifest text. Example-only, non-blocking.

Scope note: neither the example change nor the registry drift appears in the PR body's "What changed" list — worth a human glance but not blocking.

Medium findings

  • examples/hello_signals_adapter_marketplace.ts:646 — activate_signal example swaps SIGNAL_NOT_FOUND for generic REFERENCE_NOT_FOUND on unresolvable signal handle

@bokelley
bokelley merged commit cc4e6dc into 16.x Nov 12, 2026
40 checks passed
@bokelley
bokelley deleted the chore/16.x-adopt-3.1.33-3.2.10 branch November 12, 2026 17:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant