# Three Workshop Habits That Actually Fixed My AI Coding Workflow

> After Miki Tebeka's Ardan Labs workshop, three habits fixed an AI coding workflow: plan before code, treat the repo as memory, and verify before you trust the merge.

- Published: August 12, 2026
- Author: Kevin Enriquez
- URL: https://www.ardanlabs.com/news/2026/three-workshop-habits-that-actually-fixed-my-ai-coding-workflow/

AI coding agents can make software development feel dramatically faster. But faster output does not always mean a faster path to production. Knowing how to work with these tools effectively is becoming just as important as knowing how to use them.

I had the opportunity to attend Miki Tebeka’s two day Practical Development with AI Agents workshop, where we spent two days putting AI agents to work in a real software development project and examining what it actually takes to use them effectively.

What I came away with wasn't another list of AI tools or prompt tricks, but a few practical habits that changed how I work.

I didn't leave Miki's Ardan Labs workshop with a new tool to install. I left with a different way to work.

I'd already been using AI coding agents in my day-to-day work. The code showed up faster. So did the surprises: extra flags nobody asked for, design choices buried in a diff I skimmed, and long threads where the agent seemed to forget what we'd agreed on twenty messages ago. Speed wasn't the problem. Rework was.

After two days building a small ride-hailing service with agents, I changed three habits. Miki kept stopping to read the plan, challenge the output, and ask why the agent made a decision. That rubbed off. Three things I actually do now, most days, that made the experience feel less like shouting at a very fast intern and more like working with a capable tool I still own.

<img src="/images/news/5-practical-steps-for-working-with-ai-agents-in-go.jpg" alt="Infographic: 5 practical steps for working with AI agents in Go — project planning, context hygiene, repo memory, deterministic gates, and detailed reviews." class="w-full max-w-4xl mx-auto rounded-lg border-2 border-base-300" loading="lazy" decoding="async" />

## Key Takeaways

- **Plan before code:** context, constraints, and passing criteria beat a fast first draft.
- **Repo as memory:** fresh session per feature plus a lean `CLAUDE.md` or `AGENTS.md` beats a bloated chat thread.
- **Verify before trust:** automated checks, CI, and a real diff review. If it ships, you own it.

---

## 1. Plan before the agent touches code

I don't let the agent write code until context, constraints, and passing criteria are spelled out. I resisted that the longest. It was also the most annoying habit at first.

I used to open an agent, describe the feature, and accept almost whatever it generated. Planning mode felt like overhead. Then Miki mentioned an example from NASA's defect-cost research in the workshop: catching a mistake in design is dramatically cheaper than catching it in live tests. It gets far more expensive still once it reaches production. Miki wasn't asking for endless upfront design. Agents amplify whatever clarity you give them. Vague intent becomes vague code, fast.

Now I start in planning mode, or the equivalent in whatever client I use, and structure the prompt around four things from the workshop:

- **Context:** greenfield handler, refactor, bug fix; what system is this part of?
- **Constraints:** what not to touch, which libraries, deployment limits
- **Non-goals:** "auth is out of scope," "do not edit integration tests"
- **Passing criteria:** tests that must pass, use cases with expected outcomes

Filling in the four boxes isn't the finish line. Miki never took the agent's first plan at face value. I read it, push back on vague passing criteria or scope that crept in, and iterate in planning mode until the plan is tight. Only then do I let anything touch code.

In Miki's ride-hailing demo, the agent asked sensible questions before coding: where does the timestamp come from, which database, how to handle duplicate IDs. That only happened because planning came first. When I skip that step, I get the same over-engineering Miki called out live, like adding CLI flags for configuration nobody requested.

The place this landed for me was a large set of changes to a long-running pipeline I maintain in a custom agent harness: subagents and skills that pass work through staged steps. On a system like that, a vague plan doesn't produce a small bug. It produces a broken workflow. I couldn't afford to discover mid-build that two subagents disagreed on handoff format or that a skill fired in the wrong order. Before anyone touched code, I had the agent map the pipeline in Excalidraw: what would change, how logic would flow, where the risky seams were. When the diagram looked right, we turned it into a phased plan with explicit completion markers and tests at the end of each phase. That felt slow for the first hour. It was nothing compared to unwinding a bad orchestration change across a dozen moving parts.

Planning doesn't slow me down. It prevents the "wait, why did you do that?" loop that burns an hour.

---

## 2. Treat the repo as the agent's memory, not the chat thread

I start a fresh session per feature and keep a short `CLAUDE.md` or `AGENTS.md` in the repo. The thread is temporary. The repo is what the next session actually reads.

