<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniel Stolf</title>
    <description>The latest articles on DEV Community by Daniel Stolf (@dcstolf).</description>
    <link>https://dev.to/dcstolf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3951248%2Fa1bca884-9bcf-4916-90bd-cac1343c97e3.jpeg</url>
      <title>DEV Community: Daniel Stolf</title>
      <link>https://dev.to/dcstolf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dcstolf"/>
    <language>en</language>
    <item>
      <title>Code Is the New Server. Specs Are the New Terraform.</title>
      <dc:creator>Daniel Stolf</dc:creator>
      <pubDate>Fri, 19 Jun 2026 18:04:50 +0000</pubDate>
      <link>https://dev.to/dcstolf/code-is-the-new-server-specs-are-the-new-terraform-l4h</link>
      <guid>https://dev.to/dcstolf/code-is-the-new-server-specs-are-the-new-terraform-l4h</guid>
      <description>&lt;p&gt;Most of us are committing the wrong artifact to version control.&lt;/p&gt;

&lt;p&gt;When you commit code today, you're committing the output of a process. The thinking happened somewhere upstream (a Linear ticket, a Slack thread, a notebook, a conversation with the team), and what survived that thinking is the code in the repo. The spec, the trade-offs, the constraints you considered and rejected? Mostly gone. The code is the record. The repo is the source of truth.&lt;/p&gt;

&lt;p&gt;We had this exact conversation a decade ago. It was about servers.&lt;/p&gt;




&lt;p&gt;Before Terraform, the server WAS the truth. You'd SSH in, install packages, edit configuration files, restart services. Maybe you wrote a runbook. The runbook went stale. The server kept going. When something broke, you debugged the server, not the runbook. The version of truth was the running machine.&lt;/p&gt;

&lt;p&gt;Then IaC happened. The .tf file became the source of truth. The server became the build artifact. You stopped backing up servers and started backing up .tf files. When a server drifted from the .tf, you didn't reach for the server to figure out what changed. You ran terraform plan, saw the diff, decided whether to update the .tf or re-apply. The server stopped being something you protected. It became something you could reliably regenerate.&lt;/p&gt;

&lt;p&gt;We didn't stop having servers. We stopped versioning them.&lt;/p&gt;




&lt;p&gt;AI changes the cost of regenerating code from a description of what it should do.&lt;/p&gt;

&lt;p&gt;Not perfectly. Not in every case. But enough that, for a growing set of work, the implementation is cheaper to regenerate from intent than to maintain by hand. And once that's true, the implementation can move into the role the server played: the build artifact. The thing you keep around but don't treat as the canonical source.&lt;/p&gt;

&lt;p&gt;What plays the role of the .tf file? The spec. Or whatever you want to call it: the acceptance criteria, the contract, the intent-doc. The thing that says what should be true about the behavior, captured in a form structured enough to regenerate the code from.&lt;/p&gt;

&lt;p&gt;That's the thing worth versioning.&lt;/p&gt;




&lt;p&gt;If intent is the source of truth, several things shift.&lt;/p&gt;

&lt;p&gt;PRs stop being about code diffs and start being about intent diffs. The reviewer asks: did the spec change? does the new spec make sense? does the code match? The interesting conversation moves upstream of the implementation. The downstream check (code matches spec) gets cheaper, often automatable.&lt;/p&gt;

&lt;p&gt;Tests come from the spec, not from the code. Acceptance criteria become failing tests before any implementation exists. The code has to satisfy them. This is what test-first really means once code becomes regenerable.&lt;/p&gt;

&lt;p&gt;Drift, when it happens, gets repaired differently. If the code stops matching the spec, you don't reach into the code to fix it. You decide whether the spec was right (in which case, regenerate the code) or the spec was wrong (in which case, fix the spec, then regenerate). The same loop terraform plan teaches you.&lt;/p&gt;

&lt;p&gt;History and memory attach to the spec. The reasons a decision was made, the alternatives considered, the failure mode that bit you in production last quarter, those belong with the spec they shaped. The code is downstream. It inherits those reasons but doesn't carry them.&lt;/p&gt;




&lt;p&gt;The natural pushback is: but code is still code. You still have to read it, debug it, run it, pay for it in CPU cycles. It doesn't go away just because it's downstream.&lt;/p&gt;

&lt;p&gt;Right. Servers don't go away under Terraform either. You still SSH in when things break. You still tail logs. You still get woken up at 2am. The change wasn't that the artifact disappeared. The change was where the source of truth lived.&lt;/p&gt;

&lt;p&gt;Code in an intent-versioned workflow is the same. It stays in the repo. You can read it. You can debug it. You can ship it. But when you need to change WHAT the system does, you change the spec, and the code follows. When the code drifts from the spec, you investigate why, and the fix lands upstream more often than not. The shift isn't "no more code." The shift is "code answers to something now."&lt;/p&gt;




&lt;p&gt;This is what &lt;a href="https://github.com/DCSTOLF/speccraft" rel="noopener noreferrer"&gt;Speccraft&lt;/a&gt; is built around.&lt;/p&gt;

&lt;p&gt;Specs are first-class versioned artifacts in the repo, not throwaway prompts. Code generation flows from those specs through a structured process. Tests come from the spec before implementation, enforced by a hook that blocks production edits without a corresponding test edit. Decisions, conventions, and scars attach to specs and persist across sessions, so the next contributor (human or model) inherits the rationale, not just the diff.&lt;/p&gt;

&lt;p&gt;It's the .tf file for code. The thing you version, the thing you review, the thing you treat as canonical. The code becomes what it should have been all along: the runnable expression of an intent the team agreed on.&lt;/p&gt;




