
Stop Letting AI Agents Guess Where Code Goes
A practical guide to structuring your codebase so AI agents stop creating architectural debt.

Mob Sessions Are Variance Insurance, Not Meetings
When Paying Three People for One Feature Is Actually Efficient

Why Spec-Driven Development Doesn't Solve Variance
Part 2 of 5: Organizational Structures for AI-Native Development Part 1 established that "epic-sized" work units create variance explosions. The standard response from engineering leaders is: "We need better specifications upfront.
<100 subscribers



Stop Letting AI Agents Guess Where Code Goes
A practical guide to structuring your codebase so AI agents stop creating architectural debt.

Mob Sessions Are Variance Insurance, Not Meetings
When Paying Three People for One Feature Is Actually Efficient

Why Spec-Driven Development Doesn't Solve Variance
Part 2 of 5: Organizational Structures for AI-Native Development Part 1 established that "epic-sized" work units create variance explosions. The standard response from engineering leaders is: "We need better specifications upfront.
Share Dialog
Share Dialog
Part 3 of 5: Organizational Structures for AI-Native Development
Part 1 established that process debt kills AI initiatives. Part 2 showed why spec-driven development doesn't eliminate variance—it just relocates it. The bottleneck is intent articulation and continuous validation, not code production.
Now we address the uncomfortable question: if AI writes most of the code, what are developers actually paid for?
Vercel published an "AI Skill" for React best practices last month. Someone at Vercel got paid—probably well—to write that skill. They didn't write any React code. They encoded how to write good React code into a format AI could consume.
Value creation happened one layer upstream.
This is the economic engine driving everything else. Developers aren't being paid to create perfect code anymore. We're being paid to create environments in which AI agents produce perfect code.
It's closer to industrial tooling than traditional software development. In manufacturing, craftsmen stopped hand-carving each chair when tooling engineers built machines that carved perfect chairs repeatedly. The tooling engineer earned more because their work multiplied—one jig guided a thousand cuts.
When AGENTS.md encodes "all cross-module access goes through public.ts," it prevents an entire class of architectural violations. An agent working in one module knows exactly what it can import from others (their public interfaces) and what it must not touch (their service and repo layers).
A developer who writes the route registry pattern that centralizes auth enforcement isn't just saving their own time—they're preventing every AI interaction across the entire team from implementing auth inconsistently. The centralized pipeline becomes the jig that ensures auth gets checked once, correctly, rather than scattered across hundreds of handlers.
In the craftsman era, perfect code demonstrated mastery. Elegant algorithms. Clever optimizations. Thoughtful abstractions. Code review was partly bug detection, mostly learning from craftsmanship.
But when AI writes the implementation, what are you reviewing for?
The new definition: Perfect code is code that perfectly captures intent.

The measure isn't implementation elegance but translation fidelity—how accurately the code reflects what you actually meant.
And that fidelity depends entirely on the quality of your environment: your specifications, your architectural boundaries, your validation rules.
Our hackathon revealed this starkly. One developer built a complete product in one month. The code itself? Generated by AI. His value? Setting up the architecture, the naming conventions, the constraints that made AI productive instead of thrashing.
Quote from a senior developer: "If you ask do I know every single line of the code—no idea. What I do know is how every hot path works, what are the columns in the table, what are the workers, where are the queues, what's the architecture."
This is the shift. Code knowledge is abundant. System knowledge is scarce.
Good architecture is a compression algorithm for context.
Most discussions about AI and context focus on RAG solutions—trying to retrieve relevant information from vast codebases. That treats the symptom, not the cause.
In a tangled monolith, every change potentially affects everything else. The AI (and the human) needs to hold the entire system in working memory to make confident changes. Context explodes because boundaries don't exist.
But in a modular monolith with enforced boundaries, modules become the context units.
When you're implementing a feature in any module, you only need to understand:
The module's public interface (what it exposes via public.ts)
Other modules' public interfaces (what they expose for you to use)
The platform layer contracts (auth, database, routing)
*We do not claim that the only architecture fitting AI driven development is a modular monolith in typescript, these are just examples.
Everything else becomes irrelevant. Another module's internal service layer? Irrelevant. How does another module's repository access the database? Irrelevant. The implementation details of 28 other modules? Irrelevant.
Your cognitive load shrinks from the entire codebase to one module's vertical slice plus the explicit contracts it depends on.
At 500,000 lines, if module boundaries are enforced, AI still only needs to understand local context plus relevant public interfaces. Context requirements stay bounded because architecture enforces boundaries mechanically.
The critical dependency: this only works if boundaries are actually enforced.

