Critical issues are the ones that lose data, money or trust: writes that half-complete, errors nobody sees, deploys that can't be rolled back and features that look finished but aren't. They hide in the paths you rarely test. Here's where to look before launch, and after every big change.
Last reviewed by the Forge team
What goes wrong
What it costs when this is missed
Critical
Lost or corrupted data
A crash halfway through a multi-step write leaves orders without payments, or accounts without owners.
High
Failures nobody sees
Swallowed errors and missing monitoring mean users find your bugs first, and most of them just leave.
High
Deploys that break
An env variable nobody documented, or a migration that can't be undone, turns a release into an outage.
Medium
Half-built features in production
A TODO on the payment path, or a stub behind a live button, looks fine in a demo and fails for real users.
Common problems
What to look for in your code
Each one: why it hurts, and how to spot it in your own project.
01Multi-step writes without a transaction
If the second write fails, the first one stays. Your data now says something that isn't true.
How to spot it: Find places that write to two or more tables (or call an external service, then write). Check they're in one transaction, or can be safely retried.
Risky
await db.order.create({ data: order });
await db.stock.update({ where: { id }, data: { count: { decrement: 1 } } });
Example findingIssuesHighConfirmed in codeOrder saved even when the stock update failsapp/api/checkout/route.ts:31await db.order.create({ data: order });the stock update on the next line runs outside any transaction
Questions
What counts as a critical issue?
Anything that can lose or expose data, take money wrongly or take the product down, and anything users would hit without you noticing.
We have tests. Isn't that enough?
Tests cover the paths someone thought of. A review finds the paths no test exists for: the timeout nobody set, the write that isn't atomic, the variable nobody documented.
When should we check?
Before launch, before big releases, and after migrations, major refactors or a burst of AI-assisted changes.