&lt;p&gt;What would your repo look like if the spec was the source of truth and the code was the build artifact? Most of us already half-believe this. We just haven't restructured anything to act on it yet.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have you started treating intent as a versioned artifact in your workflow? Or is the spec still living in a ticket somewhere?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agentskills</category>
      <category>claude</category>
    </item>
    <item>
      <title>Terraform for AI generated code</title>
      <dc:creator>Daniel Stolf</dc:creator>
      <pubDate>Mon, 15 Jun 2026 03:00:00 +0000</pubDate>
      <link>https://dev.to/dcstolf/terraform-for-ai-generated-code-4bk</link>
      <guid>https://dev.to/dcstolf/terraform-for-ai-generated-code-4bk</guid>
      <description>&lt;p&gt;Over the past few weeks I've written about the workflows I developed building production systems with AI: spec-driven development, manual RAG, grounding models against hallucinations, the Terraform discipline of plan-before-apply, and what happens when you skip all of that and vibe-code your way into a mess you can't undo.&lt;/p&gt;

&lt;p&gt;Every post in this series was pointing at the same thing.&lt;/p&gt;

&lt;p&gt;Today I'm sharing it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Introducing speccraft: a Claude Code plugin for spec-first, test-driven AI development.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The one-line description from the README says it better than I can:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Terraform for AI-generated code. Versioned intent. Auto-injected memory. Cross-model review. Hook-enforced TDD.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Here's what it actually does, in plain terms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every change starts with a spec.&lt;/strong&gt; /spec:new interviews you Socratically (why, what, acceptance criteria_ and writes a versioned spec file directly into your repository. Not a chat artifact. Not a prompt you'll lose at the end of the session. A durable, committed, reviewable document that defines exactly what is about to change before implementation begins.&lt;/p&gt;

&lt;p&gt;The spec is the contract. Committing it to the repo makes that contract real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The spec gets reviewed before code is written.&lt;/strong&gt; /spec:review routes the spec to auxiliary agents (Codex, Gemini, OpenCode, or a Claude subagent running a critic persona) in parallel, and synthesizes the verdicts. Ambiguity, missing edge cases, untestable criteria: these surface at the spec stage, not after the implementation is already tangled across six files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation is test-first. Not by convention. By enforcement.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A hook intercepts every edit to a production file. If no sibling test file was edited more recently in the same session, the edit is blocked.&lt;/p&gt;

&lt;p&gt;Not warned. Blocked.&lt;/p&gt;

&lt;p&gt;Now, I know what you're thinking. We've all tried the "make no mistakes" prompt. We've all been let down.&lt;/p&gt;

&lt;p&gt;Turns out it does work, you just have to enforce it with a hook, not a prompt.&lt;/p&gt;

&lt;p&gt;Speccraft is how "write tests first" stops being advice and starts being a hard constraint. The model cannot skip the RED step and go straight to GREEN. You can override it (one-time, with a reason that gets logged) but you can't ignore it. The discipline is architectural, not aspirational.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The repo carries its own memory.&lt;/strong&gt; A small .speccraft/index.md (guardrails, architecture decisions, conventions) is auto-injected at every session start. The model always knows the rules of this codebase. Not because you remembered to paste them in. Because the plugin handles it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heavy work is delegated to auxiliary agents.&lt;/strong&gt; /spec:delegate codex "Generate table-driven tests for internal/health/handler.go": Codex or other agent runs the task, speccraft synthesizes the result. The right model for the right job, orchestrated from a single workflow.&lt;/p&gt;




&lt;p&gt;Everything in this series (the Kubernetes Operator built in two weeks, the manual RAG sessions, the hallucination loops, the race condition the model confidently couldn't fix, the Terraform analogy, the vibe-coding mess I couldn't undo), all of it was pointing at the same underlying problem.&lt;/p&gt;

&lt;p&gt;AI-assisted development is genuinely powerful. But left undisciplined, it amplifies ambition faster than it delivers correctness. Specs drift from implementations. Memory resets between sessions. Reviews are single-model and single-perspective. Tests get written after the fact, if at all.&lt;/p&gt;

&lt;p&gt;Speccraft is the workflow I needed to build the things I was building and couldn't find anywhere else.&lt;/p&gt;

&lt;p&gt;So I built it.&lt;/p&gt;




&lt;p&gt;It's open source. MIT licensed. Currently Go-first, with Python support already in and more languages on the roadmap.&lt;/p&gt;

&lt;p&gt;If you've been building with Claude Code and hitting the same walls, link in the comments.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="//github.com/DCSTOLF/speccraft"&gt;github.com/DCSTOLF/speccraft&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What would you add to a workflow like this? What's the discipline you keep having to re-enforce manually?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>programming</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>The Terraform hook</title>
      <dc:creator>Daniel Stolf</dc:creator>
      <pubDate>Fri, 12 Jun 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/dcstolf/the-terraform-hook-715</link>
      <guid>https://dev.to/dcstolf/the-terraform-hook-715</guid>
      <description>&lt;p&gt;The most dangerous moment in AI-assisted development isn’t when the model gets something wrong.&lt;/p&gt;

&lt;p&gt;Like most things in life, it’s when everything is going right and you stop paying attention.&lt;/p&gt;




&lt;p&gt;I’ve been building a complex software project using Claude Code and Codex as my primary implementation engine. The productivity is real. The output quality, when the workflow is disciplined, is genuinely impressive.&lt;/p&gt;

&lt;p&gt;But a few times I fell into a different mode entirely.&lt;/p&gt;

&lt;p&gt;Prompt after prompt, change after change, no spec, no checkpoints, no Git discipline. Just vibing: chasing a goal with whatever the model suggested, iterating fast, feeling productive.&lt;/p&gt;

&lt;p&gt;Until something broke.&lt;/p&gt;

&lt;p&gt;And when I went to undo it, I couldn't separate the good changes from the bad ones. They were tangled together across files, across sessions, across prompts I could no longer reconstruct (and even the ones I could would not have helped, because running them again wouldn't reproduce the same code). &lt;/p&gt;

&lt;p&gt;I had to roll back work that was correct alongside work that wasn't, with no safe way to recover what I'd lost. I built the bad outcome myself. The model just helped me get there faster.&lt;/p&gt;




