park-unroutable-work-never-destroy-it

Guides queue consumers to retry unroutable messages toward a DLQ instead of acking them.

Updated Jul 9, 2026
One-click install
npx skills add https://github.com/shuddl/shuddl-os --skill park-unroutable-work-never-destroy-it-shuddl
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: park-unroutable-work-never-destroy-it
Source: https://github.com/shuddl/shuddl-os/tree/main/.claude/skills/park-unroutable-work-never-destroy-it
Command: npx skills add https://github.com/shuddl/shuddl-os --skill park-unroutable-work-never-destroy-it-shuddl

SYSTEM DOCUMENTATION & REQUIREMENTS

What problem does it solve? Queue consumers that ack messages naming unknown tenants or streams silently destroy recoverable, money-bearing work, and recovery sweeps that share the same static roster never find the loss. This Skill enforces a discipline where only genuinely unparseable messages are acked as poison, while unroutable-but-valid work is retried toward a configured dead-letter queue. ## Core Features & Use Cases - Ack vs retry decision rules: Distinguishes poison (unparseable body, ack with loud log) from unroutable-here (tenant outside a static roster, retry toward the DLQ). - Static roster gap detection: Flags workers whose tenant maps lag sibling services (api workers, sequencer DOs) that serve a wider tenant set. - Recovery sweep audit: Forces any sweep or cron to state its roster, since a sweep enumerating a compile-time tenant list recovers only those tenants. - Use Case: A Biller consumer receives a pod.signed trigger for a newly provisioned pool tenant not yet in its static map; instead of acking and losing the invoice, it calls message.retry() so the trigger lands in the declared dead-letter queue as a recoverable record. ## Quick Start Review this queue consumer's dispatch and error branches and tell me whether any ack path destroys work that a retry toward the DLQ could preserve.

Frequently Asked Questions about park-unroutable-work-never-destroy-it

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
When should a queue consumer ack a message versus retry it?▼

Ack only when redelivery provably cannot fix the message, meaning an unparseable body with no recoverable shape. If the message is valid but names a tenant or stream outside the consumer's roster, call message.retry() so it reaches the dead-letter queue as a recoverable record.

How do I handle unknown tenant messages in a queue consumer?▼

Treat unknown tenant as unroutable-here, not poison, because static rosters lag their producers. Log the mismatch loudly and retry the message toward the configured dead_letter_queue so a recovery process can replay it once the roster catches up.

Why is acking unknown-tenant messages dangerous in multi-tenant systems?▼

Acking destroys the only copy of committed work, such as a pod.signed trigger that should produce an invoice, with no DLQ record and no alarm. The append to the ledger succeeds but the money projection never happens, failing silently.

What are the red flags of a broken dead-letter queue setup?▼

Red flags include message.ack() inside a catch branch, max_retries and dead_letter_queue configured with zero retry() call sites, comments justifying acks with future deliverables that already shipped, and recovery sweeps iterating a compile-time tenant constant.

When is it correct to ack a poison message?▼

Ack is correct only for genuinely unparseable bodies where no shape means no tenant and nothing to recover. Pair the ack with a loud error log so the loss is visible rather than silent.