diff --git a/CHANGELOG.md b/CHANGELOG.md index 7086bd2..9a27431 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,26 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.2.4] - 2026-06-18 + +### Fixed + +- **A late first transcript flush under MCP/tool load no longer surfaces a + delivered turn as lost.** When MCP servers and tool schemas load under + contention, claude defers a fresh session's first `.jsonl` write by 3–9 s — + past the fixed anchor window. `send()` then returned the `DELIVERY_UNCONFIRMED` + sentinel, and a reader that saw `wait()→completed` still read an empty + `messagesSince("0")` / `turnComplete === false`, even though the turn had + landed. claudemux now tolerates the late flush at both seams against one shared + budget: the write-side cursor anchor keeps polling while the transcript file is + addressable-but-absent, and a read-side settle waits the first records out + once. A present / fast-flush session is untouched (the anchor keeps its exact + window; the settle returns on the first poll). The settle is bounded on both + success and exhaustion, so a never-flushing session (a crashed/slow resume) is + never re-stalled. Verified live (claude 2.1.181): 1/20 → 0/20 sentinels under + 20 concurrent heavy tool-MCP sessions. See + [ADR 0009](docs/decisions/0009-tolerate-late-first-transcript-flush.md). + ## [0.2.3] - 2026-06-09 ### Fixed diff --git a/package.json b/package.json index 08b5bca..3f683b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@wastedcode/claudemux", - "version": "0.2.3", + "version": "0.2.4", "publishConfig": { "access": "public" },