v10.4.0
thedotmack/claude-memv10.4.0Feb 24, 2026by thedotmack
AI Summary
v10.4.0 is a massive reliability release for claude-mem with 30+ root-cause bug fixes across 10 triage phases. Key improvements include session custom titles for agent attribution, a Chroma toggle for SQLite-only fallback mode, platform hardening for Windows/Cursor IDE/Codex CLI, and significant data integrity fixes including SHA-256 content-hash deduplication.
Key Highlights
- 30+ root-cause bug fixes across 10 triage phases
- Session custom titles for agent attribution with new endpoint (migration 23)
- Chroma toggle (`CLAUDE_MEM_CHROMA_ENABLED`) for SQLite-only fallback mode
- Major platform support improvements: Windows backslash conversion, PowerShell fixes, FTS5 fallback, Cursor IDE and Codex CLI adapters
- Data integrity fixes: SHA-256 content-hash deduplication, project name collision fix, stuck isProcessing reset
New Features
- Session custom titles — agents can set `custom_title` on sessions for attribution (migration 23, new endpoint)
- Chroma toggle — `CLAUDE_MEM_CHROMA_ENABLED` setting allows SQLite-only fallback mode
- Plugin disabled state — early exit check in all hook entry points when plugin is disabled
- Context re-injection guard — `contextInjected` session flag prevents re-injecting context on every UserPromptSubmit turn
- SHA-256 content-hash deduplication on observation INSERT with backfill and index
- PID file mtime guard prevents concurrent restart storms
- Windows support: cmd.exe /c uvx spawn, backslash-to-forward-slash conversion, windowsHide: true, FTS5 runtime probe
- Cursor IDE and Codex CLI adapter improvements with fallbacks and tolerant validation
- /api/logs OOM fix: tail-read replaces full-file readFileSync with 64KB chunks and 10MB cap
- CORS: explicit methods and allowedHeaders configuration
- MCP type coercion for batch endpoints: string-to-array for ids and memorySessionIds
- Stale AbortController fix with 30s timeout and automatic abort/restart
Full Release Notes
## 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_title` on sessions for attribution (migration 23, new endpoint) - **Chroma toggle** — `CLAUDE_MEM_CHROMA_ENABLED` setting 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** — `contextInjected` session 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 returns `parent/basename` - Empty project string guard with cwd-derived fallback - Stuck `isProcessing` reset: 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.write` in `hookCommand()` 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 /c` uvx 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_id` fallbacks, unknown platform tolerance, undefined guard (#744) #### API & Infrastructure - `/api/logs` OOM fix: tail-read replaces full-file `readFileSync` (64KB expanding chunks, 10MB cap, #1203) - CORS: explicit methods and allowedHeaders (#1029) - MCP type coercion for batch endpoints: string-to-array for `ids` and `memorySessionIds` - 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 - `lastGeneratorActivity` timestamp tracking with 30s timeout (#1099) - Stale generator detection + abort + restart in `ensureGeneratorRunning` - `AbortSignal.timeout(30000)` in `deleteSession` prevents indefinite hang ### Installation - `resolveRoot()` replaces hardcoded marketplace path using `CLAUDE_PLUGIN_ROOT` env var (#1128, #1166) - `installCLI()` path correction and `verifyCriticalModules()` 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