From Agents to Intent: Why Declarative AI Programming is the Next Efficiency Revolution
By Ben Houston, 2025-05-05
"AI doesn’t need better prompts -- it needs better context."
When I built MyCoder.ai -- an autonomous coding agent that could write, test, and commit code -- I thought I had seen the future. It scaffolded applications, added endpoints, wrote tests, and even passed CI.
Then I asked it to modify something.
That’s when everything broke.
It wasn't the AI’s fault. It was mine -- for asking it to operate in a paradigm that no longer made sense.
The Greenfield Mirage
AI agents shine in blank-slate scenarios:
- “Build a product review system using Prisma and Next.js”
- “Create a page for browsing user feedback with filters and charts”
- “Add a GitHub Action that runs tests and lint checks”
The output is coherent, contextual, and (usually) solid.
But ask it to:
- Update a specific validation rule
- Refactor duplicated logic between two controllers
- Add a setting to an old configuration system
And suddenly you’re debugging hallucinated fields, broken flows, and code that doesn't resemble your architecture at all.
This isn’t a tooling issue -- it’s a structural one.
The Asymmetry of Agentic Coding
Here’s the pattern:
Task Type | Agent Performance |
---|---|
Greenfield creation | ✅ Coherent, fast, high-quality |
Modification of existing code | ❌ Inconsistent, fragile, ghost-prone |
Agents perform best when you give them explicit, well-bounded goals. But most real-world software isn’t a clean slate. It’s a tangle of past decisions, half-forgotten constraints, and inconsistent patterns.
When we ask an AI to modify a codebase, we’re asking it to infer intent from implementation -- a task even senior engineers struggle with.
No surprise that the results are unreliable.
(See: Ghost Features and Test Theater.)
Implementation-Centric Development Is the Bottleneck
Our current paradigm is built around the idea that implementation is the point:
- We write Jira tickets like "Add auth to checkout flow"
- We treat code as the primary artifact of our work
- We review diffs, not designs
- We celebrate commits, not clarity
But implementation is fragile. It captures the “how” but rarely the “why.”
Worse: the moment you ship code, its rationale begins to decay. Weeks later, no one remembers why a function skips nulls or why a toggle exists. This forces every future contributor -- human or AI -- to reverse-engineer the past.
This is where agents fail -- not because they’re unintelligent, but because the context they need simply isn’t there.
This Has Happened Before: Assembly vs. High-Level Languages
This problem isn’t new. In the early days of programming, we used to write in assembly -- manually translating goals into low-level machine instructions.
It worked. But it was error-prone, opaque, and nearly impossible to maintain.
Then we invented high-level languages.
We stopped thinking in terms of instructions and started thinking in terms of intent:
- for loops
- functions
- classes
Suddenly, we could build bigger systems with fewer errors and more reuse.
Today, we’re stuck in an equivalent trap -- but at the application level.
AI coders are our new compilers. But we’re still feeding them hand-tuned assembly.
Intent-Based Development: A New Abstraction Layer
The next leap forward is to stop writing implementation code altogether -- and start declaring intent.
In this new model:
- Code is no longer the source of truth.
- Intent is defined in structured, version-controlled specification files.
- Implementation is generated from that intent.
- Modifications happen at the level of intent -- not code.
This is what I call intent-based development. And it changes everything.
What This Looks Like in Practice
Imagine describing a UI component like this:
builder: react/component description: A horizontal group of buttons that stacks vertically on mobile instructions: | A group of horizontal buttons that stacks vertically when on mobile screens. It takes as props just standard react children. concerns: - prefer-types
From that one intent file, a system like Declary can generate:
- A typed React component
- A test suite
- An optional Storybook story
- Styles scoped to your design system
Need to update the layout? Change the description. Re-run the builder.
Everything stays aligned. Nothing rots.
Now imagine doing the same for APIs, database queries, workflows, dashboards, and infrastructure.
That's the power of declarative intent.
Why This Works Better -- for AI and for You
When you work this way:
- AI doesn’t have to guess what you want -- it reads the spec.
- Generated code reflects the current truth -- not accumulated entropy.
- Tests can be derived from requirements -- not existing behavior.
- Refactors become regenerations -- not manual surgery.
This isn’t just a productivity boost -- it’s a resilience boost. Your system becomes explainable, reproducible, and evolvable.
But What About Control?
Developers ask: “What if I want to tweak the generated code?”
You can. But treat the generated code like you’d treat compiled assembly: inspect it, learn from it, override it -- but don’t make it your source of truth.
And for the cases where you truly need handcrafted logic, just write it. Intent-based development doesn’t ban implementation -- it demotes it.
Code becomes a byproduct of design, not the design itself.
Meet Declary: A Toolkit for Intent-Based Systems
To make this real, I’ve been building Declary: a system for defining, managing, and generating software from structured intent.
- Intent lives in YAML files (e.g., ButtonGroup.intent.yaml)
- Builders produce artifacts like code, tests, and configs
- Concerns apply reusable logic (like auth, styling, or analytics)
- Agents help you write and evolve intent -- not code
Declary isn’t a framework. It’s a toolkit. You can use it for one component or an entire application. Start small. Expand as you see results.
The Shift Already Happened in Infra
If this sounds radical, remember: infrastructure already went through this shift.
Terraform taught us that:
- You don’t make changes via the cloud builder consoles.
- You declare the state you want.
- You let the tool figure out how to get there.
Why should app code be any different?
Conclusion: Declare, Don’t Implement
Agentic coding showed us what’s possible -- but also exposed the limits of our current tooling.
If we want AI to become a reliable collaborator -- not just a novelty -- we have to give it something better than messy code and loose tickets.
We have to give it intent.
Intent-based development isn’t just a new tool. It’s a new abstraction layer for software. One that aligns with how humans think and how AI works.
It’s not about replacing programmers.
It’s about replacing plumbing with architecture.
And if we get it right, the next generation of developers won’t debug features -- they’ll design them.