GoalGo straight to the right module when something goes wrong in production, without reading the whole guide.
Use this page as a reverse index. Find the symptom, read the likely cause and go to the module. Modules that aren’t written yet appear without a link.
| Symptom |
Likely cause |
Where to read |
| Fast locally, slow in production |
Network latency multiplied by many database round trips (N+1) |
1.3, M11 |
| A route gets slower as the table grows |
Missing index, large OFFSET, SELECT * |
M10, M11 |
| Every request stalls at the same moment |
Event loop blocked by CPU work or synchronous I/O |
M06 |
| Slow at peak times, fine the rest of the day |
Exhausted connection pool, no caching |
M25, M26 |
| Great p50, terrible p99 |
Contention, GC, a slow external dependency |
M26, M17 |
| Page loads slowly even though the API is fast |
Large bundle, wrong rendering strategy, images |
M08 |
| Symptom |
Likely cause |
Where to read |
| Duplicate records (charge, email, order) |
A non-idempotent operation being repeated |
2.2, 2.3 |
| A balance or counter is “sometimes” wrong |
Race condition (read, compute, write) |
1.3, M10 |
| User sees old data right after saving |
Cache without invalidation, lagging replica |
M25, M27 |
| Data disappears after a deploy |
State kept in process memory |
2.1 |
| A migration locked the table in production |
ALTER TABLE taking a heavy lock |
M12 |
| Webhook processed twice or out of order |
At-least-once delivery treated as exactly-once |
M24, M28 |
| Symptom |
Likely cause |
Where to read |
| An external service goes down and takes your app with it |
No timeout, unbounded retries, no circuit breaker |
M17 |
| Worked in staging, broke in production |
Environment differences (config, data, scale) |
1.2 |
| A deploy broke and you can’t go back |
No rollback strategy, irreversible migration |
M22, M12 |
| The domain stopped resolving after a change |
DNS and TTL |
M14 |
| A queue keeps growing |
Slow consumers, no backpressure |
M24 |
| The build broke “on its own” |
Dependency without a pinned version |
M09 |
| Symptom |
Likely cause |
Where to read |
| A user sees someone else’s data by changing the ID in the URL |
Missing per-resource authorization (IDOR) |
M16 |
| An API key showed up on GitHub or in the bundle |
Secret in the wrong place |
M16 |
| An npm package behaves strangely |
Supply chain attack |
M09 |
| A user manipulates your app’s LLM |
Prompt injection |
M33 |
| Symptom |
Likely cause |
Where to read |
| A production error that won’t reproduce locally |
No structured logs or tracing |
M19, M34 |
| You find out it’s down when customers complain |
No alerts or SLOs |
M19, M35 |
| A bug showed up and nobody knows since when |
History not put to use |
M04 (git bisect) |
| A simple change breaks something far away |
Coupling, wrong abstraction, missing tests |
3.3, M18, M23 |