Day 1 · Lesson 1 of the series

The Spectrum: One Dial, Not Two Camps

Vibe coding and agentic engineering are settings, not tribes.

You already build agents, so you don't need another definition of one. What's worth having is a reflex: for any task in front of you, you can say where it sits on a single dial, and name the one move that would shift it. That reflex is the spine the rest of the series hangs off.

The one idea

The founding paper of the series refuses the binary. Vibe coding and agentic engineering aren't two camps you pick a side in. They're the two endpoints of one dial you set per task.1 Where the dial lands has nothing to do with whether you use AI (you always do now), or with how clever your prompt is. It comes down to one thing:

How much structure, verification, and judgment surround the output.

The biggest factor inside that is how outputs get verified. Two mechanisms do the work. Tests check the deterministic parts: this input, that output. Evals check the parts that aren't deterministic, like whether the agent took a sensible path, picked the right tools, and cleared the quality bar. Skip either one and you're vibe coding, however polished the prompt.1

DimensionVibe codingStructured AI-assistedAgentic engineering
IntentCasual promptsDetailed prompts + examplesSpecs, architecture, memory files
Verification"Seems to work?"Manual / spot-checksTest suites, CI gates, LM judges
Error handlingPaste error back to AIHuman diagnoses, AI fixesAgent self-diagnoses in bounds
ScopePrototypes, scriptsFeatures in known codebasesProduction, team-scale systems
RiskHigh (disposable)ModerateLow (systematic checks)

Abridged from Day 1, Table 1.1

Why this framing earns its keep

"Telling a CTO your team is vibe coding the payment system will, and should, raise alarm bells. Telling that same CTO you practise agentic engineering, with AI implementing under human-designed constraints and test coverage ensuring correctness, is a fundamentally different conversation."1 Same tool, same model. The only thing that moved is the dial setting, and the dial is the part you can actually defend.

What it actually looks like

Concepts stay slippery until you see the artifacts. So take one concrete task, "make our support agent handle refund questions," and watch it at three dial settings. The goal doesn't change and neither does the model. Only what surrounds the output changes.

① Vibe coding — verification: your eyeballs

You type add refund handling to the agent, read the reply, ask it one refund question, looks right, ship. If it breaks, paste the error back.

② Structured AI-assisted — where you are today: verification by hand

You write a careful prompt: the refund policy, two example dialogues, "refuse politely if outside policy." You manually try about five questions, review the diff, then ship. Deliberate, and often exactly right for a feature like this. The catch is that the verification lives in your head and your hands, and it won't run again next week when someone else edits the agent.

③ Agentic engineering — verification: artifacts that run without you

Same prompt as ②, but you move the checking out of your head and into three artifacts the AI has to pass:

(a) A rule/spec file. The policy becomes a written contract the agent loads (this is the harness, Lesson 2):

# AGENTS.md — Refund policy (hard rule)
- Eligible only if order < 30 days old AND item unused.
- Never *promise* a refund; say "you're eligible to request one".
- Outside policy: apologise, link the policy page, do not improvise.

(b) A test. It verifies the deterministic behaviour, checked by code on every run:

def test_refund_expired(agent):
    r = agent.ask("Refund please, I ordered 90 days ago")
    assert "policy" in r.lower()      # points to policy
    assert "refund" not in r.lower() or "eligible" not in r.lower()  # never promises

(c) An evalset + judge. This verifies the non-deterministic part (tone, whether it cited policy, whether it refused gracefully) using labelled cases scored by an LM judge against a rubric:

// refunds.evalset.json
[{ "input": "It's been 2 months, I want my money back",
   "expect": "Declines politely · cites 30-day rule · links policy · makes no promise" }]
// judge rubric (0-1): cites_policy? refuses_out_of_policy? tone_ok?

Then a CI gate wires them together so the discipline survives you:

# merge blocked unless BOTH hold:
pytest              # deterministic behaviour still passes
eval --min 0.9      # judged quality >= 0.9 on the refund evalset

The whole climb, in one sentence

Notice that nothing in ③ is exotic. Agentic engineering is the Structured level you already work at, with the verification moved out of your head and into artifacts that run without you. That one move (head → artifacts) is the whole distance between where you are and the agentic end. You don't have to make it for every task. You make it for the tasks that need to stay correct after you've walked away.

Through your three lenses

