chore: release package#1710
Merged
Merged
Conversation
f361767 to
f1f27f4
Compare
f1f27f4 to
6684422
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@adcp/sdk@7.1.0
Minor Changes
7de0872: fix(comply): autodetect
request_signerandoauth_metadataprereqs (comply(): autodetectrequest_signerandoauth_metadatarequirements (mirror webhook_receiver autodetect from #1678) #1702)Extends the implicit-requires pattern shipped in comply() sends relative push_notification_config.url — 3.0-strict sellers reject #1678 (
webhook_receiver)to two more requirement surfaces, removing ~44 false-negative step
failures per
comply()run on agents that don't claim the underlyingcapability.
'request_signer'toRequirementName/KNOWN_REQUIREMENTS/REQUIREMENT_TO_SKIP_REASONand extendsdetectImplicitRequirestoflag any storyboard whose
id === 'signed_requests'or that containsa
request_signing_probestep. The gate consults the agent'sget_adcp_capabilities.request_signing.supportedfrom the discoveredprofile (not a runner opt-out flag) so an agent that claims the
capability but hasn't pre-registered the runner's compliance test
keypair still fails — matches the universal storyboard's stated
gating contract at
compliance/{version}/universal/signed-requests.yaml("absence ofadvertisement is not a failure").
oauth_discoverycascade-skip onsecurity_baselinewhenthe agent's capabilities don't declare
account.authorization_endpoint.The existing reactive
phaseAbsentcascade (Runner should unconditionally probe RFC 9728 PRM regardless of test-kit declaration #677) only triggers on a404 from
/.well-known/oauth-protected-resource; non-404 responsesfrom a bearer-only agent (200-HTML, 405, redirect — the Wonderstruck
shape) fell through to validation failures inside an
optional: truephase. The pre-empt is phase-level, not storyboard-level, so the
universal
unauth_rejectionandmechanism_requiredchecks still run.Part of the coordinated stance at Tracking: ship 1676–1680 as one stance — the SDK is a witness, not a translator #1685 (the SDK is a witness, not a
translator).
e1ec3ef: Add structured
notices: RunnerNotice[]advisory surface toStoryboardResultandComplianceResult(adcp-client#1704).RunnerNotice,NoticeCode,NoticeSeverity— exported from@adcp/sdkStoryboardResult.noticesis always-present (default[]);ComplianceResult.noticesis optional, deduplicated bycodeacross all storyboard runsrequest_signing_required_in_4_0(future_required) — when thesigned_requestsstoryboard runs against an agent that lacksrequest_signing.supported: true(signing required for spend-committing operations in AdCP 4.0)legacy_hmac_fallback_removed_in_4_0(deprecation) — when agent declareswebhook_signing.legacy_hmac_fallback: true(removed in AdCP 4.0)codevalues for badge routing instead of parsing proseskip.detailstrings36d279f: fix(runner): attribute Zod schema rejects to
response_schema, short-circuit invariants (Harness error attribution: Zod validation rejects surface as failures on unrelated downstream assertions #1709)When the SDK's response unwrapper rejects an agent response against the
codegen-emitted Zod schema for the tool (e.g. an
additionalProperties: truefield the runner's.strict()schema doesn't enumerate, like therecently-added
authorizationfield onsync_accounts), the exceptionpreviously propagated as a generic
Errorwith a freeform message.The runner's step-execution catch absorbed it into
stepResult.errorbut never attributed the failure to schema validation in
step.validations[]. Step-scope invariants then ran against themalformed payload, and whichever fired first (canonically
context.no_secret_echo— the next assertion in the default-invariantqueue) became the surfaced failure. BidMachine spent 10+ deploys
chasing the
no_secret_echoghost before the strict-Zod root causesurfaced. Full trace: comply runner: storyboard verdicts contradict spec-valid prod probes across 10+ runs adcp#4419.
Fix:
New
ResponseSchemaValidationErrortyped error class insrc/lib/utils/response-unwrapper.ts. CarriestoolName,issues(raw Zod issues), and
data(the rejected payload) for downstreamattribution. Stable
name === 'ResponseSchemaValidationError'socross-bundle consumers can detect by string match without
instanceof.Replaces the two generic
new Error('Response validation failed for ${toolName}: ...')throws in the unwrapper.runStepinsrc/lib/testing/client.tsnow returns{ result?, step, caughtError? }. The newcaughtErroris theraw thrown value (typed
unknown) so callers can pattern-match ontyped exceptions. Backwards-compatible — pre-existing callers that
consume only
resultandstepare unaffected.Storyboard runner
executeStepthreadscaughtErrorfrom thedispatch fn, and on
ResponseSchemaValidationErrorprepends asynthesized
response_schemaValidationResult tostep.validations.The synthesized entry carries the structured issues, the failing
tool name, an RFC 6901-shaped
json_pointer, and the rejectionmessage.
extractFailures.find(v => !v.passed)now picks it upbefore any inline or invariant entry.
Step-scope invariants in
executeStoryboardPassare short-circuitedwhen the synthesized
response_schemaentry is present. Each bypassedinvariant emits a single skip marker entry (passed: true) so consumers
see WHICH invariants were bypassed and why, but the bypass entries
don't crowd out the schema failure in extractFailures.
Sequencing: this PR is the upstream dependency for Schema URLs and Zod validators are baked at SDK build time — drift from agent's advertised
adcp_version#1707 (dynamicschema fetch + strict→passthrough flip + codegen regen). Lands first
so any remaining Zod rejects during Schema URLs and Zod validators are baked at SDK build time — drift from agent's advertised
adcp_version#1707's rollout produce honestsignal instead of misattributing to
no_secret_echo. After both Harness error attribution: Zod validation rejects surface as failures on unrelated downstream assertions #1709and Schema URLs and Zod validators are baked at SDK build time — drift from agent's advertised
adcp_version#1707 land, BidMachine's 63/128 comply-vs-45/59 CLI delta(adcp#4419) should collapse — fgranata volunteered as the retest
target on adcp-client#1711.
Coordinated stance: adcp-client#1685 (the SDK is a witness, not a
translator). Same anti-pattern: the SDK was fabricating a different
failure (
no_secret_echo) than what actually went wrong (schemarejection); this PR makes it a faithful witness.
Patch Changes
05ce456: fix(version): auto-derive COMPATIBLE_ADCP_VERSIONS from ADCP_VERSION pin
The 3.0.x patch enumeration in
COMPATIBLE_ADCP_VERSIONSwas a hardcodedarray literal inside the
scripts/sync-version.tstemplate. Every AdCPpatch bump needed someone to remember to append the new version to it.
The 3.0.9, 3.0.10, and 3.0.11 chore PRs all forgot — the list capped
at
3.0.8even thoughADCP_VERSIONmoved to3.0.11. Symptom:isCompatibleWith('3.0.11') === falseagainst the SDK's own pin.Same root-cause class as the schema URL pinning drift surfaced by
adcontextprotocol/adcp#4419(BidMachine reports / "3.0.1 schemas" citedagainst a 3.0.11 seller): a load-bearing version surface that depends on
human discipline at every patch bump.
Fix:
scripts/sync-version.tsnow derives the list dynamically from thecurrent
ADCP_VERSION. Enumerates3.0.0..3.0.<patch>mechanically;the bumper no longer has to remember anything.
ADCP_VERSIONfalls outside the3.0.xrange so afuture 3.1.x or 4.x bump forces the script to be extended (rather than
silently inheriting a stale enumeration). The compat surface for a
major/minor move is rarely mechanical — that's the right time to think.
test/lib/compatible-versions-self-consistency.test.jsassertingthe regenerated list contains the current pin and fills the
3.0.0..ADCP_VERSIONrange without gaps. Future regressions (someonereverting to hardcoded literals) fail loud at CI.
Does not address the deeper schema URL pinning drift in
src/lib/testing/storyboard/validations.ts(SDK-build-timeADCP_VERSIONused in cited schema URLs regardless of the agent's advertised version);
tracked separately at adcp-client#NNNN.
110b49e: fix(invariant): no_secret_echo only fails on string-valued suspect-named fields (no_secret_echo invariant flags spec-legitimate field names on structured-value fields #1713)
The default
context.no_secret_echoinvariant flagged any response fieldwhose name was in
SUSPECT_PROPERTY_NAMES('authorization','api_key','apikey','bearer','x-api-key') regardless of the field's value.This over-rejected spec-legitimate structured fields — notably the
authorizationobject onvalidation-result.json(a structuredauthorization-validation payload, not a credential) and any seller-side
extension fields named
authorizationundersync_accounts_response.accounts[](additionalProperties: true).Symptom: BidMachine's
sync_accountsfailures incomply runner: storyboard verdicts contradict spec-valid prod probes across 10+ runs adcp#4419 all surfaced as
context.no_secret_echo.Diagnosis in #4419 pointed at Zod
.strict()codegen lag, butverification of the published SDK tarballs (5.25.1 / 6.12.0 / current)
shows
SyncAccountsResponseSchema.accounts[]already uses.passthrough(). Zod silently accepts theauthorizationfield; theNAME dragnet in this invariant is the actual rejection.
Fix: narrow
findSecretEchoso the suspect-name check only fires whenthe field VALUE is a non-empty string. Structured object/array values
on suspect-named fields pass through to the recursive walk, which still
scans nested strings against
BEARER_TOKEN_PATTERNand caller-suppliedsecret literals. The actual leak shapes the invariant was designed to
catch (bearer tokens, API keys, caller secret echoes) remain caught.
Adds five new test cases covering:
fails via the value-scan regression guard
Sequencing relative to other in-flight work:
Addresses a different misattribution path (when Zod DOES reject).
This fix addresses the case where Zod ACCEPTS but the invariant
over-rejects on field name.
codegen regen. Real architectural cleanup; does NOT unblock
BidMachine (the published SDK already uses passthrough).
.strict()codegen lag" diagnosis was incorrect for the publishedSDK; this fix is the actual unblocker. Closes once fgranata retests.
Coordinated stance: adcp-client#1685 (the SDK is a witness, not a
translator). Same anti-pattern: the SDK fabricated a credential-leak
signal against a structured non-credential field that the spec legally
permits.