<?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>Fri, 10 Apr 2026 08:16:38 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[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>