{"version":"1.1.0","schema":"https://oneagentaday.com/api/schema.json","agent":{"title":"Error Message Poet","slug":"error-message-poet","date":"2026-09-25","issue":21,"category":"fun","categoryLabel":"Fun & Weird","tags":["errors","humor","ux"],"difficulty":"easy","runtimes":["ChatGPT","Claude","Gemini"],"excerpt":"Paste a harsh error. Get a version a person can act on, a short UI string, and a joke you can delete without losing the fix.","problem":"The error tells the developer the stack is unhappy and tells the user nothing about what to do next.","videoUrl":null,"url":"https://oneagentaday.com/agents/error-message-poet","apiUrl":"https://oneagentaday.com/api/agents/error-message-poet.json","promptUrl":"https://oneagentaday.com/agents/error-message-poet/prompt.txt","configUrl":null,"configFilename":null,"license":"CC-BY-4.0","howItWorks":"The poet returns three strings so the joke cannot hold the fix hostage. You paste the harsh error, who sees it, and what they can do. The plain version is the meaning. The UI string is short enough to ship. The joke can leave.\n\nThe joke may tease the software. It may not tease the person, their money, or a group. Internal ids stay in the log. A shopper does not get a stack trace wearing a costume.\n\nShip the short string. If you love the joke, put it where a frustrated person will still see the action in the same glance.","steps":[{"name":"Paste the current error and the facts","text":"Include who sees the string and what they can actually do. Paste the log line separately if it must stay out of the interface."},{"name":"Paste the prompt","text":"You get three layers: the plain explanation, the short UI string, and a joke. The joke is optional. The UI string is the one you ship."},{"name":"Ship the short string","text":"Put the UI string in the product. Keep the plain explanation in the docs or the log-side comment. Leave the joke out if it softens the action."},{"name":"Read it as the shopper","text":"If the joke names their money, their intelligence, or a group, delete it. The plain string still tells them to reload."}],"demo":[{"second":0,"label":"The old string","detail":"Invariant violation, code R3. A shopper cannot act on that. The log already has the order and the totals."},{"second":8,"label":"The plain version","detail":"The order total does not match the cart. Reload the order. If it persists, the reload is the handoff, not a second insult."},{"second":16,"label":"The UI string","detail":"'This total does not match your cart. Reload the order and try again.' Under 90 characters."},{"second":24,"label":"The joke, optional","detail":"A line about the cart and the typed number disagreeing. The order id stays in the log, not in the joke."}],"sampleInput":"Current UI string: \"Invariant violation: refund total mismatch (code R3).\"\nWhat is true: the client sent a total that does not match the cart. The user can reload the order. They cannot fix a database invariant. The audience of this string is the shopper, not the on-call engineer.\nLog line, already exists, do not put it in the UI: R3 order=1844 expected=40 got=1.\nDo not joke about the shopper's money in a cruel way.","prompt":"You rewrite one error for the human who has to see it. You always provide a plain version so a joke cannot be the only instruction.\n\nINPUTS\n- Current string.\n- Audience: shopper, teammate, or developer.\n- What they can do next.\n- Facts that must stay in the log and out of the UI.\n\nRULES\n- Three outputs: plain, UI, joke.\n- The UI string is under 90 characters, names the next action, and contains no stack, no internal code unless the audience is a developer, and no secret.\n- The plain version can be longer and still has the action.\n- The joke may tease the software. It may not tease the person's body, intelligence, money, identity, or family.\n- If the joke needs a cruelty to work, replace it with: \"The joke did not survive the rule. Ship the UI string.\"\n- Do not invent a cause beyond the facts they gave.\n\nOUTPUT\n## Plain\n## UI\n## Joke\n## Kept in the log\nFacts you refused to put in the UI.","config":null}}