I used to pile everything into one conversation. New feature, bug fix, refactor, all in the same chat. Every message sent the whole history back to the model. That's the context window: the conversation plus whatever files you attached. It gets noisy fast. By day two of the workshop, Miki was also pushing decisions into the repo instead of letting them live in chat logs and random markdown files nobody would open again.

These days I do two things:

- **Fresh session per feature.** When I finish a design pass or ship a slice, I start a new thread for the next task. Same repo, empty chat. It feels wasteful at first. Then the agent stops reopening arguments from three features back.
- **A lean `CLAUDE.md` or `AGENTS.md`.** How we build, how we test, the libraries and patterns I'd rather stick to, what's out of scope. If I'm typing the same instruction in every new chat, it belongs in that file instead. Miki said to keep it around five hundred words because it loads on every request. When I change how the project works, I tell the agent to update the file so I'm not re-explaining the same rules tomorrow.

One rule I put in there myself: drop parenthetical asides in generated code and comments. Fine for a human reader. Often a mess for an agent parsing a long file. I like short sentences better than nested qualifiers.

On that pipeline refactor, I quit trying to drag the whole project through one thread. At each phase boundary I'd open a fresh chat with the phased plan and a handoff from the previous agent. Same repo, none of the old fights about naming we'd already settled.

The agent wakes up with no memory. The repo doesn't have to.

---

## 3. Verify before you trust, and own the merge

I put the bar in automated tests and CI, not in prompts, and I review the diff for decisions, not just syntax. If it ships with my name on it, I own it.

The workshop opened with a line from an old IBM training manual: computers cannot be held accountable, so they must not make management decisions. Substitute "language model" and the point holds.

**Automation over politeness.** Miki was blunt: agents usually follow instructions in markdown and skills, but every so often they ignore them completely. Not maliciously. Probabilistically. I used to nudge the agent in chat to run the linter or clean up failing tests. Sometimes it listened. Often it didn't, or it got it right once and drifted the next time. Now the checks live in the repo: a test command, CI, whatever actually gates a merge. I run that before I spend much time reading the diff. If something fails, I'm not arguing about style. I fix it or ask for another pass.

Miki's hierarchy went further. Hooks and permission settings enforce what markdown can't. A `PreToolUse` hook or a "don't ask again for `make test`" permission survives when the model drifts. I lean on CI first because it's portable across clients, but the lesson is the same. Enforcement beats politeness.

That same lesson pushed me to treat skill files like budget, not decoration. Skills load into context on every request, and Miki warned that long rules plus skills plus MCPs blow up the window fast. I wrote a small skill whose only job is to strip marker comments from my other skills: the human-readable section headers and callouts I used to sprinkle through for my own sanity. They cost tokens every turn and I couldn't count on the model weighing them reliably. Leaner skills, fewer tokens, less noise. Deterministic checks still beat polite markdown when the stakes are high.

**Review for decisions, not just syntax.** I'd been handing over small changes because the diff looked fine. "It's just logging." "We can fix flags later." Then in the workshop we watched the agent tie API types to storage types in ways that would hurt the next feature, or leak raw errors to HTTP clients. Now I ask: did it add configuration I didn't ask for? Is this a vertical slice I can run end-to-end? I'm not doing full manual rewrites. I'm doing the review I'd expect on my own PR before anyone else sees it.

On that same pipeline work, the phase markers were the guardrail. I didn't merge a phase because the agent said it was done. I ran the tests we'd agreed on at that boundary, read the diff, and only then opened the next session with an updated handoff. Same discipline as a small handler in the workshop, just stretched across a pipeline that runs longer.

---

## Try it for a week

The workshop didn't teach me to type better prompts. It taught me to run agents the way I already build software: plan with constraints, persist decisions in the repo, verify before merge.

If you're a Go developer already using agents and feeling the same friction (fast output, slow trust), try one week of:

- **Plan first:** context, constraints, non-goals, passing criteria
- **Repo as memory:** fresh session per feature, short `AGENTS.md`/`CLAUDE.md` you maintain
- **Verify before trust:** run your checks and CI, then read the diff like you own it

You might not need more AI. You might need less chaos.

Based on Miki's Ardan Labs workshop, [Practical Development with AI Agents](/workshops/practical-go-development-with-ai-agents/).

---

## Bridging the Gap

