<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title>Chemaclass - developer-tools</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/developer-tools/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/developer-tools/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>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></feed>