"Modules" on paper with direct imports into other modules' internals dissolves those boundaries. You're back to needing global context for every change.
This shifts what senior developers do: they enforce architectural boundaries through code review. The AI might generate code that reaches into another module's service layer directly. The human, or another AI catches it because it violates the public.ts rule.
That requires understanding why boundaries exist, not just what rules specify.
There's a beautiful feedback loop here: good architecture makes AI more effective, which makes maintaining good architecture easier, because AI generates compliant code faster than humans write hacky shortcuts.
Architecture becomes self-reinforcing rather than constantly eroding.
This can be demonstrated through one developer's practical experience. He built a complete product in one month—but not without hitting this pattern first.
Early on, he had inconsistent naming: "push/pull sources" in backend, "webhooks and scheduled imports" in UI. Same concept, different names everywhere. The AI thrashed. Couldn't maintain context. Generated code that was technically correct but semantically inconsistent.
Once he enforced naming consistency and clear boundaries, everything changed. The AI could stay productive because the environment was coherent. The architecture was clean. That coherence is what enabled the one-month delivery.
Architecture quality directly determines AI effectiveness.
This demands different capabilities than traditional development:
Intent articulation - Not formal waterfall-like specifications. The ability to describe what matters clearly enough that AI can execute without repeated back-and-forth. This is conversational precision, not documentation bureaucracy.
Modern specifications start as napkin sketches and sharpen through AI collaboration. Rough notes evolve through iterative dialogue, each pass clarifying intent.
System-level thinking - Understanding data flows, architectural patterns, system boundaries. The ability to reason about composition rather than implementation. This is big-picture cognition, not function-level detail work.

Constraint design - Writing AGENTS.md rules that prevent authorization bugs without restricting valid patterns. Designing the public.ts boundary that makes "can module A use code from module B?" a mechanical yes/no question. Creating module layout contracts (api/routes.ts, service/handlers.ts, repo/index.ts) that tell agents exactly where code belongs. This is API design thinking—creating interfaces between human intent and AI execution.
These aren't the skills the industry traditionally valued. They're fundamentally different because the production function changed.
Junior developers used to learn by reading code. Understanding implementations. Building mental models through detailed study.
That path is breaking. When AI generates the implementation, there's often nothing to study. The code exists, it works, but it doesn't teach anything because it wasn't designed to be learned from—it was designed to execute.
The learning path shifts:
Junior: Understanding system architecture from documentation and AGENTS.md files. Learning through building small features with AI assistance. Developing intent articulation skills.
Mid-level: Owning features end-to-end. Maintaining architectural consistency. Writing AGENTS.md files that guide AI effectively. Validating that implementations match intent.
Senior: Defining architectural boundaries. Making system-level trade-offs. Teaching others to work effectively with AI. Enforcing constraints that keep the codebase coherent as it scales.

