What Are AI Hallucinations in Code?
An AI hallucination is when a Large Language Model (LLM) generates code that looks correct but contains fictional elements: APIs that don't exist, deprecated patterns, phantom dependencies, or invented method signatures.
Real Example: Stripe API Hallucination
// AI-generated code (looks plausible)
const session = await stripe.checkout.createPortalSession({
customer: customerId,
return_url: 'https://example.com/dashboard'
});
// ❌ HALLUCINATION: This method doesn't exist
// ✅ CORRECT: stripe.billingPortal.sessions.create()The AI invented a method name that "sounds right" but doesn't match the actual Stripe API. This compiles, but crashes at runtime.
Why AI Hallucinations Happen
1. Lack of Context = Confident Guessing
LLMs are prediction engines. When you prompt "build a user authentication system" without specifying your stack, database schema, or API contracts, the model fills in the blanks based on statistical patterns from its training data.
Without Context:
"Build auth" → AI guesses you're using Firebase, invents field names, assumes JWT structure
With Context:
"Build auth using Supabase, schema: users(id uuid, email text, role enum), JWT claims: userId + role" → AI has constraints
2. Training Data Lag
Most LLMs are trained on outdated Stack Overflow posts and GitHub repos. They don't know:
- ✗ That React 18 deprecated
componentWillMount() - ✗ That Next.js 14 changed the App Router API structure
- ✗ That your company's internal library was refactored 3 months ago
3. Vibe-Driven Prompts
Prompts like "make it work" or "add user login" are too vague. The AI interprets them based on the most common patterns it's seen, which may not match your architecture.
Common Hallucination Patterns
Phantom Dependencies
import { validateUser } from '@auth/helpers';
// ❌ This package was never installedAI invents a helper library that sounds logical but doesn't exist in your node_modules.
Deprecated Patterns
class Dashboard extends React.Component {
componentWillMount() { ... }
// ❌ React 18 removed this lifecycle method
}Training data from 2020 doesn't reflect modern framework conventions.
API Method Invention
const data = await db.users.findByEmail(email);
// ❌ Your ORM doesn't have 'findByEmail'
// ✅ It's: db.users.findUnique({ where: { email } })AI creates methods that would be convenient but aren't in the actual API.
The Fix: Context Engineering Framework
Context Engineering is the practice of giving AI strict constraints upfront so it can't hallucinate. Think of it as "defensive prompting" backed by specs.
The 3-Layer Defense
Spec-First Development
Define API contracts, database schemas, and architecture before prompting AI. No specs = no guardrails.
Generate Full Spec PackLock Context with Rules
Use .cursorrules or system prompts to enforce your exact stack, library versions, and coding patterns.
Define "Done" with Acceptance Criteria
Without explicit Given/When/Then tests, AI doesn't know when to stop generating. Give it concrete exit criteria.
Build Acceptance CriteriaBefore vs. After: Real Example
Before (Vibe Coding)
Prompt: "Add user authentication"Result: AI hallucinates:
- • Fictional auth library
- • Invented DB fields
- • Deprecated session logic
After (Context Engineering)
Prompt: "Implement auth using:
- Supabase Auth
- Schema: users(id, email, role)
- JWT claims: userId + role
- Follow .cursorrules patterns"Result: AI generates:
- • Correct Supabase calls
- • Schema-aligned logic
- • Zero hallucinations
Ready to Stop Debugging AI Hallucinations?
Run a free Spec Readiness Score to see exactly which context is missing from your project.
Diagnose Context Gaps (Free)The Bottom Line
AI doesn't hallucinate because it's broken. It hallucinates because you gave it a vibe instead of a spec. Context Engineering flips the script: instead of debugging AI-generated code, you prevent hallucinations from happening in the first place.
Key Takeaways
- Missing context = confident hallucinations
- Spec-first development constrains AI output
.cursorrulesand acceptance criteria lock the context- Prevention beats debugging every time
