<?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: Alex Metelli</title>
    <description>The latest articles on DEV Community by Alex Metelli (@alex_metelli_f22d28dae8de).</description>
    <link>https://dev.to/alex_metelli_f22d28dae8de</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3862991%2F3d35f220-4ca0-4ace-a4ec-d55b93230843.png</url>
      <title>DEV Community: Alex Metelli</title>
      <link>https://dev.to/alex_metelli_f22d28dae8de</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alex_metelli_f22d28dae8de"/>
    <language>en</language>
    <item>
      <title>Building Better Software with AI Agents: Why Fundamentals Still Matter</title>
      <dc:creator>Alex Metelli</dc:creator>
      <pubDate>Mon, 27 Apr 2026 20:39:12 +0000</pubDate>
      <link>https://dev.to/alex_metelli_f22d28dae8de/building-better-software-with-ai-agents-why-fundamentals-still-matter-22fd</link>
      <guid>https://dev.to/alex_metelli_f22d28dae8de/building-better-software-with-ai-agents-why-fundamentals-still-matter-22fd</guid>
      <description>&lt;p&gt;AI coding tools are changing how software gets built, but they do not remove the need for software engineering discipline. In practice, they make fundamentals more important.&lt;/p&gt;

&lt;p&gt;This post is a condensed write-up of a workshop by Matt Pocock on building better software with AI agents. The original workshop is available here: &lt;a href="https://youtu.be/-QFHIoCo-Ko?si=9qyQKxnid9sE_ehc" rel="noopener noreferrer"&gt;https://youtu.be/-QFHIoCo-Ko?si=9qyQKxnid9sE_ehc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The core mistake many developers make is treating AI as a “spec-to-code compiler”: write a vague requirement, hand it to an agent, and expect production-ready software to appear. That works for demos. It breaks down in real codebases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A better model is this&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use AI agents to accelerate implementation, but use software engineering fundamentals to control alignment, architecture, feedback loops, and quality.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This post distills a developer workflow from a workshop transcript on AI-assisted coding, agentic planning, PRDs, vertical slicing, TDD, and codebase design. &lt;/p&gt;




&lt;h2&gt;
  
  
  The Two Constraints of LLM Coding Agents
&lt;/h2&gt;

&lt;p&gt;Before designing an AI-assisted workflow, you need to understand two constraints.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Agents have a “smart zone” and a “dumb zone”
&lt;/h3&gt;

&lt;p&gt;An LLM performs best when the context is clean, focused, and not overloaded.&lt;/p&gt;

&lt;p&gt;As the conversation grows, the agent has to reason across more tokens, more decisions, more previous mistakes, and more irrelevant detail. Eventually, it starts making worse decisions.&lt;/p&gt;

&lt;p&gt;This is why giant context windows are not a free lunch. They are useful for retrieval, but not always for coding. A 1M-token window does not mean the agent stays sharp for 1M tokens.&lt;/p&gt;

&lt;p&gt;For coding, the &lt;strong&gt;practical strategy&lt;/strong&gt; is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep tasks small.&lt;/li&gt;
&lt;li&gt;Keep context clean.&lt;/li&gt;
&lt;li&gt;Avoid long, drifting conversations.&lt;/li&gt;
&lt;li&gt;Prefer fresh sessions for focused work.&lt;/li&gt;
&lt;li&gt;Do not let the agent accumulate too much conversational sediment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Agents forget unless you externalize state
&lt;/h3&gt;

&lt;p&gt;LLMs are stateless between sessions unless you give them state explicitly.&lt;/p&gt;

&lt;p&gt;That means important decisions should not live only in the chat history. You need artifacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product requirements documents.&lt;/li&gt;
&lt;li&gt;Local issue files.&lt;/li&gt;
&lt;li&gt;GitHub issues.&lt;/li&gt;
&lt;li&gt;Architecture notes.&lt;/li&gt;
&lt;li&gt;Test cases.&lt;/li&gt;
&lt;li&gt;Commit history.&lt;/li&gt;
&lt;li&gt;Review summaries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trick is not to preserve everything. It is to preserve the useful shape of the work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Start with Alignment, Not Implementation
&lt;/h2&gt;

&lt;p&gt;When a vague feature request arrives, the wrong move is to immediately ask the agent to code.&lt;/p&gt;

&lt;p&gt;Example request:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Retention is bad. Students sign up, do a few lessons, then drop off. Let’s add gamification.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds simple. It is not.&lt;/p&gt;

&lt;p&gt;Before coding, you need to clarify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What actions earn points?&lt;/li&gt;
&lt;li&gt;Are points retroactive?&lt;/li&gt;
&lt;li&gt;Do streaks earn points?&lt;/li&gt;
&lt;li&gt;Where does the UI live?&lt;/li&gt;
&lt;li&gt;What counts as lesson completion?&lt;/li&gt;
&lt;li&gt;What is the progression curve?&lt;/li&gt;
&lt;li&gt;What is out of scope?&lt;/li&gt;
&lt;li&gt;What data model supports this?&lt;/li&gt;
&lt;li&gt;How will this be tested?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The useful pattern here is a &lt;strong&gt;grilling session&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Create a plan.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ask the agent to interrogate the requirement:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Interview me relentlessly about every aspect of this feature until we reach a shared understanding. Ask one question at a time. For each question, give your recommended answer.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This changes the interaction.&lt;/p&gt;

&lt;p&gt;The goal is not to produce a plan immediately. The goal is to reach a shared design concept between the human and the agent.&lt;/p&gt;

&lt;p&gt;That matters because most AI coding failures are not syntax failures. They are alignment failures.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Turn the Conversation into a Destination Document
&lt;/h2&gt;

&lt;p&gt;Once the agent and human have converged on the feature, convert the alignment conversation into a PRD.&lt;/p&gt;

&lt;p&gt;The PRD should not be a bloated corporate artifact. It should capture the destination.&lt;/p&gt;

&lt;p&gt;A useful PRD contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Feature: Gamification System&lt;/span&gt;

&lt;span class="gu"&gt;## Problem&lt;/span&gt;

Students start courses but do not consistently return or complete lessons.

&lt;span class="gu"&gt;## Solution&lt;/span&gt;

Add a lightweight gamification system with points, levels, and streaks to increase visible progress and motivation.

&lt;span class="gu"&gt;## User Stories&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; As a student, I can earn points when I complete lessons.
&lt;span class="p"&gt;-&lt;/span&gt; As a student, I can see my current points on the dashboard.
&lt;span class="p"&gt;-&lt;/span&gt; As a student, I can see my level progression.
&lt;span class="p"&gt;-&lt;/span&gt; As an instructor/admin, I can trust that points are derived from real completion events.

&lt;span class="gu"&gt;## Implementation Decisions&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Points are awarded for lesson completion.
&lt;span class="p"&gt;-&lt;/span&gt; Video watch events are excluded because they are noisy and gameable.
&lt;span class="p"&gt;-&lt;/span&gt; Existing completion records may be backfilled.
&lt;span class="p"&gt;-&lt;/span&gt; Streaks are tracked separately from points.

&lt;span class="gu"&gt;## Out of Scope&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Leaderboards.
&lt;span class="p"&gt;-&lt;/span&gt; Social sharing.
&lt;span class="p"&gt;-&lt;/span&gt; Complex achievements.
&lt;span class="p"&gt;-&lt;/span&gt; Manual admin point editing.

&lt;span class="gu"&gt;## Testing Decisions&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Core point logic is tested in a dedicated gamification service.
&lt;span class="p"&gt;-&lt;/span&gt; Integration tests cover lesson completion triggering point awards.
&lt;span class="p"&gt;-&lt;/span&gt; UI smoke tests verify dashboard visibility.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The PRD is not the implementation. It is the destination.&lt;/p&gt;

&lt;p&gt;The point is to move from “vague intent” to “clear target.”&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Do Not Use Linear Phase Plans by Default
&lt;/h2&gt;

&lt;p&gt;A common AI workflow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Phase 1: Database schema
Phase 2: Backend services
Phase 3: API routes
Phase 4: Frontend UI
Phase 5: Tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks organized, but it has a major flaw: it is horizontal.&lt;/p&gt;

&lt;p&gt;The agent builds layer by layer, but you do not get useful feedback until late in the process. The database may be done, the backend may be done, and the UI may be partially done before you discover that the full flow does not actually work.&lt;/p&gt;

&lt;p&gt;That is bad engineering.&lt;/p&gt;

&lt;p&gt;A better approach is to break work into &lt;strong&gt;vertical slices&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Prefer Vertical Slices / Tracer Bullets
&lt;/h2&gt;

&lt;p&gt;A vertical slice crosses the full stack and produces something testable.&lt;/p&gt;

&lt;p&gt;Bad first task:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Create the gamification database schema and service.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better first task:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Award points when a student completes a lesson and show the points on the dashboard.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That first slice may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A minimal database change.&lt;/li&gt;
&lt;li&gt;A gamification service.&lt;/li&gt;
&lt;li&gt;A lesson completion hook.&lt;/li&gt;
&lt;li&gt;A dashboard display.&lt;/li&gt;
&lt;li&gt;A test proving points are awarded.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is more valuable because the system becomes testable immediately.&lt;/p&gt;

&lt;p&gt;The agent gets feedback earlier. The human gets something visible earlier. The architecture gets pressure-tested earlier.&lt;/p&gt;

&lt;p&gt;This is the same idea as tracer bullets from &lt;em&gt;The Pragmatic Programmer&lt;/em&gt;: build a thin, end-to-end path through the system so you can see where you are aiming.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Convert the PRD into a Kanban Board, Not a Sequential Script
&lt;/h2&gt;

&lt;p&gt;Instead of one long plan, convert the PRD into independently grabbable issues.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Issue 1: Award lesson completion points and display them on dashboard
Blocks: none
Type: AFK

Issue 2: Track student streaks
Blocks: Issue 1
Type: AFK

Issue 3: Add level progression based on accumulated points
Blocks: Issue 1
Type: AFK

Issue 4: Backfill points for existing lesson completions
Blocks: Issue 1
Type: AFK

Issue 5: Add dashboard polish and empty states
Blocks: Issues 1, 2, 3
Type: Human review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you a directed acyclic graph of work.&lt;/p&gt;

&lt;p&gt;That matters because agents can work in parallel only when dependencies are clear.&lt;/p&gt;

&lt;p&gt;A linear plan can usually be executed by one agent. A Kanban-style graph can be executed by multiple agents safely.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Separate Human-in-the-Loop Work from AFK Work
&lt;/h2&gt;

&lt;p&gt;Not all tasks should be delegated equally.&lt;/p&gt;

&lt;p&gt;Some work needs humans:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product alignment.&lt;/li&gt;
&lt;li&gt;Domain decisions.&lt;/li&gt;
&lt;li&gt;Architecture boundaries.&lt;/li&gt;
&lt;li&gt;UX judgment.&lt;/li&gt;
&lt;li&gt;QA.&lt;/li&gt;
&lt;li&gt;Final code review.&lt;/li&gt;
&lt;li&gt;Tradeoff decisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some work can be AFK:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementing a well-scoped issue.&lt;/li&gt;
&lt;li&gt;Adding tests.&lt;/li&gt;
&lt;li&gt;Running type checks.&lt;/li&gt;
&lt;li&gt;Fixing straightforward failures.&lt;/li&gt;
&lt;li&gt;Refactoring within a clear boundary.&lt;/li&gt;
&lt;li&gt;Generating boilerplate.&lt;/li&gt;
&lt;li&gt;Applying known patterns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical split is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Human-in-the-loop:
Idea → Grilling → PRD → Issue breakdown → QA → Review

AFK:
Issue implementation → Tests → Type checks → Automated review → Commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the “day shift / night shift” model.&lt;/p&gt;

&lt;p&gt;Humans prepare the backlog and define quality. Agents execute scoped tasks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Use TDD as an Agent Control Mechanism
&lt;/h2&gt;

&lt;p&gt;TDD is not just a human discipline. It is especially useful for AI agents.&lt;/p&gt;

&lt;p&gt;The pattern is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;1.&lt;/span&gt; Write a failing test.
&lt;span class="p"&gt;2.&lt;/span&gt; Confirm it fails for the right reason.
&lt;span class="p"&gt;3.&lt;/span&gt; Implement the smallest change.
&lt;span class="p"&gt;4.&lt;/span&gt; Run the test.
&lt;span class="p"&gt;5.&lt;/span&gt; Refactor.
&lt;span class="p"&gt;6.&lt;/span&gt; Run full feedback loops.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this works well with agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It prevents the agent from coding blind.&lt;/li&gt;
&lt;li&gt;It gives the agent immediate feedback.&lt;/li&gt;
&lt;li&gt;It makes cheating harder.&lt;/li&gt;
&lt;li&gt;It forces the agent to encode expected behavior before implementation.&lt;/li&gt;
&lt;li&gt;It leaves the codebase better tested after each task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without tests, agents tend to hallucinate correctness. With tests, they have a feedback loop.&lt;/p&gt;

&lt;p&gt;Bad codebases produce bad agents partly because they lack feedback loops.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Improve the Codebase for Agents by Deepening Modules
&lt;/h2&gt;

&lt;p&gt;A codebase made of many tiny, shallow modules is hard for both humans and agents to reason about.&lt;/p&gt;

&lt;p&gt;Shallow modules often look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function A depends on helper B
helper B depends on utility C
utility C depends on config D
service E calls A, B, and C directly
tests mock half the graph
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The dependency graph is hard to understand.&lt;/li&gt;
&lt;li&gt;Test boundaries are unclear.&lt;/li&gt;
&lt;li&gt;Agents modify the wrong layer.&lt;/li&gt;
&lt;li&gt;Small changes cause unexpected breakage.&lt;/li&gt;
&lt;li&gt;The agent has to inspect too many files to understand one behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A better structure uses &lt;strong&gt;deep modules&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A deep module has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A small public interface.&lt;/li&gt;
&lt;li&gt;Significant internal functionality.&lt;/li&gt;
&lt;li&gt;Clear ownership of behavior.&lt;/li&gt;
&lt;li&gt;A natural test boundary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AwardLessonCompletionPointsInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="na"&gt;lessonId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="na"&gt;completedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;GamificationService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;awardLessonCompletionPoints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AwardLessonCompletionPointsInput&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nf"&gt;getStudentProgress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;StudentGamificationProgress&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Internally, the service may do many things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check whether points were already awarded.&lt;/li&gt;
&lt;li&gt;Insert a point event.&lt;/li&gt;
&lt;li&gt;Update streaks.&lt;/li&gt;
&lt;li&gt;Recalculate level.&lt;/li&gt;
&lt;li&gt;Return dashboard data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But callers do not need to know that.&lt;/p&gt;

&lt;p&gt;This is good for humans and good for agents.&lt;/p&gt;

&lt;p&gt;The human owns the interface. The agent can implement the internals.&lt;/p&gt;

&lt;p&gt;That is the right abstraction boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: Use Push vs Pull Context Deliberately
&lt;/h2&gt;

&lt;p&gt;Do not dump every rule into every prompt.&lt;/p&gt;

&lt;p&gt;There are two ways to provide context to an agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Push context
&lt;/h3&gt;

&lt;p&gt;You always include it.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Follow these coding standards.
Use strict TypeScript.
Do not introduce new dependencies.
Run tests before committing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Push context is useful for reviewers and critical constraints.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pull context
&lt;/h3&gt;

&lt;p&gt;You make information available, and the agent retrieves it when needed.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;/skills/react-patterns.md
/skills/database-migrations.md
/skills/testing-guidelines.md
/architecture/gamification.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pull context is useful for implementation guidance that is not always needed.&lt;/p&gt;

&lt;p&gt;A good rule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Push constraints to reviewers.&lt;/li&gt;
&lt;li&gt;Let implementers pull guidance when needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reviewer should be stricter than the implementer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 10: Always Review in a Fresh Context
&lt;/h2&gt;

&lt;p&gt;If the same agent implements and reviews in one long session, the review often happens in the “dumb zone.”&lt;/p&gt;

&lt;p&gt;Better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Session 1:
Implement issue.

Clear context.

Session 2:
Review the diff against the issue, coding standards, and architecture rules.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the reviewer sharper.&lt;/p&gt;

&lt;p&gt;It also reduces self-justification. Agents are less likely to catch their own mistakes when they are still carrying the implementation history.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 11: QA Is Where Taste Re-enters the System
&lt;/h2&gt;

&lt;p&gt;Automated tests are necessary, but they are not enough.&lt;/p&gt;

&lt;p&gt;Human QA is where you impose taste.&lt;/p&gt;

&lt;p&gt;This is especially true for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend behavior.&lt;/li&gt;
&lt;li&gt;UX quality.&lt;/li&gt;
&lt;li&gt;Product feel.&lt;/li&gt;
&lt;li&gt;Naming.&lt;/li&gt;
&lt;li&gt;Edge cases.&lt;/li&gt;
&lt;li&gt;“Does this actually solve the problem?”&lt;/li&gt;
&lt;li&gt;“Would I be happy merging this?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you automate everything from idea to QA, you often get software that technically exists but lacks judgment.&lt;/p&gt;

&lt;p&gt;That is how teams produce AI slop.&lt;/p&gt;

&lt;p&gt;The human role is not disappearing. It is moving upward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less typing.&lt;/li&gt;
&lt;li&gt;More shaping.&lt;/li&gt;
&lt;li&gt;More reviewing.&lt;/li&gt;
&lt;li&gt;More boundary-setting.&lt;/li&gt;
&lt;li&gt;More taste enforcement.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A Practical Workflow You Can Steal
&lt;/h2&gt;

&lt;p&gt;Here is the full loop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;1.&lt;/span&gt; Start with a vague idea or client brief.
&lt;span class="p"&gt;
2.&lt;/span&gt; Run a grilling session.
   Goal: reach shared understanding.
&lt;span class="p"&gt;
3.&lt;/span&gt; Convert the conversation into a PRD.
   Goal: define the destination.
&lt;span class="p"&gt;
4.&lt;/span&gt; Convert the PRD into vertical-slice issues.
   Goal: create independently grabbable tasks.
&lt;span class="p"&gt;
5.&lt;/span&gt; Mark each issue:
&lt;span class="p"&gt;   -&lt;/span&gt; Human-in-the-loop
&lt;span class="p"&gt;   -&lt;/span&gt; AFK
&lt;span class="p"&gt;   -&lt;/span&gt; Blocked by X
&lt;span class="p"&gt;   -&lt;/span&gt; Blocks Y
&lt;span class="p"&gt;
6.&lt;/span&gt; Run one agent per available AFK issue.
   Goal: scoped implementation.
&lt;span class="p"&gt;
7.&lt;/span&gt; Require TDD and feedback loops.
   Goal: prevent blind coding.
&lt;span class="p"&gt;
8.&lt;/span&gt; Run automated review in a fresh context.
   Goal: catch obvious problems.
&lt;span class="p"&gt;
9.&lt;/span&gt; Human QA and code review.
   Goal: enforce correctness and taste.
&lt;span class="p"&gt;
10.&lt;/span&gt; Add new issues from QA findings.
    Goal: keep the Kanban board alive.
&lt;span class="p"&gt;
11.&lt;/span&gt; Merge only when the slice is coherent.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Bigger Lesson
&lt;/h2&gt;

&lt;p&gt;AI coding is not replacing software engineering fundamentals.&lt;/p&gt;

&lt;p&gt;It is punishing teams that ignored them.&lt;/p&gt;

&lt;p&gt;If your codebase has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Poor tests.&lt;/li&gt;
&lt;li&gt;Shallow modules.&lt;/li&gt;
&lt;li&gt;Unclear boundaries.&lt;/li&gt;
&lt;li&gt;Weak architecture.&lt;/li&gt;
&lt;li&gt;Vague requirements.&lt;/li&gt;
&lt;li&gt;No review discipline.&lt;/li&gt;
&lt;li&gt;No product taste.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then agents will amplify the mess.&lt;/p&gt;

&lt;p&gt;If your codebase has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear modules.&lt;/li&gt;
&lt;li&gt;Strong feedback loops.&lt;/li&gt;
&lt;li&gt;Small vertical slices.&lt;/li&gt;
&lt;li&gt;Explicit requirements.&lt;/li&gt;
&lt;li&gt;Testable behavior.&lt;/li&gt;
&lt;li&gt;Good review practices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then agents can move extremely fast.&lt;/p&gt;

&lt;p&gt;The future of software development is not “write specs and ignore code.”&lt;/p&gt;

&lt;p&gt;It is closer to this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Developers design the system, define the boundaries, create the feedback loops, and delegate scoped implementation to agents.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a much stronger model than vibe coding.&lt;/p&gt;

&lt;p&gt;And it is much closer to real engineering.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
