Conversation
663cda0 to
80e6c32
Compare
80e6c32 to
4bc7a96
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/client@5.1.0
Minor Changes
50c809a: Pull storyboards from the AdCP compliance tarball instead of bundling them.
Released as a minor bump: 5.0 was intentionally shipped incomplete while the
upstream compliance tarball + cosign signing work landed (feat(security): sign protocol tarballs with Sigstore (cosign keyless) adcp#2273).
5.0 has not seen meaningful adoption, so the removals below are treated as finishing
the 5.x surface rather than a 6.0 breaking release.
npm run sync-schemasfetches/protocol/{version}.tgzfrom adcontextprotocol.org,verifies its sha256 sidecar, and extracts both
schemas/andcompliance/intoschemas/cache/{version}/andcompliance/cache/{version}/. Per-file schema sync is keptas a fallback. The compliance cache ships with the published npm package — no network
call required for first use.
When a pinned version ships cosign sidecars (
.sig/.crt, perfeat(security): sign protocol tarballs with Sigstore (cosign keyless) adcp#2273),
sync-schemasverifies them against the upstreamrelease workflow's Sigstore identity.
latest.tgzis intentionally unsigned and skipped.Missing sidecars or a missing
cosignbinary fall back to checksum-only trust with aclear log line; a present-but-failed verification is a hard error.
Storyboard selection is driven by the agent's
get_adcp_capabilitiesresponse:supported_protocolsresolves to domain baselines andspecialismsresolves tospecialism bundles. The runner fails closed when:
supported_protocols.Unknown
supported_protocolsentries (new spec version, typo) log a warning and are skipped.discoverAgentProfilenow callsget_adcp_capabilitiesto populateprofile.supported_protocols+profile.specialisms. A probe failure is surfacedas
profile.capabilities_probe_errorand a top-level error-severity observation,rather than silently downgrading the assessment.
Breaking changes:
storyboards/directory is no longer shipped in the npm package. Consumersrelying on direct file paths must read from
/compliance/{version}/onadcontextprotocol.org or the
compliance/cache/tree after running sync.ComplyOptions.platform_typeis removed. Callers that still pass it get aruntime error pointing to this changeset. Capability-driven selection replaces
platform-type curated lists. Pass
storyboards: [id]for explicit/targeted runs;bundle ids (e.g.,
sales-guaranteed) expand to every storyboard in the bundle.ComplianceResult.platform_coherenceandComplianceResult.expected_tracksareremoved along with the
expectedtrack status.ComplianceSummary.tracks_expectedis removed.PlatformType,SalesPlatformType,CreativeAgentType,SponsoredIntelligenceType,AINativePlatformType,PlatformProfile,PlatformCoherenceResult,CoherenceFinding,InventoryModel,PricingModel,getPlatformProfile,getAllPlatformTypes,getPlatformTypesWithLabels,PLATFORM_STORYBOARDS,getStoryboardIdsForPlatform,extractScenariosFromStoryboard,filterToKnownScenarios,loadBundledStoryboards,loadBundledScenarios,getStoryboardById,getScenarioById,getStoryboardsForPlatformType,getComplianceStoryboards,getApplicableComplianceStoryboards,listStoryboards.adcp storyboard list --platform-typeandadcp storyboard run --platform-type/--list-platform-typesare removed.Added
adcp storyboard run <agent> --file <path.yaml>for ad-hoc spec-evolution runs.New exports on
@adcp/client/testing:resolveStoryboardsForCapabilities,resolveBundleOrStoryboard,findBundleById,listBundles,loadBundleStoryboards,listAllComplianceStoryboards,getComplianceStoryboardById,loadComplianceIndex,getComplianceCacheDir.6953c35: Optimistic concurrency primitives on
AdcpStateStore.New
putIfMatch(collection, id, data, expectedVersion)— atomic compare-and-swap. Returns{ok: true, version}on success,{ok: false, currentVersion}on conflict.expectedVersion: nullmeans insert-only.getWithVersion(collection, id)— read a document with its row version.patchWithRetry(store, collection, id, updateFn, options?)— get → compute → putIfMatch → retry loop for read-modify-write updates. ThrowsPatchConflictErroraftermaxAttempts(default 5).InMemoryStateStore,PostgresStateStore) track a monotonically increasingversionper row. Everyput/patch/putIfMatchbumps it.createSessionedStore/store.scoped(key)) proxy the new methods through so scoped views get CAS for free.Postgres migration
getAdcpStateMigration()addsversion INTEGER NOT NULL DEFAULT 1viaADD COLUMN IF NOT EXISTS. Existing rows start at version 1. No data rewrite.Docs
docs/guides/CONCURRENCY.mdgains a section coveringpatchWithRetry,putIfMatch, and when to reach for each.No breaking changes. Both new methods are optional on the
AdcpStateStoreinterface; custom stores that don't implement them keep working.835e633: SessionStore ergonomics + state-store validation (batch 1 of upstream feedback).
New
store.scoped(sessionKey)on built-in stores +scopedStore(store, key)helper that works on anyAdcpStateStore(falls back tocreateSessionedStorewhen a custom store doesn't implement the method). Returns a session-isolated view that auto-prefixes ids and filterslist()by_session_key.::is reserved as the scope separator and is rejected in session keys and ids so scopes can't collide.HandlerContext.sessionKey+resolveSessionKeyhook oncreateAdcpServer. Sellers derive the scoping key once; handlers readctx.sessionKeyinstead of re-parsing params.StateErrorwith typed codes (INVALID_COLLECTION,INVALID_ID,PAYLOAD_TOO_LARGE, …), built-in charset/length validation on every store operation, configurablemaxDocumentBytes(5 MB default) onInMemoryStateStoreandPostgresStateStore.structuredSerialize/structuredDeserializehelpers so handlers can round-tripMap,Set, andDatethrough the state store without writing per-type converters. Envelope tag is namespaced as__adcpTypeand the deserializer validates payload shape, so caller data that happens to use the same field is passed through unchanged.Docs
docs/guides/CONCURRENCY.md— explicit last-writer-wins vs per-row isolation model, the read-modify-write race on whole-session blobs, and why per-entity rows are safer.docs/guides/TASKRESULT-5-MIGRATION.md— the four migration patterns for the 5.0 discriminated-unionTaskResult(success check, error extraction, status narrowing, intermediate states).No breaking changes.
scopedonAdcpStateStoreis an optional method; custom store implementations that don't define it keep working.Patch Changes
setupis placed at the top level of a media buy response. The IO-signing setup URL belongs insideaccount.setup(a field onAccount), not on the media buy itself. This was a silent trap becauseDomainHandleracceptsRecord<string, unknown>so the strict type wasn't catching it. AffectsmediaBuyResponse,updateMediaBuyResponse, andgetMediaBuysResponse.