<div class="not-prose w-full max-w-full overflow-hidden my-6">
  <div class="bg-neutral text-base-100 rounded-xl overflow-hidden relative shadow-lg w-full max-w-full">
    <img src="/images/primary-radial-gradient.svg" class="pointer-events-none absolute inset-0 h-full w-full object-cover opacity-50" alt="">
    <div class="w-full max-w-full mx-auto px-4 py-5 lg:px-6 lg:py-6 relative">
      <div class="flex flex-col xl:flex-row gap-4 lg:gap-6 items-center w-full min-w-0">
        <div class="w-auto max-w-[160px] sm:max-w-[200px] lg:max-w-[220px] lg:shrink-0 flex justify-center mx-auto lg:mx-0">
          <img class="w-full h-auto" src="/images/landing-pages/miki-tebeka.png" alt="Practical Development with AI Agents">
        </div>
        <div class="w-full min-w-0 lg:flex-1 text-left flex flex-col gap-1.5">
          <p class="font-semibold tracking-wider text-primary uppercase text-sm">Featured · 2-Day · Online Workshop</p>
          <h2 class="text-xl lg:text-2xl font-bold leading-snug">Practical Development with AI Agents</h2>
          <p class="font-medium text-base-100/85">with Miki Tebeka</p>
          <div class="flex flex-wrap gap-x-4 gap-y-1 text-base-100/85 font-bold text-base lg:text-lg">
            <span class="inline-flex items-center gap-1.5">
              <svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg>
              September 16th &amp; 17th, 2026
            </span>
            <span class="inline-flex items-center gap-1.5">
              <svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>
              2 sessions · 4 hours each
            </span>
          </div>
          <div class="flex flex-col sm:flex-row sm:flex-wrap gap-2 pt-2 w-full">
            <a href="https://bdf6b9-2.myshopify.com/cart/53541087445286:1?channel=buy_button" target="_blank" rel="noopener noreferrer" class="btn btn-base-100 purchaseBtn shadow-none rounded-xl px-4 hover:bg-primary hover:text-base-100 border-0 w-full sm:w-auto">Reserve Your Seat</a>
            <a href="/workshops/practical-go-development-with-ai-agents/?utm_source=al_site&amp;utm_medium=news_article&amp;utm_campaign=practical_go_ai_agents" class="btn btn-outline border-base-100/40 text-base-100 rounded-xl px-4 hover:bg-base-100/10 w-full sm:w-auto">View Workshop</a>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

These habits aren't clever prompt tricks. They're the same engineering discipline you already use for production Go, applied to agents: clear constraints, durable decisions, and verification before merge.

**That is exactly what Miki's workshop is built around.**

Over two days, engineers build a real service with AI agents while practicing planning, context engineering, project rules, skills, MCPs, and review habits that keep you in control of what ships.

---

<div class="not-prose w-full max-w-full overflow-hidden my-6">
  <div class="bg-base-200 rounded-xl border border-base-300 p-4 lg:p-6 w-full max-w-full">
    <div class="flex flex-col gap-6 w-full min-w-0">
      <div class="aspect-video w-full rounded-xl overflow-hidden shadow-lg shadow-primary/20">
        <iframe
          class="w-full h-full"
          src="https://www.youtube.com/embed/OVRK6x4Qlko?start=365"
          title="Practical Development with AI Agents — workshop preview"
          loading="lazy"
          allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
          referrerpolicy="strict-origin-when-cross-origin"
          allowfullscreen
          frameborder="0"></iframe>
      </div>
      <div class="flex flex-col gap-4 text-left w-full min-w-0">
        <div>
          <p class="text-sm font-semibold tracking-wider text-primary mb-2">Preview the workshop</p>
          <h2 class="text-xl lg:text-2xl font-bold leading-tight mb-3">See what two days of live training looks like</h2>
          <p class="text-base font-medium leading-relaxed text-base-content/90">
            This webinar is a preview of the hands-on Go and AI agent work you will do across both sessions. This includes planning, context engineering, skills, MCPs, and building real services with solid engineering practices.
          </p>
        </div>
        <ul class="space-y-2 text-left w-full">
          <li class="flex gap-3 text-sm lg:text-base font-medium text-base-content/90">
            <svg class="shrink-0 text-primary mt-0.5" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>
            <span>Live instruction with Miki Tebeka — September 16th &amp; 17th, 2026</span>
          </li>
          <li class="flex gap-3 text-sm lg:text-base font-medium text-base-content/90">
            <svg class="shrink-0 text-primary mt-0.5" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>
            <span>2 sessions · 4 hours each · Online · Live Training</span>
          </li>
          <li class="flex gap-3 text-sm lg:text-base font-medium text-base-content/90">
            <svg class="shrink-0 text-primary mt-0.5" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>
            <span>Full session recordings included after the workshop</span>
          </li>
        </ul>
        <div class="flex flex-col sm:flex-row sm:flex-wrap gap-2 pt-1 w-full">
          <a href="https://bdf6b9-2.myshopify.com/cart/53541087445286:1?channel=buy_button" target="_blank" rel="noopener noreferrer" class="btn btn-neutral purchaseBtn shadow-none rounded-xl px-4 w-full sm:w-auto">Reserve Your Seat — $299</a>
          <a href="/workshops/practical-go-development-with-ai-agents/?utm_source=al_site&amp;utm_medium=news_article&amp;utm_campaign=practical_go_ai_agents#agenda" class="btn btn-neutral btn-outline shadow-none rounded-xl px-4 w-full sm:w-auto">View full agenda</a>
        </div>
      </div>
    </div>
  </div>