&lt;p&gt;That experience forced me to design something I’d been resisting: a structured workflow that keeps the implementation grounded and close to deterministic, even when my specs are too ambitious and my instincts are telling me to just ship.&lt;/p&gt;

&lt;p&gt;Here’s what it looks like.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Step 1 - Plan: generate a durable spec&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A slash command takes the goal and produces a structured specification as a file committed directly to the repository, not a chat artifact, not a temporary prompt. A durable, reviewable, version-controlled document that defines exactly what is about to change and why.&lt;/p&gt;

&lt;p&gt;This matters because the spec is now part of the codebase. It can be reviewed by a human, challenged by a subagent running a critic persona, or sent to a different model entirely ( Codex, a local model) for an independent second opinion before a single line of implementation begins.&lt;/p&gt;

&lt;p&gt;The spec is the contract. Committing it to the repo makes that contract real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 - Decompose: break ambition into steps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Overambitious specs are where agentic workflows go wrong. A goal that sounds coherent at the planning level often requires changes across too many files, too many layers, too many concerns simultaneously (and the model loses coherence trying to hold it all).&lt;/p&gt;

&lt;p&gt;The decompose step breaks the spec into sequential sub-specs, each targeting no more than 8 self-contained steps. Dependencies are grouped into step groups. Each step group has a simple validation gate between steps and a full validation gate at the end of the group.&lt;/p&gt;

&lt;p&gt;The ambition doesn’t go away. It gets sequenced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 - Apply: scoped, gated, recoverable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Implementation is scoped to single files per step. After each step: syntax check, compilation, tests. Only when the gate passes does the next step begin.&lt;/p&gt;

&lt;p&gt;No gate, no progress.&lt;/p&gt;

&lt;p&gt;This is the part I was skipping when I vibe-coded my way into trouble. The gates feel slow when everything is going well. They feel essential the first time something fails cleanly at step 3 instead of corrupting steps 1 through 7 simultaneously.&lt;/p&gt;




&lt;p&gt;If this sounds familiar, it should.&lt;/p&gt;

&lt;p&gt;It's the same discipline Terraform enforced on infrastructure a decade ago. You don't run &lt;code&gt;terraform apply&lt;/code&gt; on a hunch. You run &lt;code&gt;terraform plan&lt;/code&gt; first, you review exactly what is about to change, you confirm it matches your intent, and only then do you apply. The plan is reviewable, the apply is scoped, and the state is always recoverable.&lt;/p&gt;

&lt;p&gt;There's a useful way to think about why this matters now. If an agent is a kind of fuzzy compiler (something that turns intent into working code, but non-deterministically) then the plan starts to look like our real source code, and the code itself becomes more like a build artifact. That shifts where the discipline has to live: plan is what you review and version, because it's the thing that actually captures intent. It's the same split Terraform draws between the plan you scrutinize and the state you protect.&lt;/p&gt;

&lt;p&gt;We learned that lesson for infrastructure. We're relearning it now for code.&lt;/p&gt;

&lt;p&gt;The difference is that a reckless &lt;code&gt;terraform apply&lt;/code&gt; might delete a database. A reckless agentic coding session might delete your understanding of what you built - and that's much harder to restore from backup.&lt;/p&gt;




&lt;p&gt;The workflow didn’t make me build faster. It made what I built recoverable.&lt;/p&gt;

&lt;p&gt;There’s a version of AI-assisted development that is genuinely fast and genuinely reliable, where you can move quickly because you have checkpoints, where you can be ambitious because the ambition is sequenced, where a failure at step 4 doesn’t take steps 1, 2, and 3 down with it.&lt;/p&gt;

&lt;p&gt;And there’s a version that feels faster (prompt after prompt, change after change) right up until the moment it isn’t.&lt;/p&gt;

&lt;p&gt;I’ve done both. The structured version is slower to start and harder to resist bypassing. But it’s the only one where I can honestly say I know what I built, why it works, and how to reproduce it.&lt;/p&gt;




&lt;p&gt;The insight that took me too long to internalize:&lt;/p&gt;

&lt;p&gt;Agentic tools don’t just amplify good judgment. They amplify the absence of it too.&lt;/p&gt;

&lt;p&gt;The workflow exists to make sure that when I’m too ambitious, too impatient, or too deep in a flow state to notice, the system catches it before I do.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you developed guardrails for your own agentic workflows? What forced you to build them?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>claude</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>AI Doesn't Replace Expertise. It Multiplies It.</title>
      <dc:creator>Daniel Stolf</dc:creator>
      <pubDate>Wed, 10 Jun 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/dcstolf/ai-doesnt-replace-expertise-it-multiplies-it-11m0</link>
      <guid>https://dev.to/dcstolf/ai-doesnt-replace-expertise-it-multiplies-it-11m0</guid>
      <description>&lt;p&gt;When I started building my Kubernetes Operator, I wasn't a Go developer.&lt;/p&gt;

&lt;p&gt;I had deep Kubernetes expertise. Deep database expertise. Seven years of enterprise platform work. But Go? I was learning it as I went, reading documentation, studying patterns, understanding idiomatic practices for the first time.&lt;/p&gt;

&lt;p&gt;The operator shipped in two weeks anyway.&lt;/p&gt;

&lt;p&gt;Not because AI replaced the expertise I didn't have. Because the expertise I did have (knowing exactly what the system needed to do, understanding the Kubernetes internals, seeing the database behavior clearly) was the hard part. AI helped me express that expertise in a language I was still learning.&lt;/p&gt;

&lt;p&gt;That distinction is everything.&lt;/p&gt;




&lt;p&gt;The popular framing right now is that AI replaces developers. Tasks get automated, roles compress, headcount comes down.&lt;/p&gt;

&lt;p&gt;I think the framing misses the more important shift.&lt;/p&gt;

&lt;p&gt;The layers of the job that AI has eaten so far are the layers that look like translation. Retrieval and synthesis (finding the relevant information and condensing it) got eaten last cycle. Code generation from a known spec is largely solved. Even parts of judgment, the rubric-based review of whether a design covers its failure modes and respects existing conventions, are being distributed across panels of models.&lt;/p&gt;

