So it's 4:45 PM. You have a meeting at 5. You have fifty prompts that returned garbage today. You have ten minutes. What do you do?
You don't fix all of them. You don't even fix half. You triage. Because the difference between a prompt that's 20% correct and one that's 80% correct often comes down to one small edit — but you have to know which one to touch. This article is that triage system. No fluff. Just a sequence of hard choices.
Who Needs This and What Goes Wrong Without It
The solo developer drowning in broken outputs
You wrote fifty recipes yesterday. Forty-seven of them returned garbage—hallucinated metadata, malformed JSON, or that maddening polite refusal that looks like an answer but isn't. The clock reads 6:47 PM. Your standup is tomorrow at 9 AM. Without a triage system, you do what every solo dev does: you pick the nearest broken recipe—the one whose failure you can almost see the fix for—and sink twenty minutes patching it. Meanwhile, five recipes upstream, a silent root cause is corrupting every downstream pipeline. You fix one leaf. The whole tree stays rotten. I have watched this exact ritual burn three weeks in a row for a friend building a document-extraction bot. The fix that felt productive? It wasn't. The thing that needed fixing—a broken system-prompt delimiter—sat untouched for fourteen days.
The product manager who can't ship because prompts keep failing
Your team of four engineers just shipped a new summarization feature. The demo works. The customer beta? Thirty-percent failure rate—hallucinated numbers, attached the wrong context block. Everybody starts guessing. One engineer rewrites the summarization instruction; another tweaks the output schema; a third adjusts temperature. Three fixes, zero coordination. The product manager burns two hours in a war-room Slack channel and still can't tell leadership which fix landed or whether the root cause is even touched. That sounds fine until the CEO asks "Is it fixed?" and the only honest answer is "We don't know." Wrong order. No system. The catch is that each person felt they were addressing the most urgent problem. None of them were.
What usually breaks first is the unglamorous stuff: a prompt whose context window bleeds, a JSON schema that drifted between API versions, a system instruction that silently truncates because somebody added eighteen examples. These don't look dramatic. They look like yesterday's work. So we skip them. We fix the dramatic failure—the one that screams in red—and ignore the quiet seepage that kills accuracy across all fifty recipes. The painful truth: most of that ten minutes should go to the boring failure pattern, not the spectacular one.
“We spent four sprints polishing individual prompts before realizing every single one shared a corrupted top-level instruction. Four sprints. One line fix.”
— lead ML engineer, fintech risk-analysis team
What happens when you fix the wrong prompt first
The cost isn't just the wasted ten minutes. It's the cascading misdiagnosis. You fix recipe #23—a summarization prompt that misattributes speakers. Feels good. But recipe #23 was failing because the chunking function upstream clipped every third sentence. Your patch doesn't touch that chunker. The summarization works now? Barely—it just got lucky on this one test. You ship it. Friday night, the production monitor goes red. The chunker fault hasn't disappeared; it just moved downstream, now corrupting two features instead of one. The researcher running batch experiments with no time to debug knows this rhythm intimately. They look at the failure dashboard, see fifty red rows, and grab the top one by instinct. That's a trap. The top failure is often a symptom. The fifth one down—the one with the weird intermittent pattern—that's often the root. Most teams skip this: they never check whether two failures share one cause. Single cause, multiple symptoms. Fix the symptom, leave the cause festering. Not yet. That hurts. How do you spot the actual root in a stack of broken outputs? You don't guess. You run the four-filter workflow—but first, you need to know what not to touch.
Prerequisites: What You Need Before You Triage
Defining 'failing prompt' — wrong output, no output, or inconsistent output?
You can't triage what you haven't defined. Most teams I see lump everything into 'it doesn't work' and then wonder why ten minutes disappear into nothing. Wrong output — that's the sneakiest. The LLM gives you a grammatically perfect refusal to your perfectly polite request, or it fabricates a plausible-sounding date that happens to be a Tuesday when the data says Thursday. That's a failure, even if the JSON parses cleanly. No output? Easier to catch but harder to diagnose — maybe a token limit clipped the response, maybe the model silently rejected a safety filter you didn't know existed. Inconsistent output is the one that will waste your whole ten minutes if you let it: sometimes the same prompt works, sometimes it hallucinates, sometimes it returns 'I can't answer that.' You need to pick one failure mode per triage session. The catch is — picking wrong means you chase ghosts. Define the failure before you open the logs.
The one metric that matters: consistency over accuracy
Accuracy is a trap when you have fifty broken recipes. A prompt that nails the output nine times out of ten but explodes on the tenth is a prompt you can't ship. Consistency — does the same input produce the same output structure, the same tone, the same content boundaries across five runs? — that's your north star. I once watched a team burn two hours tuning for perfect accuracy on edge cases while their core path returned gibberish every third call. That hurts. Trade-off: you will sometimes leave a perfectly accurate prompt in the backlog because it fails consistently enough to block the pipeline. That's fine. Fix the brittle ones first. The mental model here is code bugs: a crash every time is easier to debug than a crash only when the phase of the moon is wrong.
Reality check: name the intelligence owner or stop.
Why you need logs — even bad logs — and how to get them in 30 seconds
No logs, no triage. Period. The tricky part is that most people think 'I don't have logs' and stop there. You have logs. The browser console captures console.log automatically. If you're hitting an API, wrap each call in a simple console.dir({prompt, response, latency, timestamp}). That takes 30 seconds to add and saves you ten minutes of guessing. Honestly — I've debugged fifty broken recipes with nothing but a browser's 'Copy as cURL' and a notes app. Even bad logs — logs missing the system prompt, logs that truncate responses — give you pattern evidence. 'Response length always spikes before error' or 'All failures happen after the user mentions dates'. That's gold. Most teams skip this because they assume logging means infrastructure. It doesn't. A screenshot of the output panel counts if that's all you have. Start with what exists, then improve.
'We spent a week rewriting prompts until someone realized the failure pattern only appeared on mobile Safari. The logs — clipboard copies from a console — showed it in twenty minutes.'
— Senior engineer, internal postmortem
The mental model: treat prompts like code bugs
You wouldn't fix a null pointer exception by reading the error message once and rewriting the whole function. Treat prompts the same way. A failing output is a stack trace — it tells you where the logic broke, not why. The prerequisites you need before triage are: one concrete input that triggers the failure, one concrete output that shows the failure, and a guess at what changed. Because something always changed — a model update, a slightly different user message, a hidden character in the context window. That sounds obvious, but when you have fifty broken recipes, the instinct is to batch-refactor them all at once. Don't. Pick one recipe, one input, one output. Reproduce it. Then triage. Anything else is gambling with your ten minutes.
Core Workflow: Four Filters in Ten Minutes
Filter 1: Eliminate obvious errors — typos, formatting, API-specific bugs
Open your list of fifty failing recipes and scan for the ones that shouldn't have been tested at all. A missing closing brace. A template variable that got pasted as {variable_name} instead of {{variable_name}}. I once spent forty-five minutes debugging a translation prompt only to find a stray semicolon at line 12 — the model read it as literal text and obligingly printed it before every output. That hurts. Set a two-minute timer and strip every recipe where a human eyeball can spot the breakage without running the prompt. Wrong order? Out. API endpoint that requires gpt-4-turbo but you're sending gpt-3.5-turbo? Trash it. Filter one drops about 15–20% of your pile. The remaining failures are genuine problems — worth your next eight minutes.
Filter 2: Sort by cost — time, tokens, and emotional energy
Now look at what's left and ask one merciless question: How expensive is this failure? A recipe that burns 4,000 tokens every time it runs and takes ninety seconds to complete — that's costing you in API credits and iteration speed. But emotional cost matters more than most engineers admit. Not yet on your triage sheet? It should be. A prompt that fails in the first five seconds is easy to retry; a prompt that hallucinates subtly two paragraphs in forces you to read every output line by line. That kind of failure drains your ten-minute window fast. Rank the remaining recipes by total blast radius: token burn plus your own mental fatigue. The ones that fail fast and cheap go to the bottom of the stack. The expensive, time-sucking failures rise to the top.
„A prompt that fails silently costs you three debugging sessions. A prompt that fails loudly costs you one.“
— internal team note after a particularly nasty translation meltdown
Filter 3: Sort by user impact — how many people see this failure?
The tricky bit is balancing cost against audience. That expensive failure from filter two might only affect three internal users. Meanwhile, a cheap, fast-failing prompt on your public-facing chat widget hits four hundred visitors every hour. The catch is obvious once you feel it: fixing the visible failure first builds trust; fixing the internal one first builds infrastructure. I have seen teams spend all ten minutes polishing a backend prompt nobody outside the engineering slack ever sees. Meanwhile, the homepage summarizer returns garbled nonsense for every logged-in user. Prioritize by surface area. A prompt that breaks for 1% of users but those users are your CEO and every customer support agent — that's a 1% that feels like coverage collapse. Sort by who screams first, not who screams loudest.
Filter 4: Sort by fixability — quick wins vs. deep rethinks
Final pass: which recipes can you patch in under three minutes? A missing system message? Toss it in. A temperature that's accidentally set to 1.8 instead of 0.7? Fixed. These are quick wins — grab them. The deep rethinks — prompts where the whole structure is wrong, where you need a new chain-of-thought wrapper or a different model entirely — those go on a separate list. Honest? You won't fix them in ten minutes. Don't try. The goal of this filter is to ship four or five solid fixes and clearly name the three monsters you'll tackle tomorrow. Most teams skip this step and end up with fifty half-fixed recipes and zero confidence. Do the quick ones, flag the hard ones, walk away with a written triage note. That's a ten-minute win.
Tools and Setup: What You Actually Need
A spreadsheet with three columns: prompt, failure type, impact score
You don't need Notion, no Airtable, definitely nothing with a kanban board. Open Google Sheets or a plain CSV. Three columns. Prompt text — paste the exact recipe that broke. Failure type — be brutally specific: 'rejected token', 'looping narrative', 'refused role', 'hallucinated date'. And impact score — a 1-to-5 rating where 5 means 'client visible, project delayed, teams blocked.' I have seen teams waste ten minutes building color-coded dashboards when a flat table with consistent labels would have surfaced the pattern in two scans. The catch: get your team to agree on failure categories before you first sort. If one person writes 'weird output' and another writes 'logic drift,' your filter collapses. That hurts. Spend five minutes up front defining six categories max — keep it brutal, not poetic.
A simple bash script to batch-test prompts and log outputs
Most people refine prompts by hand, one by one, copy-pasting into a chat window. Wrong order. You can loop through a file of prompts, pipe each to an API call, and write the result into a log with a timestamp. Ten lines of bash, maybe a curl wrapper. The output file becomes your failure tracker — greppable, sortable, shareable with a junior engineer who can then classify failures while you drink coffee. Not yet convinced? The real payoff is reproducibility: when you tweak one variable (temperature, system instruction length), you re-run the same list and diff the logs. The tricky bit is rate limits — your script will hammer the endpoint, so embed a sleep 1 or you will get throttled and your triage hour becomes a debugging rabbit hole. Does that sound like overkill for a ten-minute session? Maybe. But once you have the script, it pays for itself every time a prompt fails in the same batch.
Using a notebook when you have no digital tools
Pen. Paper. Column drawn with a ruler. I have seen a product manager at a startup — no terminal access, laptop dead — triage seven failing recipes on a napkin during a standup. She listed each prompt, circled the failure symptom, and drew a star next to the one with highest customer impact. That napkin got photographed, posted to Slack, and became the canonical triage document for two sprints. The trade-off: a paper log is fast to start, painfully slow to aggregate. You can't grep a napkin. But if your environment blocks external APIs or your team is physically in a room without Wi-Fi, handwritten beats waiting for permissions. One pitfall: handwriting degenerates under time pressure. Set a rule — one symbol per failure type (★ for hallucination, ● for refusal, ■ for drift). Your future self will thank you when the ink smudges.
Field note: artificial plans crack at handoff.
The one tool you should build yourself: a failure tracker
A static HTML page with a form. Three fields — prompt text, failure category dropdown, impact slider. Submit stores to localStorage. That's it. No backend, no auth, no cloud sync. Why build this instead of using the spreadsheet? Because a dropdown enforces category consistency — no human typing 'refusal' once and 'rejection' next time. I built one in an afternoon for a team that kept mislabeling failures; within two days the data became reliable enough to spot that 70% of our broken prompts shared a single personality instruction. The catch: localStorage is fragile — clear your browser cache and the data vanishes. So every Friday, export the JSON file and dump it into a shared drive. Not elegant. But faster than convincing IT to approve a new tool.
'A spreadsheet is fine until you have three people typing "weird output" fourteen different ways. A dropdown is worth one hour of setup and saves ten hours of decoding.'
— senior prompt engineer, internal team retrospective, 2024
Variations for Different Constraints
When you have no logs: reconstruct failures from memory
The core workflow assumes clean failure logs. Real life? Your terminal scrollback just evaporated, or you're debugging a conversation you ran at 2 AM and half-remember. You still have ten minutes. Open a blank note and time-box three minutes to dump every failure you recall—one line per recipe, no judgment. What broke: the model refused to follow a role? Output was cut short? It hallucinated a tool call we never defined? That last one is a pattern I have seen repeatedly: people remember the weirdest failures first, not the most common. After the dump, tag each line with a gut-feel severity: “blocked release” vs “annoying but shipped anyway.” Now apply only the cost and impact filters from the core workflow. Skip the syntax filter entirely—you have no precise error text, and guessing syntax problems from memory is a trap. You will misidentify three out of four. What usually breaks first in reconstructions is the gap between what actually happened and what you wish
you
had written. Be brutal: if you can't remember whether the prompt returned JSON or plain text, mark it as a probable structural failure. That hurts, but it beats spending ten minutes polishing a prompt that was never the real problem.
When you have a team: divide and conquer by failure type
Your three-person team stares at fifty broken prompts. Wrong move: everyone picks their five favorites to debug. That guarantees overlap and blind spots. Instead, sort the fifty recipes into three buckets by failure mode—syntax errors, semantic drift, and cost overruns—then assign one bucket per person. The catch: semantic drift is the deepest bucket and the hardest to parallelize. One person can't skim fifty subtle meaning mismatches in ten minutes. So split that bucket further: “model misunderstood the task” vs “output format mismatched expectations.” Now each person runs the four filters on their bucket alone, but they share a live document. We fixed a real team scenario this way—three engineers, forty-five minutes, but the triage went from chaotic to surgical. The rule: never let two people debug the same failure type unless they specifically ask for pairing. Parallel work only helps when the failure categories are truly independent. And one thing that trips teams up: they forget to nominate a tiebreaker. When two people claim a prompt is the highest priority to fix, and time is running out, someone with the final say must choose. That person should be the one who knows the business impact, not the one with the strongest opinion about prompt aesthetics.
When all failures are semantic (not syntax): look for patterns in wording
Worst-case scenario: every prompt executes without errors. No JSON parse failures, no token limit warnings. Yet half the outputs are subtly wrong—wrong tone, wrong level of detail, wrong inclusion of disclaimers the user never asked for. You have ten minutes and zero obvious breakage. Now what? Don't apply the syntax filter—it will greenlight everything. Go straight to the semantic filter, but run it differently: group the failing recipes by the exact verbs you used. I have seen a pattern where every prompt using “explain” produced verbose, lecture-style output, while “describe” gave concise answers. Same model, same context, different single word. That's your triage clue: the most common verb across the failing recipes is probably the root cause. Change it in one recipe, test it, and if the output snaps into correctness, you just deprioritized forty-nine other failures that share that verb. Another pattern: look at negation. Prompts saying “don't include…” fail more often than prompts saying “only include…” because models treat negation as a weak signal. If eight out of ten failures have “don't,” you have found your bottleneck. The editorial aside here—honestly, this is the scenario where experience beats process. The filters only work if you catch the semantic thread. Nothing else will save you.
‘We had fifty recipe failures, all returning valid JSON. Every single one included the word “however.” Removing it fixed forty-three.’
— senior prompt engineer, internal retrospective at a fintech startup
When you have 5 minutes instead of 10: skip cost filter
Five minutes changes everything. You can't run four filters—something has to drop. Drop the cost filter. Not because cost is unimportant, but because in a five-minute triage, correctness outranks efficiency. A prompt that returns the wrong answer for free still blocks your release. A prompt that costs twice as much but returns the right answer buys you time to fix the cost later. That said, you still need to apply the impact filter ruthlessly: which prompt, if fixed, stops the biggest downstream failure? That's your single task for the five minutes. Ignore the rest. Write the fix directly, test it once, and if it works, stop. Don't polish. Don't try to fix a second prompt. I have watched engineers burn four of their five minutes debating which of two equally broken prompts to fix—then fix neither. The correct move: pick the one that unblocks the next person on your team, even if the other prompt feels more intellectually satisfying to debug. Wrong order. Not yet. That pain is tomorrow’s problem.
Pitfalls and Debugging: What to Check When It Still Fails
The sunk cost trap: you spent an hour on a prompt that should be scrapped
This is the one that eats teams alive. You have forty minutes invested in a prompt — fourteen revisions, careful chain-of-thought restructuring, a custom separator scheme. It still returns garbage. The instinct is to polish harder. I have watched engineers spend two more hours on a prompt that should have died at minute twelve. The rule is brutal but clean: if three refinements made zero difference in the failure mode, that prompt has a fundamental design flaw — wrong data shape, wrong instruction logic, or a model capability gap no amount of rewording will fix. Scrap it. You're not saving time; you're burning it. The sunk cost feels real but it's an illusion — the forty minutes are gone either way. The question is whether you lose another forty.
Honestly — most artificial posts skip this.
The shiny object fallacy: fixing the newest failure instead of the most harmful
The latest broken output is always the loudest. You run a batch, see a hallucination in the third recipe, and immediately reach for the tweak — add a constraint, tighten the format rule. That's a trap. What you missed: the prompt is silently failing on seventeen other recipes, but those failures look "close enough" so they escape attention. The shiniest error is rarely the most expensive one. Pause. Look at the distribution — which failure costs you actual user trust or actual dollars? A 3% hallucination rate that poisons financial data matters more than a 30% formatting error that still returns parseable output. Prioritise harm, not novelty. That said — if you're seeing a brand-new error mode appear after a model update, treat that as urgent; it signals a boundary you didn't know existed.
Over-engineering: adding instructions when you should change the data
The reflex is to add more rules. More constraints. Another paragraph of "don't do X." The prompt swells from forty tokens to four hundred, and performance actually drops. Most people miss it: the problem is not instruction density — it's that the input data is inconsistent. Your recipe examples have trailing whitespace. The model is trying to obey a rule about "units" but half your inputs say "oz" and half say "ounce." No prompt fix can patch bad data hygiene. Strip out the extra instructions, clean the input schema instead, and watch the failure rate halve. We fixed a stubborn 40% failure case once by removing three lines of prompt and adding a single regex normalization step upstream. The model wasn't confused; the data was.
'I added twelve rules in one afternoon. The prompt was worse. I deleted eight of them and fixed the CSV header mismatch instead. Errors dropped by half.'
— DevOps engineer, internal incident postmortem, paraphrased
When to stop triaging and start from scratch
Three signals: the failure mode keeps shifting under your fixes, your prompt is longer than the expected output, or you have rewritten the same instruction four different ways with no measurable improvement. At that point, you're not debugging — you're polishing a dead process. Start over. Strip the prompt to its skeleton — role, task, output format, one example. That's it. Run it on the single hardest recipe. If it still fails, the concept is wrong. Maybe you're asking the model to classify when it should extract. Maybe the role assignment contradicts the instruction. Whatever it's, incremental patching won't find it — only a clean rebuild will. Triage is a tool, not a religion. Know when to burn the whole thing.
FAQ: Quick Answers for Common Triage Questions
Should I fix the prompt or the data?
If the same prompt works on a clean, hand-crafted example but chokes on your production feed, the data is the culprit. I have watched teams burn forty minutes rewriting instructions when the real fix was trimming stray newlines from a CSV column. However—if your golden test case also fails, you're chasing a prompt problem. Quick heuristic: run your top three failures against a single, known-good input. Two pass? Data wins. Zero pass? The prompt is rotten. The trade-off is painful: fixing data feels like plumbing, not prompt engineering, but ignoring it guarantees tomorrow's triage will look identical.
How do I know when a prompt is beyond repair?
You have rewritten the system instruction five times. Every tweak fixes one edge case but breaks two others. The failure modes are contradictory—saying 'be concise' makes it drop required fields, adding 'use bullet points' introduces hallucinated numbers. That pattern signals a structural mismatch. Not repair. Rewrite from scratch. Here is the threshold: if your prompt contains more than three 'except when' clauses or a paragraph of negative examples ('don't say X, don't list Y'), you're patching around a broken foundation. The catch is that starting over feels wasteful at minute eight of your ten-minute window. It's not. A clean prompt takes five minutes to draft; the tangled one will steal your whole hour.
We kept adding 'ignore previous instructions' to a model that already ignored everything. The prompt was not broken—it was a ghost shouting at an empty room.
— Prompt debug log, e-commerce team
What if two failures look identical?
Same error message. Same output length. Same hallucinated product name. Copy both inputs into a diff tool. Most teams skip this—and that costs them a day. The subtle difference is often a trailing space, a Unicode dash versus ASCII hyphen, or one line that uses '&' while the other spells 'and'. The model treats these as entirely different contexts. If the diff shows zero change, check the order of few-shot examples in your prompt. Identical failures with identical inputs mean you're hitting a model-level blind spot—temperature too low, context window congestion, or a token bias. That requires a parameter change, not a prose edit.
How do I prevent this next time?
Tag every prompt version with a short 'why it failed' note before you fix it. Honest notes, not 'tweaked wording'. Write: 'data had null category' or 'model refused numbered lists over 7 items'. After five triage sessions, you will spot clusters. That clustering is your prevention lever. One concrete action: set up a single spreadsheet with columns for input hash, failure symptom, root cause bucket (data vs prompt vs model), and fix time. I promise you—after three weeks, you will have a ranked list of the ten changes that eliminate 80% of your recurring failures. Then your ten-minute triage becomes a glance at that list, not a fire drill.
Comments (0)
Please sign in to post a comment.
Don't have an account? Create one
No comments yet. Be the first to comment!