<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Olga Safonova]]></title><description><![CDATA[Olga Safonova]]></description><link>https://olgasafonova.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!6Dwe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2846a3da-12e0-4268-926d-a6837f1829ca_1363x1363.jpeg</url><title>Olga Safonova</title><link>https://olgasafonova.substack.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 17 Jun 2026 04:03:15 GMT</lastBuildDate><atom:link href="https://olgasafonova.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Olga Safonova]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[olgasafonova@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[olgasafonova@substack.com]]></itunes:email><itunes:name><![CDATA[Olga Safonova]]></itunes:name></itunes:owner><itunes:author><![CDATA[Olga Safonova]]></itunes:author><googleplay:owner><![CDATA[olgasafonova@substack.com]]></googleplay:owner><googleplay:email><![CDATA[olgasafonova@substack.com]]></googleplay:email><googleplay:author><![CDATA[Olga Safonova]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Why the average Claude Code skill scores 57 out of 100]]></title><description><![CDATA[The mid-corpus average from SkillCheck&#8217;s v3.20.0 ecosystem scan was 57.]]></description><link>https://olgasafonova.substack.com/p/why-the-average-claude-code-skill</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/why-the-average-claude-code-skill</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Tue, 19 May 2026 06:45:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6Dwe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2846a3da-12e0-4268-926d-a6837f1829ca_1363x1363.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The mid-corpus average from SkillCheck&#8217;s v3.20.0 ecosystem scan was 57. That means the average community Claude Code skill has either one critical issue and three warnings, or no criticals and around nine warnings. Both shapes show up in the data. I wrote about the scan itself last week in <a href="https://olgasafonova.substack.com/p/how-does-skills-ecosystem-look-like">How does skills ecosystem look like right now</a> &#8212; 2,139 SKILL.md files, twelve community repos, what the corpus looks like at v3.20.0.</p><p>This piece answers the natural follow-up: what is being scored, and how.</p><p>57 is not low because the rubric is harsh. It&#8217;s what falls out when you score a skill against twenty-five check categories assembled over five months from fourteen named sources. The <a href="https://www.getskillcheck.com/methodology">methodology page</a> documents all of it. This is the narrative version.</p><p></p><h2>Phase I: foundation checks</h2><p>I started building SkillCheck in December 2025. Ten check categories. Four trace directly to the <a href="https://agentskills.io/specification">agentskills.io specification</a>: structure, body, naming, and token budget. The remaining six categories are mostly my own work, with narrow anchors in external standards where specific rules fit existing patterns.</p><p>Visual is half WCAG. Two of its four rules come from <a href="https://www.w3.org/TR/WCAG22/">WCAG 2.2</a> (color contrast and alt-text requirements). The other two rules are mine: detecting AI-default purple gradients and generic-font usage. Technical (the category that catches secrets, injection risks, PII, version pinning, and a few other production hazards) borrows one rule from <a href="https://modelcontextprotocol.io/">MCP best practices</a>, specifically the protocol-version requirement. The other six technical rules are mine.</p><p>Semantic consistency, anti-slop pattern detection, quality patterns, and enterprise readiness are entirely mine. Together with the parts of visual and technical I wrote myself, that&#8217;s most of Phase I.</p><p>This was the version that caught the lowest-hanging fruit. A SKILL.md without a <code>description</code> field. A markdown body that ran past the recommended 5000-token mark. A naming collision with a built-in skill. The published spec said these were problems, and v1.0 said so deterministically.</p><p>That version did its job. What it didn&#8217;t do was catch the things I actually wanted it to catch.</p><h2>Phase II: what production teaches you</h2><p>Three months later, in March 2026, I added eight more categories based on what I was learning from running checks across my own portfolio. Quality Pro covered the deeper structural patterns that the spec didn&#8217;t name. Workflow covered what the skill actually does in production, which often differs from what its description claims. Reference integrity. Eval readiness. Orchestration safety. Autonomy boundaries. Composability. Observability.</p><p>These are the categories that nobody writes a spec for, because they only become visible after you&#8217;ve shipped a few skills and watched them collide. A skill that passes every Phase I check can still fail in production because its trigger words overlap with another skill, or because it claims to be deterministic and isn&#8217;t, or because it loads three reference files when one would do. Phase II is what showed up in audit logs after Phase I shipped clean skills into the wild.</p><h2>Phase III: the field reports</h2><p>In April 2026 I added three more categories from observed failures and two pieces of cross-lab methodology. Design pattern classification, because the same skills kept being miscategorized between &#8220;reviewer&#8221; and &#8220;generator,&#8221; and the wrong category leads to the wrong eval. The classification itself (Reviewer, Generator, Inversion, Pipeline, Tool Wrapper) is adapted from <a href="https://x.com/GoogleCloudTech/status/2033953579824758855">Google&#8217;s ADK agent-type hierarchy</a>. Trigger collision detection, because skill libraries grow into namespace clashes the way directories grow into deep nesting. Eval kit completeness, because a skill without an eval is a vibe with confidence. The eval-kit category encodes <a href="https://developers.openai.com/blog/eval-skills">OpenAI&#8217;s approach to systematic agent skill testing</a>, which auto-generates should-trigger and should-NOT-trigger prompt pairs.</p><p>Each Phase III category was added because a specific failure mode showed up in a specific skill audit and I wanted to never see that failure again. The categories are field reports compressed into deterministic checks, anchored to lab-published methodology where I could find it.</p><h2>Phase IV: the empirical anchor</h2><p>Phase IV is one category, knowledge density, and it&#8217;s the most empirically grounded check in the whole tool. The principle behind it is simple: when an agent has a list of things to choose from, the words you wrote to describe each thing are what it reads to decide. Vague descriptions get skipped. Precise descriptions get picked. This holds whether the things are MCP tools or skills or anything else with a description field.</p><p>Two arXiv papers measured the effect at scale on MCP tools, which is the domain where thousands of measurable examples already exist.</p><p>Hasan et al. (<a href="https://arxiv.org/abs/2602.14878">arXiv:2602.14878</a>) scanned 856 MCP tool descriptions across 103 servers and found that 97% of them contained at least one description smell, which the authors define as a pattern that makes a tool harder for an agent to select correctly. The paper&#8217;s findings shaped several of the rules in SkillCheck&#8217;s knowledge density check.</p><p>Wang et al. (<a href="https://arxiv.org/abs/2602.18914">arXiv:2602.18914</a>) ran a different experiment across 10,831 MCP servers. They measured how often an agent picks the right tool when faced with a list of MCP tools to choose from. Descriptions that followed a standard schema (purpose, when-to-use, when-not-to-use, examples) got picked 72% of the time. Descriptions that didn&#8217;t got picked 20% of the time. The fifty-two-point gap is the entire reason knowledge density exists as a category of its own and not a subsection of the body check.</p><p>The same mechanism applies to skill descriptions. A SKILL.md whose description doesn&#8217;t tell the agent what the skill does and when to use it gets skipped, even when it&#8217;s the right skill for the job. Knowledge density is the check category that catches this.</p><p>I cite these papers in the methodology page and in the rule descriptions inside the tool itself, because the alternative is to claim I came up with knowledge density on my own. I did not. Hasan and Wang did the work; I encoded their findings.</p><h2>Phase V: the marketplace year</h2><p>Phase V arrived in April 2026 with three categories. Agent integration readiness, marketplace governance, memory governance. These are the categories that became relevant when Anthropic shipped plugin marketplaces and built-in memory in late April. Until those features existed, the categories were theoretical. The day they shipped, a thousand skills suddenly needed to declare things about themselves that they hadn&#8217;t previously needed to.</p><p>Each Phase V category leans on multiple sources. Agent integration readiness prices MCP servers along <a href="https://youtu.be/ideYDMJKujE">Sam Morrow&#8217;s four axes</a> (token efficiency, security, unique unlocks, execution environment), populated with <a href="https://claude.com/blog/building-agents-that-reach-production-systems-with-mcp">Anthropic&#8217;s six production patterns</a>. Marketplace governance prices plugin marketplaces against <a href="https://github.com/anthropics/knowledge-work-plugins">Anthropic&#8217;s reference schema</a>, with governance requirements (named maintainers, change-gate evals, deprecation paths) the reference itself doesn&#8217;t yet ship. Memory governance is design-locked against <a href="https://claude.com/blog/claude-managed-agents-memory">Anthropic&#8217;s managed-agents memory primitives</a>.</p><p>Marketplace governance and memory governance will keep evolving for the rest of 2026. Phase V is the phase that will keep moving.</p><h2>The scoring math</h2><p>Every check fires at one of three severities. Critical issues subtract 20 points. Warnings subtract 5. Suggestions subtract 1. Every skill starts at 100.</p><p>The reason for the asymmetric weighting is calibration against a known reference. A skill with one critical and no warnings should score 80. A skill with four warnings and no criticals should score 80. The math says those skills are equally broken, and in practice that turns out to be approximately true.</p><p>The 57 from the opening is what falls out when you run this scoring across the 2,139 community skills SkillCheck scanned in May 2026. The corpus has three rough population shapes. Skills that don&#8217;t validate as agent-readable at all score low (multiple criticals, often missing the description field or the frontmatter that the spec requires). Skills that pass Phase I cleanly but break on Phase II categories score in the middle (many warnings about workflow, eval readiness, orchestration safety). Skills that nail the foundation and most of production score high but still drop points on knowledge density or reference integrity. Most of the corpus sits in the middle shape.</p><h2>What v3.20 actually means in calendar time</h2><p>The versioning isn&#8217;t decorative. Every minor bump corresponds to a category being added or a rule being refined. v3.18.0 was the version that started scanning the public Claude Code ecosystem. v3.20.0 added marketplace governance and memory governance because the marketplace and memory features had just shipped. By the time you read this, there will probably be a v3.21 or v3.22, because the spec landscape is moving fast and a tool that doesn&#8217;t move with it is just a snapshot.</p><p>The five months between December 2025 and April 2026 are not a long time. They are also not nothing. The categories that exist at v3.20 are the categories that survived being run against real skills, written by real people, in real codebases.</p><h2>The methodology page is the audit trail</h2><p>Every category traces back to something concrete. The <a href="https://agentskills.io/specification">agentskills.io spec</a> for structure, body, naming, and token budget. <a href="https://www.w3.org/TR/WCAG22/">WCAG 2.2</a> for accessibility rules inside the visual category. <a href="https://modelcontextprotocol.io/">MCP best practices</a> for protocol versioning inside the technical category. <a href="https://arxiv.org/abs/2602.14878">Hasan</a> and <a href="https://arxiv.org/abs/2602.18914">Wang</a> on description quality, measured across thousands of MCP tools. <a href="https://developers.openai.com/blog/eval-skills">OpenAI&#8217;s approach</a> to systematic agent skill evaluation. <a href="https://x.com/GoogleCloudTech/status/2033953579824758855">Google&#8217;s ADK agent-type hierarchy</a>. <a href="https://glama.ai/blog/2026-04-03-tool-description-quality-score-tdqs">Glama&#8217;s industry quality benchmark</a>. <a href="https://youtu.be/ideYDMJKujE">Sam Morrow&#8217;s framework</a> for pricing MCP servers. <a href="https://claude.com/blog/building-agents-that-reach-production-systems-with-mcp">Anthropic&#8217;s production writeups</a> and the <a href="https://claude.com/blog/claude-managed-agents-memory">memory</a> and <a href="https://github.com/anthropics/knowledge-work-plugins">marketplace specs</a> they shipped in late April. The audit logs from my own skills that broke in specific ways.</p><p>Fourteen named sources informing twenty-five categories. The categories that don&#8217;t have a public source (anti-slop, semantic conflict detection, quality patterns, enterprise readiness, and most of the visual and technical rules) come from my own work. The methodology page lists all of it, mapped to the categories it informed.</p><div class="file-embed-wrapper" data-component-name="FileToDOM"><div class="file-embed-container-reader"><div class="file-embed-container-top"><image class="file-embed-thumbnail-default" src="https://substackcdn.com/image/fetch/$s_!0Cy0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2Fimg%2Fattachment_icon.svg"></image><div class="file-embed-details"><div class="file-embed-details-h1">Skillcheck Methodology Carousel 17 05 2026 V3 Vector</div><div class="file-embed-details-h2">190KB &#8729; PDF file</div></div><a class="file-embed-button wide" href="https://olgasafonova.substack.com/api/v1/file/c8f10266-5ae2-41d0-9620-caade3ba2010.pdf"><span class="file-embed-button-text">Download</span></a></div><a class="file-embed-button narrow" href="https://olgasafonova.substack.com/api/v1/file/c8f10266-5ae2-41d0-9620-caade3ba2010.pdf"><span class="file-embed-button-text">Download</span></a></div></div><p></p><p>The full version is at <a href="https://www.getskillcheck.com/methodology">getskillcheck.com/methodology</a>.</p>]]></content:encoded></item><item><title><![CDATA[How does skills ecosystem look like right now]]></title><description><![CDATA[The newer the spec, the cleaner the ecosystem]]></description><link>https://olgasafonova.substack.com/p/how-does-skills-ecosystem-look-like</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/how-does-skills-ecosystem-look-like</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Sat, 16 May 2026 07:45:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pZLq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>The newer the spec, the cleaner the ecosystem</h1><p>When you ship a new file format into a developer community, the early adopters tend to read the spec. The crowd that arrives a few months later read other people&#8217;s files. By the time the format is famous, half the corpus is cargo-culted off whatever shipped first.</p><p>SkillCheck has been scanning the public Claude Code ecosystem since v3.18.0. On 12-05-2026, we ran v3.20.0 against twelve community repos. The scan covers two artifact types that live side by side: the older <code>SKILL.md</code> files Anthropic introduced last year, and the plugin manifests added more recently. Same authors. Same repos. Two different specs.</p><p>The plugin layer is in much better shape than the skill layer. That&#8217;s the story.</p><h2>The numbers</h2><p>The skill scan covered <strong>2,139</strong> <code>SKILL.md</code> files. Average quality score: 57 out of 100. About 86% pass the no-critical-issues bar. About 3% score 81 or higher. The highest single score in the corpus is 92, which means zero skills score in the 93-to-100 band. The floor is 62 skills scoring 20 or below.</p><p>The plugin scan covered 178 manifests across seven of the same repos. 91% are clean. There are 17 total issues across the entire set, and they cluster on two checks: 12 plugins are missing the <code>version</code> field, and 5 keep their <code>marketplace.json</code> file in the wrong location.</p><p>Two artifact types. Same author pool. One scores 57 on average; the other scores 91% clean. That gap is the lens for everything else in this piece.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pZLq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pZLq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png 424w, https://substackcdn.com/image/fetch/$s_!pZLq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png 848w, https://substackcdn.com/image/fetch/$s_!pZLq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png 1272w, https://substackcdn.com/image/fetch/$s_!pZLq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pZLq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:266920,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/197916265?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pZLq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png 424w, https://substackcdn.com/image/fetch/$s_!pZLq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png 848w, https://substackcdn.com/image/fetch/$s_!pZLq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png 1272w, https://substackcdn.com/image/fetch/$s_!pZLq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feebee3c8-b96d-4713-b014-4b3dacd1e36d_2400x2400.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>What the warnings actually say</h2><p>A scan score by itself is thin signal. The shape of the story comes from which checks fire most.</p><p>On the skill side, the top warnings cluster around what the skill says about itself. About 1,817 skills present themselves as reviewer-pattern skills but never declare what they&#8217;re evaluating against. Another 1,557 have descriptions that don&#8217;t say what the skill does. Another 1,427 don&#8217;t say when to use it. Another 1,402 don&#8217;t declare a clear trigger condition. Another 1,384 omit success criteria.</p><p>The warnings rhyme. They&#8217;re all variants of the same problem: the skill&#8217;s <code>description</code> field is supposed to tell a coordinating agent what the skill is for, and most descriptions don&#8217;t do that work. They describe the topic instead of the trigger. They list what the skill contains instead of what calling it produces.</p><p>On the plugin side, the warnings are mechanical. The <code>version</code> field is missing or the <code>marketplace.json</code> file sits in <code>.claude-plugin/</code> when it should sit at the plugin root. These are one-line fixes. They get caught by anyone who reads the spec once.</p><p>The contrast matters. A plugin issue is a structural problem with a known fix. A skill issue is a semantic problem with no single answer. To make a skill description say what the skill does and when to use it, the author has to know their own skill better than they currently do. That&#8217;s much harder.</p><h2>Why the gap exists</h2><p>The simplest explanation is spec age. Anthropic&#8217;s <code>SKILL.md</code> format has been public for quite some time at the time of writing. The plugin manifest spec is newer. Every author who ships a <code>SKILL.md</code> today is operating in a community where examples already exist, and most of those examples were written before the current SkillCheck rubric existed. People copy patterns that worked for shipping.</p><p>The plugin spec doesn&#8217;t have that drag yet. There hasn&#8217;t been time to grow a layer of pre-spec patterns underneath it. Everyone who ships a plugin manifest in May 2026 is reading the actual spec, because there isn&#8217;t yet a corpus of bad manifests to copy from.</p><p>This generalizes. Newer formats look healthier because there hasn&#8217;t been time for habits to ossify against them. Older formats look messier because the spec has drifted while the corpus stayed put.</p><p>The version-over-version data backs this up. The same scan a month ago, at v3.18.0, covered 1,950 skills with an average score of 58.8 and 90.5% no-critical. By v3.20.0, the corpus grew to 2,139 skills, the average fell to 57.1, and no-critical share dropped to 86.3%. The corpus is getting bigger and slightly worse. Each batch of new contributors arrives without having internalized the rubric, so the average sinks.</p><h2>A portability footnote worth noticing</h2><p>One repo in the scan does something unusual. The <a href="https://github.com/alirezarezvani/claude-skills">alirezarezvani-claude-skills</a> repo ships 311 <code>SKILL.md</code> files under <code>.gemini/skills/</code> paths, and 241 of those have an exact-named sibling somewhere else in the same repo. Same skill, two trees: one for Claude Code, one for Gemini&#8217;s agent runtime. The maintainer is shipping agent-portable skills, betting that the <code>SKILL.md</code> format outlives any single agent harness.</p><p>Worth flagging because it&#8217;s the one of community examples of explicit multi-runtime packaging in the corpus. The hypothesis is &#8220;the <code>SKILL.md</code> format will end up cross-vendor&#8221;.</p><h2>What this means if you&#8217;re shipping skills today</h2><p>Read the spec, then read your description back. The thing that gets your skill picked by a coordinating agent isn&#8217;t the body; it&#8217;s the description string. If yours doesn&#8217;t say what the skill does and when to use it, the agent has no signal to fire on.</p><p>If the description fits in one sentence that starts with &#8220;Use when&#8230;&#8221; and ends with what the skill produces, you&#8217;re already in the top 3% of the corpus. That bar is lower than it should be, which is the whole point of this piece.</p><h2>Sources</h2><ul><li><p>Full SKILL.md scan: 2,139 entries across 12 repos, v3.20.0, run 12-05-2026</p></li><li><p>Plugin scan: 178 entries across 7 of those repos</p></li><li><p>Reports landing page: <a href="https://getskillcheck.com/reports/">https://getskillcheck.com/reports/</a></p></li><li><p>Methodology: <a href="https://getskillcheck.com/methodology">https://getskillcheck.com/methodology</a></p><p></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Three Layers, Not Two Camps]]></title><description><![CDATA[I watched a community thread devolve into MCP vs CLI.]]></description><link>https://olgasafonova.substack.com/p/three-layers-not-two-camps</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/three-layers-not-two-camps</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Thu, 07 May 2026 06:31:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!I8ZH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I watched a community thread devolve into MCP vs CLI. Long, sharp, technical. Almost nobody who builds both.</p><p>I build MCP servers. I also enhance and use CLIs. And I write skills that wire them together. They solve different problems. This piece is about when each layer is the right call, with real examples from a setup that runs all three daily.</p><h2>The thread that started this</h2><p>Someone asked: &#8220;Why do some people feel so strongly against MCPs?&#8221;</p><p>The answers were sharp and specific. <strong>Token pre-loading</strong>: every MCP tool description sits in the agent&#8217;s working memory whether you call the tool or not, eating into the context window. <strong>No piping</strong>: there&#8217;s no native way to feed one MCP tool&#8217;s output into another the way you can with shell commands. <strong>Auth passthrough</strong>: if the agent has to construct API requests for you, your credentials risk passing through the model&#8217;s context. <strong>Multi-agent portability</strong>: an MCP server has to be configured in every agent that uses it. <strong>Dropped connections</strong>: networked MCP servers cut off mid-call.</p><p>These are real engineering problems with solvable designs. The thread framed MCP and CLI as competing philosophies. They&#8217;re different layers of the same stack, and both layers serve a third one most people forget about: the agent&#8217;s instruction sheet.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I8ZH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I8ZH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png 424w, https://substackcdn.com/image/fetch/$s_!I8ZH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png 848w, https://substackcdn.com/image/fetch/$s_!I8ZH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png 1272w, https://substackcdn.com/image/fetch/$s_!I8ZH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I8ZH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png" width="1200" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1335939,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/196712166?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!I8ZH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png 424w, https://substackcdn.com/image/fetch/$s_!I8ZH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png 848w, https://substackcdn.com/image/fetch/$s_!I8ZH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png 1272w, https://substackcdn.com/image/fetch/$s_!I8ZH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d656517-14e4-4ce9-aa61-01d3fe068628_1200x630.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>The three layers, briefly</h2><p>Before the catalogue, the picture you need:</p><ul><li><p><strong>MCP servers</strong> are tool surfaces with structure. The agent discovers what&#8217;s available from a typed list and calls each tool through a defined schema.</p></li><li><p><strong>CLIs</strong> (command-line interfaces) are tool surfaces with shell ergonomics. The agent invokes a command, reads the text output, optionally pipes it into the next command.</p></li><li><p><strong>Skills</strong> are short markdown documents the agent reads to know <em>which</em> surface to use, <em>when</em>, and <em>how</em> to call it well.</p></li></ul><p>The agent is the only thing doing the calling. Skills don&#8217;t call MCP servers. MCP servers don&#8217;t manage CLIs. Each layer is independent. The three meet at the agent.</p><h2>Layer 1: MCP servers</h2><p>MCP servers are the structured interface layer. They expose typed tools with input schemas, descriptions, and discovery. The agent doesn&#8217;t need to know your API exists before it finds the right tool.</p><p>I run nine MCP servers in my personal portfolio. Eight in Go, one in TypeScript. (There&#8217;s a tenth I built for work that I&#8217;m not catalogue-ing here, but a few skills that depend on it show up later.) Each wraps a domain that benefits from structure:</p><ul><li><p><strong><a href="https://github.com/olgasafonova/miro-mcp-server">miro-mcp-server</a>.</strong> 92 tools: 91 for canvas operations (stickies, shapes, frames, connectors, tags, groups, mindmaps, exports) and one <code>miro_tool_search</code> meta-tool that lets the agent search the rest by keyword. Many tools work here because Miro is a small world: every board object is one kind of item or another, and each kind supports the same four basic actions (create, read, change, delete). The meta-tool exists because loading 92 tool descriptions costs about 15K tokens of context, so clients can opt into a 15-tool essentials profile and reach the rest on demand through search.</p></li><li><p><strong><a href="https://github.com/olgasafonova/mediawiki-mcp-server">mediawiki-mcp-server</a>.</strong> 42 tools for wiki authoring, search, link checking, and markdown conversion. The agent can read a page, edit it, check whether outbound links still resolve, find orphan pages, or convert markdown into wikitext before saving.</p></li><li><p><strong><a href="https://github.com/olgasafonova/tilbudstrolden-mcp">tilbudstrolden-mcp</a>.</strong> 18 TypeScript tools for cross-Nordic grocery shopping across Denmark, Norway, Sweden, and Finland. Search deals, compare unit prices, plan weekly meals around what&#8217;s on sale, build shopping lists grouped by store. The name is Danish for &#8220;the troll of deals,&#8221; but the troll roams Nordic-wide.</p></li><li><p><strong><a href="https://github.com/olgasafonova/ridge">ridge</a>.</strong> 19 tools that reverse-engineer architecture from a directory tree. Point it at a Go, TypeScript, or Python codebase and it walks the source to build a structured graph of services, packages, databases, queues, caches, endpoints, and the relationships between them, with confidence scores on every edge. The same graph model works for markdown trees (Obsidian vaults, doc directories), where wiki-links and relative <code>.md</code> links become edges. Beyond the scan, ridge generates diagrams in nine formats (including a self-contained D3 force-directed HTML page), validates architecture rules (circular dependencies, layering violations, boundary crossings), and detects drift between any two git refs. The <code>arch_drift_explain</code> tool returns a paste-ready PR paragraph through pure templating, no LLM round-trip needed. Architecture diagrams normally go stale the day you commit them; ridge rebuilds them from source on demand.</p></li><li><p><strong><a href="https://github.com/olgasafonova/nordic-registry-mcp-server">nordic-registry-mcp-server</a>.</strong> 23 tools across the four Nordic government business registries (Norway&#8217;s Br&#248;nn&#248;ysundregistrene, Denmark&#8217;s CVR, Finland&#8217;s PRH, Sweden&#8217;s Bolagsverket) in one binary. Look up a company by name or organisation number, fetch board members and signing authority, list branch offices, monitor for changes since a given date.</p></li><li><p><strong><a href="https://github.com/olgasafonova/gleif-mcp-server">gleif-mcp-server</a>.</strong> 12 tools for looking up Legal Entity Identifiers. An agent searching for &#8220;Apple Inc LEI&#8221; calls <code>search_entity</code> and gets a typed response, without ever needing to know the GLEIF API exists.</p></li><li><p><strong><a href="https://github.com/olgasafonova/productplan-mcp-server">productplan-mcp-server</a>.</strong> 47 tools for product roadmap management. Read and update plans, bars, milestones, releases, and tags through typed schemas, so an agent drafting roadmap edits can&#8217;t malform the request.</p></li><li><p><strong>ratatoskr</strong> (currently private). 15 tools for searching a product help center from inside the editor: browse sections, search topics, read pages, view screenshots, extract PDFs, compare translations, audit links. Named after the Norse squirrel that runs up and down Yggdrasil carrying messages between the eagle in the crown and the dragon at the roots.</p></li><li><p><strong>diagram-insight-mcp</strong> (currently private). 10 tools for diagram comprehension through a vision-language model. Feed it an architecture, sequence, or flowchart diagram and the agent gets back a structured description of what the picture is saying.</p></li></ul><p>That&#8217;s where the structure earns its keep: bounded domains where typed schemas catch malformed requests before they hit the API.</p><p><strong>When MCP wins:</strong> the agent benefits from discovering what&#8217;s possible. The domain has a finite set of operations. Input validation matters (financial data, regulatory lookups, structured board manipulation). Auth is handled inside the server&#8217;s compiled code so credentials never travel through the model&#8217;s context.</p><p>That last point is worth pausing on. The thread raised auth passthrough as a criticism of MCP, but it&#8217;s actually the opposite. MCP servers handle authentication in code: the OAuth flow, the API key injection, the token refresh all happen server-side. The agent just calls <code>search_entity</code> and gets results. Compare that to a skill that tells the agent to construct raw HTTP requests with credentials in the prompt. Those credentials flow through inference and any observability the provider runs on the model.</p><h2>Layer 2: CLIs</h2><p>Some APIs are too big to wrap in MCP. Wrap a service that exposes hundreds of methods as MCP tools and the tool list alone crowds the agent&#8217;s context window before any actual work begins. CLIs are the cleaner answer for that case: one binary, one calling pattern, no per-method context cost.</p><p>I use two CLIs daily, both supported by skills and rules that explain how to call them.</p><p><a href="https://github.com/googleworkspace/cli">gws</a> is a CLI that covers everything in Google Workspace: Gmail, Calendar, Drive, Docs, Sheets, Slides, Tasks. Each of those services has dozens to hundreds of methods. Imagine listing every one as a separate MCP tool. The agent&#8217;s context window would be half-full of tool descriptions before it did anything useful.</p><p>Instead, <code>gws</code> handles login (browser-based OAuth, credentials stored in <code>~/.config/gws/</code>), and the agent calls it through Bash:</p><pre><code><code>gws calendar:v3 events list --params '{
  "calendarId": "primary",
  "timeMin": "2026-04-05T00:00:00+02:00",
  "timeMax": "2026-04-05T23:59:59+02:00",
  "singleEvents": true
}' --format json
</code></code></pre><p>The agent doesn&#8217;t need a tool schema for every Google API method. It needs to know the pattern: <code>gws [service] [method] --params '{...}'</code>. That pattern is taught through a rule file (more on this in Layer 3), not an MCP tool list.</p><p><a href="https://github.com/olgasafonova/linkedin-rs">li-cli</a> is my Rust CLI for LinkedIn. It lets me run LinkedIn from the terminal without opening a browser: read and reply to messages, browse the feed, react and comment on posts, send and accept connection invitations, search for people, jobs, and posts, audit my own profile for staleness, and answer the daily &#8220;who do I know at this company?&#8221; question with one command. There are 44 subcommands across 11 domains, including the day-to-day ones (Profile, Feed, Messages, Connections, Search, Company, Events, Notifications) and a few composite commands like <code>inbox</code> for the morning check and <code>who</code> for network overlap.</p><p>It&#8217;s a fork of <a href="https://github.com/eisbaw/linkedin-rs">linkedin-rs</a> by Mark Ruvald Pedersen, who built the core client, login flow, and protocol handling. I built the daily-driver shell on top of that: the additional commands, the inbox composite, the network-overlap queries, JSON output for piping into other tools, and shell completions.</p><p>LinkedIn&#8217;s public API is built on <a href="https://linkedin.github.io/rest.li/">Rest.li</a>, an open-source REST framework LinkedIn built and uses internally. Rest.li sits on top of HTTP but layers on custom conventions: required headers like <code>X-RestLi-Protocol-Version</code>, response wrapping (entities returned inside a <code>CollectionResponse</code> envelope), and projection rules for limiting fields. LinkedIn ships official Python and JavaScript clients that handle this; generic HTTP clients have to handle it manually. The Rust binary takes care of all of it. Login is a browser cookie (<code>li_at</code>) stored locally. The agent calls <code>li feed list --count 20</code> and gets posts. It never sees the cookie, never constructs the protocol headers, never touches the transport layer.</p><pre><code><code>li inbox                                    # morning check: messages, invitations, notifications
li feed list --count 20                     # browse the feed
li who Anthropic                            # who do I know there?
li search posts "AI engineering"            # search posts by topic
li messages reply &lt;id&gt; "thanks!"            # reply from terminal
li profile audit                            # check my own profile for staleness
</code></code></pre><p><strong>When CLI wins:</strong> the API has too many methods to wrap each one as its own MCP tool (Google Workspace). The API uses a non-standard protocol that&#8217;s a pain to call directly (Rest.li). Login uses session cookies or browser cookies that shouldn&#8217;t travel through the model&#8217;s context. You want to chain commands together with shell pipes (<code>li feed list --json | jq '.[] | select(.reactions &gt; 50)'</code> reads as &#8220;list my feed, then keep only posts with more than 50 reactions&#8221;). And one CLI installed on your machine works with every AI agent you have at once, no extra configuration per agent.</p><h2>Layer 3: Skills (and rules)</h2><p>Skills are short markdown documents the agent reads when relevant. They explain how to use a CLI or MCP server, give context about which tool to pick, and encode recurring workflows. Rules are the same idea at a different scope: they live alongside skills but load globally, attaching themselves whenever a matching context appears.</p><p>My skills divide into three rough groups, with rules sitting alongside as a fourth.</p><p><strong>Rules that document CLI patterns.</strong> A <code>gws-cli.md</code> rule documents every Google Workspace service pattern, login setup, timezone handling (always <code>Europe/Copenhagen</code>, always include UTC offset), and the gotcha that Calendar&#8217;s table format silently drops events. The rule isn&#8217;t a skill; it&#8217;s a context document that loads automatically when the agent is doing calendar or Gmail work. Skills like <code>today</code> (daily standup prep) and <code>dropcheck</code> (catching dropped balls in Gmail and Calendar) read this rule to know how to call <code>gws</code> correctly.</p><p><strong>Skills that wrap CLIs for specific outcomes.</strong> <code>linkedin-sift</code> is the discovery layer for my LinkedIn feed: it calls <code>li</code> to pull recent posts, filters out noise, and surfaces a shortlist of items worth deeper review. <code>skillcheck-engage</code> finds LinkedIn posts about MCP and Claude skills, drafts replies, and posts after my approval. Both rely on <code>li</code> for read access.</p><p><strong>Skills that span both layers.</strong> These show why the three-layer model matters:</p><ul><li><p><code>sift</code> is a content evaluation pipeline that handles several input types. For URLs, it extracts clean article content through a fallback chain: a reader API first, then <code>trafilatura</code> (a Python tool that strips ads and navigation off a webpage and returns just the article text), then <code>curl</code> as a last resort. For YouTube videos, it pulls transcripts via <code>yt-dlp</code> (a command-line tool that downloads subtitles and metadata from video sites). For GitHub repos, it uses the <code>gh</code> CLI. For my open Chrome tabs, it discovers each tab via AppleScript and then reads the page contents through the <code>claude-in-chrome</code> MCP server (a Chrome extension that exposes browser actions to Claude through MCP); pages in Chrome are already JS-rendered, so extraction works on sites where <code>curl</code> and <code>trafilatura</code> come back empty (LinkedIn Pulse, Medium, most single-page apps). It evaluates everything against seven lenses and routes the keepers to my Obsidian vault. The agent reads the skill, then picks the right tool for the input shape.</p></li><li><p><code>lmwtfy</code> answers colleague questions about a product I work on. It searches GitHub source code (via the <code>gh</code> CLI), the customer-facing 360 Online help center (via Ratatoskr, an MCP server I built that wraps the help-center search), Azure DevOps (Azure DevOps MCP server), and the internal wiki (mediawiki MCP server). Four data sources, two transport layers, one skill telling the agent how to weave them together.</p></li><li><p><code>today</code> runs daily standup prep: checks Azure DevOps (MCP), GitHub activity (<code>gh</code> CLI), Google Calendar (<code>gws</code> CLI), and Obsidian notes (file reads). Four systems, three layers, one prompt.</p></li></ul><p><strong>Skills that show up in customer work.</strong> I work in product management for a records management platform. A handful of skills do the heavy lifting on that side of my desk:</p><ul><li><p><code>release-prep</code> generates release notes from Azure DevOps work items.</p></li><li><p><code>bid-intel</code> drafts bid and tender responses by searching the wiki, GitHub source, and existing intel folders.</p></li><li><p><code>enhanced-edoc-update</code> generates the weekly stakeholder progress report from Azure DevOps and GitHub activity.</p></li></ul><p>Each of these calls the same kinds of tools the personal-knowledge skills do. The pattern repeats: the agent reads the skill, then calls into MCP servers and CLIs as the work requires.</p><h2>Where each layer reaches</h2><p>The decision matrix gets sharper if you pull back and ask which agent surfaces support which layer in the first place. Three tiers, each with different reach.</p><p><strong>The chat web apps are the narrowest.</strong> Claude on the web and ChatGPT on the web can load MCP servers and read skill files. They can&#8217;t shell out to a CLI, and they can&#8217;t call arbitrary APIs. ChatGPT has one partial exception: Custom GPT Actions, a mechanism that lets a Custom GPT call your API if you describe it in an OpenAPI spec. The newer ChatGPT Apps SDK uses MCP rather than Actions.</p><p><strong>Cloud-based development agents sit in the middle.</strong> Anthropic&#8217;s Cowork and OpenAI&#8217;s Codex (cloud) both run as managed cloud sandboxes that you talk to from a browser. They support CLIs, MCP servers, and skills out of the box. They support direct API calls too, but with restrictions: both sandboxes block outbound network traffic by default, so you have to whitelist specific domains and configure access before either can reach an external service.</p><p><strong>The local developer tools have full reach.</strong> Codex CLI, Claude Code, and Cursor support all four delivery methods without restriction. CLIs run because the agent has a shell. APIs work because there&#8217;s no network sandbox. MCP and skills work because every modern agent loads them.</p><p>Two patterns are worth pulling out of that.</p><p><strong>MCP and skills work everywhere.</strong> Every surface I just walked through can load an MCP server or read a skill file. Nothing else has that reach.</p><p><strong>Chat surfaces have less reach than developer surfaces.</strong> The web chat apps, which are also the surfaces with the most users, have the narrowest set of options. The debate I see online treats MCP-vs-CLI as if every agent could pick freely. Most can&#8217;t.</p><p>If you&#8217;re a builder shipping a product to AI agents:</p><ul><li><p>Ship only an API and you&#8217;re invisible to chat users.</p></li><li><p>Ship only a CLI and you&#8217;re invisible to web-based agents.</p></li><li><p>Ship an MCP server and every surface can reach you.</p></li></ul><h2>When to pick which</h2><p>Once you&#8217;re inside an agent surface that supports all three layers, the question becomes which layer fits which job. Here&#8217;s the heuristic I land on after building all three:</p><p><strong>Below ~20 operations: MCP.</strong> The agent benefits from discovering what&#8217;s available. Diagram-insight has 10 tools. Ratatoskr has 15. Tool descriptions fit comfortably in context, and schemas catch malformed requests early.</p><p><strong>Above ~50 operations: CLI plus a rule or skill.</strong> Token efficiency dominates. Google Workspace has hundreds of methods. LinkedIn has dozens of endpoints across nine domains. Enumerate those as MCP tools and you&#8217;ve spent your context budget before doing any work.</p><p><strong>The gray zone (20-50): depends.</strong> TilbudsTrolden has 18 tools. Could be a CLI. But meal planning workflows need the agent to discover tools (&#8221;what can I do with recipes?&#8221;), and the input schemas for <code>plan_and_shop</code> are complex enough that free-form CLI args would produce errors. MCP wins here despite the tool count.</p><p>Three additional dimensions push the boundary in either direction:</p><ul><li><p><strong>Who&#8217;s the consumer.</strong> Chat users with conversational, sporadic traffic want MCP: small responses, stateful turns, dynamic discovery. Backend services with high-volume programmatic traffic want a direct API. Power users running scripts or CI pipelines want a CLI.</p></li><li><p><strong>Auth complexity.</strong> A simple API key works in any layer. OAuth flows, browser cookies, and session tokens are easier to handle safely in a CLI (credentials stay in the binary or local config) or in MCP server code than in a skill that asks the agent to construct requests.</p></li><li><p><strong>Multi-agent reuse.</strong> A CLI installed once serves every agent on the machine. An MCP server has to be configured in each agent. Skills also carry across agents if you share your config repo.</p></li></ul><p>Token cost is the single dimension most people underweight. MCP carries roughly a 4-32x overhead on tool listings and metadata compared to a direct API call. That&#8217;s not an argument against MCP; it&#8217;s an argument for not loading every server in every context.</p><h2>What the thread got right</h2><p>Token pre-loading is real. My nine MCP servers expose 278 tools combined. That&#8217;s a lot of tool descriptions sitting in context before any work happens. I make intentional choices about which servers to load in which context, and the Miro server&#8217;s <code>miro_tool_search</code> profile (15 essentials plus the meta search) shows what server-side mitigation can look like.</p><p>Composability is a real gap. When I want &#8220;find all Miro stickies in frame X, then create connectors between them,&#8221; the agent makes multiple round trips where a single piped command would suffice. Anthropic and others are working on solutions, but they&#8217;re not mature.</p><p>Connection instability is real for networked MCP servers. Less so for local ones, which run as processes on your machine talking to the agent through standard input/output. They don&#8217;t go over the network, so they don&#8217;t disconnect. Most of my Go servers run locally, and I can&#8217;t remember the last time one crashed.</p><p>Two things have changed since the thread that I&#8217;d weight against the criticisms.</p><p><strong>Governance moved off Anthropic.</strong> On 9 December 2025, Anthropic donated MCP to the Agentic AI Foundation, a directed fund under the Linux Foundation. Two other projects joined as co-founders: OpenAI&#8217;s AGENTS.md (a vendor-neutral file format that lives at the root of a code repo and tells AI coding agents how to work in that codebase, similar in spirit to Anthropic&#8217;s CLAUDE.md) and Block&#8217;s <a href="https://github.com/aaif-goose/goose">goose</a>, an open-source AI coding agent framework. Single-vendor risk was the most common reason enterprise architects hesitated to bet on MCP; the foundation arrangement removes it. The cross-vendor commitment matters too. Anthropic, OpenAI, and Block all betting on the same neutral home is a stronger signal than any single donation would have been. (<a href="https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation">announcement</a>, <a href="https://www.linuxfoundation.org/press/linux-foundation-announces-the-formation-of-the-agentic-ai-foundation">Linux Foundation press release</a>)</p><p><strong>Adoption has compounded.</strong> As of early May 2026, the <code>@modelcontextprotocol/sdk</code> TypeScript SDK pulls roughly 143 million monthly downloads on npm, and the <code>mcp</code> Python package pulls another 244 million on PyPI: close to 400 million combined across the two official SDKs. (You can verify either number live: npm at <code>api.npmjs.org/downloads/point/last-month/@modelcontextprotocol/sdk</code>, PyPI via <code>pypistats.org/api/packages/mcp/recent</code>.) The criticisms in the thread are still valid; the question is whether they&#8217;re worth weighing against the alternatives, and the alternatives keep losing surface area.</p><h2>What the thread missed</h2><p>Nobody distinguished local from networked MCP servers. The &#8220;MCPs disconnect all the time&#8221; complaint applies to networked servers, not local ones.</p><p>Nobody pointed out the upside of input schemas. CLI arguments are just text strings the agent has to guess at. MCP tool schemas spell out which fields are required, what types they take, and which values are valid. For complex inputs (a Miro board with specific frame layout and tagged stickies), schemas catch errors before the call runs.</p><p>Nobody framed skills as a distinct layer. The thread treated it as MCP vs CLI: structured discovery vs lean invocation. Skills are the third piece. Without skills, a CLI is a binary the agent has to guess at. Without CLIs, an MCP server for a 200-method API eats your context window. Without either, an agent in a chat surface can&#8217;t reach your product at all.</p><p>Nobody mentioned security. Three things deserve more conversation than they get:</p><ul><li><p><strong>Prompt injection through tool descriptions and tool outputs.</strong> Anything an MCP server returns can carry instructions the agent might follow. The defenses are still maturing.</p></li><li><p><strong>Knowing what you&#8217;re actually running.</strong> When you <code>npx</code> or <code>go install</code> an MCP server, there&#8217;s no built-in way to confirm that the binary you got matches the source code the README points to. Someone could publish a package, tag it <code>v1.0</code>, and quietly swap the contents, and you&#8217;d have no easy way to tell. The registry layer that would solve this is half-built.</p></li><li><p><strong>Token discipline.</strong> &#8220;MCP eats tokens&#8221; is a meme. It&#8217;s also true. The fix isn&#8217;t fewer servers; it&#8217;s the right servers in the right context.</p></li></ul><p>And nobody talked about building both. That&#8217;s the part I find strange. Some domains want to be discovered (MCP). Some want to be invoked (CLI). Most want to be explained (skills). The stack is three layers deep. The interesting work happens at the seams.</p>]]></content:encoded></item><item><title><![CDATA[I deleted 2,700 lines from my AI Skills. They got better.]]></title><description><![CDATA[Everyone writes about building skills.]]></description><link>https://olgasafonova.substack.com/p/i-deleted-2700-lines-from-my-ai-skills</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/i-deleted-2700-lines-from-my-ai-skills</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Tue, 14 Apr 2026 06:16:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!NB3F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Everyone writes about building skills. Nobody writes about what happens to them six months later.</p><p>Sixty-four Claude Code skills, accumulated since October. Product research, content publishing, MCP server development, sprint planning. Some run daily. Some I&#8217;d forgotten about until I opened them this week and found instructions addressed to a model that no longer exists.</p><h2>Every skill is a snapshot</h2><p>Anthropic published an engineering post this week about their <a href="https://www.anthropic.com/engineering/managed-agents">managed agents architecture</a>. Most of it is infrastructure plumbing. But one line stopped me: &#8220;context anxiety&#8221; &#8212; Claude wrapping up work prematurely near context limits &#8212; existed in Sonnet 4.5 and disappeared in Opus 4.5.</p><p>The workaround remained. Nobody removed it. It sat there, compensating for a problem the model had already solved.</p><p>Skills are scaffolding. Every skill wraps the model in assumptions about what it can and can&#8217;t do at the time of writing. When the model improves, those assumptions don&#8217;t update themselves. They sit there, consuming tokens and solving yesterday&#8217;s problems.</p><p>This is assumption debt. Tech debt&#8217;s quieter cousin. It doesn&#8217;t crash anything. It fills the context window with instructions nobody needs, crowding out the space where actual work happens. Across my library, that added up to roughly 18,000 tokens of dead instructions the model was dutifully reading on every invocation.</p><h2>What it looks like</h2><p>I ran an audit across all 64 skills. Eight parallel agents, each with its own worktree and a SKILL.md to evaluate &#8212; Claude Code auditing its own skill library. The signals were consistent:</p><p><strong>Defensive instructions that restate native model behaviour.</strong> &#8220;Do NOT hallucinate.&#8221; &#8220;Do NOT skip steps.&#8221; &#8220;Make sure to check X.&#8221; Written when models actually did skip and hallucinate more. Noise now. The model equivalent of telling a senior engineer to remember to save their files.</p><p><strong>Micro-step decomposition.</strong> Breaking a simple reasoning task into seven numbered steps because an earlier model couldn&#8217;t hold the full chain. Opus 4.6 handles multi-step reasoning without scaffolding. The steps become a straitjacket.</p><p><strong>Negative instructions restating positive ones.</strong> A skill that says &#8220;Present scope options as genuine choices&#8221; in one section, then says &#8220;DON&#8217;T present Option A when a fixed customer deadline makes it risky&#8221; ten lines later. The second instruction adds zero information. It exists because an earlier model missed the implication.</p><p>And my personal favourite: motivational scaffolding. One skill contained the line &#8220;This is normal! Don&#8217;t be discouraged.&#8221; I was coaching a language model through its feelings.</p><h2>The taxonomy</h2><p>Not everything that looks like scaffolding is debt. Every guardrail falls into one of three categories:</p><p><strong>Stale assumptions.</strong> Workarounds for model weaknesses that have been fixed. Safe to remove.</p><p><strong>Earned constraints.</strong> Rules that exist because the skill failed without them, and the failure mode is still possible. My research skill has an Evidence Ledger step that forces the model to show sources before writing an answer. I added it after the model kept producing plausible-sounding answers with no verification. Opus 4.6 is smarter, but the verification step catches domain-specific traps the model can&#8217;t know about: incomplete wiki coverage, API quirks, search snippets that look like evidence but aren&#8217;t. The constraint earned its place.</p><p><strong>Domain constraints.</strong> Knowledge the model genuinely can&#8217;t derive. &#8220;This API has specific operations; check the contract, not what seems reasonable.&#8221; No model improvement eliminates this.</p><p>Trim earned constraints because they look stale, and your skill regresses. Keep stale assumptions because they feel earned, and your skill wastes tokens for no reason.</p><p>I got this wrong during the audit. Pass 1 removed a deduplication check from my content evaluation skill. It forced the model to verify against existing notes before writing new ones. Looked like hand-holding for a model that should know better. Two days later, the skill produced a knowledge note that nearly duplicated one from the previous week. The guardrail wasn&#8217;t compensating for a weak model. It was compensating for a large vault where relevant context doesn&#8217;t always surface on the first pass. Back it went.</p><p>The obvious objection: guardrails are cheap insurance. Tokens cost fractions of a cent. Why risk it? Because stale guardrails don&#8217;t just waste tokens. They constrain behaviour. A skill full of &#8220;DO NOT&#8221; instructions produces cautious, hedged output &#8212; not because the model needs the reminder, but because the instructions set the tone. Assumption debt makes the model worse at the thing the skill is supposed to do.</p><h2>The numbers</h2><p>Before the audit, I ran the library through <a href="https://getskillcheck.com">SkillCheck Pro</a>, which validates 22 categories of skill quality. Several categories surface assumption debt directly. The railroading detector counts prescriptive phrases: &#8220;you must always,&#8221; &#8220;never deviate,&#8221; &#8220;follow these exact steps.&#8221; Five or more in a single skill and it fires. That&#8217;s the mechanical signal for what the assumption audit confirms through judgment: over-scaffolding. The token budget audit makes the cost visible. The anti-slop detector catches hedge stacking and sycophantic openers baked into skill instructions, teaching the model bad habits on every call.</p><p>SkillCheck tells you a skill is well-formed. The assumption audit tells you it&#8217;s well-calibrated for the current model. Different questions. Both necessary.</p><p>Then three passes across one afternoon.</p><p>Pass 1 cut 1,900 lines. Deleted two skills entirely (a pandoc wrapper the model handles natively, an incomplete stub). Trimmed five skills by 80%+ each. Merged one n8n skill into its parent.</p><p>Pass 2 cut 125 lines from the three worst offenders. My feature-scoping skill went from 314 lines to 226. The before/after:</p><pre><code><code>BEFORE: 5 quality gates, each stated FIVE times
  - Inline in each phase (the actual rules)
  - Hard Gates Reference table (same 5 rules, tabular)
  - Evaluation Criteria section (same 5 rules, prose)
  - Success Criteria section (same 5 rules, conditional)
  - DO/DON'T section (same 5 rules, imperative)