The progression isn't lines of code written. It's scope of context managed and quality of constraints designed.
Traditional interview process: write an algorithm on a whiteboard. Demonstrate coding ability. Prove you can implement solutions.
With AI, those skills are table stakes. Everyone can generate working implementations. The differentiator is something else entirely.
What actually matters:
Can you articulate requirements clearly? Not in formal specs—in conversation. Can you explain what needs to exist and why, clearly enough that someone (or AI) can build it?
Do you understand system architecture? Not just patterns—actual systems. Data flows. Bottlenecks. Failure modes. The ability to reason about how pieces compose.
Can you design good constraints? Rules that guide without restricting. Boundaries that clarify without limiting. The jigs that make AI productive.
Traditional "leetcode" interviews test for skills that AI makes abundant. They miss the skills that are becoming scarce.
Stop hiring for coding ability alone.
Start assessing intent articulation, system thinking, and constraint design.
Stop measuring developers by lines of code or features shipped.
Start measuring by architectural quality, constraint effectiveness, and team velocity enabled.
Stop training developers to write better code.
Start training them to create better environments where AI writes code.
Stop optimizing for individual productivity.
Start optimizing for the quality of jigs that multiply across the entire team.
The value concentration shifted. Adapt your evaluation criteria accordingly.
Coming in Part 4: When solo developers can build complete products and coordination overhead dominates development time, how should teams actually be structured? We'll explore coordination patterns across different scales—from 5-person startups to 500-person engineering orgs—and why mob sessions are variance insurance, not meetings.
Part 3 of 5: Organizational Structures for AI-Native Development
Part 1 established that process debt kills AI initiatives. Part 2 showed why spec-driven development doesn't eliminate variance—it just relocates it. The bottleneck is intent articulation and continuous validation, not code production.
Now we address the uncomfortable question: if AI writes most of the code, what are developers actually paid for?
Vercel published an "AI Skill" for React best practices last month. Someone at Vercel got paid—probably well—to write that skill. They didn't write any React code. They encoded how to write good React code into a format AI could consume.
Value creation happened one layer upstream.
This is the economic engine driving everything else. Developers aren't being paid to create perfect code anymore. We're being paid to create environments in which AI agents produce perfect code.
It's closer to industrial tooling than traditional software development. In manufacturing, craftsmen stopped hand-carving each chair when tooling engineers built machines that carved perfect chairs repeatedly. The tooling engineer earned more because their work multiplied—one jig guided a thousand cuts.
When AGENTS.md encodes "all cross-module access goes through public.ts," it prevents an entire class of architectural violations. An agent working in one module knows exactly what it can import from others (their public interfaces) and what it must not touch (their service and repo layers).
A developer who writes the route registry pattern that centralizes auth enforcement isn't just saving their own time—they're preventing every AI interaction across the entire team from implementing auth inconsistently. The centralized pipeline becomes the jig that ensures auth gets checked once, correctly, rather than scattered across hundreds of handlers.
In the craftsman era, perfect code demonstrated mastery. Elegant algorithms. Clever optimizations. Thoughtful abstractions. Code review was partly bug detection, mostly learning from craftsmanship.
But when AI writes the implementation, what are you reviewing for?
The new definition: Perfect code is code that perfectly captures intent.

The measure isn't implementation elegance but translation fidelity—how accurately the code reflects what you actually meant.
And that fidelity depends entirely on the quality of your environment: your specifications, your architectural boundaries, your validation rules.
Our hackathon revealed this starkly. One developer built a complete product in one month. The code itself? Generated by AI. His value? Setting up the architecture, the naming conventions, the constraints that made AI productive instead of thrashing.
Quote from a senior developer: "If you ask do I know every single line of the code—no idea. What I do know is how every hot path works, what are the columns in the table, what are the workers, where are the queues, what's the architecture."
This is the shift. Code knowledge is abundant. System knowledge is scarce.
Good architecture is a compression algorithm for context.
Most discussions about AI and context focus on RAG solutions—trying to retrieve relevant information from vast codebases. That treats the symptom, not the cause.
In a tangled monolith, every change potentially affects everything else. The AI (and the human) needs to hold the entire system in working memory to make confident changes. Context explodes because boundaries don't exist.
But in a modular monolith with enforced boundaries, modules become the context units.
When you're implementing a feature in any module, you only need to understand:
The module's public interface (what it exposes via public.ts)
Other modules' public interfaces (what they expose for you to use)
The platform layer contracts (auth, database, routing)
*We do not claim that the only architecture fitting AI driven development is a modular monolith in typescript, these are just examples.
Everything else becomes irrelevant. Another module's internal service layer? Irrelevant. How does another module's repository access the database? Irrelevant. The implementation details of 28 other modules? Irrelevant.
Your cognitive load shrinks from the entire codebase to one module's vertical slice plus the explicit contracts it depends on.
At 500,000 lines, if module boundaries are enforced, AI still only needs to understand local context plus relevant public interfaces. Context requirements stay bounded because architecture enforces boundaries mechanically.
The critical dependency: this only works if boundaries are actually enforced.