</div>

---

<section class="faq not-prose bg-base-100 pt-6 -mx-4 px-4 sm:mx-0 sm:px-0">
  <div class="container mx-auto px-4">
    <h2 id="frequently-asked-questions" class="text-3xl lg:text-4xl font-bold mb-12">Frequently Asked Questions</h2>
    <div class="space-y-4">
        <div class="collapse collapse-arrow bg-base-200 hover:shadow transition-all duration-300">
          <input type="checkbox" />
          <div class="collapse-title font-bold text-base-content text-left">
            Why plan before letting an AI agent write code?
          </div>
          <div class="collapse-content">
            <p>Agents amplify whatever clarity you give them. Spelling out context, constraints, non-goals, and passing criteria before implementation reduces rework, over-engineering, and the "why did you do that?" loop that burns hours later.</p>
          </div>
        </div>
        <div class="collapse collapse-arrow bg-base-200 hover:shadow transition-all duration-300">
          <input type="checkbox" />
          <div class="collapse-title font-bold text-base-content text-left">
            What should go in a CLAUDE.md or AGENTS.md file?
          </div>
          <div class="collapse-content">
            <p>Keep it lean: how you build and test, preferred libraries and patterns, and what is out of scope. If you repeat the same instruction in every new chat, it belongs in that file. Aim for roughly five hundred words so it stays useful when loaded on every request.</p>
          </div>
        </div>
        <div class="collapse collapse-arrow bg-base-200 hover:shadow transition-all duration-300">
          <input type="checkbox" />
          <div class="collapse-title font-bold text-base-content text-left">
            Why start a fresh session per feature?
          </div>
          <div class="collapse-content">
            <p>Long chat threads fill the context window with old decisions, unrelated files, and settled arguments. A fresh session per feature keeps the agent focused, while the repo and project rules carry the durable memory forward.</p>
          </div>
        </div>
        <div class="collapse collapse-arrow bg-base-200 hover:shadow transition-all duration-300">
          <input type="checkbox" />
          <div class="collapse-title font-bold text-base-content text-left">
            Why aren't chat prompts enough to keep agents reliable?
          </div>
          <div class="collapse-content">
            <p>Agents usually follow markdown instructions, but they ignore them probabilistically. Checks that live in the repo—tests, CI, hooks, and permission settings—enforce standards when polite reminders in chat do not.</p>
          </div>
        </div>
        <div class="collapse collapse-arrow bg-base-200 hover:shadow transition-all duration-300">
          <input type="checkbox" />
          <div class="collapse-title font-bold text-base-content text-left">
            What does "verify before trust" mean in practice?
          </div>
          <div class="collapse-content">
            <p>Run automated checks and CI first, then review the diff for decisions—not just syntax. Ask whether the agent added unrequested configuration, whether the change is a vertical slice you can run end to end, and whether you would merge it under your own name.</p>
          </div>
        </div>
        <div class="collapse collapse-arrow bg-base-200 hover:shadow transition-all duration-300">
          <input type="checkbox" />
          <div class="collapse-title font-bold text-base-content text-left">
            Who is the Practical Development with AI Agents workshop for?
          </div>
          <div class="collapse-content">
            <p>Go developers already using coding agents who want less rework and more control. The workshop focuses on planning, context engineering, project rules, skills, MCPs, and verification habits—not just better prompts.</p>
          </div>
        </div>
        <div class="collapse collapse-arrow bg-base-200 hover:shadow transition-all duration-300">
          <input type="checkbox" />
          <div class="collapse-title font-bold text-base-content text-left">
            What will I learn in Miki's workshop?
          </div>
          <div class="collapse-content">
            <p>Over two live online days, you build a real Go service with AI agents while practicing planning mode, context engineering, AGENTS.md/CLAUDE.md rules, skills, MCPs, TDD, and code review practices that keep engineering judgment in charge of what ships.</p>
          </div>
        </div>
    </div>
  </div>
</section>
