Find the errors your app reports as success.

To make the red go away, the assistant wraps the call in try/catch and returns success anyway. The user sees “Saved”. The data never arrived.

npx @neuralaxis/vibedoctor scan

What it looks like

It compiles. It ships. It’s wrong.

A swallowed error removes the only evidence that something went wrong. Logs stay clean and dashboards stay green.

Returning success after a failure is worse: the client believes it, and so does every retry and analytics event downstream.

src/handler.ts
} catch (error) {}  await Promise.reject(new Error("write failed"));} catch (error) { return { ok: true }; }

Example: fixtures/flow-swallowed in the VibeDoctor repository.

What VibeDoctor reports

A ranked finding with the exact location.

FindingSeverityEvidenceFrom
Success response after a caught failure
A catch block sends HTTP 2xx, ok: true, or success: true. In Python, an except block that returns 200 or success.
high verified flow-doctor
Swallowed error path
An empty catch {} in JavaScript or TypeScript, or an except that only contains pass.
medium verified flow-doctor

Evidence grades say how sure the finding is. What verified, observed and heuristic mean →

How to fix it

  1. Return a real error status and message to the caller.
  2. Log the failure with enough context to debug it, without personal data.
  3. Add a test where the write fails and assert that the response says so.

What this check can’t see

  • It only looks inside catch and except blocks. A handler that returns 200 with an error message outside one is not flagged.

Fixing it, and the limits of this check

Run it

Check your repo now.

npx @neuralaxis/vibedoctor scan

Runs locally on JavaScript, TypeScript and Python repos. Hand the result to Cursor, Claude Code, Codex or Copilot with agent-plan. Agent setup →