AFTER: 5 quality gates, stated once
  - Inline in each phase (the actual rules)
  - Gotchas section (4 domain-specific items)
</code></code></pre><p>Four copies of the same five rules. Not variations. Not refinements. The same words in five different containers, like finding five identical corkscrews in a kitchen drawer, each bought because you forgot you already had one.</p><p>Pass 3 cut 377 lines across 16 skills. Smaller cuts accumulated between the formal passes as I noticed patterns the structured audit missed.</p><p>Total: roughly 2,700 lines, ~14% of the library.</p><h2>Why this keeps happening</h2><p>The creation pipeline has seven phases. The maintenance pipeline has zero.</p><p>Skills collect guardrails the way drawers collect utensils. You build one, it works mostly. Fails on an edge case, you add a guardrail. Different edge case, another guardrail. Model upgrade ships and half those edge cases vanish, but you don&#8217;t know which half. The guardrails stay. Six months later you have a 314-line skill where 135 lines are meta-commentary about the same five rules.</p><p>I wrote about <a href="https://olgasafonova.substack.com/p/a-prompt-is-something-you-type-a">the difference between a prompt and a skill</a>. Turns out there&#8217;s also a difference between building one and keeping it honest.</p><h2>The audit question</h2><p>For each guardrail, ask: &#8220;Is this compensating for a model weakness, or encoding domain knowledge?&#8221;</p><p>If it&#8217;s a model weakness: has it been fixed? Remove the guardrail. Run the skill. If it still works, the guardrail was debt.</p><p>If it&#8217;s domain knowledge: keep it. No model improvement will teach the model that your internal wiki has coverage gaps or that your API has undocumented quirks.</p><p>If you&#8217;re not sure: it&#8217;s probably debt. Earned constraints are memorable. You remember the failure that created them. Stale assumptions are invisible &#8212; added as a precaution, never tested without.</p><p><strong>When to audit:</strong> Every time a new model drops. A model upgrade is an assumption invalidation event. Half your guardrails may have just become dead weight, and you won&#8217;t know which half until you check.</p><p><strong>Try this.</strong> Pick your most-used skill. Find one guardrail that talks to the model instead of about the domain. Remove it. Run the skill. Did anything change?</p><h2>Beyond skills</h2><p>Assumption debt lives wherever code wraps a language model. System prompts, RAG pipelines, agent workflows, retry loops, preprocessing steps &#8212; all of it encodes assumptions about the model&#8217;s capabilities at the time of writing. All of it goes stale at the same rate: one model release at a time. The taxonomy is the same everywhere. The audit question is the same. Most people discover this the way I did: not by looking, but by tripping over something that should have been obvious months ago.</p><p>The model improved. The harness didn&#8217;t notice.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NB3F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NB3F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png 424w, https://substackcdn.com/image/fetch/$s_!NB3F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png 848w, https://substackcdn.com/image/fetch/$s_!NB3F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png 1272w, https://substackcdn.com/image/fetch/$s_!NB3F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NB3F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png" width="1200" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1164364,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/193999708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NB3F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png 424w, https://substackcdn.com/image/fetch/$s_!NB3F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png 848w, https://substackcdn.com/image/fetch/$s_!NB3F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png 1272w, https://substackcdn.com/image/fetch/$s_!NB3F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41443121-6308-4765-bc90-a1a80b8e5cbe_1200x630.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Intent Doesn't Parse]]></title><description><![CDATA[Stripe&#8217;s AI agents ship 1,300 pull requests every week.]]></description><link>https://olgasafonova.substack.com/p/intent-doesnt-parse</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/intent-doesnt-parse</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Tue, 07 Apr 2026 08:15:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!40hO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://stripe.com/">Stripe</a>&#8217;s AI agents ship 1,300 pull requests every week. The secret has nothing to do with AI.</p><p>Six years ago, Stripe&#8217;s developer productivity team wrote comprehensive docs, blessed paths for common tasks, and robust CI/CD. When AI agents arrived, they followed the same documentation that human engineers use. No parallel infrastructure. No special prompts.</p><p>Steve Kaliski, the engineer behind Stripe&#8217;s Minions system, <a href="https://www.lennysnewsletter.com/p/this-week-on-how-i-ai-how-stripe">explains this</a> in Lenny Rachitsky&#8217;s &#8220;How I AI&#8221; series like it&#8217;s the most boring observation in the world. Of course the agents use the same docs. What else would they use?</p><p>That &#8220;of course&#8221; is doing a lot of work. Because most organizations treat agent infrastructure as a separate problem from developer experience. Separate teams. Separate budgets. Separate docs. Stripe&#8217;s insight is that the separation is the problem.</p><h2>The new hire who never leaves onboarding</h2><p>The reason Stripe&#8217;s docs work for agents isn&#8217;t that they&#8217;re &#8220;good.&#8221; Plenty of companies have good docs. The reason is specific: Stripe&#8217;s docs were written for someone who knows nothing.</p><p>Every blessed path assumes the reader just joined. Here&#8217;s the repo. Here&#8217;s how you add an API field. Here&#8217;s what CI checks before your code ships. The docs don&#8217;t assume you were in the room when the architecture was decided. They don&#8217;t assume you know which Slack channel has the context. They externalize what most teams leave implicit.</p><p>AI agents are the extreme version of that new hire. Zero institutional memory. Zero hallway conversations. Zero sense of &#8220;we tried that in Q3 and it didn&#8217;t work.&#8221; An agent reads what you wrote down and nothing else.</p><p>Stripe&#8217;s docs passed the agent test because they&#8217;d already been passing the new-hire test for years. The investment that mattered most was made before agents existed in their workflow.</p><p>One detail from the same conversation that deserves its own paragraph. Every one of those 1,300 PRs still requires human review. The bottleneck didn&#8217;t vanish. It moved. Code production is cheap now. Judgment is the constraint. Good DX didn&#8217;t eliminate expensive work; it relocated it.</p><h2>Where intent disappears</h2><p>I build MCP servers. Each one exposes tools that AI agents discover and call. The agent never sees the Go code, the handler logic, or the tests. It sees a name, a description, and an input schema. That&#8217;s the entire relationship.</p><p>Here&#8217;s a tool description from my <a href="https://github.com/olgasafonova/miro-mcp-server">Miro MCP server</a>:</p><blockquote><p>Create a connector line between two items. Styles: straight, elbowed (default), curved. Caps: none, arrow, stealth, diamond, filled_diamond, oval, filled_oval, triangle, filled_triangle.</p></blockquote><p>It used to be better. The original version had USE WHEN clauses, parameter guidance, the works. Then I trimmed it for token efficiency. Shorter descriptions, smaller payloads, faster tool loading. A reasonable trade-off, except I never measured what I lost. The knowledge that made the tool selectable disappeared into a git diff, and I didn&#8217;t notice because I still had it in my head.</p><p>When Claude encounters this description, it has a decision to make: connector or shape? The description doesn&#8217;t help. Both &#8220;draw a line&#8221; and &#8220;connect two boxes&#8221; are reasonable user requests. Both could plausibly map to either tool. So the agent guesses.</p><p>On my test board, there are three shapes in a row: &#8220;Start Test&#8221;, &#8220;Pass?&#8221;, and &#8220;Success.&#8221; I asked Claude to draw a line from Start Test to Success. The connector description says nothing about when to use it. The shape description, which already had USE WHEN clauses, explicitly mentioned &#8220;draw a...&#8221; requests. Claude picked <code>miro_create_shape</code> and placed a long, thin rectangle between the two boxes. Visually, it looked like a line. In the data model, it was a rectangle. Not a connector. Not part of the diagram&#8217;s logical structure. The board looked right. The data was wrong.</p><p>I blamed the model. The blame was misplaced. The description was technically correct and operationally useless.</p><p><a href="https://blog.murphytrueman.com/what-your-components-look-like-as-data">Murphy Trueman</a>, writing about design systems, identified the same pattern in a different domain. Designers create buttons in Figma and see buttons. The design system sees structured data. The designer&#8217;s intent is embedded in layers of implicit structure that only become visible when someone who wasn&#8217;t in the room tries to consume them.</p><p>MCP tools have the same hidden architecture. The server author sees a function call. The agent sees a data object: name as semantic label, description as intent signal, input schema as parameter contract, required-versus-optional as constraint boundary. Yes, the JSON schema contributes too; it constrains what&#8217;s valid. But the description determines whether the agent shows up at all. Selection happens before validation. The code behind the description might as well not exist.</p><p>The gap between what you know your tool does and what the description communicates to a consumer with zero context; that&#8217;s where agent failures live. I call it <strong>&#8220;intent doesn&#8217;t parse.&#8221;</strong> Your intent is real. It just didn&#8217;t survive the journey from your head to the description string.</p><p>Trueman has a D&amp;D analogy for this: a Dungeon Master who shuts down player actions because &#8220;it&#8217;s not in the book&#8221; doesn&#8217;t just fail that session. Players learn to stop attempting anything creative. The documented world shrinks to the documented edges. Vague tool descriptions train agents the same way. Over a session, the agent learns which tools produce predictable results and avoids the rest. Ambiguity doesn&#8217;t just cause errors. It narrows the agent&#8217;s world.</p><h2>What the agent reads when it gets it right</h2><p>A different tool on the same server:</p><blockquote><p>Create a shape on a Miro board.</p><p>USE WHEN: User says &#8220;add a rectangle&#8221;, &#8220;draw a circle&#8221;, &#8220;create a box for X&#8221;</p><p>SHAPE TYPES:</p><ul><li><p>Basic: rectangle, round_rectangle, circle, triangle, rhombus</p></li><li><p>Flow: parallelogram, trapezoid, pentagon, hexagon, star</p></li><li><p>Flowchart: flow_chart_predefined_process, wedge_round_rectangle_callout</p></li></ul><p>PARAMETERS:</p><ul><li><p>board_id: Required. Get from list_boards or find_board</p></li><li><p>shape: Shape type (required, default: rectangle)</p></li><li><p>content: Text inside shape</p></li><li><p>color: Fill color (e.g., &#8220;#FF5733&#8221; or color name)</p></li><li><p>x, y: Position (default: 0, 0)</p></li><li><p>width, height: Size (default: 200, 200)</p></li></ul><p>RETURNS: Item ID, shape type, position, size, and view link.</p><p>RELATED: For flowchart-specific stencil shapes (experimental API), use miro_create_flowchart_shape instead.</p></blockquote><p>These two tools sit in the same file, <code>definitions.go</code>, thirty-eight lines apart. The connector used to look like this too. I trimmed it for token efficiency and improved other tools in the same month without going back to restore it. Two weeks between commits. The gap between &#8220;I optimized this&#8221; and &#8220;I should fix that&#8221; is where selection debt accumulates.</p><p>The difference isn&#8217;t length. It&#8217;s explicitness. USE WHEN tells the agent which user utterances should route here. SHAPE TYPES tells it what&#8217;s legal. PARAMETERS tells it what to bring and where to find prerequisites. RELATED tells it where to go instead.</p><p>The shape description passes the new-hire test. Someone who has never seen the codebase can read it and act correctly. The connector description doesn&#8217;t. Both are mine.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!40hO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!40hO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png 424w, https://substackcdn.com/image/fetch/$s_!40hO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png 848w, https://substackcdn.com/image/fetch/$s_!40hO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png 1272w, https://substackcdn.com/image/fetch/$s_!40hO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!40hO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png" width="1200" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1145035,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/193185757?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!40hO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png 424w, https://substackcdn.com/image/fetch/$s_!40hO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png 848w, https://substackcdn.com/image/fetch/$s_!40hO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png 1272w, https://substackcdn.com/image/fetch/$s_!40hO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b69ac1-5507-4cf5-b3d2-4a5bc28310cb_1200x630.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The realization that changed how I write tool descriptions: I&#8217;m not documenting a function. I&#8217;m writing onboarding material for a colleague who will never ask a follow-up question. Every implicit assumption is a place where that colleague will guess. And guessing compounds. When you have dozens of tools across several servers, each ambiguous description makes every other tool slightly harder to choose correctly. That compound tax is what I&#8217;ve started calling selection debt: the accumulated cost of descriptions that are accurate but opaque.</p><h2>Write for the reader who can&#8217;t ask</h2><p>Stripe didn&#8217;t set out to build agent infrastructure. They set out to make their platform legible to someone who just walked in the door.</p><p>I didn&#8217;t set out to build agent-friendly tool descriptions. I set out to stop Claude from picking the wrong tool.</p><p>Same mechanism. Same fix. Write for the reader who has no context, and you accidentally write for every future consumer, including the ones that don&#8217;t exist yet.</p><p><strong>Good DX = Good Agent DX.</strong> Not because agents are special. Because agents are the most demanding version of the reader you should have been writing for all along.</p><p>Pick one tool description. Read it as someone who has never seen your codebase, has infinite patience, and cannot ask a clarifying question. Does the intent survive? That&#8217;s your health check.</p><p></p>]]></content:encoded></item><item><title><![CDATA[CLAUDE.md is the New Onboarding Doc]]></title><description><![CDATA[Every company has an onboarding doc.]]></description><link>https://olgasafonova.substack.com/p/claudemd-is-the-new-onboarding-doc</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/claudemd-is-the-new-onboarding-doc</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Tue, 24 Mar 2026 07:46:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!u8NY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u8NY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u8NY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!u8NY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!u8NY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!u8NY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u8NY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:684661,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/191705867?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!u8NY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!u8NY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!u8NY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!u8NY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f46dff-9d1e-40c1-becb-493112b335c8_1376x768.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Every company has an onboarding doc. A wiki page or a shared Google Doc titled &#8220;Getting Started&#8221; or &#8220;New Developer Guide.&#8221; It was accurate when someone wrote it. That was eleven months ago. Three APIs have changed since then. The testing workflow section references a CI pipeline that was replaced in Q3. Nobody updated it because updating docs isn&#8217;t anyone&#8217;s KPI.</p><p>You know how this plays out. The new hire reads the doc, follows the steps, hits an error on step 4, asks a colleague, gets the current answer verbally, moves on. The doc stays wrong. The next new hire hits the same wall.</p><p>Onboarding docs don&#8217;t onboard people. People onboard people. The doc is a prop, a thing you hand someone so the handoff feels structured. The actual knowledge transfer happens over Slack, in pairing sessions, through the particular inflection a senior engineer uses when she says &#8220;oh, we don&#8217;t do it that way anymore.&#8221;</p><h2>The inversion</h2><p>When your AI coding assistant reads a <code>CLAUDE.md</code> file, it doesn&#8217;t skim and forget. It follows the instructions. Every session, without variance or fatigue. The instruction is the enforcement.</p><p>Most people see this and think: great, I can document my project conventions and Claude will follow them. True, but it misses the more interesting thing happening underneath.</p><p>You&#8217;re not onboarding the person. You&#8217;re onboarding the AI. The human benefits because they work <em>through</em> the AI. The new hire who clones a repo with a well-maintained CLAUDE.md doesn&#8217;t need to find the wiki page or extract tribal knowledge from a colleague. They type a natural language request and the AI already knows the conventions, the correct endpoints, the deployment sequence. The onboarding happened before the human arrived.</p><p>Brian Leven, a designer at Notion, built exactly this for his team. A committed <code>CLAUDE.md</code> with team-wide conventions, plus a gitignored <code>claude.local.md</code> for personal preferences. New designers clone the repo and their AI assistant knows the coding standards, component naming, deploy workflow from minute one.</p><p>His principle: &#8220;Anytime the AI asks you to do something, try your best to see if you could teach the AI to answer that question for itself.&#8221;</p><p>Every question a teammate asks becomes a slash command. Every recurring mistake becomes a rule. The onboarding surface shrinks with each encoding, like a coastline retreating under steady erosion, except what&#8217;s left behind is bedrock.</p><h2>The expert system nobody planned</h2><p>Scale this up and something unexpected happens. I now run <a href="https://olgasafonova.substack.com/p/a-prompt-is-something-you-type-a">50 skills, 20 rule files, and 7 specialized agents</a> in Claude Code (up from 38 skills when I first wrote about the system). Together they form something that behaves like an expert system, except it&#8217;s markdown files in a git repo. Brand routing by hostname and project path. Procurement response drafting from wiki and source code. Code review with hard gates the reviewer agent cannot skip.</p><p>The expert systems of the 1980s died because nobody could afford a full-time knowledge engineer to keep the rules current. These rules live in the same repo as the code. When the code changes, the developer who changed it updates the rules in the same commit. The maintenance problem that killed an entire field of computer science, solved by proximity.</p><h2>The rot problem</h2><p>Skills rot too. I <a href="https://olgasafonova.substack.com/p/a-prompt-is-something-you-type-a">wrote about this</a>: after about thirty skills, quality drifted. Contradictory instructions, vague trigger phrases, empty sections. An executable onboarding system with contradictory instructions is worse than a stale wiki page. The wiki page is obviously wrong. The contradictory skill <em>looks</em> like it&#8217;s working and silently does the wrong thing. Quiet failure is always more dangerous than loud failure.</p><p>So I built <a href="https://getskillcheck.com">SkillCheck</a>. The <a href="https://github.com/olgasafonova/SkillCheck-Free">free tier</a> validates skills against the <a href="https://agentskills.io/specification">agentskills.io spec</a>: structure, naming, semantic consistency. The <a href="https://getskillcheck.com">pro tier</a> adds anti-slop detection, security scanning, token budget analysis, and enterprise readiness checks. A linter for your AI&#8217;s curriculum.</p><h2>Start with one rule</h2><p>You don&#8217;t need fifty skills. You need one rule that solves a real problem.</p><p>Find the thing your team explains verbally to every new person. &#8220;Oh, we don&#8217;t use that endpoint anymore.&#8221; &#8220;Make sure you run linting before pushing.&#8221; &#8220;The staging URL changed last month.&#8221;</p><p>Write it as a CLAUDE.md instruction. Watch it enforce itself. Notice when the next person doesn&#8217;t need to ask. Then write the next one. Validate it.</p><p>Somewhere around skill thirty, you stop maintaining documentation and start curating an institution&#8217;s memory. The curious part is that the institution doesn&#8217;t notice. It just stops losing knowledge.<br><br><em>Brian Leven&#8217;s prototype playground for Notion&#8217;s design team was discussed on the <a href="https://howiiaipod.com">How I AI podcast</a> with Claire Vo. <a href="https://github.com/olgasafonova/SkillCheck-Free">SkillCheck Free</a> is open source. <a href="https://getskillcheck.com">SkillCheck Pro</a> adds anti-slop, security, and enterprise checks.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://olgasafonova.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://olgasafonova.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Fewer Things, Better Described]]></title><description><![CDATA[Selection debt and the discipline of subtraction]]></description><link>https://olgasafonova.substack.com/p/fewer-things-better-described</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/fewer-things-better-described</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Wed, 11 Mar 2026 07:45:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1SaT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1SaT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1SaT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!1SaT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!1SaT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!1SaT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1SaT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1498772,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/190214160?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1SaT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!1SaT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!1SaT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!1SaT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63cc7d6-64ea-4b36-90b3-8a05e2fd1091_1376x768.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;ve built lots of tools across several MCP servers. The removals taught me more.<br></p><h1>The Paradox</h1><p>Here&#8217;s a number that shouldn&#8217;t exist: my <a href="https://github.com/olgasafonova/miro-mcp-server">Miro MCP server</a> has 88 tools. It didn&#8217;t start that way.</p><p>The growth wasn&#8217;t planned. Each time Claude got smarter, it attempted more ambitious workflows, and more ambitious workflows hit more edges: authentication flows, proprietary JSON schemas, approval chains that require three calls in a specific order, agents that could only read data suddenly trying to write it, agents that handled one API trying to orchestrate five, each expansion creating new integration points that needed new bridges. Every edge needed a new tool.</p><p>But here&#8217;s what nobody in the MCP ecosystem talks about: of those 88 tools, some are excellent. Some are adequate. And some could disappear without anyone noticing.</p><h1><br>The Invisible Problem: Selection Debt</h1><p><a href="https://softwaredoug.com/">Doug Turnbull</a>, who led Search at Reddit and Shopify, replaced a sophisticated retrieval pipeline with BM25 and a reasoning loop. On public benchmarks (Wayfair WANDS, Amazon ESCI), search relevance went up <a href="https://hugobowne.substack.com/p/how-to-build-your-first-agentic-search">15-30% NDCG</a>.</p><p>BM25 is a keyword matching algorithm from 1994. It counts terms. It doesn&#8217;t understand semantics. And it beat the sophisticated pipeline.</p><p>The punchline, from <a href="https://hugobowne.substack.com/">Hugo Bowne-Anderson&#8217;s</a> Vanishing Gradients newsletter: the dumb tool won because the agent could understand it. When BM25 returns bad results, the agent knows exactly what happened. It searched for &#8220;bistro table&#8221; and got patio furniture. Keywords matched literally, so the agent can reformulate. When a vector search returns bad results, the agent has no idea why. The retrieval logic lives in embedding space. The agent can&#8217;t debug what it can&#8217;t observe.</p><p>This principle doesn&#8217;t stop at retrieval. It lives in your MCP tool descriptions.</p><p>Most MCP tool descriptions tell the LLM what a tool does. Accurate, and completely unhelpful. Here&#8217;s one from my own server:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AVfK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F375f1187-9c3b-4459-955a-cbc63eac5e43_1394x454.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AVfK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F375f1187-9c3b-4459-955a-cbc63eac5e43_1394x454.png 424w, https://substackcdn.com/image/fetch/$s_!AVfK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F375f1187-9c3b-4459-955a-cbc63eac5e43_1394x454.png 848w, https://substackcdn.com/image/fetch/$s_!AVfK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F375f1187-9c3b-4459-955a-cbc63eac5e43_1394x454.png 1272w, https://substackcdn.com/image/fetch/$s_!AVfK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F375f1187-9c3b-4459-955a-cbc63eac5e43_1394x454.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AVfK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F375f1187-9c3b-4459-955a-cbc63eac5e43_1394x454.png" width="1394" height="454" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/375f1187-9c3b-4459-955a-cbc63eac5e43_1394x454.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:454,&quot;width&quot;:1394,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:88231,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/190214160?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F375f1187-9c3b-4459-955a-cbc63eac5e43_1394x454.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AVfK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F375f1187-9c3b-4459-955a-cbc63eac5e43_1394x454.png 424w, https://substackcdn.com/image/fetch/$s_!AVfK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F375f1187-9c3b-4459-955a-cbc63eac5e43_1394x454.png 848w, https://substackcdn.com/image/fetch/$s_!AVfK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F375f1187-9c3b-4459-955a-cbc63eac5e43_1394x454.png 1272w, https://substackcdn.com/image/fetch/$s_!AVfK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F375f1187-9c3b-4459-955a-cbc63eac5e43_1394x454.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The LLM knows the capability. It has no idea when to pick this over <code>miro_create_shape</code> when someone says &#8220;draw a line between these.&#8221; It can&#8217;t tell what happens when an item ID doesn&#8217;t exist on the board. The description is correct. It&#8217;s also opaque.</p><p><strong>Selection debt accumulates when tool descriptions are technically correct but operationally ambiguous, causing LLMs to pick the wrong tool.</strong> Each misselection looks like an LLM mistake, not a tooling problem. You blame the model. You pile on system prompt instructions. The real fix was in the description the whole time.</p><p>The clearest evidence came from comparing two of my own servers. Same hands. Different maturity. The <a href="https://github.com/olgasafonova/gleif-mcp-server">gleif-mcp-server</a> has full USE WHEN and FAILS WHEN clauses on every tool:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LnYo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F723f2a49-8c1a-4aca-8b49-30b0d600e263_1390x916.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LnYo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F723f2a49-8c1a-4aca-8b49-30b0d600e263_1390x916.png 424w, https://substackcdn.com/image/fetch/$s_!LnYo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F723f2a49-8c1a-4aca-8b49-30b0d600e263_1390x916.png 848w, https://substackcdn.com/image/fetch/$s_!LnYo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F723f2a49-8c1a-4aca-8b49-30b0d600e263_1390x916.png 1272w, https://substackcdn.com/image/fetch/$s_!LnYo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F723f2a49-8c1a-4aca-8b49-30b0d600e263_1390x916.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LnYo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F723f2a49-8c1a-4aca-8b49-30b0d600e263_1390x916.png" width="1390" height="916" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/723f2a49-8c1a-4aca-8b49-30b0d600e263_1390x916.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:916,&quot;width&quot;:1390,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:195517,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/190214160?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F723f2a49-8c1a-4aca-8b49-30b0d600e263_1390x916.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LnYo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F723f2a49-8c1a-4aca-8b49-30b0d600e263_1390x916.png 424w, https://substackcdn.com/image/fetch/$s_!LnYo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F723f2a49-8c1a-4aca-8b49-30b0d600e263_1390x916.png 848w, https://substackcdn.com/image/fetch/$s_!LnYo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F723f2a49-8c1a-4aca-8b49-30b0d600e263_1390x916.png 1272w, https://substackcdn.com/image/fetch/$s_!LnYo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F723f2a49-8c1a-4aca-8b49-30b0d600e263_1390x916.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The description doesn&#8217;t just describe a capability. It gives the agent a reasoning model: what to call the tool for, what to try when it fails, where to go instead.</p><p>The WHY dimension is the most underused. In my <a href="https://github.com/olgasafonova/nordic-registry-mcp-server">nordic-registry-mcp-server</a>, the Danish CVR API returns exactly one company per search query. Searching &#8220;Tietoevry&#8221; returns TIETOEVRY DK A/S, a company with 11 employees. Searching &#8220;Tietoevry Denmark&#8221; returns TIETOEVRY DENMARK A/S, a completely different legal entity with 56 employees.  Without knowing why, an agent accepts the first result. With WHY embedded in the description:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LY-F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc654da-528b-4ccb-b446-765a17a5b0d8_1394x712.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LY-F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc654da-528b-4ccb-b446-765a17a5b0d8_1394x712.png 424w, https://substackcdn.com/image/fetch/$s_!LY-F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc654da-528b-4ccb-b446-765a17a5b0d8_1394x712.png 848w, https://substackcdn.com/image/fetch/$s_!LY-F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc654da-528b-4ccb-b446-765a17a5b0d8_1394x712.png 1272w, https://substackcdn.com/image/fetch/$s_!LY-F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc654da-528b-4ccb-b446-765a17a5b0d8_1394x712.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LY-F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc654da-528b-4ccb-b446-765a17a5b0d8_1394x712.png" width="1394" height="712" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1bc654da-528b-4ccb-b446-765a17a5b0d8_1394x712.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:712,&quot;width&quot;:1394,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:151635,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/190214160?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc654da-528b-4ccb-b446-765a17a5b0d8_1394x712.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LY-F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc654da-528b-4ccb-b446-765a17a5b0d8_1394x712.png 424w, https://substackcdn.com/image/fetch/$s_!LY-F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc654da-528b-4ccb-b446-765a17a5b0d8_1394x712.png 848w, https://substackcdn.com/image/fetch/$s_!LY-F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc654da-528b-4ccb-b446-765a17a5b0d8_1394x712.png 1272w, https://substackcdn.com/image/fetch/$s_!LY-F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc654da-528b-4ccb-b446-765a17a5b0d8_1394x712.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Three debugging strategies from one description. The agent that reads this knows the API is opaque by design, knows to try variations, and knows there&#8217;s a direct lookup if it has a CVR number.</p><p>The same principle operates at both layers. At retrieval: &#8220;this is BM25, it matches keywords literally&#8221; - the agent adjusts its query. At the tool layer: &#8220;this fails when the LEI is invalid; try search_entity instead&#8221; - the agent adjusts its strategy. Opacity kills reasoning. Transparency feeds it.</p><h2>Five Dimensions of a Transparent Description</h2><p>The examples above illustrate USE WHEN, WHY, and FAILS WHEN. Here are all five dimensions, distilled from rewriting descriptions across seven servers:</p><ol><li><p><strong>USE WHEN</strong> tells the LLM which user intents should trigger this tool. Natural language phrases, not technical jargon.</p></li><li><p><strong>WHY</strong> tells the agent the mechanism behind the behavior, so it can debug failures instead of retrying blindly.</p></li><li><p><strong>FAILS WHEN</strong> covers specific failure modes with specific recovery paths. Not generic errors; conditions with next steps.</p></li><li><p><strong>INSTEAD</strong> routes the agent to sibling tools. Without explicit cross-references, the agent cycles randomly through your tool list.</p></li><li><p><strong>Limitations</strong> states hard boundaries the agent can&#8217;t work around: batch sizes, rate limits, field constraints.</p></li></ol><p>INSTEAD is the routing dimension. The <a href="https://github.com/olgasafonova/mediawiki-mcp-server">mediawiki-mcp-server</a> has <code>mediawiki_edit_page</code>, <code>mediawiki_find_replace</code>, and <code>mediawiki_apply_formatting</code>. Without routing, Claude used <code>edit_page</code> for everything, fetching and rewriting entire pages for a single text change. With explicit routing:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dQM7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F952005bf-8470-4a75-9865-321e5ed330ee_1398x794.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dQM7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F952005bf-8470-4a75-9865-321e5ed330ee_1398x794.png 424w, https://substackcdn.com/image/fetch/$s_!dQM7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F952005bf-8470-4a75-9865-321e5ed330ee_1398x794.png 848w, https://substackcdn.com/image/fetch/$s_!dQM7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F952005bf-8470-4a75-9865-321e5ed330ee_1398x794.png 1272w, https://substackcdn.com/image/fetch/$s_!dQM7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F952005bf-8470-4a75-9865-321e5ed330ee_1398x794.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dQM7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F952005bf-8470-4a75-9865-321e5ed330ee_1398x794.png" width="1398" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/952005bf-8470-4a75-9865-321e5ed330ee_1398x794.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1398,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:184318,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/190214160?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F952005bf-8470-4a75-9865-321e5ed330ee_1398x794.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dQM7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F952005bf-8470-4a75-9865-321e5ed330ee_1398x794.png 424w, https://substackcdn.com/image/fetch/$s_!dQM7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F952005bf-8470-4a75-9865-321e5ed330ee_1398x794.png 848w, https://substackcdn.com/image/fetch/$s_!dQM7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F952005bf-8470-4a75-9865-321e5ed330ee_1398x794.png 1272w, https://substackcdn.com/image/fetch/$s_!dQM7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F952005bf-8470-4a75-9865-321e5ed330ee_1398x794.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>An opaque description gives the agent nothing to work with. It selects, fails, retries, fails again.</p><h2>The Uncomfortable Audit: Tool-Shaped Objects</h2><p><a href="https://x.com/willmanidis/status/2021655191901155534">Will Manidis</a>, the CEO of Benchling, coined a term that stopped me mid-scroll: &#8220;tool-shaped objects.&#8221; Things that look, feel, and are marketed as tools but don&#8217;t change reality. They produce the sensation of productivity.</p><p>I&#8217;ve built a few. Embarrassing to admit, but useful to know.</p><p>The test is simple. Remove the tool from the chain. Does the final output change? If not, it&#8217;s a tool-shaped object. I call this the subtraction test.</p><p>I ran it against the Miro server. Most tools passed. One failed outright. Thirteen sat in the middle.</p><p>The gradient category is the uncomfortable one. These are tools that sometimes change the output, sometimes don&#8217;t. <code>miro_get_board_summary</code> exists alongside <code>miro_get_board</code>. Both return board info. The summary exists &#8220;for convenience.&#8221; Does it change the final output? Depends on the caller. Depends on the workflow. These tools aren&#8217;t obviously broken. They aren&#8217;t obviously essential.</p><p>The single fail was <code>miro_ungroup</code>. I pruned it. No user complained. No workflow broke. It had been dead weight for months, riding along like a vestigial organ.</p><p>Tool-shaped objects and selection debt compound each other. Every tool-shaped object in the listing makes the real tools harder to find. The LLM spends tokens considering it. Sometimes selects it. The tool-shaped object didn&#8217;t just fail to help; it made every other tool slightly worse by existing.</p><h2>Perfection by Subtraction</h2><p>Dieter Rams shaped Braun products for decades and distilled his philosophy to four words: <em>&#8220;Weniger, aber besser.&#8221;</em> Less, but better.</p><p>The subtraction test operationalizes this for tool builders. The audit isn&#8217;t finding what to add. It&#8217;s finding what to remove until only the essential remains. The gradient tools from the Miro audit sit in the hardest territory: not obviously broken, not obviously essential. The design discipline is having the nerve to remove them anyway.</p><p>Pruning is the most underrated practice in tool-building. Removing tools is harder than adding them because every removal feels like losing capability. It&#8217;s not. It&#8217;s gaining signal. Anyone can add a tool. Knowing which to remove requires understanding the whole system: how tools interact, which ones the LLM reaches for first, where token budgets get wasted on tools that produce nothing.</p><p>Removal is where the taste lives.</p><h1>The Craft Layer: Taste as Specification</h1><p><a href="https://www.paulgraham.com/taste.html">Paul Graham</a> defined taste as &#8220;intolerance for ugliness combined with the ability to fix it.&#8221; In 2026, when AI generates most of my code, taste isn&#8217;t about writing beautiful functions. It&#8217;s about writing beautiful specifications.</p><p>Your ToolSpec descriptions, your routing annotations, your CLAUDE.md constraints: these are your taste, expressed as text the machine reads. Not the handler code; that&#8217;s execution. Not the LLM; that&#8217;s following instructions. The person writing the description decides what &#8220;good&#8221; means for this tool.</p><p>Each NOT FOR clause is someone saying: &#8220;I&#8217;ve watched this agent fail fifty times, and here&#8217;s what I know about the right path.&#8221; Hard-earned judgment, encoded as text.</p><p>Pattern drift is the architectural version of losing taste. My <a href="https://github.com/olgasafonova/miro-mcp-server">miro-mcp-server</a> has generics, panic recovery, and audit logging in its handler wrapper. My newer servers have none of those. Same hands, same year, different maturity. The improvement in one project didn&#8217;t flow back to the others. When you stop redesigning, you stop applying taste. The codebase drifts toward whatever shipped last, not toward what&#8217;s best.</p><p>Graham wrote that &#8220;good design is redesign.&#8221; The <code>makeHandler</code> wrapper in the Miro server has been rewritten three times. Each time because something broke or annoyed me, not because I had a grand plan.</p><h2>The Bottleneck Rewards Craft</h2><p><a href="https://davidoks.blog/p/why-im-not-worried-about-ai-job-loss">David Oks</a> argues that AI capability isn&#8217;t what gates adoption. Regulations, office politics, API authentication, data format incompatibilities, security reviews: these are the actual constraints. They&#8217;re getting proportionally more important as AI gets smarter, not less. William Stanley Jevons saw the same dynamic in 1865: making steam engines more efficient didn&#8217;t reduce coal consumption. It increased it. Efficiency made steam power economical for new applications, and total demand grew.</p><p>One layer deeper, the same dynamic plays out. More capable AI agents create more demand for well-structured tools, not less. My Miro server didn&#8217;t grow to 88 tools because AI got dumber. It grew because smarter agents attempted more, hit more edges, and needed more bridges to cross them.</p><p>The people best positioned aren&#8217;t the ones building the smartest AI. They&#8217;re the ones who understand both the capability and the bottleneck. The Danish CVR API&#8217;s single-result limitation. The Norwegian business registry&#8217;s role data quirks. The mediawiki server&#8217;s routing logic, learned from watching Claude rewrite entire pages when it should have called find-and-replace. This knowledge is tacit, context-dependent, and earned through reps. No model upgrade gives you this.</p><p>Comparative advantage doesn&#8217;t require being better at everything. It requires being relatively better at the bottleneck.</p><p>The craft of tool-building appreciates as AI improves. Every time a model gets smarter, it attempts more, hits more edges, and needs better-described, better-pruned, better-designed tools.</p><p>The intelligence was never the bottleneck. I wonder how many tool-shaped objects are sitting in your server right now, quietly making every real tool a little harder to find.</p><h1>References</h1><ul><li><p><a href="https://softwaredoug.com/">Doug Turnbull</a> led Search at Reddit and Shopify. His BM25 + reasoning loop results appear in Hugo Bowne-Anderson&#8217;s <a href="https://hugobowne.substack.com/p/how-to-build-your-first-agentic-search">Vanishing Gradients</a> newsletter.</p></li><li><p><a href="https://davidoks.blog/p/why-im-not-worried-about-ai-job-loss">David Oks</a>, &#8220;Why I&#8217;m Not Worried About AI Job Loss.&#8221; Ricardian comparative advantage applied to AI.</p></li><li><p><a href="https://www.vitsoe.com/us/about/good-design">Dieter Rams</a>, &#8220;Ten Principles of Good Design.&#8221; Principle 10: &#8220;Good design is as little design as possible.&#8221;</p></li><li><p><a href="https://www.paulgraham.com/taste.html">Paul Graham</a>, &#8220;Taste for Makers.&#8221;</p></li><li><p><a href="https://x.com/willmanidis/status/2021655191901155534">Will Manidis</a>, &#8220;Tool-Shaped Objects&#8221; (X thread, Feb 2026).</p></li><li><p><a href="https://en.wikipedia.org/wiki/Jevons_paradox">William Stanley Jevons</a>, <em>The Coal Question</em> (1865). The paradox: efficiency increases total demand.</p></li><li><p>Portfolio: <a href="https://github.com/olgasafonova/miro-mcp-server">miro-mcp-server</a>, <a href="https://github.com/olgasafonova/gleif-mcp-server">gleif-mcp-server</a>, <a href="https://github.com/olgasafonova/nordic-registry-mcp-server">nordic-registry-mcp-server</a>, <a href="https://github.com/olgasafonova/mediawiki-mcp-server">mediawiki-mcp-server</a>, <a href="https://github.com/olgasafonova/productplan-mcp-server">productplan-mcp-server</a>.<br></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://olgasafonova.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">This Substack is reader-supported. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p></li></ul>]]></content:encoded></item><item><title><![CDATA[A prompt is something you type. A skill is something you ship.]]></title><description><![CDATA[I ran ls on my Claude Code skills directory last week.]]></description><link>https://olgasafonova.substack.com/p/a-prompt-is-something-you-type-a</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/a-prompt-is-something-you-type-a</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Sat, 28 Feb 2026 15:53:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vioV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vioV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vioV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png 424w, https://substackcdn.com/image/fetch/$s_!vioV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png 848w, https://substackcdn.com/image/fetch/$s_!vioV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png 1272w, https://substackcdn.com/image/fetch/$s_!vioV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vioV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png" width="1200" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:633922,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/189469998?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vioV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png 424w, https://substackcdn.com/image/fetch/$s_!vioV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png 848w, https://substackcdn.com/image/fetch/$s_!vioV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png 1272w, https://substackcdn.com/image/fetch/$s_!vioV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00893173-b5bb-4b40-97e6-4426f523418e_1200x630.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I ran <code>ls</code> on my Claude Code skills directory last week. Fifty-one files. Each one a markdown document that turns a general-purpose AI into a domain expert for one specific job.</p><p>The number itself means nothing. What matters is the shape of the thing, the way 51 separate acts of laziness, frustration, and repetition crystallized into something that resembles a nervous system for an organism that didn&#8217;t exist six months ago.</p><h1>What a skill actually is</h1><p>A Claude Code skill is a markdown file. That&#8217;s it. A prompt with metadata: trigger phrases, reference files, constraints. When you type `/today`, Claude doesn&#8217;t wonder what you mean. It loads the prompt, reads your calendar, checks your Obsidian to-do file, and drafts your standup. Every time, the same way, without the five-minute preamble of explaining your daily workflow.</p><p>The official term is &#8220;custom slash command.&#8221; Muscle memory for a thing that has no muscles and no memory.</p><p>There&#8217;s something worth pausing on here. The file format is .md. Markdown. The same format people use for READMEs nobody reads and documentation nobody updates. Yet inside a SKILL.md, a few hundred words of precise instruction can turn a general-purpose language model into a domain expert that knows your wiki URL structure, your team&#8217;s formatting preferences, your brand&#8217;s exact hex values. The gap between the container&#8217;s humility and its contents&#8217; power is almost comical.<code><br></code></p><h1>The taxonomy nobody planned</h1><p>I didn&#8217;t design a skill architecture. I solved a problem. Then another. Then I noticed clusters, the way you notice desire paths across a lawn only after the grass has already died.</p><p>Not all 51 are mine from scratch. Four were adopted or adapted from open-source repositories; several encode frameworks by people smarter than me. The rest grew out of specific irritations on specific afternoons.</p><p><strong>Research &amp; Investigation</strong> (5 skills)</p><p><code>lmwtfy</code> (let me wiki that for you) answers colleagues&#8217; questions about our products by searching the wiki, GitHub, and Azure DevOps. <code>bid-intel</code> drafts procurement responses. <code>deep-research</code> delegates to the OpenAI Deep Research API for topics that need real depth; originally from <a href="https://github.com/glebis/claude-skills">Gleb Kalinin&#8217;s skill library</a>, adapted for my workflow. <code>github-investigation</code> does code archaeology across repos. <code>investigate</code> builds on <code>lmwtfy</code>  and dispatches questions to an <a href="https://n8n.io/">n8n</a> agent that searches all three systems at once.</p><p><strong>Content &amp; Publishing</strong> (7 skills)</p><p><code>linkedin-viral-post-writer</code> creates LinkedIn posts. Although I tend to argue with it and often rewrite things in my own way. <code>publish</code> sends Obsidian notes to LinkedIn and Substack. <code>article-extractor</code> strips the ads and navigation chrome from URLs, using <a href="https://github.com/mozilla/readability">Mozilla&#8217;s Readability</a> algorithm under the hood. <code>youtube-transcript</code> downloads video transcripts. tapestry orchestrates three other skills into a single pipeline: extract content, transform it into a learning plan with <code>ship-learn-next</code>, ship an output. <code>sift</code> evaluates whether a piece of content is worth your time at all, before you commit to reading it.</p><p><strong>Visual Design &amp; Branding</strong> (8 skills)</p><p>Three separate brand systems (<code>brand-agency</code>, <a href="https://www.adsoptimizer.dev/">brand-adsoptimizer</a>,  <code>brand-assets</code>) because I work across multiple visual identities and the model will happily bleed one palette into another if you let it. <code>brand-agency</code>  is adopted from <a href="https://github.com/glebis/claude-skills">Gleb Kalinin&#8217;s skill library</a> and expanded. <code>nano-banana</code> generates images through Gemini, repackaged from <a href="https://fullstackpm.com/about">Carl Vellotti</a>&#8217;s <a href="https://ccforpms.com/nano-banana/welcome-first-generation">course</a> into a standalone skill. <code>diagram</code> produces Mermaid diagrams from natural language. <a href="https://github.com/chrisvoncsefalvay/claude-d3js-skill">d3js</a> creates interactive data visualizations. `find-asset` locates logos and icons by description so nobody hallucinates a file path. `slide-deck` builds presentations.</p><p><strong>n8n Automation</strong> (7 skills)</p><p>An entire knowledge base encoded as skills, built around <a href="https://www.linkedin.com/in/czlonkowski/">Romuald Czlonkowski</a>&#8217;s <a href="https://github.com/czlonkowski/n8n-mcp">n8n-mcp server</a>] and distilled from <a href="https://docs.n8n.io/">n8n&#8217;s documentation</a>. Workflow patterns, JavaScript and Python code node syntax, expression validation, node configuration, MCP tool guidance, error interpretation. Seven skills that together form a domain expert for a platform I work with daily. Czlonkowski&#8217;s server provides the tools; the skills provide the judgement for when and how to use them. Without either layer, every n8n session starts from first principles.</p><p><strong>DevOps &amp; Releases</strong> (4 skills)</p><p><code>enhanced-edoc-update</code> generates weekly stakeholder reports from Azure DevOps data. <code>release-prep</code> produces release notes. <code>publish-docs</code> syncs documentation to the team wiki. <code>vercel-deploy</code> deploys and returns a URL. (Full disclosure: <code>vercel-deploy</code> is adopted from <a href="https://github.com/ComposioHQ/awesome-claude-skills">Composio&#8217;s open-source skill library</a>, used as-is.)</p><p><strong>Product Strategy</strong> (4 skills)</p><p><code>feature-scoping</code> estimates sprint work. <code>triage-requests</code> organizes feature requests for prioritization. <code>edge-cases</code> identifies error states before development starts. <code>competitive</code> runs competitive analysis.</p><p><strong>Quality &amp; Meta</strong> (4 skills)</p><p>SkillCheck - free version at https://github.com/olgasafonova/SkillCheck-Free - validates skills against Anthropic&#8217;s agent skill guidelines; it&#8217;s free and open source. <a href="https://getskillcheck.com">SkillCheck Pro</a> adds anti-slop detection, security scanning, and enterprise readiness checks. Skills that check skills. <code>rhetoric-springs</code> detects rhetorical bias in text, built on Jeremy Bentham&#8217;s <a href="https://archive.org/details/b28738196">1817 taxonomy of persuasion mechanisms</a>. <br><code>mcp-builder</code> guides the creation of MCP servers; originally from <a href="https://github.com/ComposioHQ/awesome-claude-skills">Composio</a>, rewritten to v2.0 with Golang support and hard validation gates.</p><p><strong>Productivity</strong> (6 skills)</p><p><code>today</code> preps daily standups. <code>xlsx</code> handles spreadsheets. <code>md2word</code> converts markdown to Word for stakeholders who live in Microsoft land. <code>cv-from-job</code> tailors a CV to a job description, drawing on <a href="https://www.linkedin.com/in/noamsegal/">Noam Segal</a>&#8217;sinterview coaching framework. <a href="https://github.com/olgasafonova/one-page-strategy">one-page-strategy</a> structures strategy documents using the framework by <a href="https://richardrussell.co">Richard Russell</a>, synthesized from Rumelt&#8217;s <a href="https://www.goodreads.com/book/show/11721966-good-strategy-bad-strategy">Good Strategy/Bad Strategy</a> and Lafley &amp; Martin&#8217;s <a href="https://rogerlmartin.com/lets-read/playing-to-win">Playing to Win</a>. <code>projects-index</code> auto-generates an Obsidian project index by scanning repos.</p><p><strong>The rest</strong> (6 skills)</p><p><code>deck-to-video</code> converts HTML slides to MP4. <code>repo-to-video</code> generates a NotebookLM overview from a repository. <code>pra-review</code> handles Privacy Risk Assessments for <a href="https://en.wikipedia.org/wiki/Governance,_risk,_and_compliance">GRC</a>, cross-referencing PRA claims against actual source code so the compliance answers are grounded in something other than hope. <code>revenue-dashboard</code> produces financial dashboards from Power BI exports. <code>linkedin-invite</code> automates LinkedIn invites via browser. <br><code>steps</code> builds implementation guides by executing commands live and capturing the output.</p><h1>What the catalog doesn&#8217;t show</h1><p>Numbers lie by omission. Fifty-one skills arranged into categories looks like a product roadmap. It wasn&#8217;t. The French have a better word for what actually happened: <em>bricolage</em>. You build with whatever&#8217;s at hand, solving the irritation in front of you, and the structure reveals itself only in retrospect.</p><p>Three properties of the collection surprised me.</p><p>Skills compose. <code>tapestry</code> contains no extraction logic. It calls <code>youtube-transcript</code> or <code>article-extractor</code> depending on the URL, then pipes the result through <code>ship-learn-next</code>. Three skills, a pipeline. They arrived separately over three different weeks for three different reasons. The seam between them turned out to be a single function call. Modularity as accident, not architecture.</p><p>The immune system grew unprompted. After about thirty skills, quality started to drift. Some had clear trigger phrases, others were vague enough to fire on the wrong input. Some followed Anthropic&#8217;s guidelines, others had quietly abandoned them. So I built SkillCheck - https://github.com/olgasafonova/SkillCheck-Free. Then <a href="https://getskillcheck.com">SkillCheck Pro</a> for stricter validation: anti-slop patterns, security scanning, token budget analysis. The system needed maintenance and grew the maintenance organ on its own, the way a coral reef builds its own substrate.</p><p>Context savings compound invisibly. The obvious value of a skill is time saved per invocation. Five minutes here, ten there. The hidden value is the context you *don&#8217;t* spend. Without <code>/lmwtfy</code>, every colleague question opens with &#8220;search the wiki for X, then check GitHub, then look at Azure DevOps work items, here&#8217;s the project name, here&#8217;s how our wiki URLs work.&#8221; That&#8217;s 200 tokens of setup, every single time. Multiply by frequency, multiply by sessions per week. The real return is in the tokens Claude never has to process. Nobody puts that on a dashboard.</p><h1>The markdown file as <em>m&#233;tier</em></h1><p>Most writing about AI tools fixates on the model. The model got smarter. The model hallucinates less. The model now supports images. This is like evaluating a pianist by the piano.</p><p>The interesting unit isn&#8217;t the model. It&#8217;s the skill file. A few hundred words of markdown that encode a working professional&#8217;s domain knowledge: what to search, where to look, which fields matter, what the output should look like, which mistakes to avoid. The model provides reasoning. The skill provides <strong>judgement</strong>.</p><p>Most people&#8217;s experience of AI coding assistants is a blank prompt and a prayer. They describe what they want, get something close, fix it, describe the next thing. Freehand, every time. It works. It&#8217;s also the least efficient mode of interaction, the way cooking from memory works but a recipe is faster and more consistent.</p><p>The entire &#8220;prompt engineering&#8221; discourse missed this. Prompts aren&#8217;t engineering. They&#8217;re ephemeral. Skills are engineering. They persist, they version-control, they compose, they get validated. A prompt is something you type. A skill is something you ship.</p><h1>The count will be wrong by the time you read this</h1><p>I have three half-finished skills open in other tabs. That&#8217;s how it goes. Every repeated frustration is a skill waiting to be extracted. The question isn&#8217;t whether 51 is a lot. The question is which of your daily rituals are still freehand sketches when they could be stencils.</p><p>Somewhere in my skills directory, there&#8217;s probably one I built in November and haven&#8217;t triggered since. Still there, loaded into Claude&#8217;s context at startup, patiently waiting for the right / command. I don&#8217;t remember what it does. It remembers what I taught it.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://olgasafonova.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">This Substack is reader-supported. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Four Government APIs, One Go Binary: Building the Nordic Registry MCP Server]]></title><description><![CDATA[A caseworker in a Norwegian municipality receives a permit application from a Danish company.]]></description><link>https://olgasafonova.substack.com/p/four-government-apis-one-go-binary</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/four-government-apis-one-go-binary</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Tue, 24 Feb 2026 22:06:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5ed3af67-8b86-478c-b6b6-687c92e9c548_1456x816.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!df1_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17c9012d-bf6c-4516-8dc9-065a5b7d5394_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!df1_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17c9012d-bf6c-4516-8dc9-065a5b7d5394_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!df1_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17c9012d-bf6c-4516-8dc9-065a5b7d5394_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!df1_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17c9012d-bf6c-4516-8dc9-065a5b7d5394_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!df1_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17c9012d-bf6c-4516-8dc9-065a5b7d5394_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!df1_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17c9012d-bf6c-4516-8dc9-065a5b7d5394_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17c9012d-bf6c-4516-8dc9-065a5b7d5394_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:609656,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/189067590?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17c9012d-bf6c-4516-8dc9-065a5b7d5394_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!df1_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17c9012d-bf6c-4516-8dc9-065a5b7d5394_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!df1_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17c9012d-bf6c-4516-8dc9-065a5b7d5394_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!df1_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17c9012d-bf6c-4516-8dc9-065a5b7d5394_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!df1_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17c9012d-bf6c-4516-8dc9-065a5b7d5394_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A caseworker in a Norwegian municipality receives a permit application from a Danish company. To verify the company exists and isn&#8217;t bankrupt, she opens <a href="https://data.brreg.no">data.brreg.no</a>. Realizes this is a Danish company. Switches to <a href="https://datacvr.virk.dk/data/">datacvr.virk.dk</a>. Navigates a Danish interface. Manually copies the company name, status, and address back into her case system. If the company also has a Finnish subsidiary, add <a href="https://www.ytj.fi/en/">ytj.fi</a> to the tab count.</p><p>This happens thousands of times a day across Nordic public sector. Procurement officers validating vendor lists from multiple countries. Compliance teams running due diligence on cross-border contractors. Grant administrators checking whether an applicant is a legitimate non-profit or a dissolved shell company.</p><p>Nordic cross-border trade is massive. Denmark, Finland, Norway, and Sweden share labor markets, procurement frameworks, and regulatory traditions. Companies operate across these borders routinely. But the digital tools for verifying those companies act like national borders are concrete walls. Each country&#8217;s business registry is its own island: different URL, different API format, different language, different data model.</p><p>This isn&#8217;t a secret. The <a href="https://nordicsmartgovernment.org">Nordic Council of Ministers</a> spent 27 million DKK on the <a href="https://www.norden.org/en/publication/nordic-smart-government-and-business-2021-2024">Nordic Smart Government &amp; Business initiative</a> between 2021 and 2024. Twenty-one organizations across all five Nordic countries participated. They produced <a href="https://nordicsmartgovernment.github.io/Nordic-Smart-Government-OpenAPI-Specifications/">OpenAPI specifications</a> and a <a href="https://github.com/nordicsmartgovernment/nordicsmartgovernment">reference implementation on GitHub</a>]. The program concluded in June 2024. The proof of concept covers Norway and Finland only and comes with &#8221;<a href="https://pub.norden.org/us2024-459/executive-summary.html">no guarantees for stability.</a>&#8221;</p><p>So the problem is validated at the highest Nordic political level. A production solution still doesn&#8217;t exist.</p><p>27 million DKK, 21 organizations, three years of work, and the result is a Java Spring Boot proof of concept covering two countries. I found it hard to accept that the same problem couldn&#8217;t be solved faster with a Go binary and four free government APIs.</p><h1>What the vendors built (and what they didn&#8217;t)</h1><p>The case management industry had 20+ years to solve cross-Nordic company lookup. It didn&#8217;t. Here&#8217;s what got built instead.</p><p><a href="https://www.kmd.dk/">KMD</a> (Denmark, now owned by NEC Corporation) dominates Danish public sector IT. The Danish Police, Defense, Tax Authority, and most municipalities run on <a href="https://www.kmd.dk/loesninger-og-services/loesninger/elektronisk-sags-og-dokumenthaandtering/kmd-nova-esdh">KMD Nova ESDH</a>. Their <a href="https://docs.workzone.kmd.net/2022_1/en-us/Content/WZCS_CVR_CPR_Guide/WZCVRIntegration/HomeAdminDev.htm">KMD WorkZone has CVR integration</a>. Danish companies only.</p><p><a href="https://www.cbrain.com/">cBrain</a>* (Denmark, F2 platform) serves most Danish ministries, including the Prime Minister&#8217;s Office. They&#8217;re claim to be the AI leader in this space: <a href="https://www.cbrain.com/software/artificial-intelligence">F2 AI Assistant and F2 AI Expert</a> run on-premises LLMs for document summaries, translations, and legal interpretation. Could be an impressive technology. But no documented company registry integration. The AI can summarize a case file; it can&#8217;t verify whether the company mentioned in it still exists.</p><p><a href="https://www.acos.no/">Acos</a> (Norway, WebSak) serves most Norwegian municipalities and ministries. They have a <a href="https://www.acos.no/products-and-services/products/integrations-for-websak/">confirmed BRREG integration</a>. Norwegian companies only.</p><p><a href="https://www.formpipe.com/solutions/">Formpipe</a> (Sweden, <a href="https://www.formpipe.com/products/w3d3/">W3D3</a> and Platina) serves 400+ Swedish and Danish public sector organizations. No documented company registry integration at all.</p><p><a href="https://www.documaster.com/en/">Documaster</a> (Norway) focuses on archiving. No registry integration.</p><p>Tieto (Public 360) and <a href="https://www.visma.com/public-sector">Visma</a> operate across multiple Nordic countries but ship country-specific products. No cross-border registry solution documented from either.</p><p>See the pattern? Every vendor that has a registry integration built it for one country. KMD does CVR. Acos does BRREG. Nobody does both. Nobody does all four.</p><p>Commercial aggregators exist, of course. <a href="https://www.roaring.io/services/company-data-api">Roaring.io</a> offers a unified Nordic API and it&#8217;s developer-friendly, but subscription-based. <a href="https://apidocs.proff.no/">Proff API</a> covers multiple Nordic countries, paid per request. <a href="https://www.creditsafe.com/">Creditsafe</a> and <a href="https://www.dnb.com/">Bisnode/D&amp;B</a> target enterprise budgets and KYC workflows. All paid. None AI-native. None work with MCP.</p><p>Even in the MCP ecosystem, everything is fragmented. Norway has two single-country servers: <a href="https://github.com/daveHylde/brreg-mcp-server">brreg-mcp-server</a>] (18 tools) and <a href="https://github.com/reidar80/BRREG-MCP">BRREG-MCP</a> (13 tools). Denmark has <a href="https://github.com/robobobby/mcp-danish-cvr">mcp-danish-cvr</a> with 2 tools and a 50-lookup daily limit via a third-party API. Sweden has a couple of servers using third-party data sources. Finland has zero MCP servers.</p><p>The gap is clear: no free, cross-Nordic, AI-native, vendor-agnostic solution exists.</p><h1>What I built</h1><p><em>Disclosure: I work at Tieto on Public 360. This MCP server is a personal open-source project, not a company product.</em></p><p>23 tools. Four countries. All from official government APIs. All free.</p><ul><li><p><strong>Norway</strong> -  <a href="https://data.brreg.no">Br&#248;nn&#248;ysundregistrene</a> - 12 tools, no auth required</p></li><li><p><strong>Denmark</strong> - <a href="https://datacvr.virk.dk">CVR</a> - 5 tools, no auth required</p></li><li><p><strong>Finland</strong> - <a href="https://avoindata.prh.fi">PRH</a> - 2 tools, no auth required</p></li><li><p><strong>Sweden</strong> - <a href="https://bolagsverket.se">Bolagsverket</a> - 4 tools, OAuth2 (free registration)</p></li></ul><p>You can search companies by name across four countries. Verify status, bankruptcy, employee count. Look up board members, CEOs, and auditors. Check who can legally sign on behalf of a company (signaturrett and prokura in Norwegian legal terms). Access Swedish annual reports (&#229;rsredovisningar). Batch-validate lists of up to 2,000 company IDs against official registries in a single call. Monitor registry changes in near real-time.</p><p>It ships as a single Go binary with zero runtime dependencies. No Node.js, no Python, no Docker required for basic use. Download the binary, point your MCP client at it, done. Works with Claude Desktop, Claude Code, Cursor, or any MCP client that speaks the protocol.<br><br>https://github.com/olgasafonova/nordic-registry-mcp-server | Apache 2.0 license</p><h1>What each country&#8217;s API taught me</h1><p>Building across four government APIs is an exercise in tolerating inconsistency.</p><p><strong>Norway (Br&#248;nn&#248;ysundregistrene)</strong> is the gold standard. Clean REST API. HAL-formatted JSON responses. No authentication required. Comprehensive data: board members, signature rights, voluntary organizations register, branch offices, registry change feeds. If every Nordic country published APIs like this, the NSG&amp;B program wouldn&#8217;t have been necessary.</p><p><strong>Denmark (CVR)</strong> has what I call the one-result trap. The CVR API returns a single company per search query. Searching &#8220;Tietoevry&#8221; returns TIETOEVRY DK A/S (11 employees). Searching &#8220;Tietoevry Denmark&#8221; returns TIETOEVRY DENMARK A/S (56 employees). A completely different legal entity. Also, speaking of Tietoevry - it became Tieto recently. I had to embed guidance directly in tool descriptions so the AI knows to try variations: &#8220;Company A/S,&#8221; &#8220;Company Denmark,&#8221; &#8220;Company Holding,&#8221; pre-merger names. The API works; the UX for an AI consumer is hostile. </p><p><strong>Finland (PRH)</strong> is the flood. Searching &#8220;Nokia&#8221; returns 900+ results. Nokia Oyj is in there somewhere, buried among Nokia-branded subsidiaries, dissolved entities, and unrelated companies with Nokia in their address. Added filtering by company form (OY for private, OYJ for public), location, and exact legal name. Pagination defaults to 20 results because LLM context windows aren&#8217;t infinite.</p><p><strong>Sweden (Bolagsverket)</strong> is the OAuth2 wall. The API is free, but you register by <a href="https://bolagsverket.se/apierochoppnadata/vardefulladatamangder/kundanmalantillapiforvardefulladatamangder.5528.html">submitting a form on a government website</a> and waiting for credentials. OAuth2 token management, automatic refresh. No name search available in this API. You need the 10-digit organization number upfront. I made Swedish tools conditional: if OAuth2 credentials aren&#8217;t configured, the tools simply don&#8217;t register. Users who only need Norway, Denmark, and Finland never see them.</p><p>Four countries, four completely different API philosophies. Norway is open-data progressive. Denmark returns one result and calls it a search. Finland floods you with everything matching a substring. Sweden makes you fill out a government form before you can start. This inconsistency is exactly why nobody built the cross-Nordic tool before. It&#8217;s not hard technically; it&#8217;s tedious across four sets of documentation, four response formats, and four sets of edge cases.</p><p><strong>The infrastructure that makes it hold together:</strong></p><p>A circuit breaker per country opens after five consecutive failures and recovers after 30 seconds. If the Danish CVR API goes down, Norwegian lookups keep working. Request deduplication ensures that five concurrent tool calls for the same company result in a single API request; the others wait and share the result. An LRU cache with per-endpoint TTLs (searches: 2 minutes, company details: 15 minutes, reference data: 24 hours) keeps responses fast without serving stale data.</p><p>Each tool description includes a &#8220;USE WHEN&#8221; clause with explicit trigger phrases. &#8220;Who is on the board of company X?&#8221; routes to <code>norway_get_roles</code>, not <code>norway_get_company</code>. This matters because LLMs choose tools based on description text, and vague descriptions lead to wrong tool selection.</p><h1>The uncomfortable question</h1><p>Why didn&#8217;t the vendors build this? The APIs have been available for years. Br&#248;nn&#248;ysundregistrene has been publicly queryable since at least 2014. CVR opened up years ago. PRH publishes open data. Bolagsverket launched their free API tier.</p><p>I see three structural reasons:</p><p><strong>Single-country procurement</strong>. Vendors build for one government contract at a time. When a Norwegian municipality writes an RFP for case management, it asks for BRREG integration. It doesn&#8217;t ask for Danish CVR lookup because the procurement process is national. The requirement specifications are written country by country. The demand signal for cross-Nordic doesn&#8217;t appear in any single tender document.</p><p><strong>Revenue model</strong>. Registry integration is a paid add-on in most case management systems. KMD charges for CVR integration. Acos charges for BRREG. Building one cross-Nordic module would cannibalize four separate country-specific add-on sales into one. From a product management perspective, four smaller products bill better than one bigger product. The incentive structure actively works against consolidation.</p><p><strong>Adapted behavior.</strong> Caseworkers adapted years ago. They open four browser tabs. It takes five minutes instead of thirty seconds, but the workaround is functional. Nobody files a support ticket saying &#8220;I need all four registries in one place&#8221; because the pain doesn&#8217;t feel like a bug. It feels like how things are. The friction is real but diffuse enough that it never reaches a product backlog as a prioritized item.</p><p><strong>Technical fragmentation</strong>. Even a motivated vendor would face the same inconsistency I faced: four different API architectures, four sets of documentation, four response formats, four sets of ID validation rules. The integration cost scales linearly with countries, and each country adds its own edge cases. It&#8217;s not glamorous product work. It&#8217;s plumbing.</p><p>The MCP model breaks this pattern. An MCP server isn&#8217;t locked to one vendor&#8217;s case management system. It works wherever AI works. A caseworker in Acos WebSak, a compliance officer using Claude Desktop, a developer in Cursor, an n8n workflow running overnight batch validation: the same 23 tools serve all of them. The vendor doesn&#8217;t need to build it. The ecosystem builds it.</p><p>This is the part that excites me most. MCP decouples the data access layer from the application layer. The government APIs are public goods. The MCP server is open source. The case management system doesn&#8217;t need a proprietary integration module; it needs an AI assistant with the right tools connected. That shift makes cross-Nordic company verification a solved problem rather than a product roadmap item waiting for prioritization.</p><h1>What&#8217;s next</h1><p>The free government APIs cover the basics: company details, status, some role information. Premium data layers exist for Sweden and Finland. <a href="https://www.prh.fi/en/companiesandorganisations/tietopalvelut/virre.html">Virre</a> (Finland) and Bolagsverket&#8217;s premium tier offer board members, authorized signatories, and financial documents that the free APIs don&#8217;t expose. Adding these would give consistent governance data across all four countries.</p><p>Sanctions cross-referencing is the obvious due diligence extension. Verify a company exists, then check it against EU and national sanctions lists in the same conversation. One query that answers &#8220;is this company real, active, and not sanctioned?&#8221; instead of three separate manual checks.</p><p>Iceland and the Faroe Islands are the missing pieces. Iceland&#8217;s official registry <a href="https://www.skatturinn.is/">Skatturinn</a> has no public API; the data is only available through <a href="https://gagnatorg.ja.is/docs/skra/v1/">J&#225; Gagnatorg</a>, a commercial reseller charging ~$110/month. The API itself is excellent: 41 fields including industry codes, parent company structure, bankruptcy status, and geocoded addresses. But it breaks the &#8220;all free&#8221; constraint. The Faroe Islands registry <a href="https://www.skraseting.fo">Skr&#225;seting F&#248;roya</a> has no API at all, only a web search interface, and is completely separate from Danish CVR. If either country publishes a free open data API, the implementation pattern is ready; the code follows the same structure as the existing four countries.</p><p>The bigger unlock is connecting registry verification with case management through AI. Verify the company. Check the signer&#8217;s authority. Update the case record. All in one conversation instead of four tabs and a copy-paste workflow. That&#8217;s where this is heading. Not a standalone lookup tool, but a verification layer that plugs into whatever system the caseworker already uses.</p><p>I&#8217;m watching the <a href="https://nordicsmartgovernment.github.io/Nordic-Smart-Government-OpenAPI-Specifications/">NSG&amp;B OpenAPI specifications</a> for signs of adoption by individual countries. If Norway or Finland starts serving production data through a unified spec, the MCP server can consume it as another backend. Competition from government infrastructure is the best possible outcome; it means the problem got solved at scale.</p><h1>Try it</h1><p>The government APIs are free. The code is at https://github.com/olgasafonova/nordic-registry-mcp-server. The only thing that costs money is the time your team spends switching between four browser tabs.</p><p>Install it, point it at your MCP client, and ask: &#8220;Is company 923609016 active and who can sign for them?&#8221;</p><p><a href="https://github.com/olgasafonova/nordic-registry-mcp-server">GitHub</a> | <a href="https://github.com/olgasafonova/nordic-registry-mcp-server/issues">Issues</a> | <a href="https://registry.modelcontextprotocol.io/">MCP Registry</a></p><p>Tell me what&#8217;s missing.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://olgasafonova.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://olgasafonova.substack.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Two Miro MCP servers walk into a codebase]]></title><description><![CDATA[Miro shipped a significant update to their official MCP server on February 2nd.]]></description><link>https://olgasafonova.substack.com/p/two-miro-mcp-servers-walk-into-a</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/two-miro-mcp-servers-walk-into-a</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Thu, 19 Feb 2026 10:45:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9W2e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9W2e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9W2e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9W2e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9W2e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9W2e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9W2e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:225837,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/188475222?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9W2e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9W2e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9W2e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9W2e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa77528-1c22-4b4f-8349-aca69c75047d_1024x1024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://miro.com/">Miro</a> shipped  a significant update to their official MCP server on February 2nd. I&#8217;ve been building a community one since December - and recently added a few tools as well.  Both connect AI coding tools to Miro boards. Both use the Model Context Protocol. And they solve completely different problems.</p><p>This isn&#8217;t a &#8220;which one wins&#8221; comparison. It&#8217;s a &#8220;why you might want both&#8221; analysis.</p><h1>What Miro is becoming</h1><p>To understand the two servers, you need to understand where Miro is going.</p><p>Miro stopped being a whiteboard tool a while ago. At <a href="https://miro.com/blog/canvas-25-top-ten-product-highlights/">Canvas 25 (October 2025)</a>, they rebranded the AI layer as the &#8220;Innovation Workspace&#8221; and announced a Product Acceleration suite: Portfolios, Insights, Prototypes, Specs, and Goals. The pitch shifted from &#8220;collaborate on a canvas&#8221; to &#8220;accelerate product development with AI.&#8221;</p><p>The AI features already shipped tell the story. Sidekicks are conversational AI agents that live on the canvas and see whatever you select. Flows are multi-step AI workflows where each step ingests the previous step&#8217;s canvas output. Visual Context Processing serializes spatial relationships (positions, groupings, connections) alongside content and feeds everything to a multimodal LLM. &#8220;Create with AI&#8221; generates stickies, docs, tables, mind maps, flowcharts, ERD, and UML from natural language.</p><p>The common thread: Miro is building AI that <strong>understands</strong> boards. Not just the text on stickies, but how items relate spatially. Where clusters form. What a group of connected shapes represents. </p><p>This direction shaped official Miro MCP server.</p><h1>Two different philosophies</h1><p>The official Miro MCP server has 13 tools and 2 prompts as of today. That&#8217;s not a limitation; it&#8217;s a design choice. Every tool serves their core narrative: boards as context for code.</p><p><code>context_explore</code> maps a board&#8217;s structure. <code>context_get</code> extracts deep context from specific sections. c<code>ode_create_from_board</code> and c<code>ode_explain_on_board</code> are prompts purpose-built for turning visual designs into working software. The diagram tools use a custom DSL (not Mermaid) that supports flowcharts, UML, and ER diagrams natively. Doc and table tools round out the structured content operations.</p><p>It&#8217;s cloud-hosted. One URL in your MCP config, OAuth 2.1 handles auth, no binary to install. If you&#8217;re a developer who designs in Miro and codes in Cursor or Claude Code, this is the shortest path from whiteboard to implementation.</p><p>My community server has 89 tools. That&#8217;s also a design choice, just a different one. It wraps the full Miro REST API: every item type, every CRUD operation, every management endpoint. Sticky notes, shapes, cards, app cards, connectors, frames, mindmaps, tags, groups, bulk operations, export, audit logging. It runs as a 14MB Go binary with stdio and HTTP transport. You can run it locally, in Docker, behind a firewall, or air-gapped.</p><p>The official server asks: &#8220;What does this board mean?&#8221; My server asks: &#8220;What do you want to do to this board?&#8221;</p><h1>Where they overlap (and don&#8217;t)</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hWpy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2a3b10-8bc5-4c24-832b-f60d9ea4742d_1094x1162.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hWpy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2a3b10-8bc5-4c24-832b-f60d9ea4742d_1094x1162.png 424w, https://substackcdn.com/image/fetch/$s_!hWpy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2a3b10-8bc5-4c24-832b-f60d9ea4742d_1094x1162.png 848w, https://substackcdn.com/image/fetch/$s_!hWpy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2a3b10-8bc5-4c24-832b-f60d9ea4742d_1094x1162.png 1272w, https://substackcdn.com/image/fetch/$s_!hWpy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2a3b10-8bc5-4c24-832b-f60d9ea4742d_1094x1162.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hWpy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2a3b10-8bc5-4c24-832b-f60d9ea4742d_1094x1162.png" width="1094" height="1162" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6d2a3b10-8bc5-4c24-832b-f60d9ea4742d_1094x1162.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1162,&quot;width&quot;:1094,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:191523,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/188475222?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2a3b10-8bc5-4c24-832b-f60d9ea4742d_1094x1162.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hWpy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2a3b10-8bc5-4c24-832b-f60d9ea4742d_1094x1162.png 424w, https://substackcdn.com/image/fetch/$s_!hWpy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2a3b10-8bc5-4c24-832b-f60d9ea4742d_1094x1162.png 848w, https://substackcdn.com/image/fetch/$s_!hWpy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2a3b10-8bc5-4c24-832b-f60d9ea4742d_1094x1162.png 1272w, https://substackcdn.com/image/fetch/$s_!hWpy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2a3b10-8bc5-4c24-832b-f60d9ea4742d_1094x1162.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The overlap is small: diagrams, documents, tables, and reading board content. Everything else is exclusive to one server or the other. This is what makes &#8220;use both&#8221; a real option.</p><h1>The synergy case</h1><p>MCP servers register independently. You can configure both in the same AI tool under different names. One client, two servers, same boards.</p><p>Here&#8217;s where that gets interesting.</p><p><strong>Workshop facilitation + synthesis</strong>. Use the community server to run a workshop: bulk-create stickies from a participant list, organize them into frames, tag them by theme, group related ideas. After the session, switch to the official server. Its AI context tools summarize what happened, extract action items, and generate specs from the visual output.</p><p><strong>Build the board, then generate code</strong>. Use the community server to construct a technical architecture on a board: shapes for services, connectors for data flow, cards for requirements, tags for priority. Then use the official server&#8217;s <code>code_create_from_board</code> prompt to turn that visual architecture into implementation scaffolding.</p><p><strong>CI/CD + developer workflow</strong>. Run the community server in Docker as part of your pipeline. It creates boards from build results, updates status cards, manages release tracking boards. Developers interact with those boards through the official server&#8217;s AI features in their IDE.</p><p>These aren&#8217;t theoretical. They&#8217;re natural consequences of one server being good at doing things and the other being good at understanding things.</p><h1>What v1.14 of community MCP added</h1><p>The community server just hit 89 tools. Six new additions in v1.14:</p><p>- <strong>Markdown documents</strong> on boards (create, read, delete via Miro&#8217;s doc format API)</p><p>- <strong>Local file uploads</strong> for images via multipart form</p><p>- <strong>Flowchart shapes</strong>  using Miro&#8217;s experimental stencil API</p><p>- <strong>Tag queries</strong> to find all items with a specific tag</p><p>- <strong>API change tracking</strong> that diffs Miro&#8217;s OpenAPI spec weekly and opens GitHub issues on changes</p><p>- <strong>Cross-referenced tool descriptions</strong> so LLMs pick the right tool more often</p><p>The server also upgraded to go-sdk v1.3.0 and Go 1.24.</p><h1>Looking ahead</h1><p>Miro&#8217;s investment in spatial AI is significant. They&#8217;re the only visual collaboration platform showing public research signals in graph-based canvas understanding. And that&#8217;s extremely intersting and promising direction. <a href="https://www.figma.com/">Figma</a> has template generation and <a href="https://www.figma.com/make/">Figma Make</a> (powered by Claude). <a href="https://www.lucidchart.com/">Lucid</a> has diagram generation and <a href="https://help.lucid.co/hc/en-us/articles/42578801807508-Integrate-Lucid-with-AI-tools-using-the-Lucid-MCP-server">its own MCP server.</a> Neither appears to be modeling the canvas as a graph.</p><p>As Miro&#8217;s AI gets better at understanding boards, the tools that operate on boards become more useful, not less. AI agents that can comprehend a board still need tools that can create, modify, and organize what&#8217;s on it. The comprehension layer and the operations layer are complementary.</p><p>Two servers. Different strengths. Same boards. Use both.</p><div><hr></div><p>The community Miro MCP server is open source and MIT-licensed: https://github.com/olgasafonova/miro-mcp-server</p><p>The official Miro MCP server: https://miro.com/ai/mcp/</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://olgasafonova.substack.com/p/two-miro-mcp-servers-walk-into-a?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://olgasafonova.substack.com/p/two-miro-mcp-servers-walk-into-a?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Beyond CLAUDE.md: what 38 skills and 7 agents actually look like]]></title><description><![CDATA[Everyone writes the setup guide. This is what happens after.]]></description><link>https://olgasafonova.substack.com/p/beyond-claudemd-what-38-skills-and</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/beyond-claudemd-what-38-skills-and</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Mon, 16 Feb 2026 21:35:15 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d4d00ec6-bc0c-4378-98d1-c4bee8ae250c_1600x900.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!km2v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4aef5b-c139-422d-99ca-fd96946de873_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!km2v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4aef5b-c139-422d-99ca-fd96946de873_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!km2v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4aef5b-c139-422d-99ca-fd96946de873_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!km2v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4aef5b-c139-422d-99ca-fd96946de873_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!km2v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4aef5b-c139-422d-99ca-fd96946de873_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!km2v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4aef5b-c139-422d-99ca-fd96946de873_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d4aef5b-c139-422d-99ca-fd96946de873_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:577999,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/188182237?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4aef5b-c139-422d-99ca-fd96946de873_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!km2v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4aef5b-c139-422d-99ca-fd96946de873_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!km2v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4aef5b-c139-422d-99ca-fd96946de873_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!km2v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4aef5b-c139-422d-99ca-fd96946de873_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!km2v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4aef5b-c139-422d-99ca-fd96946de873_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Everyone's writing "How to set up CLAUDE.md" guides. They cover the basics: add your project context, define a few workflows, maybe set a tone preference. These guides are fine for getting started. They stop exactly where things get interesting.</p><p>I've been running Claude Code as my primary working environment for a year. What started as a CLAUDE.md file turned into something different: 38 custom skills, 7 specialized agents, 20 MCP servers, a rules engine that routes decisions automatically, and quality gates that block substandard output before it ships.</p><p>This post is about what happens after you've been doing this for a while. Not the setup. The system that emerges.</p><h2>Skills are not prompts</h2><p>The beginner articles treat skills like saved prompts. Write a good instruction, save it in a file, call it with a slash command. That's the surface.</p><p>A skill is a composable expert mode with its own activation logic, supporting resources, and success criteria. The SKILL.md file has YAML frontmatter that tells Claude <em>when</em> to activate, and a markdown body that tells it <em>how</em> to behave. The description field in the frontmatter is the most important line you'll write; it's what Claude reads when deciding which skill matches your request.</p><p>Here's what that looks like at scale - as of today. My skill categories:</p><ul><li><p><strong>Research</strong> (4): Wiki lookup, bid response drafting, deep research, GitHub investigation</p></li><li><p><strong>Content</strong> (5): LinkedIn posts, publishing pipeline, article extraction, learning frameworks</p></li><li><p><strong>Visuals</strong> (6): Brand asset generation, diagrams, data visualization, image generation</p></li><li><p><strong>DevOps</strong> (4): Weekly stakeholder reports, release notes, wiki publishing, deployment</p></li><li><p><strong>Quality</strong> (4): Skill validation, rhetoric analysis, MCP server builder guide</p></li><li><p><strong>Productivity</strong> (7): Daily standup prep, spreadsheets, strategy documents</p></li></ul><p>Each skill has trigger phrases embedded in its description. When I say "bid response," Claude loads the bid-intel skill. When I say "publish docs," it loads the wiki publishing skill. I don't need to remember which skill does what; Claude matches my intent to the right expert mode.</p><p>The interesting part is composition. I have a skill  that orchestrates three other skills into a single workflow: it detects whether a URL points to YouTube, an article, or a PDF, extracts the content using the appropriate skill, then feeds it into a learning framework that turns insights into action steps. One command, three skills working together.</p><p>The meta-skill is <code>skill-check</code>: a skill that validates other skills against quality guidelines. It reads a SKILL.md file and flags problems with trigger phrases, missing success criteria, or security issues. Tooling that audits your tooling. That's when the system starts maintaining itself.</p><h2>Multi-agent teams</h2><p>Most people use Claude Code as a single agent. One conversation, one context, one task at a time. That works for most things. Some tasks need parallel processing.</p><p>I run 7 specialized agents:</p><ul><li><p><strong>backend-architect</strong>: API design, database schemas, scalability decisions</p></li><li><p><strong>error-detective</strong>: Log analysis, debugging, error pattern detection</p></li><li><p><strong>go-mcp-reviewer</strong>: Handler safety, tool description quality, cross-project consistency</p></li><li><p><strong>mcp-expert</strong>: MCP server patterns, handler design, transport configuration</p></li><li><p><strong>technical-researcher</strong>: Code analysis, documentation review, implementation research</p></li><li><p><strong>technical-writer</strong>: User guides, README files, architecture documentation</p></li><li><p><strong>wiki-researcher</strong>: Fast wiki lookups using our internal MediaWiki</p></li></ul><p>Each agent has its own tool permissions, model selection, and behavioral rules. The wiki-researcher runs on Haiku (fast, cheap) with read-only wiki access. The go-mcp-reviewer runs on Sonnet with code review prompts loaded. They coordinate through a shared task list.</p><p>The best use case for teams: cross-repository pattern drift reviews. I maintain <a href="https://github.com/olgasafonova/mcp-workshop">7 Go MCP servers</a>. Each follows similar patterns for handler registration, error handling, and tool descriptions. But patterns drift over time. One server adds panic recovery, another doesn't. One improves its error messages, the others stay behind.</p><p>A team review works like this: the team lead creates tasks ("review handler patterns in miro-mcp-server," "review handler patterns in gleif-mcp-server"), assigns one agent per repository, and they run in parallel. Each agent reads the handlers, compares against the reference implementation, and reports drift. What would take me hours of manual cross-referencing finishes in minutes.</p><p>The cost reality: agent teams consume roughly 7x the tokens of a single agent. Using Opus for teammates would be prohibitively expensive; Sonnet works well enough for specialized tasks. Teams are worth it for specific, parallelizable work. For sequential tasks, a single agent is cheaper and often better.</p><h2>Rules that scale</h2><p>CLAUDE.md is the entrypoint. (I wrote about <a href="https://olgasafonova.substack.com/p/i-barely-knew-git-now-my-ai-assistant">how this config syncs across machines as a git repo</a> in a previous post.) The real power is in the rules directory.</p><p>I have 11 rule files, each loaded when its context applies:</p><ul><li><p><code>writing-style.md</code>: Short sentences, active voice, no LLM patterns, specific evidence</p></li><li><p><code>visual-design.md</code>: Routes to the correct brand system by project path or hostname</p></li><li><p><code>code-review-prompts.md</code>: 6 structured review prompts targeting specific risk surfaces</p></li><li><p><code>knowledge-loop.md</code>: Auto-proposes wiki entries when skills produce reusable answers</p></li><li><p><code>go-development.md</code>: Go-specific conventions, linting rules, test patterns</p></li><li><p><code>spatial-systems.md</code>: 8pt grid system, layout principles for visual work</p></li><li><p><code>azure-devops.md</code>: Work item formatting, HTML comments, mention conventions</p></li></ul><p>The brand router in visual-design.md is a good example of rules doing work that would otherwise require manual decisions. It checks the project path, hostname, and content type, then selects the right brand system. Working on a Tieto project at work? Load the Tieto brand (deep blue, specific logo variants, official template). Working on a personal MCP server at home? Load the Agency brand (neobrutalism, hard shadows, flat colors). Building something for AdsOptimizer? Load that brand system instead.</p><p>I don't think about which brand to use. The rules handle it.</p><p>The knowledge loop is subtler but more valuable over time. When a research skill (like the one that answers colleague questions about our products) produces a verified, high-confidence answer, the loop checks the team wiki. If the topic isn't covered, it drafts a wiki entry and asks for approval before publishing. The skill that answers one person's question feeds knowledge back into the system where everyone can find it.</p><h2>Quality gates</h2><p>Skills and agents can produce bad output. The question is where you catch it.</p><p>I use hooks: shell commands that execute in response to Claude Code events. When a teammate agent completes a task, a quality check script runs automatically. If the output doesn't meet standards, the hook blocks the completion with an exit code and the agent has to revise.</p><p>The go-mcp-reviewer agent has hard gates baked into its prompt. Before it can approve a handler, it must verify: does the handler validate arguments before passing them to the API? Does it respect the tool's safety annotations? Could error messages leak API tokens or internal URLs? These aren't suggestions. They're requirements the agent can't skip.</p><p>This layered approach (prompt-level enforcement plus tooling-level enforcement) catches different categories of problems. The prompt catches logical issues. The hooks catch process issues. Neither is sufficient alone.</p><h2>The decision architecture</h2><p>Here's the thing nobody talks about in the CLAUDE.md guides: the tools are commoditizing. Every month, more people set up CLAUDE.md, create a few skills, connect some MCP servers. The setup is getting easier. The barrier to entry is dropping.</p><p>What doesn't commoditize is the judgment layer.</p><p>Knowing <em>when</em> to use an agent team vs a single agent. Knowing <em>which</em> MCP patterns to apply to a new integration. Knowing when a skill should compose with other skills vs stay standalone. Knowing when to build an MCP server vs use an existing one. Knowing that 7x token cost for teams is worth it for pattern drift reviews but wasteful for sequential tasks.</p><p><a href="https://decision.substack.com/p/whats-the-most-valuable-skill-for">Cassie Kozyrkov</a>, Google's former Chief Decision Scientist, argues that as AI handles more execution, human decision-making becomes the bottleneck. The most valuable skill isn't tool mastery; it's the judgment about how to deploy tools effectively.</p><p>I think about my setup the same way. The 38 skills are artifacts. The 7 agents are artifacts. The rules and hooks are artifacts. The decision framework that produced them; the reasoning about what to build, how to structure it, when to automate and when to stay manual; that's the part that took a year to develop and can't be copied from a tutorial.</p><h2>What this means for you</h2><p>If you're reading CLAUDE.md setup guides, keep reading them. They're a real starting point. But notice when you outgrow them. Notice when you start solving the same problem twice and think "I should make this a skill." Notice when you want two things happening in parallel and think "I need another agent." Notice when a brand decision keeps requiring manual thought and think "I should encode this as a rule."</p><p>The system doesn't arrive fully formed. It emerges from paying attention to friction and encoding solutions.</p><p>Start with one skill that solves a real annoyance. Build from there. The compound interest of encoded decisions is the part nobody warned you about.</p>]]></content:encoded></item><item><title><![CDATA[I barely knew git. Now my AI assistant runs like infrastructure.]]></title><description><![CDATA[Most people set up their AI coding assistant once and forget about it.]]></description><link>https://olgasafonova.substack.com/p/i-barely-knew-git-now-my-ai-assistant</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/i-barely-knew-git-now-my-ai-assistant</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Sun, 01 Feb 2026 13:25:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7Li6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most people set up their AI coding assistant once and forget about it. I wanted mine to work the same way on my home laptop and work machine, remember my preferences, and preserve the workflows I&#8217;d spent months building.</p><p>A few months ago, I rarely touched git. Then a patient colleague named David explained why Linus Torvalds called it &#8220;the stupid content tracker&#8221; &#8212; and something clicked. As Lille My puts it: &#8220;I&#8217;ll always manage.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7Li6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7Li6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!7Li6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!7Li6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!7Li6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7Li6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:620227,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/186496738?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7Li6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!7Li6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!7Li6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!7Li6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7879853e-a21e-401a-970a-f0bb514f4727_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>So I did what any infrastructure-minded person would do: I put it all in git:<br><br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ELxZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dc69554-7a38-47c7-936e-c313788ba6e7_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ELxZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dc69554-7a38-47c7-936e-c313788ba6e7_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!ELxZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dc69554-7a38-47c7-936e-c313788ba6e7_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!ELxZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dc69554-7a38-47c7-936e-c313788ba6e7_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!ELxZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dc69554-7a38-47c7-936e-c313788ba6e7_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ELxZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dc69554-7a38-47c7-936e-c313788ba6e7_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9dc69554-7a38-47c7-936e-c313788ba6e7_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:534316,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/186496738?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dc69554-7a38-47c7-936e-c313788ba6e7_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ELxZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dc69554-7a38-47c7-936e-c313788ba6e7_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!ELxZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dc69554-7a38-47c7-936e-c313788ba6e7_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!ELxZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dc69554-7a38-47c7-936e-c313788ba6e7_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!ELxZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dc69554-7a38-47c7-936e-c313788ba6e7_1024x1024.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h1>The core trick: symlinks + git</h1><p>Here&#8217;s the clever bit. Claude Code looks for its config in a specific folder (~/.claude/). Instead of editing files there directly, I created a Git repository and used <strong>symlinks</strong> (shortcuts that make files appear in two places at once) to connect them.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iq37!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cea45b4-8842-4966-9b68-347c758f2191_1666x244.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iq37!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cea45b4-8842-4966-9b68-347c758f2191_1666x244.png 424w, https://substackcdn.com/image/fetch/$s_!iq37!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cea45b4-8842-4966-9b68-347c758f2191_1666x244.png 848w, https://substackcdn.com/image/fetch/$s_!iq37!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cea45b4-8842-4966-9b68-347c758f2191_1666x244.png 1272w, https://substackcdn.com/image/fetch/$s_!iq37!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cea45b4-8842-4966-9b68-347c758f2191_1666x244.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iq37!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cea45b4-8842-4966-9b68-347c758f2191_1666x244.png" width="1456" height="213" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9cea45b4-8842-4966-9b68-347c758f2191_1666x244.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:213,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53330,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/186496738?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cea45b4-8842-4966-9b68-347c758f2191_1666x244.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iq37!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cea45b4-8842-4966-9b68-347c758f2191_1666x244.png 424w, https://substackcdn.com/image/fetch/$s_!iq37!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cea45b4-8842-4966-9b68-347c758f2191_1666x244.png 848w, https://substackcdn.com/image/fetch/$s_!iq37!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cea45b4-8842-4966-9b68-347c758f2191_1666x244.png 1272w, https://substackcdn.com/image/fetch/$s_!iq37!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cea45b4-8842-4966-9b68-347c758f2191_1666x244.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Claude Code sees its config folder. Git sees a normal repository. I get version history, sync across machines, and can roll back mistakes.</p><p>The same approach works for any tool that reads from a config directory.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dup_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88c91787-368b-48c6-a814-be08565eaf5c_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dup_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88c91787-368b-48c6-a814-be08565eaf5c_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Dup_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88c91787-368b-48c6-a814-be08565eaf5c_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Dup_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88c91787-368b-48c6-a814-be08565eaf5c_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Dup_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88c91787-368b-48c6-a814-be08565eaf5c_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dup_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88c91787-368b-48c6-a814-be08565eaf5c_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88c91787-368b-48c6-a814-be08565eaf5c_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:698359,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/186496738?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88c91787-368b-48c6-a814-be08565eaf5c_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Dup_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88c91787-368b-48c6-a814-be08565eaf5c_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Dup_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88c91787-368b-48c6-a814-be08565eaf5c_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Dup_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88c91787-368b-48c6-a814-be08565eaf5c_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Dup_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88c91787-368b-48c6-a814-be08565eaf5c_1024x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Keeping secrets safe</h1><p>API keys and tokens can&#8217;t go in git. But I still want them to sync between machines.</p><p>The solution: <strong>template expansion</strong>. My git repo contains config files with placeholders like <code>${MIRO_ACCESS_TOKEN}</code>. A script reads actual secrets from my Obsidian vault (which syncs via a different, encrypted channel) and fills in the blanks.</p><p>The gith repo stays portable and safe to share. Secrets stay local.</p><p>For engineers: this is the same pattern as <code>.env</code> files and environment variable substitution, but applied to AI tool configuration. Simple, composable, works everywhere.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yuhT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb1e1340-df66-4736-9586-2b635c303cbb_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yuhT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb1e1340-df66-4736-9586-2b635c303cbb_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!yuhT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb1e1340-df66-4736-9586-2b635c303cbb_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!yuhT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb1e1340-df66-4736-9586-2b635c303cbb_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!yuhT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb1e1340-df66-4736-9586-2b635c303cbb_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yuhT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb1e1340-df66-4736-9586-2b635c303cbb_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb1e1340-df66-4736-9586-2b635c303cbb_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:677559,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/186496738?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb1e1340-df66-4736-9586-2b635c303cbb_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yuhT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb1e1340-df66-4736-9586-2b635c303cbb_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!yuhT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb1e1340-df66-4736-9586-2b635c303cbb_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!yuhT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb1e1340-df66-4736-9586-2b635c303cbb_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!yuhT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb1e1340-df66-4736-9586-2b635c303cbb_1024x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h1>What I&#8217;m actually versioning</h1><p><strong>Skills</strong> are like recorded macros for AI workflows. I have 30+ of them. Type <code>/brand-assets</code> and Claude knows exactly how to generate social graphics using HTML and headless Chrome. Type <code>/github-investigation</code> and it runs a specific code archaeology workflow with timeline tables and impact analysis.</p><p>Each skill is a markdown file that captures a workflow I&#8217;d otherwise explain from scratch every time.</p><p><strong>Agents</strong> are like specialized personas with domain expertise baked in. I have an mcp-expert, a technical-writer, an error-detective, a product-strategist, and a few more. Each is a markdown file describing how to think about problems in that domain.</p><p><strong>Rules</strong> trigger automatically based on context. Working on Go code? Go conventions apply. Writing prose? My writing style rules activate (no em-dashes, use contractions, avoid LLM-sounding phrases). It&#8217;s like <code>.editorconfig</code>, but for AI behavior.</p><p><strong>MCP servers</strong> connect Claude to external tools. I have 15 integrations: Azure DevOps for work items, Miro for whiteboarding, Playwright for browser automation, plus custom servers I built for domain-specific APIs.</p><h1>The automation layer</h1><p>A script runs at login: pull latest config, rebuild any servers if source changed. A hook warns me when I have uncommitted changes.</p><p>I open my laptop and everything&#8217;s current. Make a change, commit, push. The other machine gets it automatically.</p><h1>Why this matters</h1><p>Or as Lille My also says: &#8220;Hope for the best and prepare for the worst.&#8221;</p><p><strong>Consistency</strong> - Same Claude experience on every machine. Same skills, same rules, same integrations.</p><p><strong>History</strong> - I can see how my writing-style rules evolved over six months. I can trace when I added a skill and why.</p><p><strong>Portability</strong> - New machine setup is two commands: clone the repo, run the install script.</p><p><strong>Composability</strong> - Skills can reference other skills. Rules layer on top of each other. Everything is plain text, diffable, reviewable.</p><h1>The unexpected benefit</h1><p>Treating AI configuration like infrastructure forced me to articulate what I actually want from my tools.</p><p>Writing rules made me think about writing style. Building skills made me document workflows I&#8217;d been doing intuitively. Creating agents made me define what expertise actually looks like in different domains.</p><p>The configuration became a form of reflection on how I work.</p><p>The specific implementation uses Claude Code, but the patterns transfer to any AI tool with configuration files. Symlinks, template expansion, and git aren&#8217;t new. Applying them to AI assistants is.</p>]]></content:encoded></item><item><title><![CDATA[I validated 100+ Claude Code Skills. Here are the 7 most common mistakes.]]></title><description><![CDATA[Lessons from building SkillCheck, a validator for the agentskills.io specification]]></description><link>https://olgasafonova.substack.com/p/i-validated-100-claude-code-skills</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/i-validated-100-claude-code-skills</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Thu, 22 Jan 2026 06:14:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J-PR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b899660-bff4-4b4f-9bf9-d235923f8035_4800x2512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.getskillcheck.com/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J-PR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b899660-bff4-4b4f-9bf9-d235923f8035_4800x2512.png 424w, https://substackcdn.com/image/fetch/$s_!J-PR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b899660-bff4-4b4f-9bf9-d235923f8035_4800x2512.png 848w, https://substackcdn.com/image/fetch/$s_!J-PR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b899660-bff4-4b4f-9bf9-d235923f8035_4800x2512.png 1272w, https://substackcdn.com/image/fetch/$s_!J-PR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b899660-bff4-4b4f-9bf9-d235923f8035_4800x2512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J-PR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b899660-bff4-4b4f-9bf9-d235923f8035_4800x2512.png" width="1456" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b899660-bff4-4b4f-9bf9-d235923f8035_4800x2512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:922815,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://www.getskillcheck.com/&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b899660-bff4-4b4f-9bf9-d235923f8035_4800x2512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J-PR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b899660-bff4-4b4f-9bf9-d235923f8035_4800x2512.png 424w, https://substackcdn.com/image/fetch/$s_!J-PR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b899660-bff4-4b4f-9bf9-d235923f8035_4800x2512.png 848w, https://substackcdn.com/image/fetch/$s_!J-PR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b899660-bff4-4b4f-9bf9-d235923f8035_4800x2512.png 1272w, https://substackcdn.com/image/fetch/$s_!J-PR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b899660-bff4-4b4f-9bf9-d235923f8035_4800x2512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>After building <a href="https://www.getskillcheck.com/">SkillCheck</a> and running it against over a hundred real-world Claude Code skills, clear patterns emerged. The same issues appear again and again, even in well-crafted skills from experienced developers.</p><p>Skills are how you extend Claude&#8217;s capabilities. A skill is a folder with a SKILL.md file containing instructions that Claude loads when relevant. The format follows the <a href="https://agentskills.io/specification">agentskills.io specification</a>, an open standard that works across Claude Code, Codex CLI, and other AI agents.</p><p>Here&#8217;s what I found validating skills against the spec, and how to fix each issue.</p><h1>1. Missing the WHEN trigger in descriptions</h1><p><strong>The problem</strong>: Skills describe what they do, but not when Claude should activate them.</p><p>The agentskills spec requires descriptions to include activation triggers. Without them, Claude doesn&#8217;t know when your skill is relevant.</p><p><strong>Why it matters</strong>: The description is Claude&#8217;s primary signal for deciding whether to invoke your skill. No WHEN clause = your skill sits unused even when it would help.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NQNQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9994d5bb-b035-4879-8e9f-efbcdbe89374_1684x434.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NQNQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9994d5bb-b035-4879-8e9f-efbcdbe89374_1684x434.png 424w, https://substackcdn.com/image/fetch/$s_!NQNQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9994d5bb-b035-4879-8e9f-efbcdbe89374_1684x434.png 848w, https://substackcdn.com/image/fetch/$s_!NQNQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9994d5bb-b035-4879-8e9f-efbcdbe89374_1684x434.png 1272w, https://substackcdn.com/image/fetch/$s_!NQNQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9994d5bb-b035-4879-8e9f-efbcdbe89374_1684x434.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NQNQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9994d5bb-b035-4879-8e9f-efbcdbe89374_1684x434.png" width="1456" height="375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9994d5bb-b035-4879-8e9f-efbcdbe89374_1684x434.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:375,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:76267,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9994d5bb-b035-4879-8e9f-efbcdbe89374_1684x434.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NQNQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9994d5bb-b035-4879-8e9f-efbcdbe89374_1684x434.png 424w, https://substackcdn.com/image/fetch/$s_!NQNQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9994d5bb-b035-4879-8e9f-efbcdbe89374_1684x434.png 848w, https://substackcdn.com/image/fetch/$s_!NQNQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9994d5bb-b035-4879-8e9f-efbcdbe89374_1684x434.png 1272w, https://substackcdn.com/image/fetch/$s_!NQNQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9994d5bb-b035-4879-8e9f-efbcdbe89374_1684x434.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Trigger phrases that work</strong>:</p><ul><li><p>&#8220;Use when...&#8221;</p></li><li><p>&#8220;Triggers on...&#8221;</p></li><li><p>&#8220;Activate when...&#8221;</p></li><li><p>&#8220;Use for...&#8221;</p></li><li><p>&#8220;Applies to...&#8221;</p></li></ul><p>Real example from <a href="https://github.com/glebis/claude-skills">https://github.com/glebis/claude-skills</a>:</p><p>The `telegram` skill gets this right:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tMm-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6690dd5-7fb1-48da-b325-3b3c26a6cf50_1676x256.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tMm-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6690dd5-7fb1-48da-b325-3b3c26a6cf50_1676x256.png 424w, https://substackcdn.com/image/fetch/$s_!tMm-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6690dd5-7fb1-48da-b325-3b3c26a6cf50_1676x256.png 848w, https://substackcdn.com/image/fetch/$s_!tMm-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6690dd5-7fb1-48da-b325-3b3c26a6cf50_1676x256.png 1272w, https://substackcdn.com/image/fetch/$s_!tMm-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6690dd5-7fb1-48da-b325-3b3c26a6cf50_1676x256.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tMm-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6690dd5-7fb1-48da-b325-3b3c26a6cf50_1676x256.png" width="1456" height="222" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e6690dd5-7fb1-48da-b325-3b3c26a6cf50_1676x256.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:222,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:67037,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6690dd5-7fb1-48da-b325-3b3c26a6cf50_1676x256.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tMm-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6690dd5-7fb1-48da-b325-3b3c26a6cf50_1676x256.png 424w, https://substackcdn.com/image/fetch/$s_!tMm-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6690dd5-7fb1-48da-b325-3b3c26a6cf50_1676x256.png 848w, https://substackcdn.com/image/fetch/$s_!tMm-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6690dd5-7fb1-48da-b325-3b3c26a6cf50_1676x256.png 1272w, https://substackcdn.com/image/fetch/$s_!tMm-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6690dd5-7fb1-48da-b325-3b3c26a6cf50_1676x256.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Specific keywords (&#8221;show my Telegram messages&#8221;) give Claude exact phrases to match.</p><h2>2.  Missing the WHAT verb</h2><p><strong>The problem</strong>: Descriptions explain the domain but don&#8217;t state the action.</p><p>Per the <a href="https://agentskills.io/specification">spec</a>, descriptions need an action verb explaining what the skill does.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J_yp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbb571e8-a70d-4044-b865-15bc7aac3428_1666x440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J_yp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbb571e8-a70d-4044-b865-15bc7aac3428_1666x440.png 424w, https://substackcdn.com/image/fetch/$s_!J_yp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbb571e8-a70d-4044-b865-15bc7aac3428_1666x440.png 848w, https://substackcdn.com/image/fetch/$s_!J_yp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbb571e8-a70d-4044-b865-15bc7aac3428_1666x440.png 1272w, https://substackcdn.com/image/fetch/$s_!J_yp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbb571e8-a70d-4044-b865-15bc7aac3428_1666x440.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J_yp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbb571e8-a70d-4044-b865-15bc7aac3428_1666x440.png" width="1456" height="385" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fbb571e8-a70d-4044-b865-15bc7aac3428_1666x440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:385,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:89544,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbb571e8-a70d-4044-b865-15bc7aac3428_1666x440.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J_yp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbb571e8-a70d-4044-b865-15bc7aac3428_1666x440.png 424w, https://substackcdn.com/image/fetch/$s_!J_yp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbb571e8-a70d-4044-b865-15bc7aac3428_1666x440.png 848w, https://substackcdn.com/image/fetch/$s_!J_yp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbb571e8-a70d-4044-b865-15bc7aac3428_1666x440.png 1272w, https://substackcdn.com/image/fetch/$s_!J_yp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbb571e8-a70d-4044-b865-15bc7aac3428_1666x440.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Why it matters</strong>: Action verbs tell Claude what the skill <em>does</em>. &#8220;Generation&#8221; is a concept; &#8220;Generate&#8221; is actionable.</p><p><strong>Strong action verbs:</strong></p><ul><li><p>Create, Generate, Build</p></li><li><p>Convert, Transform, Extract</p></li><li><p>Analyze, Validate, Process</p></li><li><p>Search, Find, Fetch</p></li></ul><p><strong>Weak alternatives to avoid</strong>:</p><ul><li><p>&#8220;A tool for...&#8221; (what does it <em>do</em>?)</p></li><li><p>&#8220;Handles...&#8221; (vague)</p></li><li><p>&#8220;Helps with...&#8221; (still vague)</p></li></ul><h2>Vague or generic names</h2><p><strong>The problem</strong>: Single-word or overly generic names that don&#8217;t convey purpose.</p><p>The <a href="https://agentskills.io/specification">naming rules</a> require lowercase letters, numbers, and hyphens only. But beyond format, names should be self-documenting.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kpdO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f6bb68-d2f2-4152-bbcc-36f8b84f6e87_1674x528.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kpdO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f6bb68-d2f2-4152-bbcc-36f8b84f6e87_1674x528.png 424w, https://substackcdn.com/image/fetch/$s_!kpdO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f6bb68-d2f2-4152-bbcc-36f8b84f6e87_1674x528.png 848w, https://substackcdn.com/image/fetch/$s_!kpdO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f6bb68-d2f2-4152-bbcc-36f8b84f6e87_1674x528.png 1272w, https://substackcdn.com/image/fetch/$s_!kpdO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f6bb68-d2f2-4152-bbcc-36f8b84f6e87_1674x528.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kpdO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f6bb68-d2f2-4152-bbcc-36f8b84f6e87_1674x528.png" width="1456" height="459" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54f6bb68-d2f2-4152-bbcc-36f8b84f6e87_1674x528.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:459,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77510,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f6bb68-d2f2-4152-bbcc-36f8b84f6e87_1674x528.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kpdO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f6bb68-d2f2-4152-bbcc-36f8b84f6e87_1674x528.png 424w, https://substackcdn.com/image/fetch/$s_!kpdO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f6bb68-d2f2-4152-bbcc-36f8b84f6e87_1674x528.png 848w, https://substackcdn.com/image/fetch/$s_!kpdO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f6bb68-d2f2-4152-bbcc-36f8b84f6e87_1674x528.png 1272w, https://substackcdn.com/image/fetch/$s_!kpdO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f6bb68-d2f2-4152-bbcc-36f8b84f6e87_1674x528.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Why it matters</strong>: When scanning <code>~/.claude/skills/</code>, you should know what each skill does without opening the file.</p><p><strong>Reserved words to avoid</strong>: <code>skill</code>, <code>skills</code>, <code>claude</code>, <code>anthropic</code>, <code>mcp</code>, <code>tool</code>, <code>tools</code>, <code>agent</code>, <code>ai</code>, <code>assistant</code>, <code>bot</code></p><p><strong>Vague terms to avoid</strong>:  <code>helper</code>, <code>utils</code>, <code>misc</code>, <code>stuff</code>, <code>manager</code>, <code>handler</code></p><p><strong>Good pattern</strong>: <code>[domain]-[action]</code> or <code>[action]-[object]</code></p><ul><li><p>github-pr-reviewer</p></li><li><p>weekly-report-generator</p></li><li><p>code-quality-checker</p></li></ul><h2>4. Empty sections after headings</h2><p><strong>The problem</strong>: Creating structure without content.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AyHZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb84355f-8a08-41cb-b9b2-746951b31888_1674x350.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AyHZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb84355f-8a08-41cb-b9b2-746951b31888_1674x350.png 424w, https://substackcdn.com/image/fetch/$s_!AyHZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb84355f-8a08-41cb-b9b2-746951b31888_1674x350.png 848w, https://substackcdn.com/image/fetch/$s_!AyHZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb84355f-8a08-41cb-b9b2-746951b31888_1674x350.png 1272w, https://substackcdn.com/image/fetch/$s_!AyHZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb84355f-8a08-41cb-b9b2-746951b31888_1674x350.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AyHZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb84355f-8a08-41cb-b9b2-746951b31888_1674x350.png" width="1456" height="304" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bb84355f-8a08-41cb-b9b2-746951b31888_1674x350.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:304,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:36371,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb84355f-8a08-41cb-b9b2-746951b31888_1674x350.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AyHZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb84355f-8a08-41cb-b9b2-746951b31888_1674x350.png 424w, https://substackcdn.com/image/fetch/$s_!AyHZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb84355f-8a08-41cb-b9b2-746951b31888_1674x350.png 848w, https://substackcdn.com/image/fetch/$s_!AyHZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb84355f-8a08-41cb-b9b2-746951b31888_1674x350.png 1272w, https://substackcdn.com/image/fetch/$s_!AyHZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb84355f-8a08-41cb-b9b2-746951b31888_1674x350.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>That empty Overview section wastes tokens and suggests incomplete documentation.</p><p><strong>Why it matters</strong>: Every heading should deliver value. Empty sections are noise in Claude&#8217;s context window.</p><p><strong>Fix options</strong>:</p><ol><li><p>Add content to the section</p></li><li><p>Remove the heading entirely</p></li><li><p>Merge with the next section</p></li></ol><p><strong>Before</strong>:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0zsl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba414268-cf65-4400-ae9c-147325c28d5c_1672x352.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0zsl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba414268-cf65-4400-ae9c-147325c28d5c_1672x352.png 424w, https://substackcdn.com/image/fetch/$s_!0zsl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba414268-cf65-4400-ae9c-147325c28d5c_1672x352.png 848w, https://substackcdn.com/image/fetch/$s_!0zsl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba414268-cf65-4400-ae9c-147325c28d5c_1672x352.png 1272w, https://substackcdn.com/image/fetch/$s_!0zsl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba414268-cf65-4400-ae9c-147325c28d5c_1672x352.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0zsl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba414268-cf65-4400-ae9c-147325c28d5c_1672x352.png" width="1456" height="307" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba414268-cf65-4400-ae9c-147325c28d5c_1672x352.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:307,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:40815,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba414268-cf65-4400-ae9c-147325c28d5c_1672x352.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0zsl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba414268-cf65-4400-ae9c-147325c28d5c_1672x352.png 424w, https://substackcdn.com/image/fetch/$s_!0zsl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba414268-cf65-4400-ae9c-147325c28d5c_1672x352.png 848w, https://substackcdn.com/image/fetch/$s_!0zsl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba414268-cf65-4400-ae9c-147325c28d5c_1672x352.png 1272w, https://substackcdn.com/image/fetch/$s_!0zsl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba414268-cf65-4400-ae9c-147325c28d5c_1672x352.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>After</strong>:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vEpk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8cf4b8-b179-4e00-aa81-5e413817e55d_1672x252.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vEpk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8cf4b8-b179-4e00-aa81-5e413817e55d_1672x252.png 424w, https://substackcdn.com/image/fetch/$s_!vEpk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8cf4b8-b179-4e00-aa81-5e413817e55d_1672x252.png 848w, https://substackcdn.com/image/fetch/$s_!vEpk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8cf4b8-b179-4e00-aa81-5e413817e55d_1672x252.png 1272w, https://substackcdn.com/image/fetch/$s_!vEpk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8cf4b8-b179-4e00-aa81-5e413817e55d_1672x252.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vEpk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8cf4b8-b179-4e00-aa81-5e413817e55d_1672x252.png" width="1456" height="219" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/df8cf4b8-b179-4e00-aa81-5e413817e55d_1672x252.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:219,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35182,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8cf4b8-b179-4e00-aa81-5e413817e55d_1672x252.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vEpk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8cf4b8-b179-4e00-aa81-5e413817e55d_1672x252.png 424w, https://substackcdn.com/image/fetch/$s_!vEpk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8cf4b8-b179-4e00-aa81-5e413817e55d_1672x252.png 848w, https://substackcdn.com/image/fetch/$s_!vEpk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8cf4b8-b179-4e00-aa81-5e413817e55d_1672x252.png 1272w, https://substackcdn.com/image/fetch/$s_!vEpk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8cf4b8-b179-4e00-aa81-5e413817e55d_1672x252.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>5. Wordy trigger phrases</h2><p><strong>The problem</strong>: Unnecessarily verbose descriptions that waste tokens.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ozxb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5305f4d6-2f9f-4f9a-b86f-93549cbbde73_1658x426.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ozxb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5305f4d6-2f9f-4f9a-b86f-93549cbbde73_1658x426.png 424w, https://substackcdn.com/image/fetch/$s_!Ozxb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5305f4d6-2f9f-4f9a-b86f-93549cbbde73_1658x426.png 848w, https://substackcdn.com/image/fetch/$s_!Ozxb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5305f4d6-2f9f-4f9a-b86f-93549cbbde73_1658x426.png 1272w, https://substackcdn.com/image/fetch/$s_!Ozxb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5305f4d6-2f9f-4f9a-b86f-93549cbbde73_1658x426.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ozxb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5305f4d6-2f9f-4f9a-b86f-93549cbbde73_1658x426.png" width="1456" height="374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5305f4d6-2f9f-4f9a-b86f-93549cbbde73_1658x426.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:374,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:80303,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5305f4d6-2f9f-4f9a-b86f-93549cbbde73_1658x426.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ozxb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5305f4d6-2f9f-4f9a-b86f-93549cbbde73_1658x426.png 424w, https://substackcdn.com/image/fetch/$s_!Ozxb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5305f4d6-2f9f-4f9a-b86f-93549cbbde73_1658x426.png 848w, https://substackcdn.com/image/fetch/$s_!Ozxb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5305f4d6-2f9f-4f9a-b86f-93549cbbde73_1658x426.png 1272w, https://substackcdn.com/image/fetch/$s_!Ozxb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5305f4d6-2f9f-4f9a-b86f-93549cbbde73_1658x426.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Why it matters</strong>: Skills load into Claude&#8217;s context on every activation. Across thousands of uses, wordier descriptions add up to real token costs.</p><p><strong>Common bloat to cut</strong>:</p><ul><li><p>&#8220;This skill should be used when&#8221; &#8594; &#8220;Use when&#8221;</p></li><li><p>&#8220;The purpose of this skill is to&#8221; &#8594; just state what it does</p></li><li><p>&#8220;In order to&#8221; &#8594; &#8220;to&#8221;</p></li><li><p>&#8220;It is important to note that&#8221; &#8594; delete entirely</p></li></ul><p><strong>Token impact</strong>: A 100-word description vs 50-word description might seem trivial. But if the skill activates 1000 times, that&#8217;s 50,000 extra tokens processed.</p><h2>6. No output format specification</h2><p><strong>The problem</strong>: Skills that produce output but don&#8217;t define the format.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pHhA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be8ef2-299f-4a61-a82b-9117f8607cbb_1654x234.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pHhA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be8ef2-299f-4a61-a82b-9117f8607cbb_1654x234.png 424w, https://substackcdn.com/image/fetch/$s_!pHhA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be8ef2-299f-4a61-a82b-9117f8607cbb_1654x234.png 848w, https://substackcdn.com/image/fetch/$s_!pHhA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be8ef2-299f-4a61-a82b-9117f8607cbb_1654x234.png 1272w, https://substackcdn.com/image/fetch/$s_!pHhA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be8ef2-299f-4a61-a82b-9117f8607cbb_1654x234.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pHhA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be8ef2-299f-4a61-a82b-9117f8607cbb_1654x234.png" width="1456" height="206" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59be8ef2-299f-4a61-a82b-9117f8607cbb_1654x234.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:206,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28302,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be8ef2-299f-4a61-a82b-9117f8607cbb_1654x234.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pHhA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be8ef2-299f-4a61-a82b-9117f8607cbb_1654x234.png 424w, https://substackcdn.com/image/fetch/$s_!pHhA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be8ef2-299f-4a61-a82b-9117f8607cbb_1654x234.png 848w, https://substackcdn.com/image/fetch/$s_!pHhA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be8ef2-299f-4a61-a82b-9117f8607cbb_1654x234.png 1272w, https://substackcdn.com/image/fetch/$s_!pHhA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be8ef2-299f-4a61-a82b-9117f8607cbb_1654x234.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>What format? JSON? Markdown? Plain text? Claude has to guess.</p><p><strong>Why it matters</strong>: Without format examples, output is inconsistent. Users end up reformatting every response.</p><p><strong>Fix</strong>: Include concrete examples with code blocks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NNcV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9e4de2-4509-4e1c-9b04-a6b180bb6aa9_1670x1108.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NNcV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9e4de2-4509-4e1c-9b04-a6b180bb6aa9_1670x1108.png 424w, https://substackcdn.com/image/fetch/$s_!NNcV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9e4de2-4509-4e1c-9b04-a6b180bb6aa9_1670x1108.png 848w, https://substackcdn.com/image/fetch/$s_!NNcV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9e4de2-4509-4e1c-9b04-a6b180bb6aa9_1670x1108.png 1272w, https://substackcdn.com/image/fetch/$s_!NNcV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9e4de2-4509-4e1c-9b04-a6b180bb6aa9_1670x1108.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NNcV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9e4de2-4509-4e1c-9b04-a6b180bb6aa9_1670x1108.png" width="1456" height="966" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b9e4de2-4509-4e1c-9b04-a6b180bb6aa9_1670x1108.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:966,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:110931,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9e4de2-4509-4e1c-9b04-a6b180bb6aa9_1670x1108.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NNcV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9e4de2-4509-4e1c-9b04-a6b180bb6aa9_1670x1108.png 424w, https://substackcdn.com/image/fetch/$s_!NNcV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9e4de2-4509-4e1c-9b04-a6b180bb6aa9_1670x1108.png 848w, https://substackcdn.com/image/fetch/$s_!NNcV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9e4de2-4509-4e1c-9b04-a6b180bb6aa9_1670x1108.png 1272w, https://substackcdn.com/image/fetch/$s_!NNcV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9e4de2-4509-4e1c-9b04-a6b180bb6aa9_1670x1108.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Good examples from real skills</strong>:</p><p>The <a href="https://github.com/glebis/claude-skills">deep-research</a> skill documents output clearly:</p><ul><li><p>Markdown report saved to `research_report_YYYYMMDD_HHMMSS.md`</p></li><li><p>Numbered source citations</p></li><li><p>Metadata footer with date and model used</p></li></ul><h2>7. Contradictory Instructions</h2><p><strong>The problem</strong>: Instructions that simultaneously require and forbid the same thing.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gZ02!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefffed56-2bc9-4757-bcf2-1d538962be17_1650x238.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gZ02!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefffed56-2bc9-4757-bcf2-1d538962be17_1650x238.png 424w, https://substackcdn.com/image/fetch/$s_!gZ02!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefffed56-2bc9-4757-bcf2-1d538962be17_1650x238.png 848w, https://substackcdn.com/image/fetch/$s_!gZ02!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefffed56-2bc9-4757-bcf2-1d538962be17_1650x238.png 1272w, https://substackcdn.com/image/fetch/$s_!gZ02!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefffed56-2bc9-4757-bcf2-1d538962be17_1650x238.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gZ02!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefffed56-2bc9-4757-bcf2-1d538962be17_1650x238.png" width="1456" height="210" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/efffed56-2bc9-4757-bcf2-1d538962be17_1650x238.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:210,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34932,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefffed56-2bc9-4757-bcf2-1d538962be17_1650x238.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gZ02!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefffed56-2bc9-4757-bcf2-1d538962be17_1650x238.png 424w, https://substackcdn.com/image/fetch/$s_!gZ02!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefffed56-2bc9-4757-bcf2-1d538962be17_1650x238.png 848w, https://substackcdn.com/image/fetch/$s_!gZ02!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefffed56-2bc9-4757-bcf2-1d538962be17_1650x238.png 1272w, https://substackcdn.com/image/fetch/$s_!gZ02!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefffed56-2bc9-4757-bcf2-1d538962be17_1650x238.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Timestamps <em>are</em> metadata. Which instruction wins?</p><p><strong>Why it matters</strong>: Claude will follow one instruction and violate the other, leading to unpredictable behavior.</p><p><strong>Real contradiction patterns I&#8217;ve seen</strong>:</p><ul><li><p>&#8220;Be concise&#8221; + later &#8220;Include comprehensive details&#8221;</p></li><li><p>&#8220;Always use JSON output&#8221; + &#8220;Return plain text for simple queries&#8221;</p></li><li><p>&#8220;Never modify user files&#8221; + &#8220;Auto-save results to the project directory&#8221;</p></li></ul><p><strong>Fix</strong>: Read your skill end-to-end looking for conflicts. Better yet, have someone else review it. Fresh eyes catch contradictions you&#8217;ve become blind to.</p><p><strong>Pattern to use instead</strong>: Be explicit about conditions.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F4_S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37393df9-42e8-491e-b812-afcc5ac57b4a_1650x286.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F4_S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37393df9-42e8-491e-b812-afcc5ac57b4a_1650x286.png 424w, https://substackcdn.com/image/fetch/$s_!F4_S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37393df9-42e8-491e-b812-afcc5ac57b4a_1650x286.png 848w, https://substackcdn.com/image/fetch/$s_!F4_S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37393df9-42e8-491e-b812-afcc5ac57b4a_1650x286.png 1272w, https://substackcdn.com/image/fetch/$s_!F4_S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37393df9-42e8-491e-b812-afcc5ac57b4a_1650x286.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F4_S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37393df9-42e8-491e-b812-afcc5ac57b4a_1650x286.png" width="1456" height="252" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37393df9-42e8-491e-b812-afcc5ac57b4a_1650x286.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:252,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49139,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37393df9-42e8-491e-b812-afcc5ac57b4a_1650x286.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F4_S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37393df9-42e8-491e-b812-afcc5ac57b4a_1650x286.png 424w, https://substackcdn.com/image/fetch/$s_!F4_S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37393df9-42e8-491e-b812-afcc5ac57b4a_1650x286.png 848w, https://substackcdn.com/image/fetch/$s_!F4_S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37393df9-42e8-491e-b812-afcc5ac57b4a_1650x286.png 1272w, https://substackcdn.com/image/fetch/$s_!F4_S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37393df9-42e8-491e-b812-afcc5ac57b4a_1650x286.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>The Skills that got it right</h2><p>Not everything I validated had issues. Here&#8217;s what well-crafted skills have in common.</p><h3>Clear Activation Triggers</h3><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rVPS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4408dc66-6356-491d-8e43-41c7df9bbea5_1662x188.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rVPS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4408dc66-6356-491d-8e43-41c7df9bbea5_1662x188.png 424w, https://substackcdn.com/image/fetch/$s_!rVPS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4408dc66-6356-491d-8e43-41c7df9bbea5_1662x188.png 848w, https://substackcdn.com/image/fetch/$s_!rVPS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4408dc66-6356-491d-8e43-41c7df9bbea5_1662x188.png 1272w, https://substackcdn.com/image/fetch/$s_!rVPS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4408dc66-6356-491d-8e43-41c7df9bbea5_1662x188.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rVPS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4408dc66-6356-491d-8e43-41c7df9bbea5_1662x188.png" width="1456" height="165" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4408dc66-6356-491d-8e43-41c7df9bbea5_1662x188.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:165,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47204,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4408dc66-6356-491d-8e43-41c7df9bbea5_1662x188.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rVPS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4408dc66-6356-491d-8e43-41c7df9bbea5_1662x188.png 424w, https://substackcdn.com/image/fetch/$s_!rVPS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4408dc66-6356-491d-8e43-41c7df9bbea5_1662x188.png 848w, https://substackcdn.com/image/fetch/$s_!rVPS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4408dc66-6356-491d-8e43-41c7df9bbea5_1662x188.png 1272w, https://substackcdn.com/image/fetch/$s_!rVPS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4408dc66-6356-491d-8e43-41c7df9bbea5_1662x188.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Three specific trigger phrases. No ambiguity.</p><h3>Structured Workflows</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vpgI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7b875aa-abd7-44d2-8cd1-cdb3876d424f_1672x436.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vpgI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7b875aa-abd7-44d2-8cd1-cdb3876d424f_1672x436.png 424w, https://substackcdn.com/image/fetch/$s_!vpgI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7b875aa-abd7-44d2-8cd1-cdb3876d424f_1672x436.png 848w, https://substackcdn.com/image/fetch/$s_!vpgI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7b875aa-abd7-44d2-8cd1-cdb3876d424f_1672x436.png 1272w, https://substackcdn.com/image/fetch/$s_!vpgI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7b875aa-abd7-44d2-8cd1-cdb3876d424f_1672x436.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vpgI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7b875aa-abd7-44d2-8cd1-cdb3876d424f_1672x436.png" width="1456" height="380" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a7b875aa-abd7-44d2-8cd1-cdb3876d424f_1672x436.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:380,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85576,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7b875aa-abd7-44d2-8cd1-cdb3876d424f_1672x436.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vpgI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7b875aa-abd7-44d2-8cd1-cdb3876d424f_1672x436.png 424w, https://substackcdn.com/image/fetch/$s_!vpgI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7b875aa-abd7-44d2-8cd1-cdb3876d424f_1672x436.png 848w, https://substackcdn.com/image/fetch/$s_!vpgI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7b875aa-abd7-44d2-8cd1-cdb3876d424f_1672x436.png 1272w, https://substackcdn.com/image/fetch/$s_!vpgI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7b875aa-abd7-44d2-8cd1-cdb3876d424f_1672x436.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Numbered steps. Clear sequence. Easy to follow.</p><h3>Concrete examples</h3><p><br>From <a href="https://github.com/glebis/claude-skills">telegram skill</a>:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LUAX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6660689f-2c51-495f-85b1-9c898dda048f_1654x318.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LUAX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6660689f-2c51-495f-85b1-9c898dda048f_1654x318.png 424w, https://substackcdn.com/image/fetch/$s_!LUAX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6660689f-2c51-495f-85b1-9c898dda048f_1654x318.png 848w, https://substackcdn.com/image/fetch/$s_!LUAX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6660689f-2c51-495f-85b1-9c898dda048f_1654x318.png 1272w, https://substackcdn.com/image/fetch/$s_!LUAX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6660689f-2c51-495f-85b1-9c898dda048f_1654x318.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LUAX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6660689f-2c51-495f-85b1-9c898dda048f_1654x318.png" width="1456" height="280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6660689f-2c51-495f-85b1-9c898dda048f_1654x318.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:280,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:67499,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6660689f-2c51-495f-85b1-9c898dda048f_1654x318.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LUAX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6660689f-2c51-495f-85b1-9c898dda048f_1654x318.png 424w, https://substackcdn.com/image/fetch/$s_!LUAX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6660689f-2c51-495f-85b1-9c898dda048f_1654x318.png 848w, https://substackcdn.com/image/fetch/$s_!LUAX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6660689f-2c51-495f-85b1-9c898dda048f_1654x318.png 1272w, https://substackcdn.com/image/fetch/$s_!LUAX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6660689f-2c51-495f-85b1-9c898dda048f_1654x318.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>Troubleshooting</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OhFx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca894bf-67a6-4d0d-8c09-da4e0ceff407_1708x476.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OhFx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca894bf-67a6-4d0d-8c09-da4e0ceff407_1708x476.png 424w, https://substackcdn.com/image/fetch/$s_!OhFx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca894bf-67a6-4d0d-8c09-da4e0ceff407_1708x476.png 848w, https://substackcdn.com/image/fetch/$s_!OhFx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca894bf-67a6-4d0d-8c09-da4e0ceff407_1708x476.png 1272w, https://substackcdn.com/image/fetch/$s_!OhFx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca894bf-67a6-4d0d-8c09-da4e0ceff407_1708x476.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OhFx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca894bf-67a6-4d0d-8c09-da4e0ceff407_1708x476.png" width="1456" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ca894bf-67a6-4d0d-8c09-da4e0ceff407_1708x476.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:97587,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca894bf-67a6-4d0d-8c09-da4e0ceff407_1708x476.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OhFx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca894bf-67a6-4d0d-8c09-da4e0ceff407_1708x476.png 424w, https://substackcdn.com/image/fetch/$s_!OhFx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca894bf-67a6-4d0d-8c09-da4e0ceff407_1708x476.png 848w, https://substackcdn.com/image/fetch/$s_!OhFx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca894bf-67a6-4d0d-8c09-da4e0ceff407_1708x476.png 1272w, https://substackcdn.com/image/fetch/$s_!OhFx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca894bf-67a6-4d0d-8c09-da4e0ceff407_1708x476.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Users know what to do when things break.</p><h3>Anti-slop writing style</h3><p>The best skills avoid AI writing patterns:</p><p><strong>Bad</strong>:</p><p>&#8220;Furthermore, it&#8217;s important to note that the team has potentially made progress on the authentication feature, which may help us move forward.&#8221;</p><p><strong>Good</strong>:</p><p>&#8220;Authentication feature: 4 of 6 tasks complete. Remaining work blocked on API access; escalated to Platform team.&#8221;</p><p>No hedge stacking. No filler phrases. Just facts.</p><h2>Skills with badges</h2><p>Skills that pass <a href="https://www.getskillcheck.com/">SkillCheck</a> validation can display a badge in their README, like this <a href="https://github.com/OthmanAdi/planning-with-files">Planning with Files</a> skill: </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4XmW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8b1305-714f-4e57-a756-64828e63281b_1774x984.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4XmW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8b1305-714f-4e57-a756-64828e63281b_1774x984.png 424w, https://substackcdn.com/image/fetch/$s_!4XmW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8b1305-714f-4e57-a756-64828e63281b_1774x984.png 848w, https://substackcdn.com/image/fetch/$s_!4XmW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8b1305-714f-4e57-a756-64828e63281b_1774x984.png 1272w, https://substackcdn.com/image/fetch/$s_!4XmW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8b1305-714f-4e57-a756-64828e63281b_1774x984.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4XmW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8b1305-714f-4e57-a756-64828e63281b_1774x984.png" width="1456" height="808" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c8b1305-714f-4e57-a756-64828e63281b_1774x984.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:808,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:212262,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/185355185?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8b1305-714f-4e57-a756-64828e63281b_1774x984.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4XmW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8b1305-714f-4e57-a756-64828e63281b_1774x984.png 424w, https://substackcdn.com/image/fetch/$s_!4XmW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8b1305-714f-4e57-a756-64828e63281b_1774x984.png 848w, https://substackcdn.com/image/fetch/$s_!4XmW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8b1305-714f-4e57-a756-64828e63281b_1774x984.png 1272w, https://substackcdn.com/image/fetch/$s_!4XmW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8b1305-714f-4e57-a756-64828e63281b_1774x984.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Examples of validated skills</strong>:</p><ul><li><p>[<a href="https://github.com/SawyerHood/dev-browser">SawyerHood/dev-browser</a>] - Browser automation with persistent page state. 3.1K stars. Created by ex-Figma, ex-Facebook engineer.</p></li><li><p>[<a href="https://github.com/mrgoonie/claudekit-skills">mrgoonie/claudekit-skills</a>]() - ClaudeKit collection. The `code-review` skill&#8217;s principle: &#8220;Technical correctness over social comfort.&#8221; 1.4K stars.</p></li><li><p>[<a href="https://github.com/glebis/claude-skills">glebis/claude-skills</a>] - Collection of productivity skills (Telegram, PDF generation, deep research)</p></li><li><p>[<a href="https://www.getskillcheck.com/">SkillCheck</a>] - The validator itself, eating its own dogfood</p></li><li><p>[<a href="https://github.com/anthropics/skills">anthropics/skills]</a> - Anthropic&#8217;s official skill examples</p></li></ul><p>I also repackaged/remixed Carl Vellotti&#8217;s <a href="https://www.cursorforpms.com/nano-banana/setup">Nano Banana course</a> into a Claude Code skill for my own workflow. It wraps Gemini&#8217;s image generation with style libraries and multi-turn refinement. If you&#8217;re looking to build image generation skills, Carl&#8217;s course is a great starting point!</p><h2>Try it yourself</h2><p>I built SkillCheck to catch these issues automatically.</p><p><strong>Free tier</strong></p><p>Validates against the <a href="https://agentskills.io/specification">agentskills.io specification</a>:</p><ul><li><p>Frontmatter structure (name, description, required fields)</p></li><li><p>Naming conventions (format, reserved words, specificity)</p><p> Semantic consistency (contradictions, output format, clarity)</p></li></ul><p>Install by copying to your skills directory:</p><p><code>bash</code></p><p><code>git clone https://github.com/olgasafonova/SkillCheck-Free.git</code></p><p><code>cp -r SkillCheck-Free/skill-check ~/.claude/skills/</code></p><p>Then say &#8220;skillcheck my skill&#8221; in <a href="https://code.claude.com/docs/en/skills">Claude Code</a>.</p><p><strong>GitHub</strong>: <a href="https://github.com/olgasafonova/SkillCheck-Free">github.com/olgasafonova/SkillCheck-Free</a></p><p><strong>Pro tier</strong></p><p>Adds deeper analysis via MCP server:</p><ul><li><p><strong>Anti-slop detection</strong> - Catches AI writing patterns (em-dash abuse, hedge stacking, filler phrases)</p></li><li><p><strong>Security scanning</strong> - Detects hardcoded secrets, PII in examples, unsafe paths</p></li><li><p><strong>Token budget analysis</strong> - Warns when skills exceed optimal size</p></li><li><p><strong>WCAG accessibility</strong> - Validates color contrast for visual-output skills</p></li><li><p><strong>Enterprise readiness</strong> - Checks for hardcoded paths, env configuration</p></li></ul><p>Get it at <a href="https://getskillcheck.com">getskillcheck.com</a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Claude Code Primitives: A Moomin Guide]]></title><description><![CDATA[Learning Claude Code I started thinking of its features as Moomin characters, as a genuine mental model for how these things actually behave. Learn why.]]></description><link>https://olgasafonova.substack.com/p/claude-code-primitives-a-moomin-guide</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/claude-code-primitives-a-moomin-guide</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Tue, 13 Jan 2026 07:15:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pSxQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48d407b-3581-452f-bc08-130968455527_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve been using Claude Code for months. Somewhere along the way, I started thinking of its features as Moomin characters. Not as a cute metaphor; as a genuine mental model for how these things actually behave.</p><p>Turns out, Tove Jansson&#8217;s characters map perfectly to agentic AI architecture.</p><p>Claude Code ships with six primitives. The <a href="https://docs.anthropic.com/en/docs/claude-code">documentation</a> explains the syntax. It doesn&#8217;t explain the behavior. And behavior is what matters when you&#8217;re building workflows. Each primitive has a personality. Once you understand the personality, you stop fighting the tool.</p><h1>Skills</h1><p>Skills are Moominmamma. Markdown files Claude loads automatically based on context. Two locations: <code>~/.claude/skills/</code> for global, <code>.claude/skills/</code> for project-specific.</p><p>No explicit invocation. Claude scans available skills and injects relevant ones. The matching happens through semantic similarity, not keywords. A skill about &#8220;database migrations&#8221; might activate when you mention &#8220;schema changes.&#8221;</p><p>Inside a skill file you put coding standards, API patterns, decision trees, domain terminology, code snippets. Whatever you&#8217;d normally have to repeat every conversation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VW6J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01fef1d1-01d3-4931-a186-9a0a803d733b_1368x494.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VW6J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01fef1d1-01d3-4931-a186-9a0a803d733b_1368x494.png 424w, https://substackcdn.com/image/fetch/$s_!VW6J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01fef1d1-01d3-4931-a186-9a0a803d733b_1368x494.png 848w, https://substackcdn.com/image/fetch/$s_!VW6J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01fef1d1-01d3-4931-a186-9a0a803d733b_1368x494.png 1272w, https://substackcdn.com/image/fetch/$s_!VW6J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01fef1d1-01d3-4931-a186-9a0a803d733b_1368x494.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VW6J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01fef1d1-01d3-4931-a186-9a0a803d733b_1368x494.png" width="1368" height="494" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01fef1d1-01d3-4931-a186-9a0a803d733b_1368x494.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:494,&quot;width&quot;:1368,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:73098,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01fef1d1-01d3-4931-a186-9a0a803d733b_1368x494.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VW6J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01fef1d1-01d3-4931-a186-9a0a803d733b_1368x494.png 424w, https://substackcdn.com/image/fetch/$s_!VW6J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01fef1d1-01d3-4931-a186-9a0a803d733b_1368x494.png 848w, https://substackcdn.com/image/fetch/$s_!VW6J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01fef1d1-01d3-4931-a186-9a0a803d733b_1368x494.png 1272w, https://substackcdn.com/image/fetch/$s_!VW6J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01fef1d1-01d3-4931-a186-9a0a803d733b_1368x494.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The trap: skills consume context window. Load too many and you crowd out room for actual work. Keep them focused.</p><p>Moominmamma is always present with the right knowledge at the right time. She never needs to be asked. Her handbag contains everything you might need; bandages when someone falls, warm blankets when guests arrive. You reach for something and it&#8217;s already there. Stock your skills/ directory well. Claude surfaces the right knowledge without prompting.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xR7y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432c5b63-6b96-4445-8c09-7675fab656e3_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xR7y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432c5b63-6b96-4445-8c09-7675fab656e3_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!xR7y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432c5b63-6b96-4445-8c09-7675fab656e3_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!xR7y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432c5b63-6b96-4445-8c09-7675fab656e3_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!xR7y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432c5b63-6b96-4445-8c09-7675fab656e3_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xR7y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432c5b63-6b96-4445-8c09-7675fab656e3_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/432c5b63-6b96-4445-8c09-7675fab656e3_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:301399,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432c5b63-6b96-4445-8c09-7675fab656e3_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xR7y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432c5b63-6b96-4445-8c09-7675fab656e3_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!xR7y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432c5b63-6b96-4445-8c09-7675fab656e3_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!xR7y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432c5b63-6b96-4445-8c09-7675fab656e3_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!xR7y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432c5b63-6b96-4445-8c09-7675fab656e3_2400x1260.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Subagents</h1><p>Subagents are The Snork.  Spawned Claude instances with isolated context windows. Created via the `Task` tool:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dkrh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb707700-d6f3-4dd3-a329-9ac62a9a5156_1352x234.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dkrh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb707700-d6f3-4dd3-a329-9ac62a9a5156_1352x234.png 424w, https://substackcdn.com/image/fetch/$s_!dkrh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb707700-d6f3-4dd3-a329-9ac62a9a5156_1352x234.png 848w, https://substackcdn.com/image/fetch/$s_!dkrh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb707700-d6f3-4dd3-a329-9ac62a9a5156_1352x234.png 1272w, https://substackcdn.com/image/fetch/$s_!dkrh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb707700-d6f3-4dd3-a329-9ac62a9a5156_1352x234.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dkrh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb707700-d6f3-4dd3-a329-9ac62a9a5156_1352x234.png" width="1352" height="234" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb707700-d6f3-4dd3-a329-9ac62a9a5156_1352x234.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:234,&quot;width&quot;:1352,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:38044,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb707700-d6f3-4dd3-a329-9ac62a9a5156_1352x234.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dkrh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb707700-d6f3-4dd3-a329-9ac62a9a5156_1352x234.png 424w, https://substackcdn.com/image/fetch/$s_!dkrh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb707700-d6f3-4dd3-a329-9ac62a9a5156_1352x234.png 848w, https://substackcdn.com/image/fetch/$s_!dkrh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb707700-d6f3-4dd3-a329-9ac62a9a5156_1352x234.png 1272w, https://substackcdn.com/image/fetch/$s_!dkrh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb707700-d6f3-4dd3-a329-9ac62a9a5156_1352x234.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The subagent gets its own context. Doesn&#8217;t see your full conversation history. You pass specific inputs; it returns structured outputs. Parent conversation stays clean.</p><p>Why this matters: context windows are finite. A long debugging session pollutes context with stack traces, failed attempts, dead ends. Subagents let you offload deep work without the residue.</p><p>Tool scoping works here too. A &#8220;research&#8221; subagent might only get web search and file reading. A &#8220;refactor&#8221; subagent gets file editing but no shell access. Control the blast radius. Built-in types include `Explore` for codebase navigation, `Plan` for architecture design, `Bash` for command execution.</p><p>The Snork works on specific inventions and technical problems. Has his own workshop (isolated context). You give him a problem: &#8220;Build something that flies.&#8221; He disappears into his workshop, works independently, returns with a working solution. Task-oriented isolation beats philosophical isolation. The Snork actually ships th<code>gs.</code></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1Nj1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570f2229-4fe2-4182-b173-65192689e8c4_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1Nj1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570f2229-4fe2-4182-b173-65192689e8c4_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!1Nj1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570f2229-4fe2-4182-b173-65192689e8c4_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!1Nj1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570f2229-4fe2-4182-b173-65192689e8c4_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!1Nj1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570f2229-4fe2-4182-b173-65192689e8c4_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1Nj1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570f2229-4fe2-4182-b173-65192689e8c4_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/570f2229-4fe2-4182-b173-65192689e8c4_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:72913,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570f2229-4fe2-4182-b173-65192689e8c4_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1Nj1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570f2229-4fe2-4182-b173-65192689e8c4_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!1Nj1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570f2229-4fe2-4182-b173-65192689e8c4_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!1Nj1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570f2229-4fe2-4182-b173-65192689e8c4_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!1Nj1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570f2229-4fe2-4182-b173-65192689e8c4_2400x1260.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Hooks</h1><p>Hooks are The Hemulen. Shell commands that execute deterministically on lifecycle events. Zero LLM involvement. Pure automation. Configured in <code>.claude/settings.json</code>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L6fc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511265f2-64ea-44ee-95ad-8e8919d5e5a1_1356x576.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L6fc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511265f2-64ea-44ee-95ad-8e8919d5e5a1_1356x576.png 424w, https://substackcdn.com/image/fetch/$s_!L6fc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511265f2-64ea-44ee-95ad-8e8919d5e5a1_1356x576.png 848w, https://substackcdn.com/image/fetch/$s_!L6fc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511265f2-64ea-44ee-95ad-8e8919d5e5a1_1356x576.png 1272w, https://substackcdn.com/image/fetch/$s_!L6fc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511265f2-64ea-44ee-95ad-8e8919d5e5a1_1356x576.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L6fc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511265f2-64ea-44ee-95ad-8e8919d5e5a1_1356x576.png" width="1356" height="576" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/511265f2-64ea-44ee-95ad-8e8919d5e5a1_1356x576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:576,&quot;width&quot;:1356,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74886,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511265f2-64ea-44ee-95ad-8e8919d5e5a1_1356x576.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!L6fc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511265f2-64ea-44ee-95ad-8e8919d5e5a1_1356x576.png 424w, https://substackcdn.com/image/fetch/$s_!L6fc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511265f2-64ea-44ee-95ad-8e8919d5e5a1_1356x576.png 848w, https://substackcdn.com/image/fetch/$s_!L6fc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511265f2-64ea-44ee-95ad-8e8919d5e5a1_1356x576.png 1272w, https://substackcdn.com/image/fetch/$s_!L6fc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511265f2-64ea-44ee-95ad-8e8919d5e5a1_1356x576.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Events: <code>PreToolUse</code>, <code>PostToolUse</code>, <code>Notification</code>, <code>Stop</code>. Execution is synchronous; blocks until complete.</p><p>Use cases I&#8217;ve found useful: audit logging for compliance, secret scanning before commits (saved me twice already), auto-formatting after file edits, notifications when long tasks finish.</p><p>The trap: over-hooking kills velocity. Every hook adds latency. Every validation adds friction. Use them for genuine guardrails, not bureaucratic checkboxes.</p><p>The Hemulen is obsessive, rule-following, deterministic. Collector of stamps, plants, butterflies. Tell him &#8220;sort these by date&#8221; and he will, perfectly, every time. Ask him to &#8220;use your judgment&#8221; and he freezes. Essential for order. Exhausting in excess.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ad5R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617a8d1b-f7a7-4498-9eff-af7a830f8370_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ad5R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617a8d1b-f7a7-4498-9eff-af7a830f8370_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!Ad5R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617a8d1b-f7a7-4498-9eff-af7a830f8370_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!Ad5R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617a8d1b-f7a7-4498-9eff-af7a830f8370_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!Ad5R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617a8d1b-f7a7-4498-9eff-af7a830f8370_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ad5R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617a8d1b-f7a7-4498-9eff-af7a830f8370_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/617a8d1b-f7a7-4498-9eff-af7a830f8370_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:154001,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617a8d1b-f7a7-4498-9eff-af7a830f8370_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ad5R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617a8d1b-f7a7-4498-9eff-af7a830f8370_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!Ad5R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617a8d1b-f7a7-4498-9eff-af7a830f8370_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!Ad5R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617a8d1b-f7a7-4498-9eff-af7a830f8370_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!Ad5R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617a8d1b-f7a7-4498-9eff-af7a830f8370_2400x1260.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Slash Commands</h1><p>Slash Commands are Little My. User-triggered actions via <code>/command</code>. Defined as markdown files in <code>.claude/commands/</code>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fLay!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8dc931-87c2-4676-80d3-7a7c297855a6_1360x748.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fLay!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8dc931-87c2-4676-80d3-7a7c297855a6_1360x748.png 424w, https://substackcdn.com/image/fetch/$s_!fLay!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8dc931-87c2-4676-80d3-7a7c297855a6_1360x748.png 848w, https://substackcdn.com/image/fetch/$s_!fLay!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8dc931-87c2-4676-80d3-7a7c297855a6_1360x748.png 1272w, https://substackcdn.com/image/fetch/$s_!fLay!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8dc931-87c2-4676-80d3-7a7c297855a6_1360x748.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fLay!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8dc931-87c2-4676-80d3-7a7c297855a6_1360x748.png" width="1360" height="748" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e8dc931-87c2-4676-80d3-7a7c297855a6_1360x748.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:748,&quot;width&quot;:1360,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:99029,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8dc931-87c2-4676-80d3-7a7c297855a6_1360x748.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fLay!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8dc931-87c2-4676-80d3-7a7c297855a6_1360x748.png 424w, https://substackcdn.com/image/fetch/$s_!fLay!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8dc931-87c2-4676-80d3-7a7c297855a6_1360x748.png 848w, https://substackcdn.com/image/fetch/$s_!fLay!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8dc931-87c2-4676-80d3-7a7c297855a6_1360x748.png 1272w, https://substackcdn.com/image/fetch/$s_!fLay!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8dc931-87c2-4676-80d3-7a7c297855a6_1360x748.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Invocation: <code>/deploy staging</code></p><p>Key distinction from skills: skills activate automatically based on context. Commands activate explicitly based on user intent. Skills are background knowledge. Commands are foreground actions.</p><p>I have commands for <code>/today</code>, <code>/weekly-update</code>, <code>/create-test-plan</code>. A 10-word invocation expands into a 500-word instruction set. Huge time saver.</p><p>Little My is explicit, direct, invoked on purpose. Smallest but fiercest. She doesn&#8217;t hover in the background; you call her name and she acts immediately. Sharp, effective, no-nonsense. Won&#8217;t act unless asked. But when asked, acts without hesitation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fPAg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56846459-1494-4997-9934-f7acbcd9ebf6_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fPAg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56846459-1494-4997-9934-f7acbcd9ebf6_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!fPAg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56846459-1494-4997-9934-f7acbcd9ebf6_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!fPAg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56846459-1494-4997-9934-f7acbcd9ebf6_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!fPAg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56846459-1494-4997-9934-f7acbcd9ebf6_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fPAg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56846459-1494-4997-9934-f7acbcd9ebf6_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/56846459-1494-4997-9934-f7acbcd9ebf6_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:163314,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56846459-1494-4997-9934-f7acbcd9ebf6_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fPAg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56846459-1494-4997-9934-f7acbcd9ebf6_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!fPAg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56846459-1494-4997-9934-f7acbcd9ebf6_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!fPAg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56846459-1494-4997-9934-f7acbcd9ebf6_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!fPAg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56846459-1494-4997-9934-f7acbcd9ebf6_2400x1260.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>MCP Servers</h1><p>MCP Servers split into two personalities. <a href="https://modelcontextprotocol.io/">Model Context Protocol</a> connects Claude to external tools and data sources. Configured in <code>.claude/settings.json</code>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!diPl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ade81ee-9a62-4722-9eb9-e3a1337ada09_1344x730.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!diPl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ade81ee-9a62-4722-9eb9-e3a1337ada09_1344x730.png 424w, https://substackcdn.com/image/fetch/$s_!diPl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ade81ee-9a62-4722-9eb9-e3a1337ada09_1344x730.png 848w, https://substackcdn.com/image/fetch/$s_!diPl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ade81ee-9a62-4722-9eb9-e3a1337ada09_1344x730.png 1272w, https://substackcdn.com/image/fetch/$s_!diPl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ade81ee-9a62-4722-9eb9-e3a1337ada09_1344x730.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!diPl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ade81ee-9a62-4722-9eb9-e3a1337ada09_1344x730.png" width="1344" height="730" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ade81ee-9a62-4722-9eb9-e3a1337ada09_1344x730.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:730,&quot;width&quot;:1344,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:100218,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ade81ee-9a62-4722-9eb9-e3a1337ada09_1344x730.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!diPl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ade81ee-9a62-4722-9eb9-e3a1337ada09_1344x730.png 424w, https://substackcdn.com/image/fetch/$s_!diPl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ade81ee-9a62-4722-9eb9-e3a1337ada09_1344x730.png 848w, https://substackcdn.com/image/fetch/$s_!diPl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ade81ee-9a62-4722-9eb9-e3a1337ada09_1344x730.png 1272w, https://substackcdn.com/image/fetch/$s_!diPl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ade81ee-9a62-4722-9eb9-e3a1337ada09_1344x730.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Local (stdio) is Sniff. Local process, stdin/stdout communication. Millisecond latency, no network dependency. File system operations, local database queries, system scripts. Security note: local MCP servers run with your user permissions. They can access anything you can access. Vet your servers.</p><p>Sniff never leaves Moominvalley. Eager fetcher, quick data lookups, always nearby sniffing for treasure. Quick fetches, immediate returns, no network delay.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BZGH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9904dea-b7ac-4381-a763-ba8b6b441603_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BZGH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9904dea-b7ac-4381-a763-ba8b6b441603_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!BZGH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9904dea-b7ac-4381-a763-ba8b6b441603_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!BZGH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9904dea-b7ac-4381-a763-ba8b6b441603_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!BZGH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9904dea-b7ac-4381-a763-ba8b6b441603_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BZGH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9904dea-b7ac-4381-a763-ba8b6b441603_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9904dea-b7ac-4381-a763-ba8b6b441603_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:165932,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9904dea-b7ac-4381-a763-ba8b6b441603_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BZGH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9904dea-b7ac-4381-a763-ba8b6b441603_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!BZGH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9904dea-b7ac-4381-a763-ba8b6b441603_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!BZGH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9904dea-b7ac-4381-a763-ba8b6b441603_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!BZGH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9904dea-b7ac-4381-a763-ba8b6b441603_2400x1260.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Remote (HTTP/SSE) is Snufkin. Network calls with optional Server-Sent Events for streaming. 100ms-2s latency typical. GitHub, Notion, Slack, Stripe. Any REST/GraphQL API with an MCP wrapper. The <a href="https://github.com/microsoft/azure-devops-mcp">Azure DevOps MCP server</a> has become my go-to for work item management. No more context-switching to the browser. Moreover, I&#8217;ve built a few extra open source MCP servers for myself and  my teams - <a href="https://github.com/olgasafonova/mediawiki-mcp-server">MediaWiki MCP</a>, <a href="https://github.com/olgasafonova/productplan-mcp-server">ProductPlan MCP</a> and <a href="https://github.com/olgasafonova/miro-mcp-server">Miro MCP server</a>.</p><p>Snufkin wanders far from Moominvalley, returns seasonally. Worldly connector, brings rich experiences from distant lands. You wait a bit longer, but he returns with treasures from places you&#8217;ll never visit yourself.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!R1_G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a83237b-4283-4879-9155-2991f9906d6a_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R1_G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a83237b-4283-4879-9155-2991f9906d6a_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!R1_G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a83237b-4283-4879-9155-2991f9906d6a_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!R1_G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a83237b-4283-4879-9155-2991f9906d6a_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!R1_G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a83237b-4283-4879-9155-2991f9906d6a_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R1_G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a83237b-4283-4879-9155-2991f9906d6a_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a83237b-4283-4879-9155-2991f9906d6a_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:168055,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a83237b-4283-4879-9155-2991f9906d6a_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!R1_G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a83237b-4283-4879-9155-2991f9906d6a_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!R1_G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a83237b-4283-4879-9155-2991f9906d6a_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!R1_G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a83237b-4283-4879-9155-2991f9906d6a_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!R1_G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a83237b-4283-4879-9155-2991f9906d6a_2400x1260.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Plugins</h1><p>Plugins are Moominpappa. Distribution bundles combining skills, commands, hooks, and MCP configs:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A8Xf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217de538-4ef5-4875-bf2e-4f2b5e6e4770_1348x572.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A8Xf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217de538-4ef5-4875-bf2e-4f2b5e6e4770_1348x572.png 424w, https://substackcdn.com/image/fetch/$s_!A8Xf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217de538-4ef5-4875-bf2e-4f2b5e6e4770_1348x572.png 848w, https://substackcdn.com/image/fetch/$s_!A8Xf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217de538-4ef5-4875-bf2e-4f2b5e6e4770_1348x572.png 1272w, https://substackcdn.com/image/fetch/$s_!A8Xf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217de538-4ef5-4875-bf2e-4f2b5e6e4770_1348x572.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A8Xf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217de538-4ef5-4875-bf2e-4f2b5e6e4770_1348x572.png" width="1348" height="572" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/217de538-4ef5-4875-bf2e-4f2b5e6e4770_1348x572.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:572,&quot;width&quot;:1348,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:66265,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217de538-4ef5-4875-bf2e-4f2b5e6e4770_1348x572.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A8Xf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217de538-4ef5-4875-bf2e-4f2b5e6e4770_1348x572.png 424w, https://substackcdn.com/image/fetch/$s_!A8Xf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217de538-4ef5-4875-bf2e-4f2b5e6e4770_1348x572.png 848w, https://substackcdn.com/image/fetch/$s_!A8Xf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217de538-4ef5-4875-bf2e-4f2b5e6e4770_1348x572.png 1272w, https://substackcdn.com/image/fetch/$s_!A8Xf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217de538-4ef5-4875-bf2e-4f2b5e6e4770_1348x572.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One install, complete functionality. Instead of documenting &#8220;install these 5 things and configure them this way,&#8221; you ship one artifact. Onboarding drops from an hour to a minute. Teams share workflows: everyone gets the same coding conventions, deployment commands, guardrails.</p><p>Moominpappa packages adventures into memoirs and expeditions into shareable formats. His &#8220;Memoirs&#8221; are essentially a plugin manifest: curated, versioned, ready for others to install.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!C49p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0e9746-e660-4916-b9d4-2008cfbc2653_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C49p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0e9746-e660-4916-b9d4-2008cfbc2653_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!C49p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0e9746-e660-4916-b9d4-2008cfbc2653_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!C49p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0e9746-e660-4916-b9d4-2008cfbc2653_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!C49p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0e9746-e660-4916-b9d4-2008cfbc2653_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C49p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0e9746-e660-4916-b9d4-2008cfbc2653_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a0e9746-e660-4916-b9d4-2008cfbc2653_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:282538,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0e9746-e660-4916-b9d4-2008cfbc2653_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!C49p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0e9746-e660-4916-b9d4-2008cfbc2653_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!C49p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0e9746-e660-4916-b9d4-2008cfbc2653_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!C49p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0e9746-e660-4916-b9d4-2008cfbc2653_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!C49p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0e9746-e660-4916-b9d4-2008cfbc2653_2400x1260.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Claude Code</h1><p>Claude Code itself is Moomintroll. The runtime orchestrating all primitives. Loads skills based on context, spawns subagents, fires hooks, routes commands, maintains MCP connections.</p><p>Without it, primitives are inert. Config files waiting for execution.</p><p>Moomintroll is the protagonist; everyone orbits around him. Curious, kind, occasionally anxious. He doesn&#8217;t have a single special power. He brings characters together, mediates their quirks, makes the valley feel like home. Without him, the characters are scattered individuals. Without Claude Code, the primitives are just config files waiting for someone to run them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pSxQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48d407b-3581-452f-bc08-130968455527_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pSxQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48d407b-3581-452f-bc08-130968455527_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!pSxQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48d407b-3581-452f-bc08-130968455527_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!pSxQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48d407b-3581-452f-bc08-130968455527_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!pSxQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48d407b-3581-452f-bc08-130968455527_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pSxQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48d407b-3581-452f-bc08-130968455527_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d48d407b-3581-452f-bc08-130968455527_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:499472,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48d407b-3581-452f-bc08-130968455527_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pSxQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48d407b-3581-452f-bc08-130968455527_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!pSxQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48d407b-3581-452f-bc08-130968455527_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!pSxQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48d407b-3581-452f-bc08-130968455527_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!pSxQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48d407b-3581-452f-bc08-130968455527_2400x1260.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h1>One more character: The Groke is prompt injection.</h1><p>Attacks that attempt to override Claude&#8217;s instructions through malicious input. An attacker embeds commands in user-supplied data; files, API responses, form fields. The <a href="https://owasp.org/www-project-top-10-for-large-language-model-applications/">OWASP LLM Top 10</a> lists it as the #1 vulnerability for LLM applications.</p><p>The Groke freezes everything she touches. Lonely, desperate for warmth, but destructive. She doesn&#8217;t mean to destroy. But her nature makes her dangerous. The Groke is why you don&#8217;t trust arbitrary input blindly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YotR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb23d6d-a602-497d-85d8-9b856fbc8a90_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YotR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb23d6d-a602-497d-85d8-9b856fbc8a90_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!YotR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb23d6d-a602-497d-85d8-9b856fbc8a90_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!YotR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb23d6d-a602-497d-85d8-9b856fbc8a90_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!YotR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb23d6d-a602-497d-85d8-9b856fbc8a90_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YotR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb23d6d-a602-497d-85d8-9b856fbc8a90_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2bb23d6d-a602-497d-85d8-9b856fbc8a90_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:760933,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/184055177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb23d6d-a602-497d-85d8-9b856fbc8a90_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YotR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb23d6d-a602-497d-85d8-9b856fbc8a90_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!YotR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb23d6d-a602-497d-85d8-9b856fbc8a90_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!YotR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb23d6d-a602-497d-85d8-9b856fbc8a90_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!YotR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb23d6d-a602-497d-85d8-9b856fbc8a90_2400x1260.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Stock Moominmamma&#8217;s handbag with domain knowledge. Give The Snork problems worth isolating. Let The Hemulen enforce your actual rules, not imaginary ones. Make Little My&#8217;s commands worth calling. Watch for The Groke.</p><p>The primitives are just config files until you understand their personalities. Now you do.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://olgasafonova.substack.com/p/claude-code-primitives-a-moomin-guide?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://olgasafonova.substack.com/p/claude-code-primitives-a-moomin-guide?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p>]]></content:encoded></item><item><title><![CDATA["Can you just search the wiki for me?"- and other reasons I built an MCP server]]></title><description><![CDATA[Last week, a colleague asked me to look something up on our internal wiki.]]></description><link>https://olgasafonova.substack.com/p/can-you-just-search-the-wiki-for</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/can-you-just-search-the-wiki-for</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Thu, 18 Dec 2025 23:07:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pylP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week, a colleague asked me to look something up on our internal wiki. For them. Because apparently I&#8217;m faster at navigating it than they are.</p><p>I wish I was joking. Classic &#8220;let me google that for you&#8221; moment, except it&#8217;s 2025 and that wiki has 6500+ pages and a decent search.</p><p>So I did what any reasonable person would do: I spent a week building an MCP server so Claude Code could search the wiki instead of me. Problem solved. Colleagues can ask Claude Code now. I&#8217;m free.</p><p>This is my second MCP server in two weeks. December is officially &#8220;connect everything to AI&#8221; month. I might need an intervention. Or a Claude Code Max subscription as a Christmas present. Or both!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pylP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pylP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png 424w, https://substackcdn.com/image/fetch/$s_!pylP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png 848w, https://substackcdn.com/image/fetch/$s_!pylP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!pylP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pylP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png" width="1456" height="769" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:769,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4799259,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/182037068?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pylP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png 424w, https://substackcdn.com/image/fetch/$s_!pylP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png 848w, https://substackcdn.com/image/fetch/$s_!pylP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!pylP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6501ad74-5b50-420e-8e86-b8fccd71da4d_2848x1504.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h1><strong>What I actually built</strong></h1><p>MediaWiki MCP servers already exist. I checked. But none of them did what I needed:</p><ul><li><p><strong>ProfessionalWiki</strong> (&#11088;45) - TypeScript, ~12 tools, CRUD operations, OAuth2, npm install &gt; <strong><a href="https://github.com/ProfessionalWiki/MediaWiki-MCP-Server">https://github.com/ProfessionalWiki/MediaWiki-MCP-Server</a></strong></p></li><li><p><strong>shiquda</strong> (&#11088;15) - Python, 3 tools, Search + read (archived), <strong><a href="https://github.com/shiquda/mediawiki-mcp-server">https://github.com/shiquda/mediawiki-mcp-server</a></strong></p></li><li><p><strong>punkpeye/wikimedia</strong> (&#11088;9) - Python, 6 tools, Wikimedia APIs only, <strong><a href="https://github.com/punkpeye/wikimedia">https://github.com/punkpeye/wikimedia</a></strong></p></li><li><p><strong>entanglr</strong> (&#11088;1) - Python, 10 tools, Bot user auth, basic ops, <strong><a href="https://github.com/entanglr/mediawiki-api-mcp">https://github.com/entanglr/mediawiki-api-mcp</a></strong></p></li><li><p><strong>Mine</strong> (&#11088;0 &#129394; - so far?) - Go, 40+ tools, Everything below &#128071;, <strong><a href="https://github.com/olgasafonova/mediawiki-mcp-server">https://github.com/olgasafonova/mediawiki-mcp-server</a></strong></p></li></ul><p>I wanted broken link detection. Terminology checking against our brand glossary. Orphaned page finder. Markdown conversion with company colors. HTTP transport so it works with ChatGPT and n8n, not just Claude.</p><p>None of the existing servers had that all. So I built one. In Go. Because when a language is literally named &#8220;go,&#8221; the universe is telling you something. <strong>go build</strong> and off you <strong>go</strong>.</p><h1><strong>The security rabbit hole I didn&#8217;t expect</strong></h1><p>Here&#8217;s something that didn&#8217;t make it into my <strong><a href="https://www.linkedin.com/pulse/how-why-ive-built-mcp-server-what-did-i-learn-along-way-safonova--pgkde">ProductPlan MCP article</a></strong>: security.</p><p>ProductPlan&#8217;s API is well-behaved. You authenticate, you get data, done. MediaWiki is... different. It&#8217;s a 20-year-old platform that powers Wikipedia. The API surface is massive. And my link checker tool needed to fetch arbitrary URLs to verify they still work.</p><p>Day 3, Claude Code flagged this: &#8220;Your link checker has no SSRF protection. Someone could use it to scan internal networks.&#8221;</p><p>Oh.</p><p>I&#8217;d built a tool that could be tricked into hitting http://192.168.1.1 or http://localhost:8080. Not great.</p><p>So I went down the security rabbit hole:</p><ul><li><p><strong>SSRF protection</strong>: Link checker now blocks private IP ranges, <strong><a href="http://localhost/">localhost</a></strong> and link-local addresses</p></li><li><p><strong>Request size limits</strong>: Bodies capped at 2MB. No memory bombs.</p></li><li><p><strong>Input validation</strong>: Page titles get sanitized. No injection attempts getting through.</p></li><li><p><strong>Rate limiting per IP</strong>: HTTP transport won&#8217;t let one client hammer the server</p></li><li><p><strong>Security headers</strong>: CSP, X-Frame-Options, the whole paranoid checklist</p></li></ul><p>Claude Code caught issues I would&#8217;ve shipped. Security scanning tools (gosec, govulncheck) caught more. Not glamorous work. But shipping a tool that could scan someone&#8217;s internal network? Not an option.</p><h1><strong>40 tools, one decision tree</strong></h1><p>With ProductPlan, I learned that too many tools confuse the AI. Started with 58, consolidated to 15. Lesson learned.</p><p>MediaWiki was different. I actually needed 40+ tools. The API is that complex. But I couldn&#8217;t just dump them on Claude and hope for the best.</p><p>So I spent hours <s>in the garden</s> on decision trees:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5aVw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0c96c2-9b74-4c24-b5e1-9640f02b916b_1378x512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5aVw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0c96c2-9b74-4c24-b5e1-9640f02b916b_1378x512.png 424w, https://substackcdn.com/image/fetch/$s_!5aVw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0c96c2-9b74-4c24-b5e1-9640f02b916b_1378x512.png 848w, https://substackcdn.com/image/fetch/$s_!5aVw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0c96c2-9b74-4c24-b5e1-9640f02b916b_1378x512.png 1272w, https://substackcdn.com/image/fetch/$s_!5aVw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0c96c2-9b74-4c24-b5e1-9640f02b916b_1378x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5aVw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0c96c2-9b74-4c24-b5e1-9640f02b916b_1378x512.png" width="1378" height="512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e0c96c2-9b74-4c24-b5e1-9640f02b916b_1378x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:1378,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:108257,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://olgasafonova.substack.com/i/182037068?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0c96c2-9b74-4c24-b5e1-9640f02b916b_1378x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5aVw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0c96c2-9b74-4c24-b5e1-9640f02b916b_1378x512.png 424w, https://substackcdn.com/image/fetch/$s_!5aVw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0c96c2-9b74-4c24-b5e1-9640f02b916b_1378x512.png 848w, https://substackcdn.com/image/fetch/$s_!5aVw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0c96c2-9b74-4c24-b5e1-9640f02b916b_1378x512.png 1272w, https://substackcdn.com/image/fetch/$s_!5aVw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0c96c2-9b74-4c24-b5e1-9640f02b916b_1378x512.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Plus example mappings, common mistakes to avoid, and our company wiki&#8217;s editing guidelines embedded directly in the server instructions.</p><p>This is what made the difference. Without guidance, Claude used the heavy mediawiki_edit_page for simple text changes, fetching and rewriting entire pages. With guidance, it picks surgical tools first. Neat!</p><p>Context engineering isn&#8217;t an afterthought. With ProductPlan, I learned this by breaking things. With MediaWiki, I applied it from day one.</p><h1><strong>What&#8217;s actually in those 40+ tools</strong></h1><p>Here&#8217;s the breakdown:</p><ul><li><p><strong>Read operations (12 tools):</strong> search, get_page, get_sections, get_related, get_images, list_pages, list_categories, get_category_members, get_page_info, get_wiki_info, list_users, parse</p></li><li><p><strong>Link analysis (5 tools):</strong> get_external_links, get_external_links_batch, check_links, find_broken_internal_links, get_backlinks</p></li><li><p><strong>Content quality (3 tools):</strong> check_terminology, check_translations, find_orphaned_pages</p></li><li><p><strong>Content discovery (2 tools):</strong> find_similar_pages, compare_topic</p></li><li><p><strong>History (4 tools):</strong> get_revisions, compare_revisions, get_user_contributions, get_recent_changes</p></li><li><p><strong>Quick edit tools (5 tools):</strong> find_replace, apply_formatting, bulk_replace, search_in_page, resolve_title</p></li><li><p><strong>Write operations (2 tools):</strong> edit_page, upload_file</p></li><li><p><strong>File search (1 tool):</strong> search_in_file (PDFs and text files)</p></li><li><p><strong>Conversion (1 tool):</strong> convert_markdown</p></li></ul><p>Each tool has specific parameters, validation, and error handling. The find_replace tool alone has: page title, find text, replace text, preview mode, replace_all flag, regex support, and edit summary.</p><h1><strong>The README problem (17 rewrites later)</strong></h1><p>Two audiences: developers who want go build commands, and everyone else who wants it to &#8220;just work and read my mind too, thank you very much!&#8221;</p><p>The README went through seventeen rewrites. Seventeen. Each version got simpler. Or so I hope.</p><p><strong>Rewrite 1:</strong> &#8220;Clone the repository, install Go 1.21+, run go build...&#8221;</p><p><strong>Rewrite 17:</strong> Download. Paste three lines. Restart Claude.</p><p>Pre-built binaries for Mac (Intel + Apple Silicon), Windows, Linux. Platform-specific config examples. Troubleshooting section for the three things that actually go wrong.</p><p>The goal: someone who&#8217;s never opened a terminal should have this running in 5 minutes. I tested this on a colleague. Timed it. 4 minutes 23 seconds. Success.</p><p>(The irony of spending more time on docs than on several features combined isn&#8217;t lost on me - reminds me of a quote from old soviet cartoon &#8220;<strong><a href="https://www.youtube.com/watch?v=GYRgKUfA9l4">Wings, legs &amp; tails</a></strong>&#8220; - &#8220;it&#8217;s better to loose one day and then fly over in 5 minutes&#8221;).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JGRh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a2386f-bae8-465d-a468-a9287cd78d0e_1280x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JGRh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a2386f-bae8-465d-a468-a9287cd78d0e_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!JGRh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a2386f-bae8-465d-a468-a9287cd78d0e_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!JGRh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a2386f-bae8-465d-a468-a9287cd78d0e_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!JGRh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a2386f-bae8-465d-a468-a9287cd78d0e_1280x720.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JGRh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a2386f-bae8-465d-a468-a9287cd78d0e_1280x720.jpeg" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3a2386f-bae8-465d-a468-a9287cd78d0e_1280x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&#1050;&#1088;&#1099;&#1083;&#1100;&#1103;, &#1085;&#1086;&#1075;&#1080; &#1080; &#1093;&#1074;&#1086;&#1089;&#1090;&#1099; (1986) - &#1047;&#1072;&#1076;&#1085;&#1080;&#1082;&#1080; &#8212; The Movie Database (TMDB)&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="&#1050;&#1088;&#1099;&#1083;&#1100;&#1103;, &#1085;&#1086;&#1075;&#1080; &#1080; &#1093;&#1074;&#1086;&#1089;&#1090;&#1099; (1986) - &#1047;&#1072;&#1076;&#1085;&#1080;&#1082;&#1080; &#8212; The Movie Database (TMDB)" title="&#1050;&#1088;&#1099;&#1083;&#1100;&#1103;, &#1085;&#1086;&#1075;&#1080; &#1080; &#1093;&#1074;&#1086;&#1089;&#1090;&#1099; (1986) - &#1047;&#1072;&#1076;&#1085;&#1080;&#1082;&#1080; &#8212; The Movie Database (TMDB)" srcset="https://substackcdn.com/image/fetch/$s_!JGRh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a2386f-bae8-465d-a468-a9287cd78d0e_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!JGRh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a2386f-bae8-465d-a468-a9287cd78d0e_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!JGRh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a2386f-bae8-465d-a468-a9287cd78d0e_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!JGRh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3a2386f-bae8-465d-a468-a9287cd78d0e_1280x720.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1><strong>What&#8217;s different from ProductPlan MCP</strong></h1><p>Two MCP servers in two weeks. Same tools, same approach, different lessons:</p><p><strong>ProductPlan taught me:</strong> Context engineering matters. Too many tools break AI reasoning. Consolidate ruthlessly.</p><p><strong>MediaWiki taught me:</strong> Security can&#8217;t be an afterthought. Corporate wikis handle sensitive data. SSRF protection, input validation, rate limiting. The unsexy stuff that keeps you out of trouble.</p><p><strong>ProductPlan:</strong> 58 tools &#8594; 15 tools. Subtraction.</p><p><strong>MediaWiki:</strong> 40+ tools, but with surgical decision trees. Addition with guidance.</p><p><strong>ProductPlan:</strong> API is modern, predictable, well-documented.</p><p><strong>MediaWiki:</strong> API is 20 years old, sprawling, occasionally surprising. Required more defensive approach.</p><p>Same pattern though: identify tool I use daily, get frustrated with context-switching, build a solution. Ship fast. Iterate based on real feedback.</p><h1><strong>The stuff I repurposed</strong></h1><p>The Markdown-to-MediaWiki converter? I built that three weeks ago as a CLI tool - <strong><a href="https://github.com/olgasafonova/md-to-mediawiki-plus">https://github.com/olgasafonova/md-to-mediawiki-plus</a></strong>. Different project entirely. But when I needed wiki conversion in the MCP server, I just... ported it over. Added theme support (Tieto brand colors for internal docs, neutral for clean output, dark mode for wikis that support it).</p><p>Building things compounds. Today&#8217;s side project becomes next month&#8217;s feature.</p><h1><strong>7 days, 17 releases, 50 commits</strong></h1><p>Every commit co-authored with Claude Code.</p><p>Claude handled Go syntax I didn&#8217;t remember (or didn&#8217;t know - yet!), MediaWiki API lookups, security recommendations, test generation, and README rewrites 1 through 17.</p><p>I handled deciding what to build, testing against our actual wiki, prioritizing UX, writing the AI guidance, and hitting &#8220;publish release&#8221; way too many times.</p><p>I&#8217;ve written maybe 200 lines of Go before this project. All of it was copying examples from documentation and hoping they worked.</p><p>Claude Code made Go feel accessible. Not easy - I still don&#8217;t fully understand channels or goroutines - but accessible enough to build something real.</p><p>The pattern was always the same:</p><ol><li><p>Describe what I wanted in plain English</p></li><li><p>Claude Code generates Go code</p></li><li><p>I read the code, ask questions about parts I don&#8217;t understand</p></li><li><p>Make adjustments based on testing</p></li><li><p>Commit</p></li></ol><p>By day 7, I could read most Go code without help. Writing it from scratch? Still no. But reading, modifying, debugging? Yes.</p><p>That&#8217;s the real story of &#8220;AI pair programming.&#8221; Not that the AI writes everything. But that it lowers the barrier enough to actually ship. Like a pair programming with a very fast developer who&#8217;s read every API doc ever written and never needs coffee breaks. Still feels surreal.</p><h1><strong>Try it</strong></h1><p>Open source, MIT license: <strong><a href="https://github.com/olgasafonova/mediawiki-mcp-server">https://github.com/olgasafonova/mediawiki-mcp-server</a></strong></p><p>Works with any MediaWiki wiki: Wikipedia, Fandom, corporate installations. Claude Code, Claude Desktop, Cursor, VS Code + Cline, ChatGPT, n8n, Google ADK.</p><p>Setup: 5 minutes. Reading is free. Editing needs a bot password from your wiki admin.</p><p>If you have a wiki you&#8217;re tired of navigating manually - this might help. And if your colleagues keep asking you to &#8220;just search the wiki&#8221; for them - definitely try it. Redirect them to Claude or Cursor. Reclaim your time.</p>]]></content:encoded></item><item><title><![CDATA[You might as well meditate: why waiting still sucks - but now with AI]]></title><description><![CDATA[If you&#8217;ve worked in analytics or product for more than a decade, you&#8217;ll remember Omniture. That thing was so infamously slow, I still say &#8220;Ommmm-niture&#8221; when I&#8217;m forced to wait for any tool to load - part meditation, part desperation. Adobe&#8217;s 2009 acquisition]]></description><link>https://olgasafonova.substack.com/p/you-might-as-well-meditate-why-waiting</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/you-might-as-well-meditate-why-waiting</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Wed, 22 Oct 2025 21:33:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cApJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b5ec11-b202-4dcb-9813-14dd774de1af_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cApJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b5ec11-b202-4dcb-9813-14dd774de1af_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cApJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b5ec11-b202-4dcb-9813-14dd774de1af_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!cApJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b5ec11-b202-4dcb-9813-14dd774de1af_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!cApJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b5ec11-b202-4dcb-9813-14dd774de1af_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!cApJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b5ec11-b202-4dcb-9813-14dd774de1af_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cApJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b5ec11-b202-4dcb-9813-14dd774de1af_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89b5ec11-b202-4dcb-9813-14dd774de1af_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!cApJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b5ec11-b202-4dcb-9813-14dd774de1af_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!cApJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b5ec11-b202-4dcb-9813-14dd774de1af_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!cApJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b5ec11-b202-4dcb-9813-14dd774de1af_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!cApJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b5ec11-b202-4dcb-9813-14dd774de1af_1024x608.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">meditate waiting for loading software in front of the computer screen</figcaption></figure></div><p>If you&#8217;ve worked in analytics or product for more than a decade, you&#8217;ll remember <strong><a href="https://en.wikipedia.org/wiki/Omniture">Omniture</a></strong>. That thing was so infamously slow, I still say &#8220;Ommmm-niture&#8221; when I&#8217;m forced to wait for any tool to load - part meditation, part desperation. <strong><a href="https://news.adobe.com/news/news-details/2009/Adobe-Acquires-Omniture/default.aspx">Adobe&#8217;s 2009 acquisition</a></strong> didn&#8217;t make things much faster, but it gave us something to chant while staring at spinning wheels and watching our patience evaporate - <strong><a href="https://www.linkedin.com/in/johanssontobias/">Tobias Johansson</a></strong> , <strong><a href="https://www.linkedin.com/in/maxsayganov/">Max Sayganov</a></strong> , <strong><a href="https://www.linkedin.com/in/shakhboz/">Shakhboz Sidikov</a></strong> might even still remember that from our <strong><a href="https://www.linkedin.com/company/saxo-bank/">Saxo Bank</a></strong> times together ;)</p><p>For years, bad performance was a running joke, and for good reason. Who hasn&#8217;t shared the &#8220;skeleton at the computer&#8221; meme or muttered about the &#8220;World Wide Wait&#8221; as another progress bar froze at 99%?</p><p>But somewhere between web 1.0 and now, product teams, UX designers developers, and even Google got tired of this. Enter the <strong><a href="https://web.dev/explore/learn-core-web-vitals">Core Web Vitals</a></strong> initiative - <strong><a href="https://www.linkedin.com/company/google/">Google</a></strong>&#8216;s push to turn that shared suffering into measurable, enforceable standards. LCP (Largest Contentful Paint), CLS (Cumulative Layout Shift), and INP (Interaction to Next Paint) became our new commandments, their numbers tied directly to SEO, conversions, and (let&#8217;s be honest) annual reviews. <strong><a href="https://www.linkedin.com/in/viktorpetersson/">Viktor Petersson</a></strong> and I even been writing <strong><a href="https://www.siteimprove.com/blog/getting-ready-for-the-google-page-experience-update/">some blog posts</a></strong> back then - oh what a trip down to a memory lane at <strong><a href="https://www.linkedin.com/company/siteimprove/">Siteimprove</a></strong>! :)</p><p>Yet, as soon as these standards dropped, we discovered that not only did most of the web fail - <strong><a href="https://www.searchenginejournal.com/google-analytics-adsense-dont-get-a-core-web-vitals-pass/408450/">including Google&#8217;s own products</a></strong> - but that slow, unresponsive, or visually janky pages would still haunt us, regardless of what metric we chased.</p><p>And just when we thought we were getting a handle on it, #AI happened - and waiting got even more complicated.</p><h2><strong>The new AI waiting game: Perplexity, TTFT, &amp; the Generative UI tsunami</strong></h2><p>Let&#8217;s talk about what&#8217;s happening <em>right now</em> with AI-native interfaces and why &#8220;perceived speed&#8221; has become more complex, fragile, and - if you&#8217;re not careful - meme-worthy than ever.</p><p>Let&#8217;s just have a look at some recent stuff - <strong><a href="https://www.linkedin.com/company/perplexity-ai/">Perplexity</a></strong> introduced a new <strong><a href="https://www.perplexity.ai/hub/blog/introducing-comet">browser Comet</a></strong>. You open a site, and before the &#8220;real&#8221; page even loads, the browser&#8217;s built-in LLM is already summarizing content or suggesting next steps. This is the first mainstream &#8220;browser&#8221; that&#8217;s as much an AI agent as it is a window to the web. Now, instead of LCP (or FCP, First Contentful Print), the key experience is: <em>how fast does the AI give me something useful?</em> That&#8217;s where <strong><a href="https://rumn.medium.com/benchmarking-llm-performance-token-per-second-tps-time-to-first-token-ttft-and-gpu-usage-8c50ee8387fa">TTFT (Time to First Token)</a></strong> comes in - essentially, how quickly the AI can generate the first sign of intelligence on the page.</p><p>It&#8217;s early days for Comet - meaning the thingie is rough at the edges (sorry, Microsoft, no pun intended!) - but here&#8217;s one of the first <strong><a href="https://www.theverge.com/news/709025/perplexity-comet-ai-browser-chrome-competitor">reviews</a></strong> at <strong><a href="https://www.linkedin.com/company/the-verge/">The Verge</a></strong> (note &#8220;<em>Comet can buy stuff for me on Amazon and declutter my inbox - but it takes a minute</em>&#8220; there ;))</p><p>If TTFT is high, you&#8217;re staring at a blank AI box or, worse, a blinking &#8220;thinking&#8230;&#8221; indicator, reminiscent of the old loading spinners but with a side of artificial anticipation.</p><p>Users don&#8217;t separate &#8220;web loading&#8221; from &#8220;AI thinking.&#8221; If there&#8217;s a pause, it&#8217;s just &#8220;waiting&#8221; - and if there&#8217;s enough waiting, it quickly becomes &#8220;<strong><a href="https://www.heap.io/blog/rage-clicks-announcement">rage clicking</a></strong>,&#8221; a term firstly introduced by <strong><a href="https://www.linkedin.com/company/heap-inc-/">Heap | by Contentsquare</a></strong> (i believe), but now widely adopted by tooling like <strong><a href="https://www.linkedin.com/company/getsentry/">Sentry</a></strong> or <strong><a href="https://www.linkedin.com/company/amplitude-analytics/">Amplitude</a></strong></p><p>But it gets even trickier. With tools like <strong><a href="https://www.linkedin.com/company/vercel/">Vercel</a></strong> <strong><a href="https://v0.dev/">v0</a></strong> or <strong><a href="https://www.linkedin.com/company/lovable-dev/">Lovable</a></strong> , we&#8217;ve entered the world of <em>on-demand UI generation</em>. Now, the UI itself doesn&#8217;t even exist until an LLM spits out the code in real-time.</p><p>It goes kinda like this: the user asks for a dashboard, the model has to understand, compose, and generate components on the fly, then stream them to the browser where React (or whatever framework you&#8217;re using) renders them as they arrive. The &#8220;first contentful paint&#8221; for the user is now a direct function of <em>the <strong><a href="https://arxiv.org/html/2504.09775v1">LLM&#8217;s inference pipeline</a></strong></em>.</p><p>Here&#8217;s where the pain starts:</p><ul><li><p><strong>Inference delay:</strong> Large models are heavy. If you&#8217;re running in the cloud, you hit batching, queuing, and cold starts. If you&#8217;re running locally (say, on a shiny Copilot+ PC with a new NPU or using <strong><a href="https://www.linkedin.com/company/ollama/">Ollama</a></strong> for edge LLMs, you&#8217;re suddenly worried about device heat, battery life, and whether your AI is hogging the GPU, leaving no cycles for actual UI rendering.</p></li><li><p><strong>Prompt-to-paint becomes a UX battleground:</strong> You can no longer just optimize the frontend in isolation; you need to monitor, trace, and accelerate everything from the LLM&#8217;s prefill time, to token streaming, to how quickly the browser can render partial UI as it arrives.</p></li><li><p><strong>Streaming &#8800; Solved:</strong> Even if you stream tokens or UI components as soon as they&#8217;re generated, you&#8217;re back to classic progress-bar psychology. If users can&#8217;t interact or see real feedback almost instantly, you&#8217;re on the wrong side of the &#8220;World Wide Wait&#8221; meme.</p></li></ul><p>Users&#8217; expectations haven&#8217;t gotten more patient - if anything, they&#8217;re even higher. If AI can write code and summarize documents, why does it take so long for a simple answer or UI to show up?</p><p>I&#8217;ve heard jokes in like <em>&#8220;Is my AI re-reading the entire internet before it tells me how to center a div?&#8221;</em></p><h2><strong>Why Product, UX, and Engineers all need to care (and more than ever, really)</strong></h2><p>The old rules - track bounce rates, measure FCP, optimize image size - are now only half the story. Now, you have to <em>combine</em> your Core Web Vitals monitoring with deep LLM observability: TTFT, tokens-per-second, model prefill latency, and the &#8220;prompt-to-interactive&#8221; time that users actually feel. If you&#8217;re not careful, you&#8217;ll optimize your Lighthouse score but still deliver a laggy AI interface and leave users hammering away in frustration.</p><p>What&#8217;s wild is that rage clicks and waiting memes are now cross-context. we can track rage clicks in our product analytics dashboards, but we have to diagnose <em>why</em> these rage clicks are happening: Is the AI slow? Is the UI blocked by inference? Did something just break? Is the user left staring at a blank chat window? All of it counts.</p><p>Some teams are actually designing clever &#8220;AI is thinking&#8230;&#8221; loaders, or playful messages (&#8220;Aligning quantum neurons&#8230;,&#8221; &#8220;Bribing the GPU&#8230;&#8221;) - but let&#8217;s be honest, if the user has time to read them all, you&#8217;ve already lost. That&#8217;s why you now you might see companies benchmarking &#8220;prompt-to-paint&#8221; as a composite metric, merging TTFT, LCP, INP, and more - because <em><strong>only the end-to-end speed matters</strong></em>.</p><h2><strong>What&#8217;s next: building for speed (and sanity) in the AI world</strong></h2><p>If you want your product to avoid becoming the next meme, you can&#8217;t just chant Ommmm-niture and hope for the best. You need a practical, cross-functional approach:</p><ul><li><p><strong>Look at your data:</strong> Combine Core Web Vitals with new AI performance telemetry. If you don&#8217;t know your TTFT, streaming latency, and &#8220;user-visible&#8221; times, you&#8217;re flying blind.</p></li><li><p><strong>Design for progressive feedback:</strong> Show partial results, use real streaming, and never let the user feel lost. The moment you leave them staring at a blank box, you&#8217;re inviting a rage click (and possibly a joke at your expense).</p></li><li><p><strong>Fast isn&#8217;t always better, unless it feels trustworthy:</strong> There&#8217;s still a fine line; some tests show users mistrust instant payment approvals, but for everything else, slow is just slow. Sometimes healthy friction is by design.</p></li><li><p><strong>Be humble</strong> If you think you&#8217;ve solved performance, check your rage clicks. Get real people use your product and observe them in the &#8220;wild&#8221;. The skeleton meme might be closer than you think.</p></li></ul><p>So yes, the stack got more complicated. But the basics - respect the user&#8217;s time, optimize for real perceived speed, and don&#8217;t become a running joke - are more relevant than ever.</p><p>I still meditate with &#8220;Ommmm-niture&#8221; in the back of my mind. But today, I&#8217;m chanting for faster inference, smoother UI streaming, and analytics that catch rage before it goes viral. Let&#8217;s build the kind of experience that users don&#8217;t need to laugh at - unless we&#8217;re all just laughing at how fast it is now.</p>]]></content:encoded></item><item><title><![CDATA[Stop handing off, start shipping: building AI products that work]]></title><description><![CDATA[For decades, product teams ran like a relay race.]]></description><link>https://olgasafonova.substack.com/p/stop-handing-off-start-shipping-building</link><guid isPermaLink="false">https://olgasafonova.substack.com/p/stop-handing-off-start-shipping-building</guid><dc:creator><![CDATA[Olga Safonova]]></dc:creator><pubDate>Mon, 06 Oct 2025 18:23:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6Dwe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2846a3da-12e0-4268-926d-a6837f1829ca_1363x1363.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For decades, product teams ran like a relay race. Pass the baton. Hand off the work. Don&#8217;t look back.</p><p>That model just died.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://olgasafonova.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3><strong>Why the old way fails</strong></h3><p>The relay-race approach worked when you were building deterministic features. You could spec everything upfront because you knew exactly how it would behave. Click button A, get result B. Every time.</p><p>AI changed that equation completely.</p><p><strong>Trying to spec AI behavior upfront is like writing a script for a conversation that hasn&#8217;t happened yet.</strong> AI models learn patterns from training data. What they do emerges from that learning, not from specifications you write. You won&#8217;t actually know how your AI feature responds until you build it and watch it run with real data (and do your <strong><a href="https://www.linkedin.com/posts/activity-7341577277995921408-0lSO?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAABLusYB-ehcHySYcIqFeM1YX7qDSlcRsL8">evals</a></strong>). No amount of upfront planning gives you that clarity.</p><p><strong>The interface isn&#8217;t the experience anymore.</strong> Many successful AI products have minimal UI, sometimes just a text box and output. A Figma mockup can&#8217;t capture an LLM&#8217;s personality, the nuance of its responses, or the flexibility of an AI agent&#8217;s decision-making. The &#8220;how it works&#8221; is the UX now.</p><p><strong>Waiting for perfect requirements means never shipping.</strong> With AI, clarity only comes from building and observing. If you insist on complete specifications before coding, you&#8217;ll be stuck in planning while competitors ship, learn, and iterate.</p><h3><strong>What happens when you try anyway</strong></h3><p>Here&#8217;s what the traditional process looks like in practice:</p><p>Research discovers something, design interprets it, PM documents it, dev implements it.</p><p>By the end, what you built bears little resemblance to what anyone started with. Like that party game where &#8220;His heart stopped when she walked in&#8221; becomes &#8220;Video killed the radio star&#8221; after passing through five people.</p><p>Each handoff introduces noise. Details disappear. Assumptions change. Nobody remembers the original point.</p><p>Here&#8217;s what&#8217;s actually happening in your brain: every context switch costs you 20% of your cognitive capacity. When someone interrupts you, it takes <strong><a href="https://ics.uci.edu/~gmark/chi08-mark.pdf">23 minutes</a></strong> to get back to where you were.</p><p>Multiply that across a relay race of handoffs.</p><p>The researcher who talked to users has moved on to the next study. The designer translating research into screens is recreating the problem from notes. The PM writing specs is working from screenshots and memory. The developer building it is interpreting interpretations.</p><p>Nobody&#8217;s brain contains the original problem anymore. Everyone&#8217;s working from fragments, burning energy just trying to reload context. You&#8217;re not losing information because people are careless. You&#8217;re losing it because human working memory can&#8217;t survive four handoffs.</p><p>The team isn&#8217;t thinking. They&#8217;re context-switching.</p><p>A PM coach I spoke with recently, <strong><a href="https://www.linkedin.com/in/richardarussell/">Richard Russell</a></strong>, put it perfectly: &#8220;Teams have ADHD.&#8221; Not the clinical diagnosis, but the same pattern. Constantly switching focus, never finishing, chasing the next shiny thing.</p><p>One day you&#8217;re building the AI feature. Next day there&#8217;s an urgent customer request. The day after that, leadership wants a prototype of something else. By Friday, you&#8217;ve touched five things and finished none of them. Every switch resets the clock. Every restart burns energy reloading context.</p><p>The backlog grows. The team gets slower. Everyone&#8217;s busy but nothing ships.</p><p>Traditional management makes it worse. More meetings to &#8220;align.&#8221; More updates to &#8220;stay coordinated.&#8221; More process to &#8220;ensure quality.&#8221; Each one is another context switch. Another interruption. Another 23 minutes lost.</p><p>Then there&#8217;s the admin theater. Teams chase vanity metrics like ticket throughput, closing and reopening the same work sprint after sprint. The original ticket didn&#8217;t get finished, so someone creates a new one. &#8220;Copy of Sprint 47 ticket.&#8221; Then &#8220;Copy of Copy of Sprint 47 ticket.&#8221; The chain grows longer. The original context disappears.</p><p>Nobody remembers why you started building this feature. The ticket says &#8220;implement user authentication&#8221; but the reasoning, the customer problem, the constraints? Gone. Lost somewhere in the chain of copies.</p><p>Call it what it is: busywork pretending to be process.</p><p>(Worth noting: <strong><a href="https://www.linkedin.com/in/richardarussell/">Richard Russell</a></strong> is running something interesting for PMs dealing with exactly this problem. If you&#8217;re curious, speak with Richard - and <strong><a href="https://cal.com/richardrussell/pizza-coaching">check this out</a></strong>.)</p><p>The final product becomes a convenient fiction rather than what users actually need. Everyone points fingers when it fails because nobody owned the whole thing.</p><p>Even worse, when you lead with mockups, users can only comment on what they see. The AI behavior, the part that actually matters, stays invisible. You&#8217;re asking them to choose wallpaper colors while the building collapses around them. They&#8217;ll give you opinions about colors, but they can&#8217;t tell you anything about whether the structure underneath actually works.</p><p>Research becomes theater. Validating the trivial, ignoring the critical.</p><h3><strong>The isolation problem</strong></h3><p>Your developers are working hard. Building the wrong thing.</p><p>Isolated teams become their own Death Star. Sealed off from everyone else. Ideas can&#8217;t get in, usable software can&#8217;t get out, and sooner or later the whole thing blows up in spectacular fashion.</p><p>Devs optimize scores. Designers polish pixels. Nobody asks if it solves the problem. In AI products, the experience and the implementation are the same thing. You can&#8217;t design one without building the other. Everyone on the team needs to understand enough context to ask the right questions.</p><p>The numbers tell the story: studies show 80%+ of AI projects fail, twice the failure rate of non-AI technology projects. Recent research from S&amp;P Global Market Intelligence found that 42% of companies abandoned most of their AI initiatives in 2025, up from just 17% in 2024. The average organization scrapped 46% of AI proof-of-concepts before they reached production.</p><p>Look at the expensive disasters:</p><p><strong>IBM&#8217;s Watson for Oncology</strong> burned through $3 billion to <strong><a href="https://spectrum.ieee.org/how-ibm-watson-overpromised-and-underdelivered-on-ai-health-care">produce unsafe, incorrect treatment recommendations</a></strong>. The system was trained on hypothetical patient data rather than real cases. Doctors on the project called it unusable for most patients, and MD Anderson spent $62 million without achieving their goals.</p><p><strong>McDonald&#8217;s AI drive-thru</strong> <strong><a href="https://www.cnbc.com/2024/06/17/mcdonalds-to-end-ibm-ai-drive-thru-test.html">was abandoned in 2024</a></strong> after three years of working with IBM. The system couldn&#8217;t reliably take orders, leading to frustrated customers and employees.</p><p><strong>Air Canada&#8217;s chatbot</strong> cost the airline over $800 in damages (<strong><a href="https://www.cbc.ca/news/canada/british-columbia/air-canada-chatbot-lawsuit-1.7116416">and significant reputational harm</a></strong>) when it gave a passenger false information about bereavement fares. A court ruled the airline was responsible for what its chatbot told customers.</p><p><strong>New York City&#8217;s MyCity chatbot</strong> <strong><a href="https://www.cio.com/article/190888/5-famous-analytics-and-ai-disasters.html">falsely claimed</a></strong> that business owners could take workers&#8217; tips, fire employees who complained of sexual harassment, and that landlords could discriminate based on income. The chatbot remains online despite the errors.</p><p>Same root cause every time: teams applied siloed, sequential thinking to AI problems. They designed in isolation, built in isolation, tested too late. By the time real users touched the product, it was too late to fix fundamental issues.</p><h3><strong>A different approach</strong></h3><p>So what actually works?</p><p>Everyone (PM, designer, developer, data scientist) works together from the start. Build something that works. Test it with real people. Learn. Repeat.</p><p>Think of it like building in layers around a core. You start with a solid core and add layers around it. The product grows with each addition, shaped by what actually works in users&#8217; hands.</p><p>In AI products, the experience and the implementation are the same thing. You can&#8217;t design one without building the other.</p><h3><strong>Start with the core: data structures, not decoration</strong></h3><p>Here&#8217;s where you build the core: with your data.</p><p>Your first prototype shouldn&#8217;t have traditional UI at all. Instead of starting with visual design, start with the data structure itself.</p><p><strong><a href="https://www.linkedin.com/in/ravimehta/">Ravi Mehta</a></strong>, former CPO at Tinder, demonstrated this approach on the <strong><a href="https://www.youtube.com/@howiaipodcast/">How I AI podcast</a></strong> by <strong><a href="https://www.linkedin.com/in/clairevo/">Claire Vo</a></strong>. Define your data as JSON first, then let AI generate the interface around it. Not the other way around.</p><p>When you start with a JSON data model, you&#8217;re forcing yourself to think about what information actually matters. What fields does a user profile need? What properties does each product have? What relationships exist between entities?</p><p>The process looks like this:</p><p>First, define your data structure, eg in JSON. If you&#8217;re building a case management system:</p><pre><code><code>{
  &#8220;case&#8221;: {
    &#8220;case_id&#8221;: &#8220;SOC-2025-4721&#8221;,
    &#8220;citizen_cpr&#8221;: &#8220;010185-****&#8221;,
    &#8220;case_type&#8221;: &#8220;Hjemmehj&#230;lp&#8221;,
    &#8220;status&#8221;: &#8220;under_behandling&#8221;,
    &#8220;caseworker&#8221;: &#8220;Mette Hansen&#8221;,
    &#8220;submitted&#8221;: &#8220;2025-09-28&#8221;,
    &#8220;assessment_deadline&#8221;: &#8220;2025-10-12&#8221;,
    &#8220;municipality&#8221;: &#8220;K&#248;benhavn&#8221;,
    &#8220;priority&#8221;: &#8220;normal&#8221;
  }
} </code></code></pre><p>Then use Claude or another LLM to generate realistic sample data based on that structure. Not just one record, but dozens with realistic variations. Different case types, varying deadlines, multiple municipalities, different priority levels.</p><p>Finally, feed that JSON into a prototyping tool like <strong><a href="https://www.linkedin.com/company/lovable-dev/">Lovable</a></strong> , <strong><a href="https://www.linkedin.com/company/cursorai/">Cursor</a></strong> or even just Claude itself to generate a working interface. Now you&#8217;re testing with data that actually reflects reality: case IDs that need proper formatting, deadlines that test your date handling, status values that challenge your workflow logic.</p><p>This approach has three major advantages over traditional prototyping:</p><p>You&#8217;re working with real data patterns, not lorem ipsum. Designers and PMs can see immediately how their concepts hold up against actual content variations.</p><p>You can adjust and regenerate in minutes. &#8220;Actually, we need to track which documents are missing for each case... let me add that field and see how it changes the UI.&#8221; Try doing that with static mockups.</p><p>You get something functional you can test with users immediately. Not opinions about wallpaper colors but actual feedback on whether the data structure supports their needs and whether the AI outputs are useful.</p><p>Companies using this approach have validated concepts with hundreds of users before creating a single mockup. One example from Mehta&#8217;s work: using Claude with an existing FAQ database to prototype a customer service solution, then testing it with users to validate the core concept before investing in custom UI. Another case involved using GPT-4 with a company&#8217;s product catalog to prototype a shopping assistant that generated pre-orders before any interface design work began.</p><p>Before you touch the visual design, you&#8217;ve already answered the hard questions: Does this solve the problem? Do users find it useful? Does the flow work? You can adjust the data model and regenerate the prototype in minutes.</p><p>You nail down the things that matter (what data you need, what the AI should do with it, what &#8220;good&#8221; looks like) while competitors are still arguing over button colors and playing telephone with requirements.</p><h3><strong>Building the layers</strong></h3><p>Once you have that data-first core validated, you start adding layers around it:</p><p><strong>Layer 1: Get it in front of users immediately.</strong> As soon as you have something that runs, show it to real people. Their feedback shapes the next layer.</p><p><strong>Layer 2: Keep artifacts lightweight.</strong> Skip the 50-page spec. Make quick sketches, simple diagrams, one-page summaries. Document just enough to keep everyone aligned, then get back to building.</p><p><strong>Layer 3: Build in testing as you go.</strong> Every time you add data or tweak a model, add <strong><a href="https://www.linkedin.com/posts/activity-7341577277995921408-0lSO?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAABLusYB-ehcHySYcIqFeM1YX7qDSlcRsL8">evaluation metrics</a></strong> to track it. Don&#8217;t bolt quality on later.</p><p><strong>Layer 4: Iterate for clarity.</strong> Every requirement is a hypothesis until you test it. Questions about behavior? Build something and watch what happens.</p><p>The key is that everyone stays together through this process. No handoffs. Work as one team. Assign tasks by skills, not titles. When something fails, you all own it. There&#8217;s no &#8220;hole on the other side of the boat.&#8221;</p><p>Keep everything balanced. Don&#8217;t let data race ahead of the interface, or vice versa. They need to inform each other continuously.</p><p>Decide fast, adjust often. If you can reverse a decision, make it now. If it&#8217;s truly one-way, get input, decide, and commit fully.</p><p>Each iteration builds on what you learned from the last one. Keep what works, fix what doesn&#8217;t, move forward.</p><h3><strong>What this means for your job</strong></h3><p>You still need designers, PMs, developers, and data scientists. But the work looks different now.</p><p><strong>For designers:</strong> understanding JSON doesn&#8217;t require becoming a developer. You need to understand the building blocks your designs will work with. When a developer says &#8220;this is what the API returns&#8221; and shows you a JSON structure, being able to read it immediately improves your collaboration. With AI prototyping tools, designers can translate vision directly into functional prototypes. The market is already responding. Designers who can work across the stack command higher salaries and bigger roles.</p><p><strong>For product managers:</strong> your PRDs and requirements docs are becoming prototypes themselves. Instead of writing lengthy specifications that get misinterpreted, you&#8217;re building working examples that demonstrate exactly what you mean. You&#8217;re still defining what to build and why, but now you&#8217;re showing it rather than just describing it. The fastest PMs are using AI to turn their product ideas into clickable prototypes in hours, not weeks.</p><p><strong>For developers:</strong> you&#8217;re no longer isolated waiting for perfect specs that never come. You&#8217;re involved from day one, shaping the data structures and technical approach while the product concept is still forming. Your expertise in what&#8217;s actually feasible with AI isn&#8217;t locked away until implementation. It&#8217;s informing decisions from the start. You&#8217;re building alongside everyone else, not after everyone else.</p><p><strong>For data scientists:</strong> your work isn&#8217;t bolted on at the end to &#8220;add AI&#8221; to a finished product. You&#8217;re at the table from the beginning, helping define what data you need, what&#8217;s realistic to achieve, and how to evaluate whether the AI is actually working. Your models aren&#8217;t developed in isolation. They&#8217;re shaped by real user feedback from the first prototype onwards.</p><p>The common thread: everyone needs to understand enough about the other disciplines to have informed conversations. You don&#8217;t need to be an expert in everything, but you can&#8217;t hide behind role boundaries anymore.</p><p>Teams that make this shift are shipping products 10&#215; faster than those clinging to the old model. They&#8217;re creating working prototypes, testing with real users, and iterating in hours instead of weeks.</p><h3><strong>None of this applies to my org</strong></h3><p>Maybe your situation looks nothing like the clean scenarios above. Maybe you don&#8217;t have researchers. Your &#8220;requirements&#8221; come from sales calls, tender documents, and a backlog of customer requests from five years ago. Your codebase is a patchwork of custom solutions built by developers who have long since left. Nobody knows what half of it does anymore.</p><p>This is where most organizations actually are.</p><p>Here&#8217;s the hard truth: you can&#8217;t build AI products on top of chaos. You can&#8217;t add &#8220;AI features&#8221; to a system nobody understands. You can&#8217;t ship fast when every change risks breaking something else.</p><p>The impulse is to add more process. Write better requirements. Document everything. Create governance frameworks. Hire consultants to map your technical debt.</p><p>That makes it worse.</p><p>What you actually need is radical simplification. Start by admitting three things:</p><p><strong>First: your backlog is lying to you.</strong> Those five-year-old feature requests aren&#8217;t requirements. They&#8217;re artifacts of conversations nobody remembers with customers who may not even be customers anymore. The context is gone. The problem has changed. Delete most of it.</p><p><strong>Second: your legacy code is an anchor.</strong> Every line of code you don&#8217;t understand is a liability. Every custom solution built for a specific customer five years ago is slowing you down today. You can&#8217;t &#8220;modernize&#8221; it. You need to replace it, piece by piece, with something simple enough that your whole team can understand it.</p><p><strong>Third: tender specifications aren&#8217;t product strategy.</strong> When your product direction comes from whatever customers put in RFPs, you&#8217;re not building a product. You&#8217;re building custom solutions one at a time. That doesn&#8217;t scale and it definitely doesn&#8217;t work with AI.</p><p>So what do you do?</p><p><strong>Stop starting new things.</strong> Pick one actual problem (not a feature request, a problem) that matters to multiple customers. Build the simplest possible solution. Get it in front of users. Learn from it. Only then move to the next thing.</p><p><strong>Start with data, not features.</strong> Before you add AI to anything, understand what data you actually have. Not what you wish you had. What&#8217;s actually there, what quality it&#8217;s in, whether it&#8217;s even useful. Most legacy systems are drowning in data they can&#8217;t use and missing the data they need.</p><p><strong>Kill the handoffs in one place first.</strong> You can&#8217;t transform your whole organization overnight. Pick one small team, one small problem. Let them work together from start to finish. No throwing requirements over the wall. No &#8220;waiting for dev capacity.&#8221; Just let them build something simple that works. When it succeeds, others will notice.</p><p><strong>Make decisions reversible.</strong> Your legacy codebase is full of irreversible decisions. Every new thing you build should be easy to undo, easy to replace, easy to understand. Small, simple, modular. If it takes more than a week to explain how something works, it&#8217;s too complicated.</p><p>The goal isn&#8217;t to fix everything. The goal is to stop making it worse while you build new things the right way.</p><p>Leaders in organizations like this face a choice: keep adding complexity to manage complexity, or start cutting through it. The first path is comfortable and leads nowhere. The second path is uncomfortable and works.</p><p>Most of your competitive advantage is buried under accumulated cruft. The companies that will win are the ones willing to dig it out.</p><h3><strong>So what now</strong></h3><p>The traditional relay-race model is dead. Teams that work in silos will keep shipping products nobody wants.</p><p>Teams that build together (starting with real data structures, working as one unit, testing constantly, and focusing on actual working software) will win.</p><p>You win by having data nobody else has and learning from users faster than anyone else can.</p><p>The choice isn&#8217;t whether this shift happens. It&#8217;s whether you adapt to it or get left behind.</p><p>Working code beats bullshit. Every time.</p><p>Start tomorrow: Pick one team. One problem. Let them work together for two weeks with no handoffs. See what happens.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://olgasafonova.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>