&lt;p&gt;What hasn't been eaten is the upstream question. What should the system do. For whom. Under what constraints. With what failure modes that matter. That question still requires a human who has actually been close enough to the problem to know the answer.&lt;/p&gt;

&lt;p&gt;That's expertise. And expertise is the layer that compounds with AI rather than being replaced by it.&lt;/p&gt;




&lt;p&gt;The shape of the trade is simple.&lt;/p&gt;

&lt;p&gt;The scarce resource was never the code. It was always the knowledge of what to build, for whom, and why. For decades, the cost of translating that knowledge into working software was high enough that most domain experts could not afford the translation, and most engineers were spending their time on the translation rather than the knowledge.&lt;/p&gt;

&lt;p&gt;That cost is collapsing.&lt;/p&gt;

&lt;p&gt;Which means the people whose advantage is real understanding of a domain (finance, logistics, healthcare, energy, agriculture, anything where the rules are subtle and the stakes are concrete) are about to find themselves with a lot more leverage than they had a year ago. Not because they will become engineers. Because the engineering cost of expressing their expertise just dropped by an order of magnitude.&lt;/p&gt;




&lt;p&gt;There is a discipline cost on the other side.&lt;/p&gt;

&lt;p&gt;Knowing which models to use for which tasks. Understanding where they fail and why. Building the workflow that separates real productivity gains from impressive demos followed by weeks of cleanup. None of that is automatic, and the gap between "this looks like it works" and "this actually ships and stays shipped" is where most teams underestimate the work.&lt;/p&gt;

&lt;p&gt;But the discipline is learnable. And once it's in place, the multiplier on existing expertise is real.&lt;/p&gt;




&lt;p&gt;My own journey is a small proof of concept for a much larger argument.&lt;/p&gt;

&lt;p&gt;Domain expertise plus AI-assisted development plus the discipline to use both well: that combination can ship production systems faster than anyone expects, in languages you are still learning, solving problems that previously required teams and months.&lt;/p&gt;

&lt;p&gt;Retrieval got commoditized. Judgment is becoming commoditized. Expertise is the layer where the human stays in the loop, and the layer where AI works for you instead of around you.&lt;/p&gt;

&lt;p&gt;If you have spent years getting close to a real problem, the next decade is going to reward you in ways the last one didn't.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's a problem you understand deeply that you've never built for because the engineering cost was too high? I'd like to hear what people are about to start building.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>latam</category>
    </item>
    <item>
      <title>I Was the Judgment Layer</title>
      <dc:creator>Daniel Stolf</dc:creator>
      <pubDate>Mon, 08 Jun 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/dcstolf/i-was-the-judgment-layer-4hdp</link>
      <guid>https://dev.to/dcstolf/i-was-the-judgment-layer-4hdp</guid>
      <description>&lt;p&gt;There's a popular take right now that the AI coding bottleneck has moved to code review. Models write code faster than humans can read it, so the senior engineer becomes the reviewer of last resort.&lt;/p&gt;

&lt;p&gt;The take is half right. The bottleneck moved, yes. Not to code review. Upstream of it, to the spec.&lt;/p&gt;




&lt;p&gt;When the AI is fast enough that scaffolding, validation, and boilerplate are basically free, what determines whether the feature is correct is not the code. It's the intent the code was generated from.&lt;/p&gt;

&lt;p&gt;If the intent says "webhook handler that updates payment status," the AI builds the happy path beautifully and silently ignores duplicate delivery, idempotency, and the impossible state transitions. The bug was authored at spec time. The reviewer at code time can catch it, but they're catching an artifact of an upstream mistake. That work is slow, expensive, and demoralizing.&lt;/p&gt;

&lt;p&gt;So the real question is how to review the spec.&lt;/p&gt;




&lt;p&gt;For a while I assumed that was my job, full stop. I'd write the spec, sit with it, ask myself the questions a senior engineer with scars would ask. What's out of scope. What should fail loudly. What's the behaviour on duplicate input.&lt;/p&gt;

&lt;p&gt;It worked. It was also slow, and I kept noticing the same uncomfortable thing: I missed the same kinds of cases in review that I missed in authoring. The blind spots overlapped because the reviewer and the author were the same person.&lt;/p&gt;

&lt;p&gt;What clicked was treating the spec the way you treat code in a strong engineering team. Put it through reviewers with different priors.&lt;/p&gt;




&lt;p&gt;The setup I landed on uses three models.&lt;/p&gt;

&lt;p&gt;Claude drafts the spec from a Socratic interview about intent. Acceptance criteria, edge cases, what's out of scope, open questions.&lt;/p&gt;

&lt;p&gt;Codex reviews the draft against &lt;code&gt;architecture.md&lt;/code&gt;, &lt;code&gt;conventions.md&lt;/code&gt;, and &lt;code&gt;guardrails.md&lt;/code&gt;. Different training corpus, different defaults, different things it cares about.&lt;/p&gt;

&lt;p&gt;OpenCode running Qwen reviews independently against the same rubric. Different corpus again, different cultural priors, different sycophancy patterns.&lt;/p&gt;

&lt;p&gt;Each model returns specific objections: missing acceptance criteria, ambiguous edge cases, contradictions with prior decisions, gaps where the spec assumes context it doesn't have.&lt;/p&gt;




&lt;p&gt;The reason this works is that the models do not have the same biases.&lt;/p&gt;

&lt;p&gt;Claude is confident and thorough, with a recognizable tendency toward completion and a particular sycophancy pattern when the prompt frames the spec as already good.&lt;/p&gt;

&lt;p&gt;Codex is trained on a corpus that weighs code patterns heavily, so it surfaces "this spec implies a structure that won't fit your conventions" earlier than the others.&lt;/p&gt;

&lt;p&gt;Qwen flags things the other two skipped, often around explicit failure modes and recovery paths.&lt;/p&gt;

