Prompt For Debugging Code

Find a supported root cause, get one minimal patch and add a regression test instead of guessing repeatedly. Paste this prompt, then your code.

Curated by the aiprompts.page team

Example result generated with the “Prompt For Debugging Code” prompt
The Prompt

Debug the code I paste after this prompt. Use any included error, observed output, expected behavior and reproduction steps as evidence. Start by stating the failure in one sentence and identifying the smallest visible path that can produce it. Trace the relevant execution step by step, including values, branches and asynchronous ordering where needed. Separate observed facts from inferences. Choose one root cause when the evidence supports it; do not provide a grab bag of unrelated changes. If the code cannot explain the reported failure, identify the exact missing observation and ask one targeted diagnostic question or propose one focused diagnostic check. Show the smallest practical reproduction using concrete inputs from the supplied context. Explain why the failure occurs, then provide a minimal patch that preserves the public interface and unrelated behavior. Do not add dependencies, rewrite the architecture, swallow exceptions or use arbitrary delays to hide a timing bug. Write a focused regression test that fails for the stated reason before the patch and passes afterward. Include one nearby case that guards against an obvious incomplete fix. Use existing testing tools; otherwise prefer a standard test runner. Give complete test code, the required file layout and a runnable command. If you have execution tools, run the reproduction and regression checks and report the actual command, exit code and observed output. If not, label the execution status “Not executed” and keep predicted output clearly separate from real observations. Finish with any assumption that could change the diagnosis. Do not claim a fix was verified without execution evidence.

Share on XShare on LinkedInShare on WhatsApp

Example result

What this prompt produced when we ran it.

Run on this sample: // totals.mjs — Node.js, no external services. // Expected: resolve to the sum after all invoices load. export async function loadTotal(ids, fetchInvoice) { let total = 0; ids.forEach(async id => { const invoice = await fetchInvoice(id); total += invoice.amount; }); return total; } const invoices = { inv1: { amount: 10 }, inv2: { amount: 20 } }; const fetchInvoice = async id => invoices[id]; console.log(await loadTotal(['inv1', 'inv2'], fetchInvoice)); // Observed: 0. Expected: 30. Empty input should resolve to 0. --- `loadTotal` resolves to `0` because it returns before its asynchronous callbacks update `total`; the smallest failing path is one invoice with a nonzero amount. ### Execution trace Observed from the supplied example: the result is `0`, while the two invoice amounts sum to `30`. The code explains that result: 1. `loadTotal` initializes `total` to `0`. 2. `forEach` invokes the callback for `'inv1'`. - `fetchInvoice('inv1')` returns a promise fulfilled with `{ amount: 10 }`. - `await` suspends the callback, even though that promise is already fulfilled. 3. `forEach` invokes the callback for `'inv2'`. - Its callback similarly suspends at `await`, awaiting `{ amount: 20 }`. 4. `forEach` finishes without waiting for either callback’s returned promise. 5. `return total` reads `0` and fulfills the promise returned by `loadTotal` with that value. 6. The callbacks resume and update their captured `total` to `10`, then `30`. 7. The caller resumes and prints the already-returned value: `0`. The callbacks can finish before the caller prints, but updating `total` afterward cannot change the number already returned. The root cause is that `forEach` discards the promises returned by its callbacks. ### Minimal patch Await the callback promises together. This keeps invoice loading concurrent and preserves the function’s interface and empty-input result. ```js // totals.mjs export async function loadTotal(ids, fetchInvoice) { let total = 0; await Promise.all(ids.map(async id => { const invoice = await fetchInvoice(id); total += invoice.amount; })); return total; } ``` `Promise.all` waits for every successful load before execution reaches `return total`. If a load rejects, `loadTotal` rejects rather than reporting a partial total. ### Smallest reproduction One invoice is sufficient: ```js // reproduce.mjs import { loadTotal } from './totals.mjs'; const invoices = { inv1: { amount: 10 } }; const fetchInvoice = async id => invoices[id]; console.log(await loadTotal(['inv1'], fetchInvoice)); ``` Before the patch, the predicted output is `0`. Afterward, it is `10`. ### Regression tests Use Node’s built-in test runner. The first test controls completion explicitly, so it requires no timers or arbitrary delays. It also checks that both requests start before either finishes, guarding against an incomplete fix that serializes invoice loading. File layout: ```text totals.mjs reproduce.mjs totals.test.mjs ``` Use the patched function above as `totals.mjs`, without the example logging code. ```js // totals.test.mjs import test from 'node:test'; import assert from 'node:assert/strict'; import { loadTotal } from './totals.mjs'; test('waits for all invoices while starting loads concurrently', async () => { const requested = []; const resolveInvoice = new Map(); const fetchInvoice = id => { requested.push(id); return new Promise(resolve => { resolveInvoice.set(id, resolve); }); }; const result = loadTotal(['inv1', 'inv2'], fetchInvoice); try { assert.deepEqual(requested, ['inv1', 'inv2']); } finally { // Release pending work even if the concurrency assertion fails. resolveInvoice.get('inv2')?.({ amount: 20 }); resolveInvoice.get('inv1')?.({ amount: 10 }); } assert.equal(await result, 30); }); test('handles promises that are already fulfilled', async () => { const invoices = { inv1: { amount: 10 }, inv2: { amount: 20 }, }; const total = await loadTotal( ['inv1', 'inv2'], async id => invoices[id], ); assert.equal(total, 30); }); test('empty input resolves to zero without fetching', async () => { let calls = 0; const total = await loadTotal([], async () => { calls += 1; return { amount: 99 }; }); assert.equal(total, 0); assert.equal(calls, 0); }); ``` Run: ```sh node reproduce.mjs node --test totals.test.mjs ``` Execution status: **Not executed**, as requested. No actual exit codes or output were collected. Predicted results: - Original implementation: reproduction prints `0`; the first two tests fail with actual `0` versus expected `30`; the empty-input test passes. Test command exits with code `1`. - Patched implementation: reproduction prints `10`; all three tests pass. Both commands exit with code `0`. Assumption: successful invoice loads return objects with numeric `amount` values, as in the supplied example. Missing invoices or nonnumeric amounts would require a separate input-handling decision.

More in Coding & Development

Related Prompts

Example result for Claude Security Review Prompt
Claude
Coding & Development

Claude Security Review Prompt

Get an evidence-based defensive review with prioritized findings, minimal fixes and regression tests. Paste this prompt, then your code.

Example result for Landing Page Prompt
ChatGPT
Coding & Development

Landing Page Prompt

Generate a ClearWeek planner landing page with pricing controls and a usable weekly planner that saves tasks locally. Paste into ChatGPT.

Example result for Animated Portfolio Website Prompt
Claude
Coding & Development

Animated Portfolio Website Prompt

Create fictional developer Mira Sen’s animated portfolio with three detailed projects, accessible case-study dialogs and working theme controls.

Example result for Gemini Gummy Bears Prompt
Gemini
Coding & Development

Gemini Gummy Bears Prompt

Build a browser playground with draggable, stretchable gummy bears, candy colors and working reset and pour controls. Paste this prompt into Gemini.