Skip to content

chore(deps): bump AdCP to 3.0.6 + close end-to-end gaps for guaranteed worked example#1510

Merged
bokelley merged 6 commits into
mainfrom
bokelley/bump-adcp-3.0.6-drop-allowlist
May 3, 2026
Merged

chore(deps): bump AdCP to 3.0.6 + close end-to-end gaps for guaranteed worked example#1510
bokelley merged 6 commits into
mainfrom
bokelley/bump-adcp-3.0.6-drop-allowlist

Conversation

@bokelley

@bokelley bokelley commented May 3, 2026

Copy link
Copy Markdown
Contributor

Summary

Bumps the SDK's pinned ADCP_VERSION from 3.0.5 to 3.0.6 and runs the hello_seller_adapter_guaranteed storyboard suite unfiltered, end-to-end, for the first time. Surfacing 3.0.6 turned up three latent SDK gaps; this PR closes them.

Spec sync

3.0.6 ships our two upstream fixture PRs:

#1416 (NOT_CANCELLABLE) closed earlier in Phase 4 (assertMediaBuyTransition wired into the guaranteed adapter).

SDK fixes for the round-trip

  1. tasks_get registered only under the underscore name. Buyer-side TaskExecutor.getTaskStatus calls the spec's slash form tasks/get via ProtocolClient.callTool. Framework now registers under both tasks/get (spec) and tasks_get (legacy alias). Fixes the 30s tasks/get poll timed out failure on every HITL flow.
  2. tasks_get input schema only accepted {account_id} and rejected the natural-key {brand, operator, sandbox} arm — same shape gap Phase 2 fixed for comply_test_controller. Now matches the full canonical AccountReference.
  3. AgentClient didn't expose executor. The storyboard runner's pollTaskCompletion accesses client.executor; on AgentClient (the public client returned by multiClient.agent(id)) it was undefined, so canPoll was always false and the runner fell back to webhook-only racing — which times out for fixtures whose push_notification_config.url doesn't address a runner-controlled webhook. Added an @internal executor getter that proxies to the wrapped SingleAgentClient.

Hello seller-guaranteed adapter (worked example)

  • accounts.resolve(undefined, ctx) auth-derived fallback so the framework's tenant boundary on tasks/get resolves a tenant from ctx.authInfo alone. Returns the production singleton (matching the account that owned the original task).
  • taskRegistry hoisted out of the serve() factory so HITL tasks survive across requests.
  • createMediaBuy HITL bypass yields to the buyer's push_notification_config. Sandbox-mode + push-config goes through HITL (matching sales_guaranteed's narrative); sandbox-mode without push-config still bypasses for cascade scenarios.
  • getMediaBuyDelivery.by_package[] now includes pricing_model, rate, currency per AdCP 3.0.6's tightened required fields.

Allowlists

  • hello-seller-adapter-guaranteed.test.jsEXPECTED_FAILURES = []. Storyboard passes unfiltered against 3.0.6.
  • hello-seller-adapter-non-guaranteed.test.js#1415 dropped (3.0.6 closes it). #1416 retained: the SDK helper exists, the non-guaranteed worked example hasn't been migrated to assertMediaBuyTransition yet — follow-up.

Test plan

  • npm run build clean
  • npm run test:lib6022/6022 pass
  • All 7 test/examples/hello-*.test.js files green
  • Live storyboard run against the boots — 30/30 scenarios pass for sales_guaranteed, no allowlist filter
  • npm run format:check clean

Refs

🤖 Generated with Claude Code

bokelley and others added 6 commits May 3, 2026 15:20
…d worked example

Bumps `ADCP_VERSION` to 3.0.6 to pull in two upstream fixture fixes:
adcontextprotocol/adcp#3989 (sandbox:true on inventory_list_targeting
account blocks; closes adcp-client#1415 from the fixture side) and
adcontextprotocol/adcp#3990 (task_completion.media_buy_id path on
sales_guaranteed/create_media_buy; closes adcp-client#1417 from the
fixture side). adcp-client#1416 closed earlier in Phase 4.

Surfacing 3.0.6 against hello_seller_adapter_guaranteed turned up three
latent SDK gaps that prevented the storyboard from passing unfiltered:

1. tasks_get registered only under the underscore tool name. Buyer-side
   TaskExecutor.getTaskStatus calls the spec's slash form `tasks/get` via
   ProtocolClient.callTool. Now registered under both names so spec-name
   callers reach the handler. Fixes the 30s `tasks/get poll timed out`
   failure on every HITL flow.