&lt;p&gt;None of them are right alone. The disagreements between them are the signal.&lt;/p&gt;

&lt;p&gt;What I get out of that loop is judgment, applied earlier, by something that is not me and not biased the same way I am.&lt;/p&gt;




&lt;p&gt;This is the part that makes me uncomfortable.&lt;/p&gt;

&lt;p&gt;For years my edge as an engineer was judgment. Knowing which questions to ask. Knowing what to push back on. Knowing where the bodies were buried.&lt;/p&gt;

&lt;p&gt;The retrieval-and-synthesis part of the job got eaten last cycle. I told myself the response was to move up to judgment, and that judgment was durable because it required taste and experience.&lt;/p&gt;

&lt;p&gt;The honest update: judgment is also distributable. Not all of it. But the part that looks like rubric-based review (does this spec cover the failure modes, does it conflict with prior decisions, does it respect the conventions) can be parallelized across models with different training data. The result is better than any single human reviewer doing it alone. Including me.&lt;/p&gt;

&lt;p&gt;The model wasn't judging. I was the judgment layer.&lt;/p&gt;

&lt;p&gt;Now the judgment layer is a panel, and I'm one voice on it.&lt;/p&gt;




&lt;p&gt;What's left for the human is smaller, but more concentrated.&lt;/p&gt;

&lt;p&gt;Define the rubric. Maintain &lt;code&gt;architecture.md&lt;/code&gt; and &lt;code&gt;conventions.md&lt;/code&gt; so the panel has something specific to review against. Resolve disagreements when the models conflict. Decide which scars get written into &lt;code&gt;history.md&lt;/code&gt; so future specs are reviewed against past pain.&lt;/p&gt;

&lt;p&gt;These are still judgment calls. They happen less often than spec review, and each one compounds.&lt;/p&gt;




&lt;p&gt;The earlier framing I had, that judgment was the safe layer to retreat to, was wrong. There is no safe layer. There is only the next location where verification has to happen, and the work of being honest when that location moves.&lt;/p&gt;

&lt;p&gt;Right now it's at the rubric. Next year it might be somewhere else.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Anyone else running multi-model panels on the review side? What does your panel disagree about most?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>claude</category>
      <category>chatgpt</category>
      <category>qwen</category>
    </item>
    <item>
      <title>Your Test Suite Is Lying To You</title>
      <dc:creator>Daniel Stolf</dc:creator>
      <pubDate>Fri, 05 Jun 2026 03:00:00 +0000</pubDate>
      <link>https://dev.to/dcstolf/your-test-suite-is-lying-to-you-21a8</link>
      <guid>https://dev.to/dcstolf/your-test-suite-is-lying-to-you-21a8</guid>
      <description>&lt;p&gt;Most dangerous moment in AI-assisted development:&lt;/p&gt;

&lt;p&gt;The test suite is green.&lt;/p&gt;

&lt;p&gt;You ran the agent. It built the feature. It wrote the tests. They all pass. CI is happy. You ship.&lt;/p&gt;

&lt;p&gt;Two weeks later, production hits an empty list and crashes.&lt;/p&gt;




&lt;p&gt;This is the failure mode I keep watching engineers walk into, and I've walked into it too.&lt;/p&gt;

&lt;p&gt;Tests written after the code are not tests. They're documentation of what the code happened to do. Which means when the code has a bug (a silently ignored duplicate webhook, an unhandled empty input, a failure mode the model assumed away) the tests written from that code don't fail. They pass. They lock the bug in as the documented behavior.&lt;/p&gt;

&lt;p&gt;The CI signal turns green. The PR gets approved. The spec gets quietly violated.&lt;/p&gt;

&lt;p&gt;And the worst part is that the suite isn't broken. It's doing exactly what it was asked to do: confirm that the code does what the code does. The only thing missing is the spec. The thing the tests were supposed to enforce.&lt;/p&gt;




&lt;p&gt;Now add agents to the loop.&lt;/p&gt;

&lt;p&gt;The agent generates code. The agent runs the tests it generated alongside. The tests pass. The agent reports success. It moves on to the next feature.&lt;/p&gt;

&lt;p&gt;There is no point at which a human looks at the test list and asks: "wait, is the spec actually represented here? Did we test for the empty input? Did we test for the duplicate webhook? Did we test what should never happen?"&lt;/p&gt;

&lt;p&gt;Without that pause, the suite is just a self-confirming loop. The code says A. The tests say A is correct. The agent reports A is verified. The fact that the spec said B never enters the system.&lt;/p&gt;




&lt;p&gt;Tests catch what they were written to catch. Nothing more.&lt;/p&gt;

&lt;p&gt;When humans write tests after code, the same pattern shows up. Most engineers will admit this. The difference with AI is volume and speed. A junior writing code-then-tests produces maybe two or three such artifacts a day. An agent produces twenty. The same blind spot scales without the scarring that used to come from finding the bug in production at 2am.&lt;/p&gt;

&lt;p&gt;This is also why prompting your way out of it doesn't work. "Write good tests" is advice the model accepts and immediately ignores in practice, because what it was asked to do (make the feature work and verify it) is satisfied as long as the tests pass. The tests passing IS the verification. The model has no way to know the verification should have come from somewhere else.&lt;/p&gt;




&lt;p&gt;The only honest fix is the order.&lt;/p&gt;

&lt;p&gt;The tests come from the spec, not the code. Acceptance criteria like "returns X on empty input", "rejects duplicate webhook by ID", "fails loudly on unknown status" become failing tests before any implementation exists. The model writes the code to satisfy those tests. The tests didn't come from the code. They came from what the code was supposed to do.&lt;/p&gt;

&lt;p&gt;When tests come first, the model can't generate the bug AND the test that ratifies it. The empty input case is already a red bar. The duplicate webhook is already an assertion. The model has to satisfy what the spec required, not what it happened to produce.&lt;/p&gt;




&lt;p&gt;In practice, nobody does this voluntarily.&lt;/p&gt;

