What problem does it solve? Async JavaScript and TypeScript code is where LLM-generated code most often goes wrong: defensive try/catch on every function, returning null instead of throwing, misusing Promise.all when partial failure is acceptable, and building timeouts with Promise.race that leak resources. This Skill encodes the correct fail-fast patterns so async code propagates errors to the right boundary instead of silently swallowing them. ## Core Features & Use Cases - Error propagation rules: Throw typed errors instead of returning null, catch only at boundaries (user-action handlers, transformations, fan-in aggregators), and never catch-and-ignore. - Promise composition decision tree: Choose between Promise.all, allSettled, race, and any, and avoid common traps like await inside .map() or async .forEach(). - Timeouts and cancellation: Use AbortSignal.timeout() and propagate TanStack Query's signal so cancellation actually cancels the underlying fetch. - Use Case: When writing a multi-source chat search where one source timing out must not blank the whole response, apply the Promise.allSettled pattern with per-source failure logging. ## Quick Start Review my async data-fetching code and fix any incorrect try/catch placement, Promise composition, or missing AbortSignal propagation.