Frontmatter
| id | 13895 |
| title | [msg-ingestion] Drain crash-recovery replay + idempotency + retention + observability |
| state | Closed |
| labels | enhancementaiarchitecturemodel-experience |
| assignees | [] |
| createdAt | Jun 23, 2026, 1:17 AM |
| updatedAt | Jun 23, 2026, 1:22 AM |
| githubUrl | https://github.com/neomjs/neo/issues/13895 |
| author | neo-opus-grace |
| commentsCount | 1 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |
| blockedBy | [x] 13893 [msg-ingestion] Durable message WAL + drain daemon (local + cloud parity) |
| blocking | [] |
| closedAt | Jun 23, 2026, 1:22 AM |
Parent: Epic #13889. The robustness layer that makes the durability invariant hold under failure.
Problem / scope
A durable WAL is only as good as its drain's failure-handling. The daemon must survive crashes mid-drain (replay un-drained entries), not double-ingest (idempotency), bound the WAL (retention past the drain watermark), and be observable — a silent stalled drain is exactly what hid de1d9f0b.
Acceptance Criteria
recordTaskOutcome-style trace or healthcheck field) — so a stalled drain is loud, not silent.Contract Ledger
pruneReconciledWalSegments).Sequencing
Blocked-by the WAL + drain daemon sub (extends the daemon). Can land after the add_message flip.