Error Rosetta
Universal translator for cryptic error messages, stack traces, and log output. Takes the hieroglyphics your toolchain throws at you and produces plain-langua...
Description
name: error-rosetta version: 1.0.0 description: > Universal translator for cryptic error messages, stack traces, and log output. Takes the hieroglyphics your toolchain throws at you and produces plain-language diagnosis, root cause, and the exact fix — in your codebase, not some generic Stack Overflow answer from 2019. author: J. DeVere Cooley category: everyday-tools tags:
- error-handling
- debugging
- translation
- daily-driver
metadata:
openclaw:
emoji: "📜"
os: ["darwin", "linux", "win32"]
cost: free
requires_api: false
tags:
- zero-dependency
- everyday
- debugging
Error Rosetta
"The Rosetta Stone let scholars read Egyptian hieroglyphics by providing the same text in three languages. Your compiler already speaks three languages — the error code, the stack trace, and the actual problem. It just refuses to use the third one."
What It Does
You see this:
TypeError: Cannot read properties of undefined (reading 'map')
at UserList (webpack-internal:///./src/components/UserList.tsx:14:23)
at renderWithHooks (webpack-internal:///./node_modules/react-dom/cjs/react-dom.development.js:14985:18)
at mountIndeterminateComponent (webpack-internal:///./node_modules/react-dom/cjs/react-dom.development.js:17811:13)
Error Rosetta gives you this:
PLAIN ENGLISH: Your UserList component is trying to call .map() on
something that doesn't exist yet. On line 14, you're accessing a
property that is undefined — probably because the data hasn't loaded
from the API when the component first renders.
ROOT CAUSE: src/components/UserList.tsx:14 accesses `users.map()`
but `users` is undefined on first render. Your useEffect that fetches
users hasn't completed yet.
FIX: Add a guard before mapping:
{users?.map(...)} or {users && users.map(...)}
Better: Initialize your state with an empty array:
const [users, setUsers] = useState([]);
The Translation Layers
Layer 1: Error Identification
Every error message, no matter how cryptic, contains these decodable components:
| Component | What It Tells You | Example |
|---|---|---|
| Error Type | Category of problem | TypeError, ENOENT, HTTP 422, SegFault |
| Error Message | What went wrong (usually poorly) | "Cannot read properties of undefined" |
| Location | Where it happened | File path + line number |
| Stack Trace | How it got there | Call chain from entry point to error |
| Error Code | Machine-readable identifier | E0308, TS2345, EPERM |
Layer 2: Context Enrichment
Raw error → enriched with your codebase context:
ENRICHMENT PROCESS:
├── Read the file + line referenced in the error
├── Understand what the code is TRYING to do (not just what failed)
├── Check the data flow: where does the undefined/null/wrong-type value come from?
├── Check recent changes: did a recent commit introduce this?
├── Check patterns: does this error match a known pattern for this framework/language?
└── Check siblings: are similar errors happening elsewhere?
Layer 3: Plain Language Translation
The enriched error is translated into three outputs:
1. WHAT HAPPENED (one sentence, no jargon)
"Your code tried to use a list of users before the list was loaded."
2. WHY IT HAPPENED (root cause, in your codebase)
"useState(undefined) + useEffect(async fetch) = undefined on first render."
3. HOW TO FIX IT (specific to your code, not generic advice)
"Line 8: Change useState() to useState([])"
Error Pattern Library
JavaScript/TypeScript
| Cryptic Error | Plain Translation | Common Fix |
|---|---|---|
Cannot read properties of undefined (reading 'x') |
You're accessing .x on something that doesn't exist |
Add optional chaining ?.x or check for null/undefined first |
x is not a function |
You're calling something that isn't callable — it's a value, not a function | Check: did you forget () on a prior call? Is the import correct? |
Maximum call stack size exceeded |
Infinite recursion — a function calls itself forever | Find the recursive call missing its base case |
Cannot assign to 'x' because it is a read-only property |
You're mutating something that shouldn't be mutated | Use spread/Object.assign to create a new object instead |
Module not found: Can't resolve 'x' |
Import path is wrong or package isn't installed | Check spelling, check node_modules, run npm install |
TS2345: Argument of type 'X' is not assignable to parameter of type 'Y' |
Type mismatch — you're passing the wrong shape of data | Check what the function expects vs. what you're giving it |
Python
| Cryptic Error | Plain Translation | Common Fix |
|---|---|---|
AttributeError: 'NoneType' object has no attribute 'x' |
A function returned None when you expected an object | The function upstream returned nothing — check its return paths |
IndentationError: unexpected indent |
Whitespace is wrong (tabs vs. spaces or wrong level) | Fix indentation — use consistent spaces |
RecursionError: maximum recursion depth exceeded |
Infinite recursion | Find the missing base case in your recursive function |
KeyError: 'x' |
You're accessing a dictionary key that doesn't exist | Use .get('x', default) or check if 'x' in dict first |
ImportError: cannot import name 'x' from 'y' |
The thing you're importing doesn't exist in that module | Check spelling, check the module's __init__.py, check version |
Rust
| Cryptic Error | Plain Translation | Common Fix |
|---|---|---|
E0382: borrow of moved value: 'x' |
You used a value after giving ownership to something else | Clone it, use a reference, or restructure to avoid the move |
E0308: mismatched types |
Expected one type, got another | Check your function signatures and return types |
E0502: cannot borrow 'x' as mutable because it is also borrowed as immutable |
You have a read reference and are trying to write | Restructure to not hold both borrows simultaneously |
E0106: missing lifetime specifier |
Rust can't figure out how long a reference should live | Add explicit lifetime annotations |
Go
| Cryptic Error | Plain Translation | Common Fix |
|---|---|---|
cannot use x (type Y) as type Z |
Type mismatch in assignment or function call | Check the expected type and convert |
undefined: x |
Using a name that doesn't exist in this scope | Check import, check spelling, check scope |
fatal error: all goroutines are asleep - deadlock! |
Every goroutine is waiting for something and nothing can proceed | Check channel operations — something isn't sending or receiving |
panic: runtime error: index out of range |
Array/slice access beyond its length | Check bounds before accessing |
System/OS Errors
| Cryptic Error | Plain Translation | Common Fix |
|---|---|---|
ENOENT: no such file or directory |
File or directory doesn't exist at that path | Check the path — typo? Missing directory? Relative vs absolute? |
EACCES: permission denied |
You don't have permission to access this | Check file permissions, check if you need sudo/admin |
EADDRINUSE: address already in use |
Another process is already using that port | Kill the other process or use a different port |
ENOMEM: not enough memory |
System is out of memory | Check for memory leaks, increase available memory, or reduce consumption |
ETIMEDOUT: connection timed out |
The remote host didn't respond in time | Check network, check if the service is running, check firewall |
HTTP Errors
| Code | What The Server Actually Means | Developer Action |
|---|---|---|
400 Bad Request |
"Your request is malformed — I can't even parse it" | Check request body format, content-type header, required fields |
401 Unauthorized |
"Who are you? I don't see valid credentials" | Check auth token, check if it's expired, check the auth header format |
403 Forbidden |
"I know who you are. You're not allowed" | Check permissions/roles, check if the resource requires different access |
404 Not Found |
"That URL doesn't point to anything" | Check the URL path, check if the resource exists, check API version |
409 Conflict |
"This conflicts with the current state" | Check for duplicate resources, check version/ETag conflicts |
422 Unprocessable Entity |
"I can read your request but the data doesn't make sense" | Check validation rules, check field values against API docs |
429 Too Many Requests |
"Slow down. You're hitting the rate limit" | Add backoff/retry logic, check rate limit headers |
500 Internal Server Error |
"Something broke on my end, not your fault" | Check server logs, it's a bug in the backend |
502 Bad Gateway |
"I'm a proxy and the server behind me is broken" | Check the upstream service, check proxy config |
503 Service Unavailable |
"I'm overloaded or doing maintenance" | Retry with backoff, check status page |
The Translation Process
INPUT: Error message, stack trace, or log output (paste the whole thing)
Phase 1: PARSE
├── Identify error type, code, message, and location
├── Extract stack trace frames
├── Identify the framework/language/tool that produced the error
└── Separate signal from noise (framework internals vs. your code)
Phase 2: LOCATE
├── Find YOUR code in the stack trace (skip framework frames)
├── Read the file and line where the error originated
├── Read the surrounding context (function, class, module)
└── Trace the data flow to the error point
Phase 3: DIAGNOSE
├── Match against known error patterns for this language/framework
├── Analyze the specific code context (not generic advice)
├── Identify the root cause (not the symptom)
├── Check: is this a new bug or a recurring pattern?
└── Check: did a recent change introduce this?
Phase 4: PRESCRIBE
├── Plain English explanation (one sentence)
├── Root cause in your code (specific file, line, variable)
├── Exact fix (code change, not concept)
├── Prevention (how to avoid this class of error in the future)
└── Confidence level (how certain is this diagnosis)
Output Format
╔══════════════════════════════════════════════════════════════╗
║ ERROR ROSETTA ║
╠══════════════════════════════════════════════════════════════╣
║ ║
║ ERROR: TypeError: Cannot read properties of undefined ║
║ (reading 'map') ║
║ ║
║ TRANSLATION: ║
║ Your UserList component renders before the API response ║
║ arrives. On the first render, `users` is undefined, and ║
║ you're calling .map() on undefined. ║
║ ║
║ ROOT CAUSE: ║
║ src/components/UserList.tsx:8 ║
║ const [users, setUsers] = useState(); ← initialized as ║
║ undefined, not as empty array ║
║ ║
║ FIX: ║
║ Line 8: useState() → useState([]) ║
║ ║
║ PREVENTION: ║
║ Always initialize state with the correct empty type: ║
║ Arrays: useState([]) ║
║ Objects: useState(null) with explicit null check ║
║ Strings: useState('') ║
║ ║
║ CONFIDENCE: 95% (matches React uninitialized-state pattern) ║
╚══════════════════════════════════════════════════════════════╝
When to Invoke
- Every time you see an error you don't immediately understand. That's the whole point.
- When onboarding in a new language or framework (the error messages are a new dialect)
- When the error is in a dependency's code and you need to understand what YOU did wrong
- When debugging a CI failure with a wall of log output
- When a user reports an error and you need to decode it fast
Why It Matters
Developers spend 35-50% of their time debugging. A significant portion of that time is spent understanding what the error message is telling them — not fixing the actual bug. The faster you decode the message, the faster you fix the problem.
Error Rosetta doesn't fix bugs. It removes the translation step between seeing the error and understanding the error. Everything after that is just typing.
Zero external dependencies. Zero API calls. Pure pattern matching and code analysis.
Reviews (0)
No reviews yet. Be the first to review!
Comments (0)
No comments yet. Be the first to share your thoughts!