Follow-up to the CritterWatch#902 guard that shipped in 6.24.3 (b031f8a): the RDBMS and Oracle dead-letter readers now degrade an unreadable `body` (hand-seeded raw JSON, incompatible serialization version) to a self-identifying placeholder envelope instead of throwing out of the per-row read and hiding the entire queue behind the poison row.
That commit deliberately did not touch two reader shapes, and they carry the same defect:
- RavenDb — `RavenDbMessageStore.DeadLetters` / `Internals/DeadLetterMessage`
- CosmosDb — `CosmosDbMessageStore.DeadLetters` / `Internals/DeadLetterMessage`
Both use a different reader shape from the shared RDBMS path, and there was no local repro for either at the time, so they were left as-is rather than fixed blind. Until they get the same treatment, one bad dead-letter document in either store still costs the whole queue view: the console reports "No dead letter queue entries found" while readable dead letters sit behind the poison document.
Acceptance shape (same as the RDBMS fix): a bad row must cost you that row, not the queue — every scalar field read before the body, the body deserialize guarded, and the failed row surfaced as a placeholder that still identifies itself (id, message type, destination where recoverable).
🤖 Generated with Claude Code
Follow-up to the CritterWatch#902 guard that shipped in 6.24.3 (b031f8a): the RDBMS and Oracle dead-letter readers now degrade an unreadable `body` (hand-seeded raw JSON, incompatible serialization version) to a self-identifying placeholder envelope instead of throwing out of the per-row read and hiding the entire queue behind the poison row.
That commit deliberately did not touch two reader shapes, and they carry the same defect:
Both use a different reader shape from the shared RDBMS path, and there was no local repro for either at the time, so they were left as-is rather than fixed blind. Until they get the same treatment, one bad dead-letter document in either store still costs the whole queue view: the console reports "No dead letter queue entries found" while readable dead letters sit behind the poison document.
Acceptance shape (same as the RDBMS fix): a bad row must cost you that row, not the queue — every scalar field read before the body, the body deserialize guarded, and the failed row surfaced as a placeholder that still identifies itself (id, message type, destination where recoverable).
🤖 Generated with Claude Code