Skip to content

chore(deps): bump @adcp/client 5.17.0 → 5.18.0#3191

Merged
bokelley merged 1 commit intomainfrom
bokelley/adcp-client-5-18-bump
Apr 25, 2026
Merged

chore(deps): bump @adcp/client 5.17.0 → 5.18.0#3191
bokelley merged 1 commit intomainfrom
bokelley/adcp-client-5-18-bump

Conversation

@bokelley
Copy link
Copy Markdown
Contributor

Summary

Brings in this session's downstream wins:

Compat fixes in this PR

Hint type widened (5 kinds)

StoryboardStepHint widened from ContextValueRejectedHint alone to a five-kind union: context_value_rejected | shape_drift | missing_required_field | format_mismatch | monotonic_violation. renderAllHintFixPlans now accepts the broader type and filters to the kind it knows how to render. The other four kinds drop silently from the fix-plan section — the runner's per-hint message field still surfaces them upstream of this renderer. Richer rendering is a follow-up.

Strict request-schema validation

5.18.0's storyboard runner rejects unknown request fields strictly. pagination-integrity-property-lists.yaml carried a list_type: "inclusion" | "exclusion" field that isn't in create-property-list-request.json's properties (which has additionalProperties: false). Dropped it — no handler reads the field, no agent behavior change.

Deferred: multi-page get_media_buys storyboard upgrade

The natural follow-on (upgrade get_media_buys_pagination_integrity from the single-step ID-lookup invariant back to the seeded continuation+terminal walk pattern) is blocked on a second SDK gap. adcp-client's convention extractor at src/lib/testing/storyboard/context.ts populates context.media_buy_id from media_buys[0] after every successful response. Then page 2's request-builder reads that populated context and injects media_buy_ids: [<that ID>], turning the second call into an ID-lookup. The agent returns 1 buy with total_count: 1, failing the storyboard's total_count: 3 assertion.

Filed adcontextprotocol/adcp-client#998 with the diagnosis and three fix options (preferred: don't extract media_buy_id from broad-list responses where pagination.has_more indicates list semantics). Storyboard stays at the single-step shape until that lands.

Verified

  • npm run build — typecheck + schemas + compliance + tarball all clean
  • npm run test:unit — 834/834 pass (was 832 before the bump — 2 new tests from @adcp/client/testing re-exports)
  • npm run test:server-unit — training-agent: 354/354 pass
  • Pagination storyboard suite against training agent: 8/8 storyboards clean, 41/41 steps
  • npm run test:storyboard-doc-parity && npm run test:pagination-invariant — clean

Test plan

  • Build clean
  • Unit tests pass (832→834)
  • All 8 pagination_integrity storyboards pass against training agent
  • Storyboard lint suite clean
  • Negative test: dropping list_type doesn't change observable agent behavior (no handler reads it)

🤖 Generated with Claude Code

Brings in our get_media_buys request-builder fix (adcp-client#987
closing #983), placeholder-ID enricher audit (#991), schema-aware
brand/account injection in the storyboard runner (#943), the
a2a_context_continuity validator (#962), A2A wire-shape capture
(#904), and triage-bot ergonomics closing adcp#3121 (#992/#993).

Two compat fixes:

- **Hint type widening.** `StoryboardStepHint` widened from
  `ContextValueRejectedHint` alone to a five-kind union.
  `renderAllHintFixPlans` now accepts the broader type and filters
  to the kind it knows how to render. Other kinds drop silently
  from the fix-plan section but the runner's per-hint `message`
  field still surfaces them.
- **Strict request-schema validation.** 5.18.0's runner rejects
  unknown fields. `pagination-integrity-property-lists.yaml`'s
  `list_type` field isn't in `create-property-list-request.json`'s
  properties (the schema has `additionalProperties: false`). Drop
  it — no handler reads the field.

Multi-page upgrade for get_media_buys_pagination_integrity deferred —
the SDK's convention extractor populates context.media_buy_id from
the first-page response, then the request-builder injects that ID
and turns page 2 into an ID-lookup. Filed adcp-client#998 with the
diagnosis. Storyboard stays at single-step until the extractor fix
lands.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@bokelley bokelley merged commit 7401e20 into main Apr 25, 2026
16 checks passed
@bokelley bokelley deleted the bokelley/adcp-client-5-18-bump branch April 25, 2026 18:58
bokelley added a commit that referenced this pull request Apr 25, 2026
Wires this repo's reference seller to the spec primitive from #3138 —
force_task_completion resolves a previously-submitted task to completed
with a buyer-supplied result payload. Companion to #3115
(force_create_media_buy_arm); rebased onto #3191 (the @adcp/client
5.18.0 bump that ships PostgresTaskStore.createTask({ taskId })).

handleComplyTestController pre-dispatches the new scenario before
delegating to the SDK. Validates task_id (non-empty, ≤128 chars), result
(plain object), and a soft 256 KB cap on the payload. Records
(task_id, result, ownerKey) in a process-global Map so cross-account
replays return NOT_FOUND per the spec MUST, identical-params replays
are idempotent no-ops, and diverging-params replays against a terminal
task return INVALID_TRANSITION. list_scenarios is augmented to
advertise it.

Why a local Map and not the SDK task store. 5.18.0 ships
PostgresTaskStore.createTask({ taskId }) — meaningful but not yet
end-to-end:

  1. InMemoryTaskStore (re-exported from @modelcontextprotocol/sdk)
     doesn't yet honor caller-supplied IDs. Training-agent CI without
     DATABASE_URL falls back to InMemory; an SDK-backed implementation
     would silently get random IDs there.
  2. The SDK auto-registers tasks/get with the MCP Task shape
     (taskId, status ∈ working|completed|failed|input_required|cancelled).
     The AdCP tasks-get-response.json schema requires the AdCP shape
     (task_id, status ∈ submitted|working|input-required|completed|
     canceled|..., plus task_type, protocol, result). A storyboard
     polling phase asserting AdCP fails against the SDK's auto-
     registered handler.

Both tracked in adcp-client#994. The local-Map primitive ships the
spec contract sellers must honor without depending on infrastructure
that isn't there yet. Swapping the storage layer is mechanical when
upstream lands.

create_media_buy_async storyboard remains v1.0.0 (submitted-arm only).
The polling phase needs Gap 2 to land plus storyboard-runner wiring to
thread caller-supplied IDs through tool input.

Tests: 9 new in training-agent-force-task-completion.test.ts cover
directive registration, INVALID_PARAMS for missing/oversized fields,
replay idempotency, diverging-replay INVALID_TRANSITION, cross-account
NOT_FOUND, list_scenarios advertisement. Existing
comply-test-controller.test.ts length assertion bumped 8→9.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
bokelley added a commit that referenced this pull request Apr 25, 2026
@adcp/client 5.18.0 (#3191) brought in adcp-client#943's schema-aware
brand/account injection — the upstream fix for #940. Framework dispatch
now hits 53/53 clean and 401 passing on main, fully restoring (and
exceeding) the pre-#940 baseline.

- Framework: 42→53 clean, 374→401 passing
- Legacy: 53 clean (unchanged), 384→388 passing (after #3194)

Comment in the workflow cleaned up to reflect that #940 is resolved
and the reduced framework floor is no longer needed.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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