&lt;p&gt;Not because they don't know better. Because writing the failing test first feels slow in a moment when the agent can produce the implementation in seconds. Every TDD article for the last twenty years has acknowledged this part. The skip feels small in the moment. The discipline collapses.&lt;/p&gt;

&lt;p&gt;With humans, the skip is at least visible. You can see in the PR that the tests came in the same commit as the code, often even after it. With agents, the skip is invisible. The tests are there. They pass. Nobody notices that the tests are ratification, not verification.&lt;/p&gt;




&lt;p&gt;What I've come to believe is that test-first stops being achievable as discipline once the model is fast enough to make the skip free. It has to become structural. Some part of the workflow has to refuse to accept code edits that arrived before their tests. That's the only thing I've seen consistently hold the line.&lt;/p&gt;

&lt;p&gt;Whether that's a hook, a CI check, an agent that won't merge, a pre-commit gate: the mechanism matters less than the principle. The model cannot ship code whose verification it also generated. The tests must be older than the code, written from a source the code didn't influence.&lt;/p&gt;




&lt;p&gt;The discipline isn't TDD. The discipline is refusing to accept tests that came from the same context as the code they're testing.&lt;/p&gt;

&lt;p&gt;In an AI-assisted workflow, that distinction is the difference between a green suite that means something and a green suite that doesn't.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;How does your team prevent tests-after-code in AI-generated PRs? Do you trust that distinction is being held?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>tdd</category>
      <category>claude</category>
    </item>
    <item>
      <title>This Is the Definitive Solution</title>
      <dc:creator>Daniel Stolf</dc:creator>
      <pubDate>Wed, 03 Jun 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/dcstolf/this-is-the-definitive-solution-2g90</link>
      <guid>https://dev.to/dcstolf/this-is-the-definitive-solution-2g90</guid>
      <description>&lt;p&gt;The most dangerous thing an LLM can say is:&lt;/p&gt;

&lt;p&gt;"This is the definitive solution."&lt;/p&gt;

&lt;p&gt;I know, because I heard it six times in a row, each time about a different fix for the same bug.&lt;/p&gt;




&lt;p&gt;I was building a Kubernetes Operator and hit a race condition in the reconcile loop.&lt;/p&gt;

&lt;p&gt;The Operator would update the custom resource status, then immediately get overwritten by a previous state that hadn't been flushed yet. The result was a phase transition loop: the resource cycling through states endlessly, never stabilizing.&lt;/p&gt;

&lt;p&gt;I turned to the LLM. Internet search enabled. Full context provided.&lt;/p&gt;

&lt;p&gt;The first suggestion was confident and specific. A pattern for handling concurrent reconciliation. Reasonable. I tried it. Didn't work.&lt;/p&gt;

&lt;p&gt;The second suggestion went deeper, a sub-function within the controller runtime. Also confident. Also specific. Also wrong.&lt;/p&gt;

&lt;p&gt;By the fourth or fifth iteration, the model was descending into progressively more obscure corners of the Kubernetes internals. Each time with the same tone:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"This is a common race condition in Kubernetes Operators. This is the definitive solution."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It wasn't lying. It wasn't hallucinating functions that didn't exist. It was finding real patterns, real APIs, real Kubernetes behaviors and misapplying every single one of them to my specific context, with complete confidence.&lt;/p&gt;

&lt;p&gt;Internet search didn't help. It just gave the model more ammunition to be wrong with.&lt;/p&gt;




&lt;p&gt;What finally solved it had nothing to do with the model.&lt;/p&gt;

&lt;p&gt;I stopped asking. I did the research myself, read through the controller-runtime source, found the specific behavior causing the overwrite, understood the exact sequence of events in my reconcile loop. Then I came back to the model with a clear, grounded explanation of the root cause and explicit instructions for the fix.&lt;/p&gt;

&lt;p&gt;It worked immediately.&lt;/p&gt;

&lt;p&gt;The model didn't solve the problem. I solved the problem. The model wrote the code.&lt;/p&gt;

&lt;p&gt;That distinction matters more than most people want to admit.&lt;/p&gt;




&lt;p&gt;Now think about what happens when you add agentic flow.&lt;/p&gt;

&lt;p&gt;No human in the loop. The model hits the same kind of problem: a subtle race condition, a context-specific behavior it can't reason about correctly from training data alone. It generates a fix. It runs it. It observes the output. It decides the fix didn't work and tries something deeper.&lt;/p&gt;

&lt;p&gt;It does this autonomously. Confidently. Repeatedly.&lt;/p&gt;

&lt;p&gt;Each iteration, it goes further into the codebase. Refactoring here. Adding an abstraction layer there. Patching a symptom in one place while introducing a new one in another. Burning tokens at every step.&lt;/p&gt;

&lt;p&gt;By the time a human looks at the output, the codebase is a spaghetti mess and the original bug is still there, buried under six layers of confident, well-intentioned, completely misguided changes.&lt;/p&gt;

&lt;p&gt;The model didn't fail because it was dumb. It failed because it was confident about something it fundamentally could not know without the right context. And nothing stopped it from acting on that confidence, repeatedly, at speed.&lt;/p&gt;




&lt;p&gt;This is the part of agentic AI development that the demos don't show you.&lt;/p&gt;

&lt;p&gt;The capability is real. The productivity gains are real. But autonomous execution amplifies both good judgment and bad judgment equally. A model that would have wasted 30 minutes of a developer's time in a chat session can waste 3 hours of compute and leave a codebase significantly worse in an agentic loop.&lt;/p&gt;

&lt;p&gt;The solution isn't to avoid agentic workflows. It's to understand where models fail and build human checkpoints, grounding steps, and context injection at exactly those points.&lt;/p&gt;

