v12.5.0
thedotmack/claude-memv12.5.0May 2, 2026by thedotmack
AI Summary
This release (v12.5.0) is a major simplification of the observation pipeline that removes per-message retry counters to eliminate silent data loss. The parser is now binary (valid/invalid), and the ResponseProcessor has been streamlined to only two branches, resulting in a net reduction of 181 lines of code.
Key Highlights
- Removed per-message retry counter - AI parseable response is now the only success signal, eliminating silent data loss after 3 retries
- Parser simplified to binary `{ valid: true, observations, summary } | { valid: false }` - removed kind/skipped enum dispatch
- PendingMessageStore reduced from 226 to 165 lines, removing markFailed, transitionMessagesTo, confirmProcessed, and other dead methods
- Schema migration v31+v32 drops dead columns (retry_count, failed_at_epoch, completed_at_epoch, worker_pid) and reduces status enum to 'pending' | 'processing'
- Removed processingMessageIds tracking from Claude, Gemini, and OpenRouter providers
Breaking Changes
- Status enum reduced to 'pending' | 'processing' - 'processed' and 'failed' states removed (were unreachable)
- Database schema changes require auto-migration on worker startup (handled automatically)
Full Release Notes
## Highlights
**Observation pipeline cleanup — kill the per-message retry counter.** The AI's parseable response is the only success signal; any other response (unparseable, empty, transport error) is a no-op. No more silent data loss after 3 retries.
## What changed
- **Parser:** collapsed to binary `{ valid: true, observations, summary } | { valid: false }`. No more `kind`/`skipped` enum dispatch in callers.
- **ResponseProcessor:** two branches only — parseable → store + clear pending → broadcast; not parseable → reset claimed-but-unprocessed messages to pending. Removed per-message FIFO popping and the summarize-special-case best-effort confirm.
- **PendingMessageStore:** 226 → 165 lines. Removed `markFailed` (the retry counter that silently dropped data after 3 attempts), `transitionMessagesTo`, `confirmProcessed`, `clearFailedOlderThan`, plus four other dead methods.
- **Provider cleanup:** removed `processingMessageIds` tracking from Claude, Gemini, OpenRouter providers. The session-scoped clear handles the success path; no per-message in-flight tracking needed.
- **GeneratorExitHandler:** drain-in-flight loop deleted; hard-stop / restart-guard paths now just clear pending for the session.
- **Schema migration v31 + v32:** dropped four dead columns from `pending_messages` — `retry_count`, `failed_at_epoch`, `completed_at_epoch`, `worker_pid`. Status enum reduced to `'pending' | 'processing'` (the unreachable `'processed'` and `'failed'` are gone).
## Bug fixes / polish
- **`SessionQueueProcessor`:** removed two arbitrary 1-second recovery sleeps after error in `claimNextMessage`/`waitForMessage`; let the iterator end cleanly so `GeneratorExitHandler` can restart it.
- **`Server.ts` + `SettingsRoutes.ts`:** unified four magic-number `setTimeout` exit-flush patterns (100ms × 2, 1000ms × 2) into one `flushResponseThen` helper using `res.on('finish', ...)`.
- **PR review feedback (21+ threads):** install.ts argument fixes, settings cache TTL, Dockerfile login-banner sourcing, docs port-model + Node version updates, regex whitespace fix, Date.UTC for year-mismatch test, sync-marketplace port range guard, banner inflate fail-open, version-bump arg validation.
## Net diff
`-181 lines` (worker-service.cjs unaffected; total source lines down).
## Migration
Existing databases auto-migrate on worker startup (schema v31 + v32 drop the dead columns). No user action needed.