v10.4.0 — Stability & Platform Hardening
Massive reliability release: 30+ root-cause bug fixes across 10 triage phases, plus new features for agent attribution, Chroma control, and broader platform support.
New Features
- Session custom titles — Agents can now set
custom_titleon sessions for attribution (migration 23, new endpoint) - Chroma toggle —
CLAUDE_MEM_CHROMA_ENABLEDsetting allows SQLite-only fallback mode (#707) - Plugin disabled state — Early exit check in all hook entry points when plugin is disabled (#781)
- Context re-injection guard —
contextInjectedsession flag prevents re-injecting context on every UserPromptSubmit turn (#1079)
Bug Fixes
Data Integrity
- SHA-256 content-hash deduplication on observation INSERT (migration 22 with backfill + index)
- Project name collision fix:
getCurrentProjectName()now returnsparent/basename - Empty project string guard with cwd-derived fallback
- Stuck
isProcessingreset: pending work older than 5 minutes auto-clears
ChromaDB
- Python version pinning in uvx args for both local and remote mode (#1196, #1206, #1208)
- Windows backslash-to-forward-slash path conversion for
--data-dir(#1199) - Metadata sanitization: filter null/undefined/empty values in
addDocuments()(#1183, #1188) - Transport error auto-reconnect in
callTool()(#1162) - Stale transport retry with transparent reconnect (#1131)
Hook Lifecycle
- Suppress
process.stderr.writeinhookCommand()to prevent diagnostic output showing as error UI (#1181) - Route all
console.error()through logger instead of stderr - Verified all 7 handlers return
suppressOutput: true(#598, #784)
Worker Lifecycle
- PID file mtime guard prevents concurrent restart storms (#1145)
getInstalledPluginVersion()ENOENT/EBUSY handling (#1042)
SQLite Migrations
- Schema initialization always creates core tables via
CREATE TABLE IF NOT EXISTS - Migrations 5-7 check actual DB state instead of version tracking (fixes version collision between old/new migration systems, #979)
- Crash-safe temp table rebuilds
Platform Support
- Windows:
cmd.exe /cuvx spawn, PowerShell$_elimination with WQL filtering,windowsHide: true, FTS5 runtime probe with fallback (#1190, #1192, #1199, #1024, #1062, #1048, #791) - Cursor IDE: Adapter field fallbacks, tolerant session-init validation (#838, #1049)
- Codex CLI:
session_idfallbacks, unknown platform tolerance, undefined guard (#744)
API & Infrastructure
/api/logsOOM fix: tail-read replaces full-filereadFileSync(64KB expanding chunks, 10MB cap, #1203)- CORS: explicit methods and allowedHeaders (#1029)
- MCP type coercion for batch endpoints: string-to-array for
idsandmemorySessionIds - Defensive observation error handling returns 200 on recoverable errors instead of 500
.git/directory write guard on all 4 CLAUDE.md/AGENTS.md write sites (#1165)
Stale AbortController Fix
lastGeneratorActivitytimestamp tracking with 30s timeout (#1099)- Stale generator detection + abort + restart in
ensureGeneratorRunning AbortSignal.timeout(30000)indeleteSessionprevents indefinite hang
Installation
resolveRoot()replaces hardcoded marketplace path usingCLAUDE_PLUGIN_ROOTenv var (#1128, #1166)installCLI()path correction andverifyCriticalModules()post-install check- Build-time distribution verification for skills, hooks, and plugin manifest (#1187)
Testing
- 50+ new tests across hook lifecycle, context re-injection, plugin distribution, migration runner, data integrity, stale abort controller, logs tail-read, CORS, MCP type coercion, and smart-install
- 68 files changed, ~4200 insertions, ~900 deletions