&lt;p&gt;I learned this the hard way, one race condition at a time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you seen an agentic workflow make a problem worse before it made it better? What guardrails have you built?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>claude</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Opus to Plan. Sonnet to Build. Slash Command to Scale.</title>
      <dc:creator>Daniel Stolf</dc:creator>
      <pubDate>Mon, 01 Jun 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/dcstolf/opus-to-plan-sonnet-to-build-slash-command-to-scale-2m6d</link>
      <guid>https://dev.to/dcstolf/opus-to-plan-sonnet-to-build-slash-command-to-scale-2m6d</guid>
      <description>&lt;p&gt;The first version of my Kubernetes Operator worked.&lt;/p&gt;

&lt;p&gt;It was built for one database platform, for one customer problem, and it did exactly what it needed to do. But it was concrete all the way down: tightly coupled, not extensible, and impossible to test without live infrastructure.&lt;/p&gt;

&lt;p&gt;If I wanted to support other database platforms, I'd have to refactor the entire core. Replace concretes with interfaces. Restructure the codebase so logic could be reused across implementations.&lt;/p&gt;

&lt;p&gt;This is the part of AI-assisted development that nobody talks about. Not the greenfield build, but what happens next. Taking production code and making it better without breaking it.&lt;/p&gt;

&lt;p&gt;Here's the workflow I used.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Phase 1 - Specification with Opus&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before touching a single line of code, I asked Claude Opus to generate a detailed refactoring plan as a Markdown document.&lt;/p&gt;

&lt;p&gt;Not a vague outline. A precise spec: which files would be created, which code segments would move where, what the new interfaces would look like, how the abstractions would enable reuse across future database implementations.&lt;/p&gt;

&lt;p&gt;I used Opus specifically for this phase: the more capable model, slower and more expensive, but worth it for the reasoning depth required to plan a structural refactor without introducing regressions. The goal was to get the plan right before any implementation began.&lt;/p&gt;

&lt;p&gt;I reviewed it, pushed back on specific decisions, asked for alternatives in places where the approach felt wrong. The MD file went through several iterations before I was satisfied.&lt;/p&gt;

&lt;p&gt;That document became the single source of truth for everything that followed.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Phase 2 - Implementation with Sonnet in Plan Mode&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the spec was locked, I switched to Claude Sonnet and engaged Plan Mode, Claude Code's built-in capability to propose a complete implementation plan before executing any changes.&lt;/p&gt;

&lt;p&gt;This is a critical step that most people skip.&lt;/p&gt;

&lt;p&gt;Plan Mode reads the specification, maps it against the existing codebase, and produces a detailed proposal of exactly what it intends to do (file by file, change by change) before writing a single line. You review it. You approve it. Then it executes.&lt;/p&gt;

&lt;p&gt;The spec I'd built with Opus was the input. Plan Mode's proposal was the verification that the model understood the spec correctly. Implementation only started when both aligned.&lt;/p&gt;

&lt;p&gt;The refactor ran in one shot. Clean interfaces. Reusable core. Testable without live infrastructure.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Phase 3 - The slash command&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the architecture was right, I built a custom Claude Code slash command to scaffold new database integrations.&lt;/p&gt;

&lt;p&gt;Now, when I need to add support for a new platform, I run the command. It generates the API layer, the controller structure, the interface implementations: all consistent with the refactored architecture, all following the same patterns.&lt;/p&gt;

&lt;p&gt;What used to require understanding the entire codebase and carefully threading new logic through it now takes minutes.&lt;/p&gt;




&lt;p&gt;The full workflow, in plain terms:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opus&lt;/strong&gt; → think deeply, plan precisely, produce a spec &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sonnet + Plan Mode&lt;/strong&gt; → verify understanding, execute against the spec &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom slash command&lt;/strong&gt; → compound the investment, make the pattern reusable forever&lt;/p&gt;

&lt;p&gt;Each phase uses the right tool for the right job. Opus for reasoning. Sonnet for execution. The slash command for scale.&lt;/p&gt;




&lt;p&gt;This is what AI-native development looks like when it matures past the prototype stage.&lt;/p&gt;

&lt;p&gt;The 2-week MVP was speed. This is something different: it's using AI to improve the architecture of something already in production, responsibly, with a verification step between planning and execution.&lt;/p&gt;

&lt;p&gt;The spec isn't just a prompt. It's a contract between you and the model. Plan Mode is how you confirm the model understood the contract before it acts on it.&lt;/p&gt;

&lt;p&gt;That discipline (spec first, verify before executing, build reusable patterns from every solved problem) is what separates teams that ship consistently with AI from teams that generate impressive demos and then spend weeks cleaning up.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your workflow for using AI on existing production code, not just greenfield builds?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>claude</category>
    </item>
    <item>
      <title>I Was the Retrieval Layer</title>
      <dc:creator>Daniel Stolf</dc:creator>
      <pubDate>Fri, 29 May 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/dcstolf/i-was-the-retrieval-layer-1b5i</link>
      <guid>https://dev.to/dcstolf/i-was-the-retrieval-layer-1b5i</guid>
      <description>&lt;p&gt;I once spent half a day debugging code that was completely correct.&lt;/p&gt;

&lt;p&gt;The problem wasn't the logic. The problem was that the functions the LLM had written didn't exist.&lt;/p&gt;

&lt;p&gt;Not deprecated. Not renamed. Never existed.&lt;/p&gt;

&lt;p&gt;Here's what had happened: I caught the model using an outdated API parameter and corrected it. Instead of fixing the issue, it started compensating: hallucinating function names, inventing method signatures, generating plausible-looking code that had no basis in reality. The more I pushed back, the deeper into fiction it went.&lt;/p&gt;

&lt;p&gt;That afternoon is why I started doing RAG before the industry had a name for it.&lt;/p&gt;




&lt;p&gt;At the time, I was building a Kubernetes Operator using free-tier LLMs (ChatGPT and DeepSeek). No agentic tooling. No memory. No orchestration frameworks. Just a chat window and whatever I could fit into the context.&lt;/p&gt;

