Skip to main content

Your AI Agent Stack Is Your Competitive Edge — If You Treat It as Infrastructure

6 min read

TL;DR: Same models, different outcomes. The edge is infrastructure: outcome-based delegation, separate QA routing, persistent memory, and mobile approval — not which chat window you use.

Most developers have access to the same models. The gap isn’t which CLI you run — it’s whether your agents have memory, validation, routing, and a workflow that gets better every week.

I run The Unnamed Roads: 8 sites, 23 n8n workflows, self-hosted AI on a Hetzner VPS (~€35/month). This spring I rebuilt how I work with code: from “ask Cursor about X” to a pipeline where agents plan, implement, test, and wait for my approval — while I do something else.

This isn’t a product review. It’s the architecture I landed on after wasting time on things that sound productive but don’t scale. For the broader operating model, see what is agentic engineering. For the full platform breakdown, see the agentic platform case study.

Chat is not a stack

An agent in your IDE is great for exploration. It’s a poor operating model.

Three problems:

  1. No memory across sessions — the same mistakes, every month.
  2. No validation — unit tests green, product broken.
  3. You are the bottleneck — every micro-task waits on you.

The competitive edge starts when you treat agents as a team with roles, not as smart autocomplete.

What my stack actually does

I run this on owned infrastructure (Coolify on Hetzner):

LayerRole
PaperclipKanban + agent home — I see what’s in flight
LangGraphPlans tasks, runs chained heartbeats, triggers review
Developer / QA / Data agentsImplement, review, report
LiteLLMRoutes models — fast for planning, stronger for QA
TelegramMobile approval (✅/❌)
pgvectorLong-term memory per agent

The flow in practice:

  1. I send /task fix X in Telegram — or create an issue in Paperclip.
  2. The router classifies the work by outcome, not action: what must be true when it’s done, plus an E2E command as proof.
  3. LangGraph breaks the job into steps (S/M/L), runs 1–3 heartbeat passes, triggers QA immediately.
  4. The QA agent re-runs diff + tests + E2E — on a different model than dev.
  5. I get a notification. I approve or reject. Rejections are saved to memory.

I don’t blind-merge. But I also don’t read 400-line diffs per PR — I read proof that it works.

What created leverage (and what didn’t)

1. Outcome delegation

Bad prompt: “Rename this variable.”

Good issue:

## Desired outcome
Users can paste an image into chat without the layout jumping.

## E2E verification
npm run build && manual paste test in dev

The agent figures out the implementation. I verify the outcome. This sounds obvious, but most agent setups still assign actions instead of states. Action prompts create busy work. Outcome prompts create accountable work.

2. Separate models for dev and QA

LiteLLM routes planning to fast models (Groq, Haiku) and QA to stronger ones (Claude Sonnet). The dev agent optimizes for speed; the QA agent optimizes for catching what speed missed.

Same-model review is self-confirmation. Different-model review is closer to a real code review — and it costs almost nothing extra when routing is centralized.

3. Memory from rejections

When I reject a PR, the reason goes into pgvector under that agent’s namespace. Next time a similar task appears, the planner recalls: “Last time we tried X, human rejected because Y.”

This is the fix for problem #1 (no memory across sessions). Not chat history — structured recall tied to task types.

4. Approval at the right layer

Telegram approval for anything that touches production: merges, publishes, infra changes. Internal drafts and plans run without me.

Too many gates and the system isn’t autonomous. Too few and things ship broken at 3am. The rule I use: externally visible = human decision. Everything else runs.

What didn’t create leverage

Fancier prompts without workflow changes. Better system prompts don’t fix missing validation or routing.

More agents before one agent was reliable. I added a QA agent only after the dev loop ran consistently for weeks. Multi-agent coordination grows faster than linearly — get one loop right first.

Managed SaaS for every layer. I tried stacking subscriptions (hosted n8n, hosted analytics, hosted email). Cost went up; control went down. Self-hosting on Coolify cut infrastructure to ~€35/month without sacrificing observability. Details in building with AI agents as co-workers.

Reading every diff. That’s the old bottleneck wearing a new hat. Proof-based review scales; line-by-line review doesn’t.

The compounding effect

Week one, the stack felt slower than chat. Week four, rejections were dropping because memory caught repeat mistakes. Week eight, I was approving finished work from my phone between meetings instead of context-switching into the IDE for every micro-task.

The stack doesn’t make agents smarter. It makes the system smarter — every rejection, every failed E2E, every approved merge feeds the next run.

That’s infrastructure thinking. Same models as everyone else. Different operating model.

Where to start

If you’re moving from chat to stack, don’t rebuild everything at once:

  1. Pick one recurring task — bug fixes, content drafts, data reports. Something that happens weekly.
  2. Write it as an outcome — desired state + verification command.
  3. Add one validation step — tests, E2E, or a second model pass.
  4. Add one memory write — log rejections and failures somewhere persistent.
  5. Run it for 30 days before adding a second agent.

The toolstack page lists everything I run in production. The agentic engineer vs AI engineer guide helps if you’re hiring or scoping this internally.


Frequently Asked Questions

Why isn’t an IDE AI assistant enough? IDE assistants are excellent for exploration and single-session work. They don’t persist memory across tasks, don’t run validation pipelines autonomously, and don’t operate while you’re offline. A stack adds roles, routing, and governance — the parts that make agents a team instead of a tool.

What does outcome delegation mean? Define what must be true when the work is done, plus how to prove it. Let the agent plan the steps. You review proof, not micromanagement. This shifts your job from operator to reviewer.

Why route QA to a different model? Same-model review shares the same biases and blind spots as the implementation. A separate model — especially a stronger one — catches integration issues, missed edge cases, and “tests pass but product broken” scenarios more reliably.

How much does this cost? Infrastructure: ~€35/month on Hetzner via Coolify. LLM API costs depend on volume; LiteLLM tracking makes per-task spend visible. The constraint is architecture quality, not server budget.

Tools Used in This Article

This article mentions several tools from my tech stack.

Get insights and updates first

Subscribe to get updates on agentic engineering, data pipelines, MCP infrastructure, and new projects straight to your inbox.