Your linter doesn't understand your code. It just pattern-matches text.
This might seem obvious, but the implications are massive. Most "AI code analysis" tools are just glorified linters with machine learning sprinkled on top. They still don't understand anything.
Let me show you what I mean.
The Linting Illusion
Here's what traditional static analysis sees:
function processUserData(user: User) {
const data = transformData(user);
return saveToDatabase(data);
}
A linter checks:
- Are there unused variables? ✓
- Is the function too long? ✓
- Are there any obvious anti-patterns? ✓
What it completely misses:
transformDatacalls 47 other functions across 12 filessaveToDatabasetriggers 3 webhooks and 2 background jobs- This function is called by 23 different API endpoints
- Changing it will break the mobile app's sync feature
Pattern matching can't see relationships. It sees trees when your codebase is a forest.
What Real Code Evaluation Looks Like
True AI code evaluation requires understanding code as a graph of relationships, not a collection of files.
When we built the intelligence system in Glue, we started with this principle. Every symbol in your codebase becomes a node. Every call, import, and reference becomes an edge. The result is a living map of how code actually works.
// What our system sees for the same function
{
symbol: "processUserData",
file: "src/services/userService.ts:45",
callers: [
"UserController.updateProfile",
"SyncService.processQueue",
"WebhookHandler.onUserUpdate",
// ... 20 more
],
callees: [
"transformData → [12 nested calls]",
"saveToDatabase → [triggers: webhooks, jobs]"
],
impactScore: 87, // High blast radius
lastModified: "3 days ago",
contributors: ["alice", "bob"]
}
This isn't linting. This is understanding.
The Three Levels of Code Analysis
Level 1: Syntax Analysis (Traditional Linters)
- Pattern matching on text
- Rule-based checks
- Zero semantic understanding
- Tools: ESLint, Pylint, SonarQube rules
Level 2: Semantic Analysis (Type Checkers)
- Understands types and interfaces
- Catches type mismatches
- Limited to single-file context
- Tools: TypeScript, mypy, Flow
Level 3: Architectural Analysis (Graph Intelligence)
- Understands call relationships
- Maps dependencies across files
- Identifies blast radius
- Discovers features automatically
- Tools: This is what we built
Most teams are stuck at Level 1 and think they're doing "code quality." They're measuring syntax compliance, not actual code health.
Why This Matters for Real Work
Let me give you a concrete example.
A PM asks: "How long would it take to add multi-currency support?"
Level 1 analysis (linting): No idea. Can't answer business questions.
Level 2 analysis (types): "There are 47 places where price: number is used." Still not helpful.
Level 3 analysis (graph intelligence):
Currency Impact Analysis:
- 12 API endpoints handle prices
- 3 services contain currency logic
- 2 database tables need schema changes
- Payment integration touches Stripe SDK
- Mobile app has hardcoded USD symbols in 8 places
Estimated files affected: 34
High-risk changes: PaymentService, CheckoutFlow
Recommended approach: Start with database schema,
then propagate through PaymentService
Now you can actually plan the work.
The Feature Discovery Breakthrough
The most powerful application of graph-based code evaluation is automatic feature discovery.
Instead of manually documenting what your codebase does, we analyze the call graph to identify natural clusters of functionality:
// Our Louvain clustering algorithm identifies features
const features = await discoverFeatures(workspaceId);
// Returns grouped functionality:
// "Payment Processing" - 23 files, 89 symbols
// "User Authentication" - 15 files, 56 symbols
// "Search & Filtering" - 8 files, 34 symbols
No manual mapping. No stale documentation. The features emerge from the code structure itself.
What to Look for in AI Code Evaluation
If you're evaluating tools, ask these questions:
-
Does it build a symbol graph? If it only analyzes files in isolation, it's just fancy linting.
-
Can it trace call paths? "What happens when I call this function?" should be answerable.
The Bottom Line
Your codebase isn't a collection of files following syntax rules. It's a complex system of interconnected behaviors.
Evaluating code quality means understanding those connections. Linting is necessary but nowhere near sufficient. The teams shipping fastest are the ones who see the full graph — and can navigate it confidently.
That's what real AI code evaluation looks like.