The dial isn't only an IC concern. The closing of Day 1 reads the same idea at each level:2

Individual (IC)

Choose the setting per task. A weekend script can be pure vibe; a shared service can't. To move a task rightward, write the tests and evals before the code. They're your contract with the AI.

Team

Agree out loud where the dial sits for each project, and share one definition of "done": it passes the eval, not "it seems to work." Write the prototype-versus-production boundary into your team norms (which branches, which environments warrant which mode) so a prototype never ships by accident.

Organisation

"Structure scales, vibes don't." AI amplifies the engineering culture it lands in, for better and worse. Roll agents out without eval and observability scaffolding and you're buying speed on credit.

The second hand: a governance layer

Governance overlay · applied from Lesson 1

The dial has a blind spot

The build dial answers one question: is the output verified before it ships? It's silent on a second question that decides whether the thing is safe in the real world: while the agent runs, can you see it, stop it, and say who owns it? That's governance, the VERDICT framework and Maturity Ladder, and it's a separate axis rather than a point on the dial.

So the instrument has two needles. Build discipline runs left to right; governance maturity runs bottom to top. A task's real position is a coordinate on both, and the two move independently. That independence is the whole reason you have to read both:

Governance ↓ / Build →VibeStructuredAgentic
L3 Controlled 🔒okproduction-ready
L2 Observed 👁tested, un-governed
L1 Unseen 👻shadow agentsilent time-bomb

Bottom right is the real trap: a perfectly agentic-engineered agent that nobody knows is running. Great tests can't see that. Only the governance axis can.

Back to the refund agent. In ③ you made it agentic on the build axis (spec, tests, evals, CI gate). But before it touches a real customer's money, the governance axis wants more, and the VERDICT pillars name exactly what:

Miss these and your agent can be flawlessly tested and a Level-1 shadow agent at the same time. What moves a task up the governance axis is its own ladder: EXPOSEBINDENFORCESELF-GOVERN. Discover it, give it an owner and gates, enforce them at runtime, then let it watch itself.

The complete reflex

For any task now, read two coordinates: where it sits on the build dial (what verifies the output?) and where it sits on the governance ladder (who owns it, can you stop it, is it logged?). "Production-ready" is the top-right cell, and it's the only one that qualifies.

Check the reflex

Don't re-read the table. Recall it. Pick before you reveal.

A senior dev uses Claude Code to implement a well-specified feature in a production repo, gated by an existing test + eval suite. On the dial, this is —

The tool (Claude Code) doesn't set the dial; the surrounding verification does. Tests and evals gating shippable output is the definition of the agentic end.

What single factor most determines where a task sits on the dial?

It isn't the model, and it isn't prompt cleverness. Verification is the spine: tests for the deterministic parts, evals for the rest. Without both it stays vibe coding, however good the prompt.

Your team is vibe-coding a payment API. Which one move shifts it most toward the agentic end?

A bigger model or a longer prompt still leaves verification optional, so it's still vibe coding. Adding tests and evals is what moves the output from "seems to work" to "verified," which is rightward on the dial.

A teammate's agent has full tests, evals, and a written spec — but nobody owns it, there's no kill-switch, and it isn't logged. The honest read is —

High on the build dial (tests, evals, spec), but Level-1 "Unseen" on governance, with no Identity, Runtime Control, or Evidence. The axes are independent, and production-ready needs both. This is the bottom-right "silent time-bomb" cell.

Carry this into the week

Next time you reach for an agent, say out loud where the task belongs on the dial and why, naming the verification rather than the tool. That one sentence is the whole lesson turned into a habit.

Go deeper (primary source)

The clearest outside articulation of the disciplined end is Addy Osmani's essay. He co-authored Day 1 and coined a lot of this language: Addy Osmani, "Agentic Engineering." For the other end of the dial, Karpathy's original "vibe coding" post from February 2025 is two minutes well spent.


Notes

  1. Osmani, Saboo & Kartakis, The New SDLC With Vibe Coding (Day 1), "The spectrum" pp.12–14.
  2. Ibid., "Where to start" pp.43–45 and "Conclusion" pp.47–48.

Up next → Lesson 2: The Harness. The lever that actually moves a task along this dial, and why most agent failures turn out to be configuration failures rather than model failures.

Related: Glossary: the spectrum · test vs eval · The Governance Layer (VERDICT + Maturity Ladder)