@@ -9,6 +9,61 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99
1010### Fixed
1111
12+ - ** A second client on an already-connected transport now fails at construction.** A transport
13+ instance carries exactly one session. ` StdioAcpClientTransport.connect() ` had no once-only guard
14+ (the WebSocket and agent transports did), so a second ` AcpClient.async(transport) ` or
15+ ` AcpClient.sync(transport) ` on the same instance subscribed the transport's unicast inbound sink a
16+ second time — logged and dropped as `Sinks.many().unicast() sinks only allow a single
17+ Subscriber` — and then started a second agent process, whose owner could never receive a
18+ response: its first request timed out after the full ` requestTimeout ` . That is the Spring Boot
19+ autoconfiguration failure reported in June 2026 (both an ` AcpAsyncClient ` and an ` AcpSyncClient `
20+ bean built from one transport bean); it never depended on the Reactor or Boot version. Now the
21+ stdio transport refuses a second ` connect() ` , and ` AcpClientSession ` / ` AcpAgentSession ` surface a
22+ connect or start failure instead of dropping it: construction throws ` IllegalStateException ` when
23+ the transport refuses synchronously, and every later request fails immediately with the cause.
24+
25+ - ** Second prompt on a session could be rejected or hang under CPU contention (#14 ).** The agent
26+ released its single-turn prompt lock in ` doFinally ` , * after* the response had already reached the
27+ client. On a starved machine (` taskset -c 0 ` , busy CI runners) the client's next prompt arrived
28+ before that release and was rejected with ` -32000 There is already an active prompt execution ` ;
29+ the rejection's emission then collided with the still-running response emission on the same sink
30+ (` FAIL_NON_SERIALIZED ` ), which the shipped transports silently dropped and the in-memory test
31+ transport turned into a fatal error for the agent, so ` AcpSyncClient.prompt ` waited out the full
32+ ` requestTimeout ` . The lock is now released before the response is published, on the success and
33+ error paths alike, and a handler that throws before returning its ` Mono ` no longer holds the lock
34+ forever. Response emission in ` StdioAcpAgentTransport ` , ` WebSocketAcpClientTransport ` ,
35+ ` WebSocketAcpAgentTransport ` and ` InMemoryTransportPair ` is serialised the way ` sendMessage `
36+ already was, and a failed emission in the in-memory pair no longer terminates the agent. The
37+ reporter's repro is now a test, and CI runs the contention tests pinned to one CPU. Reported by
38+ @krickert .
39+ - The agent session now reads ` sessionId ` from typed ` PromptRequest ` /` CancelNotification ` params as
40+ well as from maps, so in-process transports get the right lock owner in logs and cancel matching.
41+
42+ ### Changed
43+
44+ - ** Unknown-field policy moved from the schema to the mapper (#10 ).** Every schema record carried
45+ ` @JsonIgnoreProperties(ignoreUnknown = true) ` , which made the SDK tolerate fields it does not know
46+ (deliberate: the spec adds fields between releases and a newer agent must keep working) but also
47+ defeated any consumer's strict ` ObjectMapper ` , since a class-level annotation wins over
48+ ` FAIL_ON_UNKNOWN_PROPERTIES ` . The annotations are gone. The default mapper,
49+ ` JacksonAcpJsonMapper.defaultObjectMapper() ` , is lenient and logs each ignored property at DEBUG
50+ so spec drift is observable; a consumer who passes a strict mapper to ` JacksonAcpJsonMapper ` now
51+ gets strict behaviour. ** If you construct ` JacksonAcpJsonMapper ` with a bare ` new ObjectMapper() ` ,
52+ you now get Jackson's default, which fails on unknown fields** : start from
53+ ` defaultObjectMapper() ` instead. Unknown fields are not routed into ` _meta ` , which has its own
54+ spec-defined meaning. Reported by @KallivdH .
55+
56+ ### Added
57+
58+ - ` AcpSyncClient(AcpAsyncClient) ` is public: the supported way to have both APIs over one session.
59+
60+ ## [ 0.17.0] - 2026-08-28
61+
62+ Wire-format correction. No public API change: every constructor and accessor is unchanged, and the
63+ ACP surface is identical to 0.16.1.
64+
65+ ### Fixed
66+
1267- ** Duplicate discriminator on the wire.** Every polymorphic type declared its discriminator twice —
1368 once as Jackson's ` @JsonTypeInfo ` property on the interface and again as an explicit
1469 ` @JsonProperty ` record component — so both wrote it. ` new TextContent("hello") ` serialised to
@@ -19,6 +74,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1974 and is still populated on deserialization — previously it deserialised to ` null ` . 27 records
2075 across 6 hierarchies. No API change: every constructor and accessor is unchanged.
2176
77+ ## [ 0.16.1] - 2026-08-24
78+
79+ Release-tooling patch. No protocol, dependency-closure or public API changes beyond a SLF4J patch
80+ bump: the ACP surface is identical to 0.16.0.
81+
82+ ### Build
83+
84+ - ** Consumer-scoped SBOMs.** Every module artifact now publishes a CycloneDX 1.6 SBOM (classifier
85+ ` cyclonedx ` ) rooted at that module and covering its compile and runtime scope only, so a
86+ consumer's dependency closure can be checked against what the artifact actually ships.
87+ - The release workflow commits the release version bump before tagging, so each ` vX.Y.Z ` tag now
88+ points at a commit whose POMs carry that version.
89+
90+ ### Changed
91+
92+ - SLF4J 2.0.17 → ** 2.0.18** .
93+
2294## [ 0.16.0] - 2026-08-24
2395
2496Maintenance dependency and release-tooling refresh. No protocol or public API changes: the ACP
@@ -204,5 +276,7 @@ Protocol currency: catching up to ACP spec v0.13.6 (June 2026). Supersedes the n
204276- SLF4J 2.0.16
205277
206278[ 0.9.0 ] : https://github.com/agentclientprotocol/java-sdk/releases/tag/v0.9.0
279+ [ 0.17.0 ] : https://github.com/agentclientprotocol/java-sdk/releases/tag/v0.17.0
280+ [ 0.16.1 ] : https://github.com/agentclientprotocol/java-sdk/releases/tag/v0.16.1
207281[ 0.16.0 ] : https://github.com/agentclientprotocol/java-sdk/releases/tag/v0.16.0
208282[ 0.15.0 ] : https://github.com/agentclientprotocol/java-sdk/releases/tag/v0.15.0
0 commit comments