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