When code stops being the source of truth

A paradigm shift is emerging in software engineering: Requirements, not Code, are becoming the Source of Truth.

For decades, engineers have treated code as the ultimate authority. When documentation conflicted with implementation, we’d say “the code doesn’t lie.” When someone asked why a system behaved a certain way, we’d point to the source files. This made sense in a world where writing code was expensive and maintaining documentation was an afterthought.

But something fundamental is changing. In domains like medical software or large enterprises, where regulatory compliance demands traceability, I’ve watched teams struggle with a painful reality: knowledge about why things were built a specific way has been lost. The code exists, but the intent behind it has evaporated. Comments rot. Wikis go stale. The original architects move on. What remains is implementation without explanation—a system that works, but nobody fully understands why.

LLMs are forcing us to confront this problem head-on. And surprisingly, they’re also offering a way out.


The paradigm shift: Requirements-first because code is cheap

Here’s the uncomfortable truth: LLMs have commoditized code generation.

When I can describe what I want in natural language and get working implementation in seconds, the code itself stops being the scarce resource. What becomes scarce is the intent—the precise specification of what we actually need.

This is why requirements are becoming the new source of truth. It’s not philosophical; it’s practical. LLMs make it trivially easy to generate code. But that code frequently isn’t what was intended. I’ve seen this pattern repeatedly: an LLM produces syntactically correct, logically coherent code that completely misses the point. The implementation is flawless. The understanding is wrong.

Think of it like a new kind of compiler. English (your requirements) is the high-level language. Python or Java is becoming the new Assembly. We stopped reading Assembly decades ago because compilers got good enough. We’re approaching a similar inflection point with natural language and code.

This shift changes everything about how we work. It’s now dramatically easier to write requirements with an LLM, store them in structured formats, reference them across the codebase, and regenerate code when needed. The requirements become the persistent artifact. The code becomes ephemeral—generated, tested, potentially discarded and regenerated.

The implication is stark: if your requirements are vague, your generated code will be confidently wrong. If your requirements are precise, your generated code has a fighting chance. The quality bottleneck has moved upstream.


What changes in practice: Product management becomes the bottleneck

If requirements are the source of truth, then the people who create requirements become the most critical function in the organization.

This means product management is about to gain significant importance. Not the project-management-disguised-as-product-management that plagues many companies, but genuine product thinking: user journeys, workflows, acceptance criteria, edge cases, constraints.

The artifacts that product managers create—user stories, journey maps, functional specifications—are no longer just communication tools. They’re becoming executable intent. Feed them to an LLM with the right context, and you get implementation. The quality of that implementation directly reflects the quality of those artifacts.

This has several practical implications:

The counterargument I hear most often: “Requirements documents become stale just as easily as code comments.” This is true in the old paradigm, where requirements were write-once artifacts that nobody referenced after development started. In a requirements-first world, the requirements are referenced constantly—every time you regenerate code, every time you onboard an LLM to a new task. Staleness becomes immediately visible because the generated code stops matching expectations.


Engineering is reinvented: The ‘LLM buddy’ becomes infrastructure

Engineering isn’t disappearing. It’s being reinvented.

The “LLM buddy” is no longer a nice-to-have productivity tool. It’s becoming infrastructure—as fundamental to development as the compiler or the version control system. According to 2025 Industrial Trends research, automation acceleration is driving industrial-scale speed and efficiency. The same principle applies to software: the LLM buddy isn’t just a helper, it’s a requirement for keeping pace.

What does this mean for day-to-day engineering work?

Highly skilled engineers may resist this shift. It can feel like deskilling, like the craft they’ve spent years mastering is being commoditized. But the reality is different: the skill ceiling rises, not falls. The engineers who thrive are those who can think at the requirements level while still understanding implementation deeply enough to validate LLM outputs and catch subtle errors.


LLM versioning is a new dependency class (and a new risk)

Here’s something most teams haven’t internalized yet: the LLM is a dependency, and dependencies have versions.

When you upgrade from GPT-4 to GPT-4.5, or switch from Claude to Gemini, you’re not just changing a tool. You’re changing the “compiler” that transforms your requirements into code. And unlike traditional compilers, LLMs don’t guarantee deterministic output.

A new LLM version won’t necessarily deliver the same speed, cost, or quality as the previous one. I’ve seen teams upgrade to a “better” model only to discover that their carefully tuned prompts now produce subtly different—and sometimes worse—results. The model improved on benchmarks but regressed on their specific use case.

This creates a new class of risk:

The practical implication: pin your LLM versions like you pin your library versions. Document which model produced which code. Build tooling to detect when regenerated code differs from committed code.


Architecture for LLMs: Consistency beats cleverness

If you want LLMs to generate good code for your codebase, you need to make your codebase LLM-friendly. And the single most important principle is consistency.

Repository consistency makes it dramatically easier for LLMs to implement new features. When design patterns are already established and consistently applied, the LLM can follow them. When naming conventions are uniform, the LLM can extend them. When file structures are predictable, the LLM knows where to put things.

The problem arises when you have two or more design patterns for the same goal. Maybe the codebase evolved over time. Maybe different teams had different preferences. Maybe someone introduced a “better” pattern without migrating the old one. This confuses LLMs and generates hallucinations. The model sees conflicting examples and picks one—or worse, invents a hybrid that follows neither pattern correctly.

This leads to a counterintuitive principle: in an LLM-assisted codebase, consistency beats cleverness. A simpler, more uniform architecture that an LLM can reliably extend is more valuable than a sophisticated architecture that requires deep understanding to work with correctly.

Practical guidelines for LLM-friendly architecture:


Guardrails beyond traditional engineering

LLMs can very easily hallucinate and drift from requirements. They can drift from architecture. They can introduce patterns the team abandoned years ago—like passing variables by reference when the team stopped using that approach five years back.

This is why strong guardrails that go beyond usual engineering guardrails will emerge.

Traditional guardrails—linters, type checkers, code review—catch syntactic and structural issues. LLM-era guardrails need to catch semantic drift: code that’s technically correct but violates intent.

This is especially critical in regulated domains like medicine. Medical software requires traceability from requirements to implementation to validation. If an LLM generates code for a clinical decision support system, there must be a clear chain showing which requirement produced which code, and which tests validate that the code meets the requirement. Regulatory bodies like the FDA don’t accept “the AI wrote it” as documentation.

Emerging guardrail patterns include:

The goal isn’t to eliminate LLM assistance. It’s to channel it within boundaries that ensure the output meets your standards, your architecture, and your regulatory requirements.


A requirements-first operating model teams can adopt

The shift from code-first to requirements-first isn’t something that happens overnight. It’s a gradual evolution in how teams think about their work.

Here’s what this looks like in practice:

The teams that adapt to this paradigm will build faster and more reliably. The teams that don’t will find themselves struggling with confident, coherent code that completely misses the point.

The code doesn’t lie. But increasingly, the requirements are what matter.


Further Reading


Dan Gurgui | A4G
AI Architect

Weekly Architecture Insights: architectureforgrowth.com/newsletter