&lt;p&gt;I had two problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 1:&lt;/strong&gt;&lt;br&gt;
The model didn't know current APIs. Kubernetes controller-runtime, Operator SDK, and Delphix APIs move fast. The model's training data was already stale. Left to its own devices, it would confidently generate code against API versions that no longer existed. When corrected, it would sometimes make things worse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 2:&lt;/strong&gt;&lt;br&gt;
The context window ran out. Long sessions degraded. The model would start contradicting earlier decisions, losing track of architecture choices, rehashing solved problems. On a free tier, hitting the limit meant starting over and losing everything.&lt;/p&gt;




&lt;p&gt;Here's what I built to solve both:&lt;/p&gt;

&lt;p&gt;For the API problem, manual retrieval and injection. Before writing any implementation code for a new component, I would research the relevant documentation myself. Then I'd summarize it (sometimes by hand, sometimes by feeding the raw docs into a separate chat session just for summarization) and inject only the relevant fragments into the working session. Confirmed, current, scoped to exactly what the model needed.&lt;/p&gt;

&lt;p&gt;The model wasn't searching. I was the retrieval layer.&lt;/p&gt;

&lt;p&gt;For the context problem, session state documents. When a session was getting too long, I'd ask the model to generate a structured Markdown file: current architecture decisions, what had been built, what was left, key constraints and open questions. Then I'd start a fresh session, paste the MD file as context, and continue exactly where I'd left off.&lt;/p&gt;

&lt;p&gt;The model wasn't remembering. I was the memory layer.&lt;/p&gt;




&lt;p&gt;What I was doing, without knowing it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrieval-Augmented Generation:&lt;/strong&gt; surfacing accurate, current information and injecting it as context to ground model outputs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session state management:&lt;/strong&gt; the manual precursor to what agent memory systems now handle automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-session LLM chaining:&lt;/strong&gt; using one model to process and compress information for another, before orchestration frameworks made this trivial.&lt;/p&gt;




&lt;p&gt;I didn't invent these patterns. I arrived at them by necessity, the hard way, after a hallucination loop cost me half a day.&lt;/p&gt;

&lt;p&gt;That's usually how the best practices emerge.&lt;/p&gt;

&lt;p&gt;The tools have improved dramatically since then. But the underlying problem (models that hallucinate on fast-moving APIs, context that degrades over long sessions, outputs that need grounding in verified information) hasn't gone away. It's just more visible now, at scale, in enterprise deployments.&lt;/p&gt;

&lt;p&gt;The engineers and companies figuring this out today are rediscovering the same lessons. Usually also the hard way.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you hit a hallucination loop that cost you real time? What was your fix?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>deepseek</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>AI-Native Engineering Story</title>
      <dc:creator>Daniel Stolf</dc:creator>
      <pubDate>Wed, 27 May 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/dcstolf/ai-native-engineering-story-16c1</link>
      <guid>https://dev.to/dcstolf/ai-native-engineering-story-16c1</guid>
      <description>&lt;p&gt;In 2020, during the pandemic lockdown, I built a working Kubernetes CSI Driver prototype in a hackathon.&lt;/p&gt;

&lt;p&gt;It was good enough to win. But turning it into a production-ready integration took months. Eventually it required a team of 3 additional engineers to get there.&lt;/p&gt;

&lt;p&gt;Same person. Same domain. Same company. Months, plus a team.&lt;/p&gt;

&lt;p&gt;Fast forward five years.&lt;/p&gt;

&lt;p&gt;I built a production Kubernetes Operator (a more complex project) in 2 weeks. Solo. No team allocation. No formal project approval. Just me and a workflow I’d developed almost by accident.&lt;/p&gt;

&lt;p&gt;Same person. Same domain. Same company. 2 weeks, alone.&lt;/p&gt;

&lt;p&gt;The only thing that changed was how I worked with AI.&lt;/p&gt;




&lt;p&gt;Here’s what that workflow actually looked like, before it even had a name:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 - Spec-driven architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I didn’t start by writing code. I used high-reasoning models (ChatGPT, DeepSeek) to think through the design, discussing trade-offs, challenging assumptions, generating a structured Markdown spec with architecture decisions and code scaffolding. The model was my technical co-founder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 - Grounding the model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LLMs hallucinate on fast-moving APIs. Before writing any implementation code, I researched and injected the relevant documentation (Kubernetes controller-runtime specs, CRD patterns, Delphix API definitions) directly into context. The model then worked from accurate, current sources. I was doing RAG manually before RAG was a term most people used casually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 - Agentic execution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the spec as a foundation, I used GitHub Copilot to drive implementation, iterating on specific functions, sharing code segments with targeted prompts, reviewing and correcting outputs. Claude Code came later and accelerated the final stretch further.&lt;/p&gt;




&lt;p&gt;The result wasn’t just a faster build.&lt;/p&gt;

&lt;p&gt;It broke a structural go-to-market deadlock. Without a working solution, customers wouldn’t commit. Without customer demand, engineering wouldn’t prioritize it. By shipping a working MVP first (alone, in two weeks) I generated real demand from a working product.&lt;/p&gt;

&lt;p&gt;That converted a churn risk into a US$30M enterprise deal.&lt;/p&gt;




&lt;p&gt;The 2020 hackathon wasn’t a failure. The CSI Driver became the technical foundation the Operator was built on. But the contrast matters:&lt;/p&gt;

&lt;p&gt;The same engineer. The same problem space. A team and months, versus solo and two weeks.&lt;/p&gt;

&lt;p&gt;What changed wasn’t the engineer. It was the workflow.&lt;/p&gt;

&lt;p&gt;The practices I stumbled into out of necessity (spec-driven development, context grounding, agentic coding loops) are now what enterprises are actively trying to learn and implement at scale.&lt;/p&gt;

&lt;p&gt;The gap between “we’re experimenting with AI” and “we’re shipping with AI” is mostly a workflow problem. It’s not about the model. It’s about how you work with it&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What’s the biggest shift you’ve noticed in how your team builds since AI tools became mainstream?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>claude</category>
      <category>githubcopilot</category>
    </item>
  </channel>
</rss>
