How to fix it
- Send the model only what the task needs: an internal ID instead of a name, a redacted field instead of an email.
- Log IDs, not user objects.
- Record which providers receive personal data, then re-run the scan.
“Summarise this customer” is one prompt away from sending their name, email, and phone number to a model provider, and logging all three on the way.
npx @neuralaxis/vibedoctor scan What it looks like
Every prompt is a transfer of data to a third party. Every log line is a copy you now have to retain, secure, and delete.
Neither shows up in a code review that only checks whether the feature works.
console.log("processing user", user.email, user.phone);logger.info("customer payload", user);content: `Summarise account for ${user.name} email=${user.email}`return client.chat.completions.create({ model, messages }); Example: fixtures/dpdp/projects/llm-logs in the VibeDoctor repository.
What VibeDoctor reports
| Finding | Severity | Evidence | From |
|---|---|---|---|
| PII in LLM prompts or embeddings Personal-data fields near chat.completions, Anthropic messages, embeddings, Pinecone, or vector-store calls. | critical | observed | DPDP-SEC-002 |
| PII in application logs Logger calls that include personal-data fields or whole user objects. | high | observed | DPDP-SEC-001 |
| Whole user objects sent to third parties A full user object passed to analytics, error-tracking, or LLM vendors. | high | observed | DPDP-THIRD-001 |
| External processors and recipients inventory Lists the LLM SDKs in use: OpenAI, Anthropic, Google, Cohere, Hugging Face. | info | observed | DPDP-PROC-001 |
Evidence grades say how sure the finding is. What verified, observed and heuristic mean →
How to fix it
What this check can’t see
Run it
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 →