2. tasks_get input schema accepted only {account_id} and rejected the
   natural-key {brand, operator, sandbox} arm — same shape gap Phase 2
   fixed for comply_test_controller. Schema now matches the full
   canonical AccountReference.
3. AgentClient (the public client from multiClient.agent(id)) didn't
   expose its underlying TaskExecutor. The storyboard runner's
   pollTaskCompletion checks client.executor and silently fell back to
   webhook-only racing — which times out for fixtures whose push URL
   doesn't address a runner-controlled webhook. Added @internal executor
   getter on AgentClient that proxies to SingleAgentClient.executor.

hello_seller_adapter_guaranteed (worked example):
 - accounts.resolve(undefined, ctx) auth-derived fallback so the
   framework's tenant boundary on tasks/get can resolve a tenant from
   ctx.authInfo alone. Without it, every HITL poll fails REFERENCE_NOT_FOUND.
 - taskRegistry hoisted out of the serve() factory so tasks survive
   across requests.
 - createMediaBuy HITL bypass yields to the buyer's push_notification_config.
   Sandbox-mode + push-config goes through HITL (matching the
   sales_guaranteed storyboard's narrative); sandbox-mode + no-push still
   bypasses for cascade scenarios.
 - getMediaBuyDelivery.by_package[] now includes pricing_model, rate,
   currency per AdCP 3.0.6's tightened required fields.

Allowlists:
 - hello-seller-adapter-guaranteed: EXPECTED_FAILURES = []. Storyboard
   passes unfiltered.
 - hello-seller-adapter-non-guaranteed: #1415 entry dropped; #1416
   retained — the SDK helper exists, the non-guaranteed example hasn't
   been migrated to assertMediaBuyTransition yet.

Test plan:
- npm run test:lib — 6022/6022 pass
- All 7 hello-adapter test files green
- Live storyboard run against the boots: 30/30 scenarios pass on
  guaranteed, no allowlist filter
- npm run format:check — clean

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pulls in 4 commits:
 - feat(mock-server+adapter): audio creative-template TTS/mix/master (#1508)
 - docs(skills): pivot to fork-matrix; collapse build-*-agent SKILL.md (#1496)
 - feat(server): ConformanceClient Socket Mode primitive (#1506)
 - fix(conformance): get_media_buys enricher resolves account via resolveAccount(options) (#1489)

Conflict resolution:

- src/lib/version.ts: regenerated by sync-version against ADCP 3.0.6.
- test/examples/hello-seller-adapter-guaranteed.test.js: kept the post-3.0.6
  EXPECTED_FAILURES = [] state. The #1505 entry main added (update→get
  echo gap surfaced once the get_media_buys account-resolution fix
  landed) is closed end-to-end by 3.0.6's fixture sandbox-namespace
  alignment + main's runner-side resolveAccount(options) fix (#1489).
  Verified by running the storyboard unfiltered: all scenarios pass.
- test/examples/hello-seller-adapter-non-guaranteed.test.js: same #1505
  entry was added on main and is no longer needed post-3.0.6. Kept the
  #1416 (NOT_CANCELLABLE) entry — that's a non-guaranteed-specific gap.

Verified post-merge:
- npm run build clean
- npm run test:lib — 5999/5999 pass
- All 8 hello-adapter test files green (incl. multi-tenant which main added)
- npm run format:check clean

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pulls in 2 commits:
 - fix(testing/storyboard): symmetric account resolution on update_media_buy enricher (closes #1505) (#1509)
 - fix(adapters): declare output slot in creative formats per creative-manifest.json:14 (#1511)

Conflict resolution:

- test/examples/hello-seller-adapter-guaranteed.test.js: main re-added a
  #1417 entry. 3.0.6 closes #1417 from the fixture side (adcp#3990) and
  the storyboard runs unfiltered against 3.0.6, so the post-bump state
  remains EXPECTED_FAILURES = [].
- test/examples/hello-seller-adapter-non-guaranteed.test.js: kept the
  longer-form `reason` text on the #1416 entry — explains both the SDK
  helper status (shipped in #1427) and the non-guaranteed adopter gap
  (not yet wired) so the next reader knows where the work belongs.

Verified post-merge:
- npm run build clean
- npm run test:lib — 6027/6027 pass
- 6/6 hello-adapter tests for the modified files green
- npm run format:check clean

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CI's drift check (`npm run generate-types:all`) caught that the AdCP 3.0.6
bump didn't include the regenerated derivatives:

- src/lib/types/core.generated.ts — refreshed via json-schema-to-typescript
  off schemas/cache/3.0.6/
- src/lib/types/manifest.generated.ts — adcp_version field flipped from
  3.0.5 to 3.0.6, and GOVERNANCE_DENIED / GOVERNANCE_UNAVAILABLE
  description prose updated per upstream's wire-placement guidance
  expansion in 3.0.6

Both are auto-generated from `schemas/cache/3.0.6/` — no semantic SDK
changes, just the regenerated outputs CI expected.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pulls in 4 commits:
 - docs(skills): close three #1496 follow-up review items + seller adapter format slot sweep (#1515)
 - docs(migration): add recipe #10b for derived-mode account_id refusal (#1492) (#1512)
 - fix(codegen): preserve asset_type discriminator on Individual*Asset slot types (closes #1498) (#1514)
 - fix(examples): wire assertMediaBuyTransition into hello_seller_adapter_non_guaranteed (closes #1499) (#1513)

Conflict resolution:

- src/lib/types/core.generated.ts: kept the 3.0.6 generation header from
  HEAD; ran `npm run generate-types:all` against the local mirror to
  pull in main's #1514 codegen fix (asset_type discriminator preserved
  on Individual*Asset slots) layered on top of 3.0.6 schemas.
- test/examples/hello-seller-adapter-non-guaranteed.test.js: kept main's
  empty allowlist + new helper-shape conditional. Main's #1513 closes
  #1416 by actually wiring `assertMediaBuyTransition` into the
  non-guaranteed adapter — superseding the follow-up note my branch
  carried.

Verified post-merge:
- npm run build clean
- 6/6 hello-adapter tests for the modified files green
- npm run format:check clean

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ion expansion

CI's `Validate agent docs are in sync` step caught that the 3.0.6 bump
expanded the GOVERNANCE_DENIED / GOVERNANCE_UNAVAILABLE description
fields in the manifest, and the auto-generated agent docs hadn't been
re-emitted to match.

- docs/llms.txt — refreshed from src/lib/types/manifest.generated.ts
- docs/TYPE-SUMMARY.md — same

Both auto-generated by `npm run generate-agent-docs`. No semantic SDK
changes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@bokelley bokelley merged commit dd6cd4f into main May 3, 2026
10 checks passed
@bokelley bokelley deleted the bokelley/bump-adcp-3.0.6-drop-allowlist branch May 3, 2026 21:18
bokelley added a commit that referenced this pull request May 3, 2026
…itations (#1526)

* chore(version): add 3.0.6 to COMPATIBLE_ADCP_VERSIONS + bump 3.0.5 → 3.0.6 schema citations

PR #1510 bumped ADCP_VERSION to 3.0.6 but didn't add 3.0.6 to the
COMPATIBLE_ADCP_VERSIONS literal union in scripts/sync-version.ts. Callers
passing { adcpVersion: '3.0.6' } fell through to the (string & {}) escape
hatch — still accepted at runtime, but no editor completion. Closes the gap
by appending '3.0.6' to the list; src/lib/version.ts regenerated via
npm run sync-version.

Plus 4 schema-citation bumps so user-facing surfaces line up with the pinned
version:
- skills/cross-cutting.md (§ Spec reference)
- skills/SHAPE-GOTCHAS.md (§7 signal_type)
- examples/hello_seller_adapter_social.ts (audience.json comment)
- src/lib/server/decisioning/runtime/from-platform.ts (account-ref.json comment)

docs/migration-6.6-to-6.7.md 3.0.5 references are historical (the migration
target was 3.0.5) and stay unchanged.

Local tracking issues filed for the upstream spec gaps the team is waiting on:
- adcp-client#1523 (waits on adcp#4015 — audio variant phase for
  creative_template storyboard)
- adcp-client#1525 (waits on adcp#4021 — output_only flag on format.assets[])

Both upstream issues remain OPEN.

Validated: fork-matrix 23/23, typecheck + format clean. Pure additive at wire
and type level — COMPATIBLE_ADCP_VERSIONS extends backward compat, no existing
strings change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(adapter): repoint hello_seller_adapter_social comment to existing schema

code-reviewer caught a pre-existing broken schema citation in
examples/hello_seller_adapter_social.ts:188. The comment cited
/schemas/3.0.6/core/audience.json — a file that has never existed in either
3.0.5 or 3.0.6. The surrounding prose describes SyncAudiencesRow's
matched_count + effective_match_rate fields, which actually live at
schemas/cache/3.0.6/media-buy/sync-audiences-response.json. Repointed.

Pure comment-only fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot mentioned this pull request May 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant