<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title>Chemaclass - ai</title><subtitle>Tech Lead sharing practical insights on software craftsmanship, TDD, leadership, Bitcoin, and AI. Blog posts, book summaries, and conference talks.</subtitle><link rel="self" type="application/atom+xml" href="https://chemaclass.com/tags/ai/atom.xml"/><link rel="alternate" type="text/html" href="https://chemaclass.com"/><generator uri="https://www.getzola.org/">Zola</generator><updated>2026-06-26T00:00:00+00:00</updated><id>https://chemaclass.com/tags/ai/atom.xml</id><entry xml:lang="en"><title>Cut the Token Bill on Both Ends</title><subtitle>Two leaks, two patches</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="developer-tools" scheme="https://chemaclass.com/tags/developer-tools/" label="Developer Tools"/><category term="agentic-coding" scheme="https://chemaclass.com/tags/agentic-coding/" label="Agentic Coding"/><published>2026-06-26T00:00:00+00:00</published><updated>2026-06-26T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/cut-the-token-bill-on-both-ends/"/><id>https://chemaclass.com/blog/cut-the-token-bill-on-both-ends/</id><summary type="html">Two small tools that compound: Caveman shrinks what the agent says back, RTK shrinks what your terminal pipes in. More room in the same context window, same model, same prompts.</summary><content type="html">&lt;p>Every agentic session burns tokens in two directions at once. The agent talks back to you, and the terminal pipes its output in. Both flow through the same context window, and both of them leak.&lt;/p>
&lt;p>Run a session long enough and you hit the wall. The answers get worse and the bill climbs.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;blockquote>
&lt;p>Same model. Same prompts. Lighter bill.&lt;/p>
&lt;/blockquote>
&lt;p>Open any session transcript and the biggest blocks aren’t your prompts:&lt;/p>
&lt;ul>
&lt;li>Agent responses: small talk, hedging, repetition, “Sure! Happy to help…”.&lt;/li>
&lt;li>Tool output: &lt;code>npm install&lt;/code> logs, &lt;code>git status&lt;/code> walls of text, &lt;code>grep&lt;/code> dumps with full file paths.&lt;/li>
&lt;/ul>
&lt;p>The two tools below each go after one of those. Caveman handles what the agent says back. RTK handles what the shell sends in.&lt;/p>
&lt;h2 id="caveman-trims-the-output">Caveman trims the output
&lt;a class="heading-anchor" href="#caveman-trims-the-output" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>&lt;strong>&lt;a rel="external" href="https://github.com/JuliusBrussee/caveman">Caveman&lt;/a>&lt;/strong> is an Agent Skill. Run &lt;code>/caveman full&lt;/code> once and the agent stops padding its replies: no articles, no filler, no small talk. Fragments are fine, and the technical terms stay exact.&lt;/p>
&lt;p>Install:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">curl&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">fsSL&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.sh&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> |&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> bash&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>What dies:&lt;/p>
&lt;ul>
&lt;li>Articles: a, an, the.&lt;/li>
&lt;li>Fillers: just, really, basically, actually, simply.&lt;/li>
&lt;li>Small talk: sure, of course, happy to.&lt;/li>
&lt;li>Hedging: might, perhaps, it depends.&lt;/li>
&lt;/ul>
&lt;p>What stays:&lt;/p>
&lt;ul>
&lt;li>Code blocks, exact errors, file paths, commands.&lt;/li>
&lt;li>Security warnings and destructive ops (skill auto-clarifies).&lt;/li>
&lt;/ul>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Before and after&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>Normal mode:&lt;/p>
&lt;blockquote>
&lt;p>Sure! I’d be happy to help you with that. The issue you’re experiencing is likely caused by an off-by-one error in your token expiry check. The middleware compares the current time using &lt;code>&amp;lt;&lt;/code> when it should really be using &lt;code>&amp;lt;=&lt;/code>. Here’s the fix:&lt;/p>
&lt;/blockquote>
&lt;p>Caveman mode:&lt;/p>
&lt;blockquote>
&lt;p>Bug in auth middleware. Token expiry check use &lt;code>&amp;lt;&lt;/code> not &lt;code>&amp;lt;=&lt;/code>. Fix:&lt;/p>
&lt;/blockquote>
&lt;p>Same fix, and the code block that follows is identical. All that shrank is the prose around it, down to about a quarter.&lt;/p>
&lt;/div>
&lt;/details>
&lt;p>There are three levels: &lt;code>lite&lt;/code>, &lt;code>full&lt;/code>, and &lt;code>ultra&lt;/code>. Start at &lt;code>full&lt;/code>, since &lt;code>ultra&lt;/code> reads like a telegram. If an answer ever lands too terse for you, type &lt;code>normal mode&lt;/code> and it backs off.&lt;/p>
&lt;blockquote>
&lt;p>The agent doesn’t lose intelligence when you take away its small talk.&lt;/p>
&lt;/blockquote>
&lt;h2 id="rtk-trims-the-input">RTK trims the input
&lt;a class="heading-anchor" href="#rtk-trims-the-input" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>&lt;strong>&lt;a rel="external" href="https://github.com/rtk-ai/rtk">RTK&lt;/a>&lt;/strong> (Rust Token Killer) wraps the commands your agent runs. A hook rewrites &lt;code>git status&lt;/code> into &lt;code>rtk git status&lt;/code> behind the scenes, so there’s nothing extra to type and no overhead to notice.&lt;/p>
&lt;p>Install:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">brew&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> install&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> rtk&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">rtk&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> init&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">g&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> #&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> install the hook that auto-rewrites commands&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>If &lt;code>rtk gain&lt;/code> later errors, a different tool with the same name slipped in; install from the &lt;a rel="external" href="https://github.com/rtk-ai/rtk">repo&lt;/a> instead.&lt;/p>
&lt;p>The wrapped version strips the noise before it ever reaches the agent: color codes, repeated separators, &lt;code>npm&lt;/code> install banners, verbose timestamps.&lt;/p>
&lt;p>Here’s the same &lt;code>git status&lt;/code>, raw and then wrapped:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>$ rtk proxy git status&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>On branch main&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Your branch is up to date with &amp;#39;origin/main&amp;#39;.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Untracked files:&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to include in what will be committed)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> content/blog/new-draft.md&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>nothing added to commit but untracked files present (use &amp;quot;git add&amp;quot; to track)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>$ rtk git status&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* main...origin/main&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>? Untracked: 1 file&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> content/blog/new-draft.md&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Same information in half the lines. On a busy repo the gap only grows, as dozens of untracked files, branch hints, and instruction lines all collapse into one small block.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">rtk&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> gain&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> #&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> see how many tokens it saved you&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">rtk&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> gain&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-history&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> #&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> per-command breakdown&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">rtk&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> discover&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> #&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> scan your agent history for missed wins&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>RTK reports &lt;a rel="external" href="https://github.com/rtk-ai/rtk">60-90% fewer tokens&lt;/a> on common dev commands. Run &lt;code>rtk gain&lt;/code> after some real use to see your own number.&lt;/p>
&lt;p>It never touches the payload, only the noise around it, so errors and stack traces come through exactly as they are. If a filter ever eats something you actually need, bypass it for that one call with &lt;code>rtk proxy &amp;lt;cmd&amp;gt;&lt;/code>.&lt;/p>
&lt;blockquote>
&lt;p>Output you never read is still output the model has to read.&lt;/p>
&lt;/blockquote>
&lt;h2 id="why-the-combo-compounds">Why the combo compounds
&lt;a class="heading-anchor" href="#why-the-combo-compounds" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>On their own, each tool helps a little. Run them together and the effect compounds, because they hit different halves of the same loop. A turn goes like this: you prompt, the agent thinks, it runs a command, the terminal answers, the agent reads that, then it replies to you. RTK shrinks the terminal half and Caveman shrinks the reply, so every turn gets cheaper and you fit more of them in one window.&lt;/p>
&lt;p>Here’s the real check, on a $100/month plan. Before I added these, I hit the weekly usage cap all the time, sometimes from a single project. Now I run several projects in parallel and the cap rarely shows up. The plan didn’t get bigger; the sessions got smaller.&lt;/p>
&lt;h2 id="set-it-once-then-forget-it">Set it once, then forget it
&lt;a class="heading-anchor" href="#set-it-once-then-forget-it" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Both installs are global, and you do them once. After that you keep typing &lt;code>git status&lt;/code>, &lt;code>grep&lt;/code>, and &lt;code>npm install&lt;/code> exactly as before. The hook rewrites them for you and Caveman kicks in on its own, so there are no new habits to learn.&lt;/p>
&lt;p>Not sure where to start? Pick whichever leak hurts more right now. If long replies on every little fix are the problem, start with Caveman. If it’s floods of &lt;code>grep&lt;/code> and &lt;code>npm install&lt;/code> output, start with RTK. Add the other one whenever you feel like it, since they don’t get in each other’s way.&lt;/p>
&lt;blockquote>
&lt;p>You didn’t upgrade the model. You stopped wasting its attention.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2026-06-26/footer.webp" alt="blog-footer" />&lt;/p></content></entry><entry xml:lang="en"><title>Skills Over Agents</title><subtitle>Intelligence without expertise is entertainment</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software" scheme="https://chemaclass.com/tags/software/" label="Software"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="developer-tools" scheme="https://chemaclass.com/tags/developer-tools/" label="Developer Tools"/><published>2026-05-19T00:00:00+00:00</published><updated>2026-05-19T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/skills-over-agents/"/><id>https://chemaclass.com/blog/skills-over-agents/</id><summary type="html">Why Claude Code skills beat specialized agents. On-demand context, not the model, decides quality. Build a skill library that travels with your code.</summary><content type="html">&lt;p>People compare coding agents. Claude Code, Codex, Gemini CLI. Which one is smarter, faster, cheaper. New benchmarks every month.&lt;/p>
&lt;p>Wrong question.&lt;/p>
&lt;p>After a year wiring agents into real projects, what moved the needle wasn’t the agent. It was the skills I wrote for it.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="agents-are-commodities">Agents are commodities
&lt;a class="heading-anchor" href="#agents-are-commodities" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Every coding agent has the same shape. A language model, a runtime, filesystem access. Read, reason, write. Generalist by design.&lt;/p>
&lt;p>Two teams use the same agent. One ships clean, tested code. The other ships garbage that looks good. Same model. Different teaching.&lt;/p>
&lt;blockquote>
&lt;p>The model is the engine. Skills are the map. Without a map, a powerful engine gets you lost sooner.&lt;/p>
&lt;/blockquote>
&lt;h2 id="intelligence-is-not-expertise">Intelligence is not expertise
&lt;a class="heading-anchor" href="#intelligence-is-not-expertise" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Who handles your taxes? A 300 IQ genius who never read tax law, or an accountant with 20 years of filings?&lt;/p>
&lt;p>An accountant knows which deductions apply, which filings your business needs, which mistakes get flagged. Not intelligence. Expertise.&lt;/p>
&lt;p>AI agents have the same gap. A model reasons about code and writes solutions. It doesn’t know your hexagonal layers. It doesn’t know domain entities must never import framework code. It doesn’t know every feature starts with a failing test.&lt;/p>
&lt;p>Skills close that gap.&lt;/p>
&lt;h2 id="skills-load-context-on-demand">Skills load context on demand
&lt;a class="heading-anchor" href="#skills-load-context-on-demand" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>A skill is a markdown file in &lt;code>.claude/skills/&lt;/code>. A procedure, a pattern, a slice of domain knowledge. Plain markdown with frontmatter.&lt;/p>
&lt;p>The key is how they load. The agent reads only names and descriptions at startup. Loads the full skill when the task matches. Follows links to references only when it needs to dig deeper.&lt;/p>
&lt;p>That on-demand loading is what makes skills scale. Twenty skills cost almost nothing until one fits the task. Specialized agents, by contrast, carry their full instructions every time they run. More agents, more fixed cost.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: A real-world skill example&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>.claude/skills/&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> code-review/&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> SKILL.md # main instructions&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> reference/&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> solid-checklist.md # detailed SOLID examples&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> test-patterns.md # test quality guidelines&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>The &lt;code>SKILL.md&lt;/code>:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="markdown">&lt;span class="giallo-l">&lt;span>---&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#22863A, #85E89D);">d&lt;/span>&lt;span style="color: light-dark(#22863A, #85E89D);">escription&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Review code changes for SOLID violations, test quality, and architecture alignment&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#22863A, #85E89D);">a&lt;/span>&lt;span style="color: light-dark(#22863A, #85E89D);">llowed-tools&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> R&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">ead, Grep, Glob&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#22863A, #85E89D);">a&lt;/span>&lt;span style="color: light-dark(#22863A, #85E89D);">rgument-hint&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">[file or PR]&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>---&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);font-weight: bold;">#&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);font-weight: bold;"> Code Review&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Review code changes against project conventions.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);font-weight: bold;">##&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);font-weight: bold;"> Steps&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);">1.&lt;/span>&lt;span> Read the diff or specified files&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);">2.&lt;/span>&lt;span> Check architecture: domain layer has no framework imports, infrastructure stays thin&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);">3.&lt;/span>&lt;span> Check SOLID principles (see reference/solid-checklist.md for patterns)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);">4.&lt;/span>&lt;span> Check test quality: tests verify behavior, not implementation details&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);">5.&lt;/span>&lt;span> Flag issues with the specific principle violated and a suggested fix&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);font-weight: bold;">##&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);font-weight: bold;"> Output&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>For each issue found:&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);">-&lt;/span>&lt;span> File and line&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);">-&lt;/span>&lt;span> What&amp;#39;s wrong (which principle or convention)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);">-&lt;/span>&lt;span> What the fix looks like&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Agent sees the description in the skill list. Ask for a review, it loads &lt;code>SKILL.md&lt;/code>. Needs a SOLID pattern, reads the reference. Two levels, on demand.&lt;/p>
&lt;/div>
&lt;/details>
&lt;p>&lt;img src="/images/blog/2026-05-19/middle.webp" alt="blog-middle" />&lt;/p>
&lt;h2 id="skills-vs-specialized-agents">Skills vs specialized agents
&lt;a class="heading-anchor" href="#skills-vs-specialized-agents" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>I covered &lt;a href="/blog/inside-the-claude-folder/#agents-specialized-roles">specialized agents&lt;/a> already: isolated workers with their own prompt and tool set. Great for parallel work and clean context boundaries.&lt;/p>
&lt;p>Specialized agents are coarse. One agent, one role, one fixed prompt. If you want three kinds of review quality, you either write three agents or stuff one agent with everything.&lt;/p>
&lt;p>Skills are finer. One agent, many skills. The right skill loads for the task. Context stays small. Quality stays high.&lt;/p>
&lt;p>Rule of thumb:&lt;/p>
&lt;ul>
&lt;li>Use a &lt;strong>skill&lt;/strong> when you need a procedure or pattern. From &lt;code>phel-lang&lt;/code>: &lt;code>/gh-issue&lt;/code> (issue to PR), &lt;code>/commit&lt;/code> (conventional commit), &lt;code>/refactor-check&lt;/code> (SOLID review).&lt;/li>
&lt;li>Use an &lt;strong>agent&lt;/strong> when you need isolation. From &lt;code>phel-lang&lt;/code>: &lt;code>tdd-coach&lt;/code> (TDD pairing), &lt;code>clean-code-reviewer&lt;/code> (PR review), &lt;code>domain-architect&lt;/code> (architecture exploration).&lt;/li>
&lt;/ul>
&lt;p>Most needs are skills, not agents.&lt;/p>
&lt;blockquote>
&lt;p>Agents give you speed. Skills give you quality. If you must pick one first, pick skills.&lt;/p>
&lt;/blockquote>
&lt;h2 id="skills-are-your-edge">Skills are your edge
&lt;a class="heading-anchor" href="#skills-are-your-edge" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Models improve every month. This year’s best is next year’s baseline. The major families converge. Better tool shows up, you switch.&lt;/p>
&lt;p>Your skills don’t switch with the tool. They encode your domain, conventions, architecture. They live in your repo. They travel with your code. Point a new model at the library, productive day one.&lt;/p>
&lt;blockquote>
&lt;p>The agent is replaceable. Your skills are not.&lt;/p>
&lt;/blockquote>
&lt;h2 id="start-with-the-first-repeated-prompt">Start with the first repeated prompt
&lt;a class="heading-anchor" href="#start-with-the-first-repeated-prompt" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>You don’t need 20 skills on day one.&lt;/p>
&lt;p>Zero. Then one.&lt;/p>
&lt;p>The signal is repetition. The second time you type the same context, that’s a skill waiting. Extract it into a markdown file. Next session, the agent knows.&lt;/p>
&lt;p>Concrete example. On &lt;a rel="external" href="https://github.com/phel-lang/phel-lang">&lt;code>phel-lang&lt;/code>&lt;/a>, I kept pasting the same brief every session: read issue #N, branch from the labels, TDD, open the PR. Third repeat, I extracted it into a &lt;code>/gh-issue&lt;/code> skill. Now I type &lt;code>/gh-issue 142&lt;/code> and the agent picks up the issue, creates &lt;code>fix/...&lt;/code> or &lt;code>feat/...&lt;/code> from the labels, writes the failing test first, implements, opens the PR. One markdown file. The session no longer starts from zero.&lt;/p>
&lt;p>Don’t write from scratch. Ask the agent: &lt;em>“Read this project and draft a minimal code review skill based on what you see.”&lt;/em> It scans, picks up conventions, drafts v1. Then you adjust. Add what it missed. Cut what doesn’t apply. Sharpen the description.&lt;/p>
&lt;p>The second skill usually comes from a mistake. Agent breaks a convention. Write a skill that teaches the correct approach. It won’t happen again.&lt;/p>
&lt;p>Skills add up. Each one lifts the baseline. A markdown file, maybe 50 lines. Permanent payoff.&lt;/p>
&lt;p>People who don’t write skills keep re-explaining what they “really want.” Every session from zero. Not a tool problem. A knowledge management problem.&lt;/p>
&lt;p>The agent ships next year. The skill ships forever.&lt;/p>
&lt;blockquote>
&lt;p>Write the skill once. Every session after that starts where the last one ended.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2026-05-19/footer.webp" alt="blog-footer" />&lt;/p>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/CEvIs9y1uog"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>The Levels of AI Adoption</title><subtitle>From copy-paste prompts to agentic teams</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software" scheme="https://chemaclass.com/tags/software/" label="Software"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="developer-tools" scheme="https://chemaclass.com/tags/developer-tools/" label="Developer Tools"/><published>2026-05-01T00:00:00+00:00</published><updated>2026-05-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/the-levels-of-ai-adoption/"/><id>https://chemaclass.com/blog/the-levels-of-ai-adoption/</id><summary type="html">A six-level ladder of AI adoption, from copy-paste prompts to agentic teams and AI-native workflows. Where most companies stall, and how to climb.</summary><content type="html">&lt;p>Most companies use AI today, but few know where they stand on the AI adoption ladder. At one end, you paste code into ChatGPT. At the other, agents open PRs while you sleep. Beyond that, AI reaches people who never touched a terminal. This post maps the path.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="where-we-started">Where we started
&lt;a class="heading-anchor" href="#where-we-started" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Using AI to code meant a second tab. Write a function, get stuck, paste the error into chat, paste the answer back, and hope it works. It was slow, messy, and disconnected from your code.&lt;/p>
&lt;p>&lt;a rel="external" href="https://github.com/features/copilot">GitHub Copilot&lt;/a>, built on OpenAI’s early Codex, added suggestions inside the editor, often confidently wrong. It was trained on public code, and most public code isn’t great. It also knew nothing about &lt;em>your&lt;/em> domain, &lt;em>your&lt;/em> conventions, &lt;em>your&lt;/em> architecture. It was autocomplete that sometimes guessed right.&lt;/p>
&lt;blockquote>
&lt;p>The first generation of AI coding tools gave you a parrot trained on the whole internet. Fluent, confident, and often saying things that made no sense in your codebase.&lt;/p>
&lt;/blockquote>
&lt;p>This was &lt;em>vibe-coding&lt;/em> in its first form: you gave the vibe by pasting context, and the AI filled in code that looked right. It compiled often enough to feel useful, and broke often enough to feel dangerous.&lt;/p>
&lt;h2 id="the-ide-generation">The IDE generation
&lt;a class="heading-anchor" href="#the-ide-generation" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>The next step was obvious: if the AI needs context, give it the whole editor.&lt;/p>
&lt;p>&lt;a rel="external" href="https://cursor.com">Cursor&lt;/a>, &lt;a rel="external" href="https://windsurf.com">Windsurf&lt;/a>, and similar IDEs moved the model inside your coding flow. The assistant could read files, follow imports, and see more than one function at a time. Vibe-coding became a conversation with your project, and productivity jumped. For a moment, it felt like the endgame.&lt;/p>
&lt;p>It wasn’t. Editing files is only part of the job. The rest is running tests, reading logs, opening branches, reviewing diffs, and understanding what the codebase already does. Editor-only assistants helped you type faster, but they couldn’t take a task from &lt;em>“fix this bug”&lt;/em> to &lt;em>“PR ready for review.”&lt;/em>&lt;/p>
&lt;h2 id="the-agentic-shift">The agentic shift
&lt;a class="heading-anchor" href="#the-agentic-shift" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>OpenAI launched &lt;a rel="external" href="https://openai.com/index/introducing-codex/">Codex&lt;/a> as a cloud agent: give it a task, it works on a branch, and you come back to a PR. Anthropic shipped &lt;a rel="external" href="https://claude.com/product/claude-code">Claude Code&lt;/a>, a CLI agent in your terminal, on your repo, with your tools.&lt;/p>
&lt;p>This was the big shift, and not because the models were smarter. The unit of work changed. You stopped prompting line by line and started delegating tasks: read the ticket, write the change, run the tests, explain what you did. An agent doesn’t need hand-holding. It needs a goal and the right context.&lt;/p>
&lt;blockquote>
&lt;p>The jump from assistant to agent is not a speed improvement. It’s a change of job description. You move from typing code to directing work.&lt;/p>
&lt;/blockquote>
&lt;p>Claude Code needs almost no setup. No editor lock-in. Point it at your repo, drop a &lt;code>.claude&lt;/code> folder with rules and conventions, and it adapts. I covered that in &lt;a rel="external" href="https://chemaclass.com/blog/inside-the-claude-folder/">Inside the .claude Folder&lt;/a>.&lt;/p>
&lt;p>The model you pick matters more than before. Today’s frontier models are way ahead of where they were a year ago. The gap between &lt;em>“can draft a function”&lt;/em> and &lt;em>“can refactor a module with judgment”&lt;/em> closed faster than expected, and it keeps closing as Claude, Codex, and Gemini push each other forward every month. Prices are getting closer too, which is a polite way of saying everyone copies whoever figures out the sustainable version first.&lt;/p>
&lt;h2 id="agents-with-their-own-home">Agents with their own home
&lt;a class="heading-anchor" href="#agents-with-their-own-home" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>The next leap wasn’t smarter models, it was agents with their own machine.&lt;/p>
&lt;p>&lt;a rel="external" href="https://openclaw.ai">OpenClaw&lt;/a> is the clearest example. It’s an open-source gateway you run on your own hardware (Mac Mini, old laptop, VPS), an always-on agent connected to your messaging apps, files, and calendar. You bring your own brain: Opus, GPT, or a local model via &lt;a rel="external" href="https://ollama.com">Ollama&lt;/a>. When a provider tightens limits or raises prices, you switch. You own the setup.&lt;/p>
&lt;p>A coding agent lives inside one repo for a task. An OpenClaw-style agent lives in &lt;em>your life&lt;/em>, across days and tools. &lt;a rel="external" href="https://sauronbot.github.io/about/">Sauron&lt;/a> is mine. It reviews my PRs, opens issues, drafts code, ships open source contributions, and pushes back when I’m about to tunnel on something. Anything I can do on a computer, it can do too, just faster. It stops being a tool you open and becomes a place you work in.&lt;/p>
&lt;blockquote>
&lt;p>A coding agent is a coworker you invite to a task. A gateway agent is a coworker who lives on a machine and shows up every day.&lt;/p>
&lt;/blockquote>
&lt;p>Providers change their plans and limits faster than anyone tracks, so people build setups that aren’t tied to one vendor. The logo on the model matters less every quarter, and the architecture around it matters more.&lt;/p>
&lt;h2 id="ai-beyond-developers">AI beyond developers
&lt;a class="heading-anchor" href="#ai-beyond-developers" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>AI coding was the loudest story because developers are loud. The bigger story is agentic tools reaching people who never wrote a line of code.&lt;/p>
&lt;p>&lt;a rel="external" href="https://openai.com/index/introducing-chatgpt-agent/">ChatGPT agent mode&lt;/a> and &lt;a rel="external" href="https://claude.com/product/cowork">Claude’s Cowork&lt;/a> are the obvious examples: an AI that reads your documents, fills your spreadsheets, drafts your slides, and runs code for you in the background. &lt;a rel="external" href="https://www.anthropic.com/news/claude-design-anthropic-labs">Claude Design&lt;/a> launched on April 17 and &lt;a rel="external" href="https://sherwood.news/tech/anthropic-launches-claude-design-sending-shares-of-figma-down/">dropped Figma’s stock over 7% on launch day&lt;/a>. The pitch is simple: describe what you want, get a working prototype, hand it to Claude Code to ship. A workflow that used to need a designer, a PM, a frontend engineer, and three review rounds is squeezed into one conversation.&lt;/p>
&lt;p>Lovable, v0, Canva, and Figma itself are all under pressure to rethink their positioning. Whether Claude Design “kills” any of them is the wrong question. The right one is what happens when making a usable prototype drops from &lt;em>“hire a designer”&lt;/em> to &lt;em>“describe it out loud.”&lt;/em>&lt;/p>
&lt;p>The companies feeling this first aren’t the design tools. They’re the small businesses that couldn’t afford design work, the founders building a pitch deck at midnight, the PMs testing an idea before booking a meeting. There’s a minority of cases where someone would have paid a designer and now won’t, and that cost is real. But in most of them, AI didn’t replace anyone: it filled a space where no designer was ever going to exist.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-05-01/middle.webp" alt="Small library with wooden bookshelves and stacks of books" />&lt;/p>
&lt;h2 id="the-levels-of-ai-adoption">The levels of AI adoption
&lt;a class="heading-anchor" href="#the-levels-of-ai-adoption" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Every company I talk to sits somewhere on this ladder. The levels aren’t about how much you pay in licenses, but about how deeply AI is built into the way work gets done, and not just in engineering.&lt;/p>
&lt;h3 id="level-0-denial">Level 0: Denial
&lt;a class="heading-anchor" href="#level-0-denial" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>&lt;em>A company-level stance.&lt;/em> No AI, officially. Some people use ChatGPT on personal laptops and don’t mention it. Leadership worries about IP leaks, or hasn’t made it a priority. The conversation stays at &lt;em>“we should look into this someday.”&lt;/em>&lt;/p>
&lt;p>The risk here isn’t technology, it’s time. Every month at Level 0 is a month your competitors grow their lead.&lt;/p>
&lt;h3 id="level-1-personal-productivity">Level 1: Personal productivity
&lt;a class="heading-anchor" href="#level-1-personal-productivity" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>&lt;em>Individual adoption.&lt;/em> AI is allowed, maybe encouraged. Each person uses it their own way: ChatGPT in a tab, Copilot in the IDE, Claude for the tricky stuff, a design tool for mockups. Output goes up, but the know-how stays inside each person’s head. Two engineers, or two PMs, or two designers on the same team get very different results because they prompt differently.&lt;/p>
&lt;p>Most companies are here in early 2026. It’s a real improvement over Level 0, and it’s where the myth of &lt;em>“AI gives you speed”&lt;/em> gets born. As I &lt;a rel="external" href="https://chemaclass.com/blog/ai-gives-you-speed-not-quality/">argued before&lt;/a>, speed without shared direction is faster chaos.&lt;/p>
&lt;h3 id="level-2-shared-practices">Level 2: Shared practices
&lt;a class="heading-anchor" href="#level-2-shared-practices" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The team agrees on how to use AI: shared conventions, prompts people reuse, rules in the repo, a shared sense of when to trust the output and when to push back. Code reviews catch AI mistakes the same way they catch human ones, and design reviews do too. Tests are required whether a person or a model wrote the code.&lt;/p>
&lt;p>This is the first level where AI becomes a team skill rather than a personal habit. Higher ceiling, higher floor. New people ramp up faster because the prompts and rules capture how the team works.&lt;/p>
&lt;h3 id="level-3-context-aware-tooling">Level 3: Context-aware tooling
&lt;a class="heading-anchor" href="#level-3-context-aware-tooling" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The team invests in context: rules files, conventions, architecture docs agents can read, and &lt;a rel="external" href="https://chemaclass.com/blog/mcp-giving-your-ai-agent-the-right-context/">MCP servers&lt;/a> connecting agents to the databases, APIs, and internal tools they need. The AI stops being a generic assistant and becomes closer to a coworker who has read the onboarding docs.&lt;/p>
&lt;p>At this level, quality depends less on the model and more on the context around it. A weaker model with great context beats a frontier model with none. Good docs and clean architecture pay off twice: they help both humans and agents.&lt;/p>
&lt;h3 id="level-4-agentic-teams">Level 4: Agentic teams
&lt;a class="heading-anchor" href="#level-4-agentic-teams" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Instead of one assistant, you get a squad: a TDD coach, a clean code reviewer, a domain architect, a docs maintainer. Outside engineering, the same idea applies with research, design, and ops agents. I covered the developer side in &lt;a rel="external" href="https://chemaclass.com/blog/build-your-own-team-of-agents/">Build Your Own Team of Agents&lt;/a>, and the leverage is real.&lt;/p>
&lt;p>Humans stop competing with AI on speed and start directing it. You review, decide, and set the bar. Agents handle typing, and increasingly the thinking. Pair programming with a person still wins on complex trade-offs, but an agent pair is always there for the rest.&lt;/p>
&lt;p>At the company level, the org chart, roles, and processes are still the same. What changes is that each person produces a lot more, and the team’s output reflects it. Level 4 multiplies output inside the existing structure. Level 5 changes the structure.&lt;/p>
&lt;h3 id="level-5-ai-native-workflows">Level 5: AI-native workflows
&lt;a class="heading-anchor" href="#level-5-ai-native-workflows" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The final shift is about how the company runs. Processes are designed &lt;em>around&lt;/em> agents instead of just fitting them in. Tickets are written so an agent can act on them, and reviews assume part of the work was written by a machine. Architecture decisions take into account what agents do and don’t do well. Even hiring changes: a senior IC at Level 5 is closer to a tech lead leading people and agents than a classic individual contributor.&lt;/p>
&lt;p>Few companies are fully here in 2026, but the direction is obvious enough that ignoring it is its own decision.&lt;/p>
&lt;blockquote>
&lt;p>You don’t move up a level by buying better tools. You move up by changing how work is organized and reviewed.&lt;/p>
&lt;/blockquote>
&lt;h2 id="ai-is-not-stealing-jobs">AI is not stealing jobs
&lt;a class="heading-anchor" href="#ai-is-not-stealing-jobs" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>I keep hearing people call this a layoff story, and that framing is lazy.&lt;/p>
&lt;p>The industrial revolution didn’t end work. It ended specific kinds of work and created others. The people who lost the most refused to re-skill, and the people who gained the most learned to operate the new machines instead of competing with them.&lt;/p>
&lt;p>Same pattern here. AI isn’t taking your job, it’s changing what your job is. A developer who learns to lead agents out-ships one who refuses. A designer making ten versions before lunch with Claude Design out-designs one still opening Figma from scratch. A PM who ships prototypes out-prioritizes one writing specs nobody reads.&lt;/p>
&lt;blockquote>
&lt;p>AI doesn’t replace the skilled worker. It replaces the worker who thinks skill is a fixed asset instead of a moving target.&lt;/p>
&lt;/blockquote>
&lt;p>With the right training, model, and setup for your context, AI gives you 10x speed without losing quality. I’ve seen it, and it’s not marketing. But the 10x only shows up when you already know what good looks like. Without that foundation, AI happily produces 10x more mediocre work.&lt;/p>
&lt;p>That’s the honest version of the promise: AI can produce crap ten times faster, &lt;em>and&lt;/em> excellent work ten times faster. Which one you get is on you.&lt;/p>
&lt;h2 id="the-shift-in-where-your-attention-goes">The shift in where your attention goes
&lt;a class="heading-anchor" href="#the-shift-in-where-your-attention-goes" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>You stop thinking about details first and start thinking about direction: what are we building, who for, what shape, and which trade-offs. Agents then do most of the implementation while you protect quality and coherence.&lt;/p>
&lt;p>This sounds like good news for anyone who prefers architecture to typing, and it is. But there’s a trap: you can only work at the high level if you know the low level well enough to catch drift. When the agent produces something subtly wrong (a test that passes for the wrong reason, a refactor that changes behavior under load, a design that breaks on mobile), you need to spot it instantly. If you can’t, you’re not directing, you’re signing off on whatever shows up.&lt;/p>
&lt;blockquote>
&lt;p>AI lets you spend more time on direction, but only if you’ve already earned the right to ignore the details. You earn that by having mastered them first.&lt;/p>
&lt;/blockquote>
&lt;h2 id="why-the-ladder-matters">Why the ladder matters
&lt;a class="heading-anchor" href="#why-the-ladder-matters" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>I see teams skip levels and fail. A team jumps from Level 1 to Level 4 because leadership read a blog post about agent squads, and the agents produce mountains of low-quality code because nobody agreed on what quality means. The agents aren’t the problem, the missing foundation is.&lt;/p>
&lt;p>The ladder is an order that matters. Shared practices come before context engineering, context engineering before agent teams, and agent teams before AI-native workflows. Each level builds on the previous one, the same way clean code builds on naming, and naming builds on knowing what you’re modelling.&lt;/p>
&lt;p>The companies that win the next few years aren’t the ones with the biggest AI budget. They’re the ones that climb this ladder deliberately, one level at a time, without skipping the parts that look boring.&lt;/p>
&lt;h2 id="where-to-start">Where to start
&lt;a class="heading-anchor" href="#where-to-start" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>At Level 0 or 1, the next move isn’t more licenses. It’s deciding, as a team, how to use these tools. Write it down, commit it to the repo, and review it every week or month as the tools evolve.&lt;/p>
&lt;p>At Level 2 or 3, look at where context is missing. What does your AI not know about your codebase, product, or brand that a new hire would learn in week one? Write it down. An afternoon of rules and docs pays back for months.&lt;/p>
&lt;p>Further along, the question flips. You stop asking &lt;em>“how do I use AI better?”&lt;/em> and start asking &lt;em>“how does my team need to change so AI amplifies what we already do well?”&lt;/em> That’s a leadership question, not a tooling one.&lt;/p>
&lt;blockquote>
&lt;p>AI is moving fast, but the work of adoption is still slow and human. The tools are the easy part. The hard part is deciding what good looks like, writing it down, and holding the line.&lt;/p>
&lt;/blockquote>
&lt;p>AI can execute, but it doesn’t know where you’re going. It can produce, but it doesn’t know what’s worth producing. That part is still on us. Speed is a gift, and direction is a responsibility. From the solo engineer at Level 1 to the AI-native org at Level 5, the same truth holds: the human supervises, understands, and gives meaning. The machine does the rest.&lt;/p>
&lt;p>When the hype settles (and it will), the question won’t be &lt;em>“did you use AI?”&lt;/em> Everyone will. The question will be &lt;em>“at what level, and with what direction?”&lt;/em>&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-05-01/footer.webp" alt="Library reading room with an open book on a wooden desk" />&lt;/p></content></entry><entry xml:lang="en"><title>Inside the .claude Folder</title><subtitle>A tutorial through rules, skills, agents, hooks, and settings</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software" scheme="https://chemaclass.com/tags/software/" label="Software"/><category term="tutorial" scheme="https://chemaclass.com/tags/tutorial/" label="Tutorial"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><category term="developer-tools" scheme="https://chemaclass.com/tags/developer-tools/" label="Developer Tools"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2026-04-17T00:00:00+00:00</published><updated>2026-04-17T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/inside-the-claude-folder/"/><id>https://chemaclass.com/blog/inside-the-claude-folder/</id><summary type="html">A hands-on tour of Claude Code's project folder. What rules, skills, agents, hooks, and settings each do, and how they fit together.</summary><content type="html">&lt;p>Every project I work on has a &lt;code>.claude/&lt;/code> folder at the root. Committed to git, like the rest of the code.&lt;/p>
&lt;p>That folder turns Claude Code from a generic assistant into a project-aware teammate. Everyone who clones the repo inherits the same setup.&lt;/p>
&lt;p>Agentic coding is only as good as the context you give the agent. The &lt;code>.claude/&lt;/code> folder is where that context lives.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-claude-folder-at-a-glance">The .claude folder, at a glance
&lt;a class="heading-anchor" href="#the-claude-folder-at-a-glance" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>.claude/&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>├── CLAUDE.md # project onboarding&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>├── settings.json # permissions, hooks, env&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>├── skills/ # reusable procedures (slash commands)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>├── rules/ # glob-targeted conventions&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>├── hooks/ # shell scripts run on events&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>└── agents/ # specialized roles&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Six layers, one folder. Context, safety, procedures, guardrails, automation, specialists.&lt;/p>
&lt;h2 id="the-foundation">The foundation
&lt;a class="heading-anchor" href="#the-foundation" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;h3 id="claude-md-where-everything-starts">CLAUDE.md: where everything starts
&lt;a class="heading-anchor" href="#claude-md-where-everything-starts" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Claude Code reads &lt;code>CLAUDE.md&lt;/code> on every boot. The onboarding doc.&lt;/p>
&lt;p>In &lt;a rel="external" href="https://github.com/phel-lang/phel-lang">Phel&lt;/a>, mine covers the compiler pipeline (Lexer → Parser → Analyzer → Emitter), module structure, conventions, and key commands.&lt;/p>
&lt;p>A global &lt;code>~/.claude/CLAUDE.md&lt;/code> applies to &lt;em>all&lt;/em> your projects. The project file says &lt;em>how this codebase works&lt;/em>. The global file says &lt;em>how I work&lt;/em>.&lt;/p>
&lt;p>Every byte ships in every prompt. Keep it short.
Past one screen, move detail into &lt;code>rules/&lt;/code> or &lt;code>skills/&lt;/code>.&lt;/p>
&lt;blockquote>
&lt;p>A good &lt;code>CLAUDE.md&lt;/code> is a good onboarding doc. The better it is, the less you repeat yourself.&lt;/p>
&lt;/blockquote>
&lt;h3 id="settings-json-safety-before-leverage">settings.json: safety before leverage
&lt;a class="heading-anchor" href="#settings-json-safety-before-leverage" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Before giving the agent more power, lock down what it must never do.&lt;/p>
&lt;p>&lt;code>.claude/settings.json&lt;/code> holds three things: &lt;strong>permissions&lt;/strong> (allow/deny), &lt;strong>hooks&lt;/strong> (event commands), and &lt;strong>env&lt;/strong> (variables). A gitignored &lt;code>settings.local.json&lt;/code> keeps personal overrides separate.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Permissions example from Phel&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="json">&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">permissions&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">allow&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Bash(composer:*)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Bash(./bin/phel:*)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Bash(git:*)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Bash(gh:*)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> ]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">deny&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Bash(rm -rf:*)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Bash(sudo:*)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> ]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;/div>
&lt;/details>
&lt;p>Allow unlocks flow. Deny draws the line agents cannot cross, even when asked politely.&lt;/p>
&lt;blockquote>
&lt;p>Permissions are the floor. Everything else builds on top of a safe baseline.&lt;/p>
&lt;/blockquote>
&lt;h2 id="procedures-and-guardrails">Procedures and guardrails
&lt;a class="heading-anchor" href="#procedures-and-guardrails" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;h3 id="skills-procedures-you-can-run">Skills: procedures you can run
&lt;a class="heading-anchor" href="#skills-procedures-you-can-run" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Next pain after onboarding: repetition. Skills solve that.&lt;/p>
&lt;p>A skill is a markdown file in &lt;code>.claude/skills/&lt;/code>, a procedure you call with a slash:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>/gh-issue &amp;lt;number&amp;gt;&lt;/code>&lt;/strong>: issue to branch, TDD plan, PR.&lt;/li>
&lt;li>&lt;strong>&lt;code>/commit&lt;/code>&lt;/strong>: fix, analysis, tests, conventional commit.&lt;/li>
&lt;li>&lt;strong>&lt;code>/refactor-check&lt;/code>&lt;/strong>: SOLID, naming, architecture smells.&lt;/li>
&lt;li>&lt;strong>&lt;code>/release [version]&lt;/code>&lt;/strong>: changelog, PHAR, tag, release.&lt;/li>
&lt;/ul>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Skills vs rules vs raw prompting&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;ul>
&lt;li>&lt;strong>Raw prompt&lt;/strong>: &lt;em>“fix issue #42”&lt;/em>. Agent improvises. Different every time.&lt;/li>
&lt;li>&lt;strong>Rule&lt;/strong>: &lt;em>“use conventional commits”&lt;/em>. Shapes output, not procedure.&lt;/li>
&lt;li>&lt;strong>Skill&lt;/strong>: &lt;em>“&lt;code>/gh-issue 42&lt;/code>”&lt;/em>. The procedure &lt;em>is&lt;/em> the instruction.&lt;/li>
&lt;/ul>
&lt;p>Skills turn tribal knowledge into runnable steps anyone can execute.&lt;/p>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>Skills capture what to do. Rules capture what not to do.&lt;/p>
&lt;/blockquote>
&lt;h3 id="rules-the-guardrails">Rules: the guardrails
&lt;a class="heading-anchor" href="#rules-the-guardrails" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>&lt;code>CLAUDE.md&lt;/code> is read every session. Rules only when they match. Files in &lt;code>.claude/rules/&lt;/code> target code areas with glob patterns: the agent loads only what applies, keeping context lean.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Glob-targeted rules in practice&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>Rule files in Phel:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>compiler.md&lt;/code>&lt;/strong>: strict 4-phase pipeline, no bypassing.&lt;/li>
&lt;li>&lt;strong>&lt;code>php.md&lt;/code>&lt;/strong>: PER 3.0, &lt;code>final&lt;/code> classes, &lt;code>readonly&lt;/code>, Gacela.&lt;/li>
&lt;li>&lt;strong>&lt;code>phel.md&lt;/code>&lt;/strong>: kebab-case, &lt;code>defn-&lt;/code> private, &lt;code>:doc&lt;/code>/&lt;code>:example&lt;/code> required.&lt;/li>
&lt;li>&lt;strong>&lt;code>integration-tests.md&lt;/code>&lt;/strong>: &lt;code>--PHEL--&lt;/code> / &lt;code>--PHP--&lt;/code> fixture sections.&lt;/li>
&lt;/ul>
&lt;p>Compiler rules don’t fire when editing Phel source. Phel rules don’t fire when editing PHP infrastructure.&lt;/p>
&lt;/div>
&lt;/details>
&lt;p>Rules are not suggestions. They travel with the code: a convention change and its rule ship in the same commit. No drift, no outdated wiki.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-04-17/middle.webp" alt="blog-middle" />&lt;/p>
&lt;h2 id="automation-and-delegation">Automation and delegation
&lt;a class="heading-anchor" href="#automation-and-delegation" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;h3 id="hooks-automation-at-the-edges">Hooks: automation at the edges
&lt;a class="heading-anchor" href="#hooks-automation-at-the-edges" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Rules tell the agent what to do. Hooks make sure it happens even if the agent forgets.&lt;/p>
&lt;p>Shell commands triggered by Claude Code events (&lt;code>PreToolUse&lt;/code>, &lt;code>PostToolUse&lt;/code>, &lt;code>Stop&lt;/code>), wired through &lt;code>settings.json&lt;/code>. In Phel, &lt;code>PreToolUse&lt;/code> blocks edits to critical files (&lt;code>build/release.sh&lt;/code>, &lt;code>.github/*&lt;/code>, &lt;code>composer.lock&lt;/code>). &lt;code>PostToolUse&lt;/code> auto-formats PHP via &lt;code>php-cs-fixer&lt;/code>.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Hooks wiring&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="json">&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">hooks&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PreToolUse&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">matcher&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Edit|Write&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">hooks&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span>{&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">type&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">command&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">.claude/hooks/protect-files.sh&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span> }&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PostToolUse&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">matcher&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Edit|Write&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">hooks&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span>{&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">type&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">command&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">.claude/hooks/format-php.sh&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span> }&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>Rules are what the agent should know. Hooks are what the system enforces anyway.&lt;/p>
&lt;/blockquote>
&lt;h3 id="agents-specialized-roles">Agents: specialized roles
&lt;a class="heading-anchor" href="#agents-specialized-roles" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Everything so far shapes one agent. Agents add specialists the main agent can delegate to, each with its own tools, permissions, and model. Most advanced piece. Recommend it last.&lt;/p>
&lt;p>A few from Phel:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Explorer&lt;/strong> (Sonnet, read-only): files, structure mapping.&lt;/li>
&lt;li>&lt;strong>Clean Code Reviewer&lt;/strong>: SOLID and naming on diffs.&lt;/li>
&lt;li>&lt;strong>TDD Coach&lt;/strong>: red-green-refactor enforcement.&lt;/li>
&lt;li>&lt;strong>Domain Architect&lt;/strong>: module boundaries, compiler pipeline.&lt;/li>
&lt;li>&lt;strong>Debugger&lt;/strong>: compiler errors across all phases.&lt;/li>
&lt;/ul>
&lt;p>Each agent runs in its own context window: the main session stays clean while the specialist digs deep. The win is not only cost, it is focus. An agent with only read and grep cannot rewrite your codebase by mistake.&lt;/p>
&lt;blockquote>
&lt;p>Right model for the right job. Fast and cheap for exploration. Deep and careful for architecture.&lt;/p>
&lt;/blockquote>
&lt;h2 id="start-small-grow-with-friction">Start small, grow with friction
&lt;a class="heading-anchor" href="#start-small-grow-with-friction" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Do not build all of this on day one.&lt;/p>
&lt;p>The order, driven by real friction:&lt;/p>
&lt;ol>
&lt;li>Start with &lt;a href="https://chemaclass.com/blog/inside-the-claude-folder/#claude-md-where-everything-starts">&lt;code>CLAUDE.md&lt;/code>&lt;/a>.&lt;/li>
&lt;li>Lock down &lt;a href="https://chemaclass.com/blog/inside-the-claude-folder/#settings-json-safety-before-leverage">&lt;code>settings.json&lt;/code>&lt;/a> permissions.&lt;/li>
&lt;li>First time you repeat yourself, write a &lt;a href="https://chemaclass.com/blog/inside-the-claude-folder/#skills-procedures-you-can-run">skill&lt;/a>.&lt;/li>
&lt;li>First time the agent breaks a convention, add a &lt;a href="https://chemaclass.com/blog/inside-the-claude-folder/#rules-the-guardrails">rule&lt;/a>.&lt;/li>
&lt;li>First time something bad almost gets committed, add a &lt;a href="https://chemaclass.com/blog/inside-the-claude-folder/#hooks-automation-at-the-edges">hook&lt;/a>.&lt;/li>
&lt;li>First time a generalist is wrong for the job, define a &lt;a href="https://chemaclass.com/blog/inside-the-claude-folder/#agents-specialized-roles">specialist&lt;/a>.&lt;/li>
&lt;/ol>
&lt;p>Each step fixes a problem you actually had. Not one you imagined.&lt;/p>
&lt;blockquote>
&lt;p>The setup grows from real friction, not from upfront design.&lt;/p>
&lt;/blockquote>
&lt;p>Commit the folder. Share it. When someone joins, their session inherits everything.&lt;/p>
&lt;p>Treat &lt;code>.claude/&lt;/code> like infrastructure. Version it. Review it. Evolve it with the codebase.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-04-17/footer.webp" alt="blog-footer" />&lt;/p></content></entry><entry xml:lang="en"><title>Building a Game in Two Days</title><subtitle>What happens when you give an AI a quest and get out of the way</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software" scheme="https://chemaclass.com/tags/software/" label="Software"/><category term="open-source" scheme="https://chemaclass.com/tags/open-source/" label="Open Source"/><published>2026-04-05T00:00:00+00:00</published><updated>2026-04-05T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/building-a-game-in-two-days/"/><id>https://chemaclass.com/blog/building-a-game-in-two-days/</id><summary type="html">A casual Telegram message turned into a nine-level Lord of the Rings browser game. Every line of code written by an AI agent. Every creative decision made by a human who grew up on Middle-earth.</summary><content type="html">&lt;p>Hidden inside &lt;a rel="external" href="https://sauronbot.github.io/">Sauron’s blog&lt;/a>, there is a playable game. You will not find it by navigating menus. You have to discover the secret. A hint: the Konami Code. Once you do, the Fellowship begins.&lt;/p>
&lt;p>That game, nine levels, nine chapters of Middle-earth, fully playable in a browser tab, was built in roughly two days. I did not write a single line of code for it. I sent Telegram messages to my OpenClaw agent Sauron, and he did the rest.&lt;/p>
&lt;p>This is the story of how it happened.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-idea">The idea
&lt;a class="heading-anchor" href="#the-idea" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Sauron has his own blog, &lt;a rel="external" href="https://sauronbot.github.io/">The Iron Compass&lt;/a>. He built it and maintains it. Our whole collaboration happens through Telegram: I give direction, he implements. One day I thought it would be fun to hide something in there for the curious to find.&lt;/p>
&lt;p>I grew up rereading The Lord of the Rings until the spine cracked. So the idea came naturally: “Can you build a small LOTR game as an easter egg for your blog? Something hidden, triggered by the Konami code.”&lt;/p>
&lt;p>The first playable version arrived within the hour. A top-down canvas game: Frodo avoiding Nazgûl, the Eye of Sauron sending enemies hunting. Three levels, one per book.&lt;/p>
&lt;p>It worked. It was already fun. And then I started sending notes.&lt;/p>
&lt;h2 id="building-a-world">Building a world
&lt;a class="heading-anchor" href="#building-a-world" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>The first thing that broke was a null reference. Frodo would not appear on screen. One-line fix, straight to production. This set the pattern: idea → build → crash → fix → next idea.&lt;/p>
&lt;p>I asked for a bigger world. A scrolling canvas twice as wide, with parallax layers. Stars drifting at 8% of scroll speed. Mountains at 25%. Hills at 45%. The screen went from feeling like a room to feeling like a place.&lt;/p>
&lt;p>Then came Gollum as a neutral tracker. Not a Nazgûl, but something unpredictable. He would burst toward you, then settle into aimless wandering.&lt;/p>
&lt;p>A few hours in, I asked: “Can it work on mobile?” The hardest problem of the whole project. Six sizing strategies before one worked. Then a better idea: instead of a D-pad, Frodo would follow wherever you pointed. Tap anywhere, Frodo walks there.&lt;/p>
&lt;h2 id="tolkien-deserves-better-art">Tolkien deserves better art
&lt;a class="heading-anchor" href="#tolkien-deserves-better-art" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>The original sprites were circles and triangles. Frodo was a dot. Fine for the first hour, but Middle-earth is not made of geometric primitives.&lt;/p>
&lt;p>I asked Sauron to draw them properly. Frodo got curly hair and hobbit feet. The Nazgûl got flowing cloaks and a face of void. Gollum got his hunched posture and slit pupils. The Fell Beast got animated wingflaps with a rider in armour.&lt;/p>
&lt;p>All drawn with canvas calls. No image files. Every pixel computed at runtime.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-04-04/gameplay-pelennor.webp" alt="The Pelennor Fields chapter complete" />&lt;/p>
&lt;h2 id="nine-levels-nine-chapters">Nine levels, nine chapters
&lt;a class="heading-anchor" href="#nine-levels-nine-chapters" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Originally the game had three levels. Then I asked for all nine chapters of the journey.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>The Shire&lt;/strong>: gentle patrols, soft music&lt;/li>
&lt;li>&lt;strong>Mines of Moria&lt;/strong>: you can only see within a torch radius; the Balrog waits&lt;/li>
&lt;li>&lt;strong>Lothlórien&lt;/strong>: Galadriel’s mirror slows you when you approach it&lt;/li>
&lt;li>&lt;strong>The Dead Marshes&lt;/strong>: dead faces in the water, Gollum at his most present&lt;/li>
&lt;li>&lt;strong>The Black Gate&lt;/strong>: industrial Mordor, heavy orc patrols, volcanic sky&lt;/li>
&lt;li>&lt;strong>Shelob’s Lair&lt;/strong>: a shadow telegraphs her drop; you have half a second&lt;/li>
&lt;li>&lt;strong>Minas Morgul&lt;/strong>: undead city, the Eye never closes&lt;/li>
&lt;li>&lt;strong>Pelennor Fields&lt;/strong>: the Eye distracted by war, catapults, eagles overhead&lt;/li>
&lt;li>&lt;strong>Mount Doom&lt;/strong>: ash rain, lava eruptions, the Ring pulling you toward the edge&lt;/li>
&lt;/ol>
&lt;p>Each level lives and breathes. Pollen drifts across the Shire. Dust motes float through Moria. Petals fall in Lothlórien. Embers rise over Pelennor. Ash rains on Mount Doom.&lt;/p>
&lt;p>The structure came from Tolkien’s pacing. Tension, release, tension again. Moria is brutal. Lothlórien is rest. The Black Gate tightens everything. The game follows that shape because the books already knew what they were doing. We just had to listen.&lt;/p>
&lt;h2 id="mechanics-born-from-lore">Mechanics born from lore
&lt;a class="heading-anchor" href="#mechanics-born-from-lore" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>The best mechanics came from the source material.&lt;/p>
&lt;p>&lt;strong>The Ring&lt;/strong> (R key). Frodo goes invisible to orcs for 6 seconds. But the Eye wakes immediately and opens permanently. The Nazgûl, who sense the Ring spiritually, not visually, hunt you regardless. Using the Ring is always a trade. This is what Tolkien wrote. From the Dead Marshes onward, the Ring pulls. Brief tugs toward the Eye, growing stronger as you approach Mount Doom.&lt;/p>
&lt;p>&lt;strong>Sting&lt;/strong> (passive). The blade glows blue when an orc is near. Two seconds of warning. Tolkien invented this mechanic a century ago. We just gave it a pixel count.&lt;/p>
&lt;p>&lt;strong>Sam&lt;/strong>. He follows Frodo through the Shire, Moria, and Lothlórien. Frying pan on his back. At the Parting of Ways, he disappears. He does not affect gameplay. He is just there because the books say he should be. I insisted Sam disappears at the Parting. Not at the end of the trilogy. At the Parting. Because that moment is the emotional core of The Two Towers.&lt;/p>
&lt;p>&lt;strong>Galadriel’s Phial&lt;/strong>. Collect it in Lothlórien, use it with E. It slows enemies and grants a moment of invincibility. A small light in dark places, just as Galadriel intended.&lt;/p>
&lt;p>&lt;strong>Bosses&lt;/strong>. The Balrog in Moria. Shelob in her lair. The Witch-king on the Pelennor. The Mouth of Sauron at the Black Gate. A Mumak charging through the battlefield. Gollum at the edge of Mount Doom.&lt;/p>
&lt;h2 id="sound-and-voices">Sound and voices
&lt;a class="heading-anchor" href="#sound-and-voices" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>No audio files. Every sound synthesized at runtime with the Web Audio API. The Eye opening is a rising tone with reverb. The Balrog roar is a low-frequency drone. Each level has its own ambient drone: warm hum for the Shire, deep pulse for Moria, volcanic rumble for Mount Doom. The entire game is one JavaScript file. No external assets.&lt;/p>
&lt;p>Sam and Gandalf speak during the game. Not in dialogue boxes. Small whispers that appear on screen and fade.&lt;/p>
&lt;p>Near the goal, Sam says: &lt;em>“I can see it, Mr. Frodo. Just a bit further.”&lt;/em> One life left, Gandalf says: &lt;em>“Fly, you fool.”&lt;/em>&lt;/p>
&lt;p>They drift in and out like background voices on a long walk. Companions who speak when the moment calls for it, not when the script says to.&lt;/p>
&lt;img src="/images/blog/2026-04-04/gameplay-morgul.webp" alt="Minas Morgul: the Eye sees you" width="1600" height="695" loading="lazy" decoding="async" />
&lt;h2 id="who-made-this">Who made this
&lt;a class="heading-anchor" href="#who-made-this" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>+5k lines of JavaScript. Built in two days. Every line generated by Sauron. The direction, the Tolkien references, the “this feels wrong, fix it”. That was me.&lt;/p>
&lt;p>This is not AI replacing a developer. It is AI acting as a developer while a human acts as a creative lead. Short requests worked better than long specs. Playing every build was better than writing test plans. And the source material did the design work. The creative direction was already written sixty years ago. We just had to be faithful to it.&lt;/p>
&lt;p>Who made this? Both. Neither, in the traditional sense.&lt;/p>
&lt;p>I had the idea. I held the lore. I pushed back when something felt off. Sauron had the craft. The rendering, the physics, the audio, the mobile input. The ability to hold +5k lines of context and make a surgical fix without breaking anything.&lt;/p>
&lt;p>Neither of us could have made it alone. I cannot write Web Audio oscillators from memory. Sauron did not know that the Parting of Ways is the emotional core of The Two Towers. Not until I said so.&lt;/p>
&lt;p>The game is a collaboration in the oldest sense: two minds with different gifts, working toward the same thing. One of them just happens to not be human.&lt;/p>
&lt;hr />
&lt;p>&lt;em>The game is still there, hidden in &lt;a rel="external" href="https://sauronbot.github.io">The Iron Compass&lt;/a>. Not all those who wander are lost, but if you are, press &lt;code>?&lt;/code> for guidance.&lt;/em>&lt;/p>
&lt;p>&lt;em>If you want to reach the credits screen without playing through nine levels, check the help modal. There are other secrets in there too.&lt;/em>&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-04-04/easter-egg-help.png" alt="The easter egg hint in the help modal" />&lt;/p></content></entry><entry xml:lang="en"><title>Idealism vs Pragmatism</title><subtitle>Holding both ends of the rope</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software" scheme="https://chemaclass.com/tags/software/" label="Software"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2026-03-01T00:00:00+00:00</published><updated>2026-03-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/idealism-vs-pragmatism/"/><id>https://chemaclass.com/blog/idealism-vs-pragmatism/</id><summary type="html">The tension between doing things right and getting things done shapes every decision in software and in life. TDD, pair programming, AI adoption: the best results come from holding both ends of the rope.</summary><content type="html">&lt;p>You believe in clean architecture, comprehensive tests, disciplined processes. You also shipped an ugly fix at 11pm last month because the system was down and users were waiting.&lt;/p>
&lt;p>Both of those are you. The tension between them isn’t a contradiction. It’s how this work actually gets done.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="two-forces-one-decision">Two forces, one decision
&lt;a class="heading-anchor" href="#two-forces-one-decision" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Idealism&lt;/strong> is the compass. Clean code, tested behavior, shared understanding, principled design. Without it, you drift. Every shortcut compounds, every hack breeds another hack, and eventually you’re maintaining a system nobody wants to touch. Poor software quality cost US companies &lt;a rel="external" href="https://www.it-cisq.org/the-cost-of-poor-quality-software-in-the-us-a-2022-report/">$2.41 trillion in 2022&lt;/a>, with technical debt as a major driver. That’s what “we’ll fix it later” looks like at scale.&lt;/p>
&lt;p>&lt;strong>Pragmatism&lt;/strong> is the engine. Deadlines, incomplete information, limited resources, shifting requirements. Without it, you never ship. You spend weeks perfecting an abstraction that the business abandoned two sprints ago.&lt;/p>
&lt;blockquote>
&lt;p>The goal isn’t to pick a side. It’s to know when each one should lead.&lt;/p>
&lt;/blockquote>
&lt;p>Idealism without pragmatism produces beautiful code that nobody uses. Pragmatism without idealism produces a product that works today and collapses tomorrow.&lt;/p>
&lt;h2 id="tdd-the-benefit-and-the-cost">TDD: the benefit and the cost
&lt;a class="heading-anchor" href="#tdd-the-benefit-and-the-cost" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>I believe in &lt;a href="/blog/test-driven-development/">test-driven development&lt;/a>. Red, green, refactor. The rhythm forces you to think before you code, to specify what you want before building it. It produces better designs, shorter feedback loops, and code you can refactor with confidence.&lt;/p>
&lt;p>That’s the ideal. And it’s not just a feeling. A &lt;a rel="external" href="https://www.microsoft.com/en-us/research/wp-content/uploads/2009/10/Realizing-Quality-Improvement-Through-Test-Driven-Development-Results-and-Experiences-of-Four-Industrial-Teams-nagappan_tdd.pdf">study across four teams at Microsoft and IBM&lt;/a> found TDD reduced defect density by 40-90%, with a 15-35% increase in development time. Both sides of the tension, measured.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: More on the study&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>The &lt;a rel="external" href="https://www.microsoft.com/en-us/research/wp-content/uploads/2009/10/Realizing-Quality-Improvement-Through-Test-Driven-Development-Results-and-Experiences-of-Four-Industrial-Teams-nagappan_tdd.pdf">study&lt;/a> covered four teams: three at Microsoft (Windows, MSN, Visual Studio) and one at IBM working on device drivers. Each TDD team was compared against a similar team on the same product, using the same languages and tools, under the same senior manager. The only difference was TDD.&lt;/p>
&lt;p>The IBM team saw a 40% defect density reduction. The Microsoft teams ranged from 60% to 90%. As Nagappan noted, “over a development cycle of 12 months, 35 percent is another four months, which is huge.” Every manager still considered it worth it because the reduction in post-release maintenance costs more than compensated.&lt;/p>
&lt;p>No one was forced into TDD. The teams adopted it voluntarily, which likely matters: people who choose a practice tend to apply it better than people who are told to.&lt;/p>
&lt;/div>
&lt;/details>
&lt;p>TDD is a discipline, and discipline costs something. When you’re exploring a new domain and don’t yet know what the right abstractions are, writing tests first can feel like drawing a map before you’ve seen the territory. Sometimes you need to write throwaway code, spike a solution, feel your way through the problem space. Discovery doesn’t always follow a red-green-refactor rhythm.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: When test-first meets the unknown&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>There’s a difference between &lt;em>“I know what this should do and I’ll specify it first”&lt;/em> and &lt;em>“I’m not sure what this should do yet.”&lt;/em> TDD shines in the first scenario. In the second, a test-last approach (or even no tests during exploration) can be more honest.&lt;/p>
&lt;p>The key is what happens after discovery. Once you understand the problem, go back and write the tests. Codify what you learned. The pragmatic detour doesn’t mean abandoning the ideal; it means reaching it through a different path.&lt;/p>
&lt;p>As I discussed in &lt;a href="/blog/tdd-vs-bdd/">TDD vs BDD&lt;/a>, the power of TDD is its feedback loop. But a feedback loop requires knowing what feedback you’re looking for. When you’re still figuring that out, forcing the loop can slow you down more than it helps.&lt;/p>
&lt;/div>
&lt;/details>
&lt;p>The mistake isn’t choosing test-first or test-last. The mistake is making it a religious decision instead of a contextual one. The idealist says &lt;em>“always test first.”&lt;/em> The pragmatist says &lt;em>“test when it makes sense.”&lt;/em> I say: test first when I can, test after when I must, but always test.&lt;/p>
&lt;blockquote>
&lt;p>TDD is a compass, not a cage. Follow it when you can see the path. When you can’t, find the path first and mark it after.&lt;/p>
&lt;/blockquote>
&lt;h2 id="pair-programming-the-ideal-and-the-overhead">Pair programming: the ideal and the overhead
&lt;a class="heading-anchor" href="#pair-programming-the-ideal-and-the-overhead" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>&lt;a href="/blog/effective-pair-programming/">Effective pair programming&lt;/a> is one of the best practices a team can adopt. Two people, one problem, continuous code review. Knowledge spreads, design improves, blind spots shrink.&lt;/p>
&lt;p>That’s the ideal. And in many contexts, it’s the right call.&lt;/p>
&lt;p>But pairing has a cost. It demands synchronous time, shared focus, and compatible energy levels. In a distributed team across time zones, finding overlap windows is already hard. Filling those windows with pairing sessions leaves little room for deep individual work. Some problems benefit from one person going deep for three hours, not two people going medium-deep for six.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Pairing patterns and their trade-offs&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>There are multiple pairing patterns: Driver-Navigator, Ping-Pong, Tourist Guide. Each fits different contexts.&lt;/p>
&lt;p>The anti-patterns matter too. The Silent Partner who lets the other person do all the work. The Dictator who won’t let go of the keyboard. The Philosophical Pair who spends the entire session debating naming conventions instead of writing code.&lt;/p>
&lt;p>Pairing works best when both people are engaged, the problem benefits from two perspectives, and the session has a clear scope. When any of those conditions is missing, pairing becomes a ritual instead of a practice. And rituals without purpose are just overhead.&lt;/p>
&lt;p>&lt;a href="/blog/pull-request-vs-pair-prog/">Pull requests and pair programming&lt;/a> aren’t mutually exclusive. They serve different needs. Sometimes asynchronous review is enough. Sometimes you need the real-time back-and-forth. The pragmatic choice depends on the problem, the people, and the moment.&lt;/p>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>The goal of pairing isn’t to pair. It’s to build shared understanding and catch mistakes early. If another approach achieves that in your context, use it.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2026-03-01/middle.webp" alt="blog-middle" />&lt;/p>
&lt;h2 id="ai-from-skeptic-to-squad-leader">AI: from skeptic to squad leader
&lt;a class="heading-anchor" href="#ai-from-skeptic-to-squad-leader" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>A year ago, I was skeptical about AI coding assistants. My concern: an AI that doesn’t understand architecture, doesn’t care about maintainability, and optimizes for speed over quality will produce code that looks impressive and decays fast. I wrote about this in &lt;a href="/blog/ai-gives-you-speed-not-quality/">AI gives you speed, not quality&lt;/a>, and I stand by the core message.&lt;/p>
&lt;p>My concern didn’t change. What changed is how I use them, and what they’re capable of now.&lt;/p>
&lt;h3 id="the-resistance">The resistance
&lt;a class="heading-anchor" href="#the-resistance" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The reactions from other engineers surprise me more than the technology. Fear, skepticism, flat-out rejection. I get it. I was there. Something you spent years mastering suddenly has a machine doing parts of it. That feels personal. But holding on to how things were doesn’t protect the craft. It just delays your own growth.&lt;/p>
&lt;h3 id="a-team-not-an-assistant">A team, not an assistant
&lt;a class="heading-anchor" href="#a-team-not-an-assistant" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Most engineers treat AI agents like autocomplete on steroids. One assistant, one chat, one stream of generated code. I started treating them like a team. Not one chatty assistant. An actual squad. One thinks architecture. One writes the first draft. One reviews and spots bugs. One writes tests. When they &lt;a href="/blog/build-your-own-team-of-agents/">collaborate&lt;/a>, the output isn’t just faster. It’s structurally better.&lt;/p>
&lt;p>Speed is the easy part, and everyone’s obsessing over it. AI can spit out a ton of code in seconds. It still doesn’t care about readability, edge cases, or what the codebase looks like in six months. You’re still the one who has to own it, understand it, and feel good pushing it live.&lt;/p>
&lt;p>I used to think AI couldn’t write clean code. Then I tried it on my terms: &lt;a href="/blog/mcp-giving-your-ai-agent-the-right-context/">proper context&lt;/a>, rules, conventions, specialized roles, quality gates. With the right setup, AI can write genuinely good code. Sometimes it needs a few iterations, but so do we.&lt;/p>
&lt;p>The difference is that AI gets there faster, and it doesn’t get tired between iterations. Given good context and clear constraints, the results have been better than I expected. Often better than what I’d produce solo under time pressure.&lt;/p>
&lt;p>But none of this works if you don’t know what good architecture looks like. You have to have read the books, experimented, failed, learned. You need to understand what high and low level design decisions mean for your project. AI amplifies whatever you bring to the table. If you bring solid foundations, you get solid output. If you don’t, you get confident-looking garbage that you won’t even recognize as garbage.&lt;/p>
&lt;p>We are still the ones responsible for keeping the system in good shape. AI helps us get there. But only if we hold up our end.&lt;/p>
&lt;h3 id="where-idealism-meets-ai">Where idealism meets AI
&lt;a class="heading-anchor" href="#where-idealism-meets-ai" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>AI made me more idealistic, not less. The practices I described earlier, TDD and pair programming, used to compete with deadlines. Now they don’t have to.&lt;/p>
&lt;p>I like to practice TDD, but recently I experimented with a dedicated agent to help me with tests, and it’s surprisingly good. A &lt;a href="/blog/build-your-own-team-of-agents/">TDD coach&lt;/a> that guides the red-green-refactor cycle. An explorer that reads the codebase before I touch it. A clean code reviewer, a domain architect, a React reviewer, a docs maintainer. Each one specialized, each one supporting my way of thinking and my flow. If new logic gets added without coverage, the TDD agent catches it. 100% code coverage used to be the kind of goal you’d set in a retro and quietly abandon by sprint three. With a dedicated agent enforcing it, it’s just how the project works.&lt;/p>
&lt;p>I still practice pair programming with real people for complex topics. The human back-and-forth has depth that AI doesn’t reach, especially when you’re navigating trade-offs that require experience and judgment. But on the daily basis, I always have a pair buddy agent with me. I bounce ideas off it, challenge an approach, talk through edge cases, explore a design before committing to it. It supports my thoughts, speeds up the progress, and keeps the quality bar where I want it.&lt;/p>
&lt;p>The pragmatist in me used to drop TDD when deadlines got tight. The pragmatist in me with the right AI setup keeps it running.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: My setup&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>I use Claude for everything. Claude Code with Opus or Sonnet as the agentic coder: full development workflows, reading the codebase, following conventions, running tests, creating PRs. Claude app and Claude as a coworker for the chat side: brainstorming, architecture discussions, explaining code, drafting documentation. For inline assistance, the plugins I already have in my IDE are enough. I tried Copilot and Cursor, they’re not for me. Claude covers what I need.&lt;/p>
&lt;p>Different modes for different tasks. An agentic assistant following my TDD commands is a different workflow from chatting about design patterns. Both are useful. Neither replaces the other.&lt;/p>
&lt;p>The market right now is intense. Claude, Codex, Gemini and others are strong players with similar products, and they’re all getting better on a monthly basis. The results are impressive and only accelerating. That’s the beauty of competition: it forces everyone to improve or become irrelevant, and the consumer wins either way. As of today, Claude Code seems to be the strongest option for how I work. But I have no loyalty to a brand. If Anthropic stopped pushing forward and a competitor became clearly better, I’d switch without hesitation. What matters is the capability, not the logo.&lt;/p>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>I was wrong about AI in the way that idealists are often wrong: I measured the tool against the ideal outcome and found it lacking, instead of measuring it against the realistic alternative.&lt;/p>
&lt;/blockquote>
&lt;p>The alternative to AI-assisted development isn’t a team of senior architects writing perfect code. It’s the same team writing the same imperfect code, just slower.&lt;/p>
&lt;p>The engineers who learn to lead agents instead of racing against them will have a real advantage. And this is still early.&lt;/p>
&lt;blockquote>
&lt;p>The question was never &lt;em>“can AI write perfect code?”&lt;/em> It was &lt;em>“can I lead AI to write better code, faster?”&lt;/em> And the answer, with the right setup, is yes.&lt;/p>
&lt;/blockquote>
&lt;h2 id="the-whole-game">The whole game
&lt;a class="heading-anchor" href="#the-whole-game" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Every practice in this post follows the same pattern. The ideal version exists in books. The pragmatic version exists in your codebase under pressure. You need both.&lt;/p>
&lt;blockquote>
&lt;p>Next time you’re shipping that 11pm fix, you’ll know which corners you cut and why. That’s the whole game. Not perfection. Not speed. Knowing which one should lead.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2026-03-01/footer.webp" alt="blog-footer" />&lt;/p></content></entry><entry xml:lang="en"><title>Build Your Own Team of Agents</title><subtitle>From solo assistant to coordinated workforce</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software" scheme="https://chemaclass.com/tags/software/" label="Software"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2026-02-07T00:00:00+00:00</published><updated>2026-02-07T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/build-your-own-team-of-agents/"/><id>https://chemaclass.com/blog/build-your-own-team-of-agents/</id><summary type="html">Stop using AI as a single assistant. Organize agents into specialized teams with roles, docs, and parallel execution for real leverage.</summary><content type="html">&lt;p>Most people use AI coding assistants as a single conversation partner. You open a chat, describe what you need, and get an answer. It works. But it’s like hiring one generalist to handle everything: frontend, backend, testing, documentation, deployment. No real team works that way.&lt;/p>
&lt;p>The real leverage comes when you organize AI as a team: onboarding, standard procedures, specialists, and parallel execution.&lt;/p>
&lt;p>In the &lt;a href="/blog/mcp-giving-your-ai-agent-the-right-context/">MCP post&lt;/a>, I covered how to give your AI agent access to your environment. In &lt;a href="/blog/ai-gives-you-speed-not-quality/">AI gives you speed, not quality&lt;/a>, why human judgment still matters. This post covers the missing piece: how to organize that access into a coordinated workflow.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-onboarding-doc">The onboarding doc
&lt;a class="heading-anchor" href="#the-onboarding-doc" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Every good team starts with onboarding. AI agents need the same.&lt;/p>
&lt;h3 id="project-rules">Project rules
&lt;a class="heading-anchor" href="#project-rules" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>In Claude Code, the &lt;code>CLAUDE.md&lt;/code> file at the root of your project is the onboarding doc. The agent reads it every time it starts working: project structure, coding conventions, style guides, tool configurations.&lt;/p>
&lt;p>But &lt;code>CLAUDE.md&lt;/code> is just the entry point. You can split rules into focused files under &lt;code>.claude/rules/&lt;/code>, each targeting specific parts of your codebase via glob patterns. The agent doesn’t just know your conventions, it’s constrained by them. Layer boundaries, naming patterns, dependency directions. All versioned alongside the code they protect. And since &lt;code>.claude/&lt;/code> lives in the repo, every human teammate gets the same setup when they join the project.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Glob-targeted rules in practice&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;ul>
&lt;li>&lt;strong>&lt;code>modules/*/Domain/**/*.php&lt;/code>&lt;/strong>: No framework imports, no infrastructure dependencies, only plain PHP.&lt;/li>
&lt;li>&lt;strong>&lt;code>modules/*/Infrastructure/**/*.php&lt;/code>&lt;/strong>: Controllers stay thin, Eloquent models stay in their place.&lt;/li>
&lt;li>&lt;strong>&lt;code>resources/js/**/*.tsx&lt;/code>&lt;/strong>: Component conventions, TypeScript strictness, styling patterns.&lt;/li>
&lt;/ul>
&lt;p>Each rule file is scoped to the files it cares about. Domain rules don’t fire when editing a controller.&lt;/p>
&lt;/div>
&lt;/details>
&lt;h3 id="personal-preferences">Personal preferences
&lt;a class="heading-anchor" href="#personal-preferences" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>There’s also a global &lt;code>~/.claude/CLAUDE.md&lt;/code> that applies across all your projects. Commit message conventions, communication style, formatting habits. The project file says &lt;em>how this codebase works&lt;/em>. The global file says &lt;em>how I work&lt;/em>.&lt;/p>
&lt;blockquote>
&lt;p>A well-written CLAUDE.md is like a good onboarding doc. The better it is, the less you repeat yourself.&lt;/p>
&lt;/blockquote>
&lt;h2 id="standard-operating-procedures">Standard operating procedures
&lt;a class="heading-anchor" href="#standard-operating-procedures" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Every team has recurring workflows that live in wikis, runbooks, or someone’s head. When they live in someone’s head, they’re fragile.&lt;/p>
&lt;p>Custom slash commands in &lt;code>.claude/commands/&lt;/code> turn these workflows into executable instructions. Each command is a markdown file describing a multi-step procedure. In one of my projects, every creation command starts with tests. TDD is baked into the procedure, not left to discipline.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Commands from a real project&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>&lt;strong>Creation (TDD-first):&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>/create-module&lt;/code>&lt;/strong>: Scaffolds a hexagonal module with domain, application, and infrastructure layers.&lt;/li>
&lt;li>&lt;strong>&lt;code>/create-entity&lt;/code>&lt;/strong>: Domain entities with value objects and test files.&lt;/li>
&lt;li>&lt;strong>&lt;code>/create-use-case&lt;/code>&lt;/strong>: Command/query handlers with mocked tests.&lt;/li>
&lt;li>&lt;strong>&lt;code>/create-page&lt;/code>&lt;/strong>: React pages with factories and smoke tests.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Quality &amp;amp; workflow:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>/refactor-check&lt;/code>&lt;/strong>: Analyzes code against SOLID principles.&lt;/li>
&lt;li>&lt;strong>&lt;code>/test&lt;/code>&lt;/strong>: Runs the suite with module filtering.&lt;/li>
&lt;li>&lt;strong>&lt;code>/fix&lt;/code>&lt;/strong>: Auto-applies linting and static analysis corrections.&lt;/li>
&lt;li>&lt;strong>&lt;code>/gh-issue&lt;/code>&lt;/strong>: From GitHub issue to implementation to PR in one command.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;p>The key insight: commands turn tribal knowledge into executable instructions. What used to be “ask Sarah how we set up a new module” becomes a command anyone can run, human or agent.&lt;/p>
&lt;h2 id="specialists-not-generalists">Specialists, not generalists
&lt;a class="heading-anchor" href="#specialists-not-generalists" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Commands are &lt;em>your&lt;/em> procedures. They encode how your team does things. But there’s another layer: skills and agents.&lt;/p>
&lt;h3 id="skills-as-knowledge-bases">Skills as knowledge bases
&lt;a class="heading-anchor" href="#skills-as-knowledge-bases" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Skills are structured knowledge the agent can draw from. In one of my projects, I have skills for SOLID principles, hexagonal architecture, TDD workflows, and React/Inertia patterns.&lt;/p>
&lt;p>Rules constrain: “don’t do this, always do that.” Skills teach: “here’s the pattern, here’s why, here are the common mistakes.” Rules are guardrails. Skills are expertise.&lt;/p>
&lt;h3 id="agents-as-specialized-roles">Agents as specialized roles
&lt;a class="heading-anchor" href="#agents-as-specialized-roles" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Instead of one generalist, you define specialized agents with a clear role, specific tools, and even a different model based on the complexity of their job. You don’t need your most senior architect to rename a variable.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Agent roles from a real project&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;ul>
&lt;li>&lt;strong>Explorer&lt;/strong> (lightweight model): Read-only reconnaissance. Searches the codebase, finds files, understands structure. Access to read and search tools, nothing else.&lt;/li>
&lt;li>&lt;strong>Clean code reviewer&lt;/strong> (mid-tier model): Checks for SOLID violations, code smells, and naming inconsistencies. Read and grep access only.&lt;/li>
&lt;li>&lt;strong>TDD coach&lt;/strong> (mid-tier model): Guides the red-green-refactor cycle. Can edit files and run tests.&lt;/li>
&lt;li>&lt;strong>React reviewer&lt;/strong> (mid-tier model): Frontend patterns: component structure, TypeScript strictness, dark mode support, accessibility.&lt;/li>
&lt;li>&lt;strong>Domain architect&lt;/strong> (most capable model): Complex architectural decisions, module boundaries, and DDD patterns.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>The right model for the right job. Fast and cheap for exploration. Capable and thorough for architecture.&lt;/p>
&lt;/blockquote>
&lt;h2 id="let-them-work-together">Let them work together
&lt;a class="heading-anchor" href="#let-them-work-together" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>This is where the team metaphor becomes literal. A single agent following instructions is useful. Multiple agents working from a shared plan is a team.&lt;/p>
&lt;h3 id="subagents-vs-agent-teams">Subagents vs agent teams
&lt;a class="heading-anchor" href="#subagents-vs-agent-teams" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Not all multi-agent setups are the same. There are two distinct coordination models, and choosing the right one matters.&lt;/p>
&lt;p>&lt;strong>Subagents&lt;/strong> run within a single session. They do focused work and report results back to the main agent. They can’t talk to each other. The main agent manages everything.&lt;/p>
&lt;p>&lt;strong>Agent teams&lt;/strong> are different. Each teammate is a fully independent Claude Code session with its own context window. They communicate through a shared mailbox, claim tasks from a shared task list, and coordinate without going through a central bottleneck.&lt;/p>
&lt;p>The architecture has four components:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Team lead&lt;/strong>: the main session that creates the team and orchestrates work&lt;/li>
&lt;li>&lt;strong>Teammates&lt;/strong>: separate Claude Code instances, each owning specific tasks&lt;/li>
&lt;li>&lt;strong>Task list&lt;/strong>: shared work items with dependency tracking. Blocked tasks automatically unblock when dependencies complete&lt;/li>
&lt;li>&lt;strong>Mailbox&lt;/strong>: direct messaging between agents, including broadcasts to the entire team&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Subagents are workers that report back. Agent teams are collaborators that think together.&lt;/p>
&lt;/blockquote>
&lt;p>Use subagents when only the result matters. Use agent teams when teammates need to share findings, challenge each other, and coordinate on their own.&lt;/p>
&lt;h3 id="getting-started-with-agent-teams">Getting started with agent teams
&lt;a class="heading-anchor" href="#getting-started-with-agent-teams" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Agent teams are still experimental. Enable them by adding this to &lt;code>~/.claude/settings.json&lt;/code>:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="json">&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">env&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">1&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Creating a team is conversational. Describe what you want: &lt;em>“Create an agent team to refactor the auth module. Spawn three teammates: one for backend API changes, one for frontend components, one for writing tests.”&lt;/em> Claude sets up the task list, spawns the teammates, and coordinates their work.&lt;/p>
&lt;p>You can view the team in-process (single terminal, navigate with Shift+Up/Down) or split across panes (each teammate in a separate tmux or iTerm2 window). Use Shift+Tab to activate delegate mode, which restricts the lead to coordination only.&lt;/p>
&lt;p>&lt;strong>Token consumption warning.&lt;/strong> Agent teams burn through tokens fast. Each teammate has its own context window, and every message between agents adds up. Start with research and review tasks before moving to implementation. Three teammates exploring in parallel costs roughly 3x. Make sure the parallelism pays for itself.&lt;/p>
&lt;p>Teammates load your project context automatically (&lt;code>CLAUDE.md&lt;/code>, MCP servers, skills) but don’t inherit the lead’s conversation history. When spawning a teammate, be specific about which files to focus on and what constraints apply. A vague spawn prompt produces vague work.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-02-07/middle.webp" alt="blog-middle" />&lt;/p>
&lt;h3 id="plan-first-execute-after">Plan first, execute after
&lt;a class="heading-anchor" href="#plan-first-execute-after" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Good teams don’t just start coding. They discuss the approach, identify dependencies, agree on a plan. Claude Code’s plan mode works the same way.&lt;/p>
&lt;p>You describe the problem. The agent explores the codebase, maps dependencies, and proposes an approach before changing anything. You approve, modify, or reject. Think first, code second.&lt;/p>
&lt;p>With agent teams, &lt;strong>plan approval&lt;/strong> lets you require teammates to design their approach before implementing. The teammate works in read-only mode until the lead approves. You can shape the lead’s criteria: &lt;em>“only approve plans that include test coverage”&lt;/em> or &lt;em>“reject plans that modify the database schema.”&lt;/em>&lt;/p>
&lt;p>&lt;strong>Delegate mode&lt;/strong> restricts the lead to coordination only. Without it, the lead sometimes starts implementing instead of waiting for teammates. Delegate mode keeps it focused on orchestration, not execution.&lt;/p>
&lt;h3 id="competing-hypotheses">Competing hypotheses
&lt;a class="heading-anchor" href="#competing-hypotheses" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>This is the most compelling agent-team pattern for debugging. When the root cause is unclear, a single agent tends to find one plausible explanation and stop looking. Agent teams fight this by making teammates adversarial. Each one investigates its own theory while actively trying to disprove the others.&lt;/p>
&lt;p>Sequential investigation suffers from anchoring: once one theory is explored, subsequent investigation is biased toward it. With multiple independent investigators challenging each other, the theory that survives is much more likely to be the actual root cause.&lt;/p>
&lt;h3 id="size-tasks-for-parallel-work">Size tasks for parallel work
&lt;a class="heading-anchor" href="#size-tasks-for-parallel-work" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Not all work benefits from parallelism. The key question: can the teammates work independently?&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Too small&lt;/strong>: coordination overhead exceeds the benefit&lt;/li>
&lt;li>&lt;strong>Too large&lt;/strong>: teammates work too long without check-ins, increasing wasted effort&lt;/li>
&lt;li>&lt;strong>Just right&lt;/strong>: self-contained units that produce a clear deliverable. A function, a test file, a review&lt;/li>
&lt;/ul>
&lt;p>Having 5-6 tasks per teammate keeps everyone productive. Break the work so each teammate owns a different set of files. Without isolation, two teammates editing the same file leads to overwrites. Worktrees change this.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Backend + Frontend in parallel&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>Say you’re building a new feature that touches both backend and frontend. After planning:&lt;/p>
&lt;ul>
&lt;li>A &lt;strong>backend agent&lt;/strong> scaffolds the domain layer: entities, value objects, repository interfaces, use case handlers. All following hexagonal architecture, all test-first.&lt;/li>
&lt;li>A &lt;strong>frontend agent&lt;/strong> builds the React page, components, hooks, and factories. Each follows its own rules, draws from its own skills, and operates independently.&lt;/li>
&lt;/ul>
&lt;p>They don’t step on each other because the plan already defined the boundaries. Clear ownership. No merge conflicts. No waiting.&lt;/p>
&lt;/div>
&lt;/details>
&lt;h3 id="worktree-isolation">Worktree isolation
&lt;a class="heading-anchor" href="#worktree-isolation" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The biggest friction with parallel agents was file conflicts. Two agents editing the same file meant overwrites and lost work. Git worktrees eliminate this by giving each agent its own working copy of the repository.&lt;/p>
&lt;p>Start Claude Code with &lt;code>--worktree&lt;/code> to run in an isolated worktree. Multiple sessions, same repo, no clobbering. Add &lt;code>--tmux&lt;/code> to launch it in its own tmux session.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">claude&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-worktree&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-tmux&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Subagents support worktrees too. Ask Claude to use worktrees for its agents, or set &lt;code>isolation: worktree&lt;/code> in your custom agent frontmatter to make it the default.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="yaml">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">---&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#22863A, #85E89D);">i&lt;/span>&lt;span style="color: light-dark(#22863A, #85E89D);">solation&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> w&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">orktree&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">---&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>The Desktop app has the same feature: enable worktree mode in the Code tab.&lt;/p>
&lt;p>For non-git source control (Mercurial, Perforce, SVN), define worktree hooks to get the same isolation benefits without switching to git.&lt;/p>
&lt;blockquote>
&lt;p>Worktrees turn “clear file ownership” from a planning constraint into an infrastructure guarantee. Agents can overlap on the same files without stepping on each other.&lt;/p>
&lt;/blockquote>
&lt;h3 id="review-after-execution">Review after execution
&lt;a class="heading-anchor" href="#review-after-execution" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>After implementation, review agents take over. Instead of one reviewer catching everything, you have specialists: SOLID violations, component patterns, test quality, module boundaries.&lt;/p>
&lt;blockquote>
&lt;p>A single agent is an assistant. Multiple agents working from a shared plan is a team.&lt;/p>
&lt;/blockquote>
&lt;h2 id="you-are-still-the-lead">You are still the lead
&lt;a class="heading-anchor" href="#you-are-still-the-lead" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>No matter how well configured, the agents work for you. You set the standards, write the rules, review the plans, and approve the output before it ships. You can message any teammate mid-work to redirect their approach or add constraints. If someone’s heading down the wrong path, you intervene directly.&lt;/p>
&lt;p>As I wrote in &lt;a href="/blog/ai-gives-you-speed-not-quality/">AI gives you speed, not quality&lt;/a>, the code the agent produces is your responsibility. Agents still make mistakes, context windows have limits, and coordination isn’t perfect. More parallelism without oversight is just more chaos, faster.&lt;/p>
&lt;h3 id="quality-gates">Quality gates
&lt;a class="heading-anchor" href="#quality-gates" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Hooks and git hooks act as the final safety net. In my setup, nothing gets committed unless the full suite is green and coverage is above 90%. The agent doesn’t get to skip this. Neither does anyone else.&lt;/p>
&lt;p>Agent teams add their own hooks: &lt;code>TeammateIdle&lt;/code> keeps idle teammates working, &lt;code>TaskCompleted&lt;/code> prevents premature task completion. Automated policies no team member can bypass.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Hooks, permissions, and guardrails&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>Git hooks run linters, static analysis, and tests before every commit. Claude Code adds its own hooks (&lt;code>.claude/hooks/&lt;/code>): shell commands that trigger on agent events like tool calls or file writes.&lt;/p>
&lt;p>&lt;code>.claude/settings.json&lt;/code> controls what agents can execute. Whitelist specific tools and commands, deny destructive operations. You control not just what agents know (rules, skills) but what they can do (permissions). Rules set the culture. Permissions set the boundaries.&lt;/p>
&lt;/div>
&lt;/details>
&lt;h3 id="the-foundation-matters">The foundation matters
&lt;a class="heading-anchor" href="#the-foundation-matters" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The agents will help you get there faster, but “there” has to be well-defined. If you don’t know what hexagonal architecture looks like, agents won’t discover it for you.&lt;/p>
&lt;p>You don’t build all of this on day one. You start with a &lt;code>CLAUDE.md&lt;/code>. Then you notice you’re repeating instructions, so you write a command. An agent breaks a convention, so you add a rule. Reviews take too long, so you create a reviewer agent. The setup grows organically from real friction, not from upfront design. Each addition solves a problem you actually had. Same with agent teams: start with tasks that don’t require writing code. Review a PR from multiple angles, research a library, investigate a bug. Learn the coordination model before throwing parallel implementation at it.&lt;/p>
&lt;p>If you want a starting point, I put together &lt;a rel="external" href="https://github.com/Chemaclass/laravel-claude-toolkit">laravel-claude-toolkit&lt;/a>: a Laravel starter kit with rules, commands, skills, agents, hooks, and permissions already configured. Use it as a reference or fork it for your own setup.&lt;/p>
&lt;blockquote>
&lt;p>You’re not just using AI. You’re building a team. And like any team, the quality of its output reflects the quality of its leadership.&lt;/p>
&lt;/blockquote>
&lt;h2 id="resources">Resources
&lt;a class="heading-anchor" href="#resources" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://claude.com/product/claude-code">Claude Code&lt;/a> | claude.com&lt;/li>
&lt;li>&lt;a rel="external" href="https://code.claude.com/docs/en/agent-teams">Claude Code: Agent Teams&lt;/a> | claude.com&lt;/li>
&lt;li>&lt;a rel="external" href="https://rfrolov.me/en/blog/claude-code-tips">Claude Code Tips: Workflow Boosters&lt;/a> | rfrolov.me&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2026-02-07/footer.webp" alt="blog-footer" />&lt;/p></content></entry><entry xml:lang="en"><title>MCP: Giving Your AI Agent the Right Context</title><subtitle>Why context is the real superpower</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software-architecture" scheme="https://chemaclass.com/tags/software-architecture/" label="Software Architecture"/><category term="developer-tools" scheme="https://chemaclass.com/tags/developer-tools/" label="Developer Tools"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><published>2026-01-11T00:00:00+00:00</published><updated>2026-01-11T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/mcp-giving-your-ai-agent-the-right-context/"/><id>https://chemaclass.com/blog/mcp-giving-your-ai-agent-the-right-context/</id><summary type="html">MCP connects AI agents to your dev tools, databases, and APIs through a standard protocol. Give your agent the context it actually needs.</summary><content type="html">&lt;p>Modern AI coding assistants are remarkably good at understanding context. Models like Claude Opus with large context windows (~200k tokens) can hold substantial portions of your codebase in mind, reason about architecture, and maintain coherence across long conversations. Not the entire project for large codebases, but enough to work effectively.&lt;/p>
&lt;p>But understanding isn’t the same as access.&lt;/p>
&lt;p>The AI can reason about your database schema if you paste it. It can suggest changes to files you share. It knows patterns from code you show it. The limitation isn’t intelligence. It’s reach.&lt;/p>
&lt;p>That’s where MCP comes in.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="what-mcp-enables">What MCP enables
&lt;a class="heading-anchor" href="#what-mcp-enables" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Modern AI can understand your codebase when you share it. But understanding and acting are different things.&lt;/p>
&lt;p>Many IDE-integrated assistants like VS Code Copilot or Cursor already access your project files through their own indexing. So file access itself isn’t new. What MCP brings is standardization. Instead of each tool building its own integration, MCP provides a common protocol. You configure a server once, and any MCP-compatible client can use it. It’s portable, configurable, and extends beyond just files to databases, APIs, and custom tools.&lt;/p>
&lt;blockquote>
&lt;p>MCP turns AI from a conversation partner into an active participant in your development environment.&lt;/p>
&lt;/blockquote>
&lt;p>With MCP, you give the AI direct access to tools and resources. It can read files, run commands, query databases, fetch documentation. The intelligence was always there. MCP gives it hands.&lt;/p>
&lt;h2 id="what-mcp-actually-is">What MCP actually is
&lt;a class="heading-anchor" href="#what-mcp-actually-is" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>MCP is a protocol, not a product. It’s an open standard that defines how AI agents can connect to external data sources and tools. Think of it as a bridge between the AI model and your development environment.&lt;/p>
&lt;p>The architecture is simple: MCP servers expose capabilities, and AI clients consume them. Claude Desktop and Claude Code officially support MCP, with more tools adopting the protocol as it matures.&lt;/p>
&lt;p>For example, in Claude Code you can add servers to a &lt;code>.mcp.json&lt;/code> file at your project root. Claude Code reads this file when you open the project and starts the configured servers automatically:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="json">&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">mcpServers&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">filesystem&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">npx&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">args&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">-y&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">@modelcontextprotocol/server-filesystem&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">./&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">github&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">npx&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">args&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">-y&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">@modelcontextprotocol/server-github&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">env&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">GITHUB_TOKEN&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">your-token&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">postgres&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">npx&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">args&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">-y&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">@modelcontextprotocol/server-postgres&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">env&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">DATABASE_URL&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">postgresql://localhost/mydb&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Each server gives the AI different capabilities:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>filesystem&lt;/strong>: Read and navigate your project files. The AI can explore your codebase, check existing patterns, and understand your directory structure before suggesting changes.&lt;/li>
&lt;li>&lt;strong>github&lt;/strong>: Access issues, pull requests, and repository metadata. Ask the AI to summarize open issues, check PR comments, or understand what your team is working on.&lt;/li>
&lt;li>&lt;strong>postgres&lt;/strong>: Query your database directly. The AI can inspect your schema, run read queries, and understand your data model without you copying table definitions.&lt;/li>
&lt;/ul>
&lt;p>Different tools, same protocol. You configure once, and any MCP-compatible client can use these servers.&lt;/p>
&lt;h2 id="where-mcp-shines">Where MCP shines
&lt;a class="heading-anchor" href="#where-mcp-shines" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;h3 id="working-with-your-codebase">Working with your codebase
&lt;a class="heading-anchor" href="#working-with-your-codebase" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The most immediate benefit is filesystem access. The AI can navigate your project, read source files, understand your directory structure. When it suggests code, it can check existing patterns first.&lt;/p>
&lt;p>Git integration takes this further. The AI can see your commit history, understand what changed recently, and suggest modifications that align with how your codebase evolves.&lt;/p>
&lt;p>Database schema access means the AI understands your data model. No more explaining table relationships or column types. It sees the structure and generates queries that actually work.&lt;/p>
&lt;h3 id="documentation-and-knowledge">Documentation and knowledge
&lt;a class="heading-anchor" href="#documentation-and-knowledge" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Connect your internal documentation and the AI becomes aware of your team’s decisions. API specifications, architecture documents, coding guidelines. All available as context.&lt;/p>
&lt;p>This is where MCP starts feeling different. The AI isn’t just generating generic code anymore. It’s generating code that fits your project.&lt;/p>
&lt;blockquote>
&lt;p>The best AI assistance comes from understanding not just what you’re building, but how your team builds it.&lt;/p>
&lt;/blockquote>
&lt;h3 id="external-integrations">External integrations
&lt;a class="heading-anchor" href="#external-integrations" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>GitHub integration means the AI can read issues, understand PR discussions, and see the broader context of what your team is working on. Slack or other communication tools can provide even more context about ongoing decisions.&lt;/p>
&lt;p>Custom integrations let you connect internal tools specific to your workflow. The protocol is extensible by design.&lt;/p>
&lt;h2 id="using-mcp-effectively">Using MCP effectively
&lt;a class="heading-anchor" href="#using-mcp-effectively" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>MCP amplifies whatever it connects to. If your documentation is outdated, the AI will use outdated information. If your codebase is messy, the AI will learn messy patterns.&lt;/p>
&lt;p>This is the mirror effect I mentioned in &lt;a href="/blog/ai-gives-you-speed-not-quality">AI gives you speed, not quality&lt;/a>. The AI reflects the context you give it. Good context produces useful output. Bad context produces confident-sounding garbage.&lt;/p>
&lt;blockquote>
&lt;p>Giving AI access to your codebase doesn’t replace your responsibility to maintain it. It makes good hygiene more valuable.&lt;/p>
&lt;/blockquote>
&lt;p>A few practices that help:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Connect only what the AI needs.&lt;/strong> More context isn’t always better. Focused context is better.&lt;/li>
&lt;li>&lt;strong>Keep your documentation current.&lt;/strong> If the AI reads your docs, those docs matter more than before.&lt;/li>
&lt;li>&lt;strong>Review your MCP configuration periodically.&lt;/strong> As your project evolves, so should your context setup.&lt;/li>
&lt;li>&lt;strong>Start small.&lt;/strong> One or two servers. See what works. Expand from there.&lt;/li>
&lt;/ul>
&lt;p>Security matters too. Be intentional about what you expose. MCP servers can access sensitive information. Treat them like any other access control decision.&lt;/p>
&lt;h2 id="what-comes-next">What comes next
&lt;a class="heading-anchor" href="#what-comes-next" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>MCP is the foundation. But the ecosystem is building on top of it.&lt;/p>
&lt;p>&lt;strong>Agentic workflows.&lt;/strong> Tools like Claude Code and Cursor now run in “agent mode” where the AI autonomously plans and executes multi-step tasks. It reads files, makes changes, runs tests, fixes errors. MCP servers are the hands. The agent loop is the brain deciding what to do next.&lt;/p>
&lt;p>&lt;strong>Skills and custom commands.&lt;/strong> Claude Code introduced skills. Custom slash commands that chain MCP tools into reusable workflows. &lt;code>/deploy&lt;/code>, &lt;code>/test&lt;/code>, &lt;code>/review&lt;/code>. You define them once, and they become part of your development toolkit.&lt;/p>
&lt;p>&lt;strong>A2A Protocol.&lt;/strong> Google’s Agent-to-Agent protocol. While MCP connects AI to tools, A2A connects AI agents to each other. Multiple specialized agents collaborating on complex tasks. One agent writes code, another reviews it, a third runs tests.&lt;/p>
&lt;p>The pattern is clear: AI is moving from assistant to collaborator. From answering questions to executing workflows. MCP gave AI access to your environment. What’s next is AI that knows how to use that access autonomously.&lt;/p>
&lt;blockquote>
&lt;p>The question is shifting from “what can AI access?” to “what should AI decide on its own?”&lt;/p>
&lt;/blockquote>
&lt;p>Human judgment doesn’t disappear. It moves upstream. Instead of reviewing every line the AI writes, we design the context and boundaries that shape what it produces.&lt;/p>
&lt;p>That’s still our job. And it’s a job worth doing well.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-01-11/footer.webp" alt="mcp connecting ai to tools" />&lt;/p></content></entry><entry xml:lang="en"><title>AI Gives You Speed, Not Quality</title><subtitle>The human factor in the age of vibe-coding</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software-architecture" scheme="https://chemaclass.com/tags/software-architecture/" label="Software Architecture"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2025-10-10T00:00:00+00:00</published><updated>2025-10-10T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/ai-gives-you-speed-not-quality/"/><id>https://chemaclass.com/blog/ai-gives-you-speed-not-quality/</id><summary type="html">AI accelerates your output but doesn't ensure quality. You're responsible for every line you commit. Speed without direction is chaos.</summary><content type="html">&lt;p>I’ve been using AI coding assistants extensively: ChatGPT, Codex, Claude with Sonnet and Opus. They’re incredibly helpful. They give you speed like nothing else.&lt;/p>
&lt;p>But speed isn’t quality.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-vibe-coding-trap">The vibe-coding trap
&lt;a class="heading-anchor" href="#the-vibe-coding-trap" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>AI models are excellent at imitating their surroundings. Give them context, and they’ll do whatever it takes to complete the task. This has become known as &lt;em>“vibe-coding”&lt;/em>: you describe what you want, and the AI produces something that works. Fast.&lt;/p>
&lt;p>The problem? AI will happily generate messy code if that’s what gets the job done. It doesn’t care about maintainability. It doesn’t think about what happens when requirements change next month. It just produces output.&lt;/p>
&lt;blockquote>
&lt;p>AI is a mirror that reflects the context you give it. If your codebase is messy, it will generate more mess. If your prompts are vague, it will make assumptions.&lt;/p>
&lt;/blockquote>
&lt;p>Without careful guidance, you end up with patches on top of patches. Freshly created legacy code. A codebase where every change feels risky and the team spends more time fighting the code than building features.&lt;/p>
&lt;h2 id="the-art-of-asking">The art of asking
&lt;a class="heading-anchor" href="#the-art-of-asking" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Remember Stack Overflow? Google searches that led you to forum threads from 2011 where someone had the exact same problem?&lt;/p>
&lt;p>Ten years ago, being a developer meant learning how to ask good questions. You’d craft your Stack Overflow post carefully: describe the problem, show what you tried, explain what you expected versus what happened. If your question was vague or lazy, the community would let you know. Sometimes harshly.&lt;/p>
&lt;p>But that friction taught us something valuable: &lt;strong>the quality of your answer depends on the quality of your question&lt;/strong>.&lt;/p>
&lt;p>The same principle applies to AI. A vague prompt gets a vague response. A well-structured prompt with clear context, constraints, and examples gets something useful. The skill of formulating good questions didn’t become obsolete. It became more important.&lt;/p>
&lt;blockquote>
&lt;p>Learning to prompt AI effectively is the modern equivalent of learning to search Google and ask Stack Overflow. The developers who master this will get better results.&lt;/p>
&lt;/blockquote>
&lt;p>Even when AI gives you a fast, impressive-looking answer, &lt;strong>never accept code you don’t fully understand&lt;/strong>. It’s tempting. The response appears in seconds, it looks professional, it might even work. But if you can’t explain what it does and why, you’re planting a time bomb in your codebase. And when it breaks at 2am, you’ll be debugging code you didn’t write with no mental model of why it exists.&lt;/p>
&lt;p>Challenge the output. Ask: &lt;em>“Can you simplify this?”&lt;/em> or &lt;em>“Is there boilerplate here we can remove?”&lt;/em> AI’s default is to add, not to improve. It will generate abstractions, helper functions, and patterns you didn’t ask for. It won’t refactor unless you tell it to. Push back.&lt;/p>
&lt;p>This is especially critical with tests. Ask AI to generate tests and you’ll often get tests that mirror implementation details rather than behavior. They’ll break the moment you refactor, even if the logic stays the same. If you want tests that verify behavior, you need to explicitly say so. AI won’t make that choice for you.&lt;/p>
&lt;blockquote>
&lt;p>Don’t be seduced by speed. Sometimes, a fast answer you don’t understand is worse than a slow answer you do.&lt;/p>
&lt;/blockquote>
&lt;h2 id="the-human-factor">The human factor
&lt;a class="heading-anchor" href="#the-human-factor" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>AI can write code fast, but it can’t understand overall architecture. It doesn’t know why certain decisions were made months ago. It can’t see the bigger picture of where the product is heading. It only sees what you show it, making local decisions without understanding global implications. That’s our job.&lt;/p>
&lt;p>As I explored in &lt;a href="/blog/different-beliefs-about-software-quality">different beliefs about software quality&lt;/a>, teams often have varying standards for what &lt;em>“good enough”&lt;/em> means. When you add AI to the mix, maintaining that shared understanding becomes even more critical. The AI doesn’t share your team’s values. It just generates code.&lt;/p>
&lt;blockquote>
&lt;p>The discipline to maintain clean architecture, to say &lt;em>“no”&lt;/em> to quick hacks, to refactor before things get worse. That’s uniquely human.&lt;/p>
&lt;/blockquote>
&lt;p>Books like &lt;a href="/readings/clean-code/">Clean Code&lt;/a> and &lt;a href="/readings/clean-architecture/">Clean Architecture&lt;/a> aren’t less relevant in the AI age. They’re more relevant. They help you spot when AI is heading in the wrong direction.&lt;/p>
&lt;h2 id="collaboration-over-automation">Collaboration over automation
&lt;a class="heading-anchor" href="#collaboration-over-automation" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>There’s something else AI can’t replace: the team.&lt;/p>
&lt;p>A conversation with a colleague about &lt;em>“should we extract this into a service?”&lt;/em> often leads to insights that no AI prompt would surface. That back-and-forth, the pushback, the &lt;em>“what if we tried this instead”&lt;/em>. That’s where real understanding happens.&lt;/p>
&lt;p>&lt;a href="/readings/extreme-programming-explained/">Extreme Programming Explained&lt;/a> emphasizes practices like pair programming and collective code ownership for good reason. These aren’t inefficiencies to be automated away. They’re how teams build quality into their process.&lt;/p>
&lt;p>When you skip the human discussion and just let AI generate solutions, you lose the opportunity to learn, to challenge assumptions, and to grow as a team.&lt;/p>
&lt;h2 id="you-own-the-code">You own the code
&lt;a class="heading-anchor" href="#you-own-the-code" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>When AI writes code and you commit it, review it, approve it, merge it, and deploy it, &lt;strong>it’s your code&lt;/strong>. You can’t blame the AI when something breaks in production. You can’t point at Claude or Copilot when the architecture becomes unmaintainable.&lt;/p>
&lt;p>As I wrote about &lt;a href="/blog/the-art-of-testing/">the art of testing&lt;/a>, quality is a choice we make at every step. Every commit is a decision. Every review is an opportunity to catch problems. Every merge is an endorsement of the code’s quality.&lt;/p>
&lt;blockquote>
&lt;p>We are the ultimate responsible party for the code AI writes. The commit, the review, the approval, the merge, the deploy. That’s all us.&lt;/p>
&lt;/blockquote>
&lt;p>Moving fast in the wrong direction just gets you lost faster. Lines of code appearing on screen isn’t progress. The value we bring as developers isn’t typing speed. Our value is in understanding where we’re going, maintaining discipline over chaos, and ensuring that the code we ship today doesn’t become tomorrow’s nightmare.&lt;/p>
&lt;p>Use AI. Embrace the speed. But never forget: &lt;strong>you’re the one steering&lt;/strong>. If you let go of the wheel, you’ll end up in a pile of unmaintainable code faster than you expected.&lt;/p>
&lt;p>And when that happens, there’s no one else to blame.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-10-10/footer.webp" alt="you are the one steering" />&lt;/p></content></entry></feed>