"Modules" on paper with direct imports into other modules' internals dissolves those boundaries. You're back to needing global context for every change.
This shifts what senior developers do: they enforce architectural boundaries through code review. The AI might generate code that reaches into another module's service layer directly. The human, or another AI catches it because it violates the public.ts rule.
That requires understanding why boundaries exist, not just what rules specify.
There's a beautiful feedback loop here: good architecture makes AI more effective, which makes maintaining good architecture easier, because AI generates compliant code faster than humans write hacky shortcuts.
Architecture becomes self-reinforcing rather than constantly eroding.
This can be demonstrated through one developer's practical experience. He built a complete product in one month—but not without hitting this pattern first.
Early on, he had inconsistent naming: "push/pull sources" in backend, "webhooks and scheduled imports" in UI. Same concept, different names everywhere. The AI thrashed. Couldn't maintain context. Generated code that was technically correct but semantically inconsistent.
Once he enforced naming consistency and clear boundaries, everything changed. The AI could stay productive because the environment was coherent. The architecture was clean. That coherence is what enabled the one-month delivery.
Architecture quality directly determines AI effectiveness.
This demands different capabilities than traditional development:
Intent articulation - Not formal waterfall-like specifications. The ability to describe what matters clearly enough that AI can execute without repeated back-and-forth. This is conversational precision, not documentation bureaucracy.
Modern specifications start as napkin sketches and sharpen through AI collaboration. Rough notes evolve through iterative dialogue, each pass clarifying intent.
System-level thinking - Understanding data flows, architectural patterns, system boundaries. The ability to reason about composition rather than implementation. This is big-picture cognition, not function-level detail work.

Constraint design - Writing AGENTS.md rules that prevent authorization bugs without restricting valid patterns. Designing the public.ts boundary that makes "can module A use code from module B?" a mechanical yes/no question. Creating module layout contracts (api/routes.ts, service/handlers.ts, repo/index.ts) that tell agents exactly where code belongs. This is API design thinking—creating interfaces between human intent and AI execution.
These aren't the skills the industry traditionally valued. They're fundamentally different because the production function changed.
Junior developers used to learn by reading code. Understanding implementations. Building mental models through detailed study.
That path is breaking. When AI generates the implementation, there's often nothing to study. The code exists, it works, but it doesn't teach anything because it wasn't designed to be learned from—it was designed to execute.
The learning path shifts:
Junior: Understanding system architecture from documentation and AGENTS.md files. Learning through building small features with AI assistance. Developing intent articulation skills.
Mid-level: Owning features end-to-end. Maintaining architectural consistency. Writing AGENTS.md files that guide AI effectively. Validating that implementations match intent.
Senior: Defining architectural boundaries. Making system-level trade-offs. Teaching others to work effectively with AI. Enforcing constraints that keep the codebase coherent as it scales.

The progression isn't lines of code written. It's scope of context managed and quality of constraints designed.
Traditional interview process: write an algorithm on a whiteboard. Demonstrate coding ability. Prove you can implement solutions.
With AI, those skills are table stakes. Everyone can generate working implementations. The differentiator is something else entirely.
What actually matters:
Can you articulate requirements clearly? Not in formal specs—in conversation. Can you explain what needs to exist and why, clearly enough that someone (or AI) can build it?
Do you understand system architecture? Not just patterns—actual systems. Data flows. Bottlenecks. Failure modes. The ability to reason about how pieces compose.
Can you design good constraints? Rules that guide without restricting. Boundaries that clarify without limiting. The jigs that make AI productive.
Traditional "leetcode" interviews test for skills that AI makes abundant. They miss the skills that are becoming scarce.
Stop hiring for coding ability alone.
Start assessing intent articulation, system thinking, and constraint design.
Stop measuring developers by lines of code or features shipped.
Start measuring by architectural quality, constraint effectiveness, and team velocity enabled.
Stop training developers to write better code.
Start training them to create better environments where AI writes code.
Stop optimizing for individual productivity.
Start optimizing for the quality of jigs that multiply across the entire team.
The value concentration shifted. Adapt your evaluation criteria accordingly.
Coming in Part 4: When solo developers can build complete products and coordination overhead dominates development time, how should teams actually be structured? We'll explore coordination patterns across different scales—from 5-person startups to 500-person engineering orgs—and why mob sessions are variance insurance, not meetings.
No comments yet