<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CommitCycle Insights</title><description>Arguments about running AI coding agents on real repositories: shared context, least privilege, and knowledge that stays true.</description><link>https://commitcycle.com/insights/</link><language>en</language><atom:link href="https://commitcycle.com/insights/rss.xml" rel="self" type="application/rss+xml"/><item><title>The instruction you write once instead of every session</title><link>https://commitcycle.com/insights/agent-skills-guide/</link><guid isPermaLink="true">https://commitcycle.com/insights/agent-skills-guide/</guid><description>What a skill is, why the description is the only part always loaded, what belongs in one versus AGENTS.md, and how to work out why yours is not firing.</description><pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There is a moment every few days where you type the same correction again. &lt;em&gt;Use our button component.&lt;/em&gt; &lt;em&gt;Do not add a dependency for that.&lt;/em&gt; &lt;em&gt;The dates in this project are always ISO.&lt;/em&gt; You said it on Tuesday, the session ended, and the knowledge ended with it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A skill is that instruction, written once, in a file the agent picks up on its own when it becomes relevant.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is the whole concept, and the rest of this page is the mechanics, the judgement about what belongs in one, and the debugging — because the failure mode is not writing a bad skill, it is writing a good skill that never loads.&lt;/p&gt;
&lt;h2 id=&quot;what-a-skill-is-on-disk&quot;&gt;What a skill is on disk&lt;/h2&gt;
&lt;p&gt;A folder with a markdown file in it:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;.claude/skills/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;cc-brand/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;SKILL.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;references/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;token-reference.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;motion-and-craft.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;cc-tokens.css&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;assets/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;AppShell.vue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; opens with frontmatter carrying two things that matter:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;name: cc-brand&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;description: Implements UI in the CC design system for Vue. Use this WHENEVER&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;building, styling, theming or reviewing any Vue interface, component, page,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;dashboard or form for CommitCycle — and whenever the user mentions CC UI, the&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;brand blue (#693DFF), Plus Jakarta Sans, shadcn-vue, or &quot;make this on-brand&quot;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;# CC Design System Implementor&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Everything the agent should know, in ordinary markdown.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Nothing else is required. No build step, no registration, no configuration file. The folder exists, so the skill exists.&lt;/p&gt;
&lt;h2 id=&quot;why-not-just-put-it-in-the-prompt&quot;&gt;Why not just put it in the prompt?&lt;/h2&gt;
&lt;p&gt;Because you have to remember, every time, and you will not. More precisely: the times you forget are not random. They are the times you were moving fast, which are the times the agent had least context, which is exactly when the convention mattered most.&lt;/p&gt;
&lt;h2 id=&quot;why-not-just-put-it-in-agentsmd&quot;&gt;Why not just put it in AGENTS.md?&lt;/h2&gt;
&lt;p&gt;This is the real question, and the answer is the design of the whole feature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; (or &lt;code&gt;CLAUDE.md&lt;/code&gt;) is always loaded.&lt;/strong&gt; Every turn, every session, every task, whether relevant or not. That makes it perfect for facts that are always true — the stack, the commands, the folder layout, the things never to do — and it means every line you add costs context on work that has nothing to do with it. A 900-line AGENTS.md is a tax on every request.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A skill is loaded only when it matches.&lt;/strong&gt; What is always in context is its name and description — a couple of lines. The body is read only when the agent decides the task calls for it.&lt;/p&gt;
&lt;p&gt;This is called progressive disclosure, and it works in three levels:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;What loads&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Name + description&lt;/td&gt;
&lt;td&gt;Always. Costs almost nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;The SKILL.md body&lt;/td&gt;
&lt;td&gt;When the description matches the task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Bundled files in the folder&lt;/td&gt;
&lt;td&gt;When the body points at them and the task needs them&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Which is why a skill can be enormous — a full design system, a compliance checklist, an API’s entire surface — without slowing down a request about something else. You are carrying a library, not a note.&lt;/p&gt;
&lt;h2 id=&quot;what-belongs-where&quot;&gt;What belongs where&lt;/h2&gt;
&lt;p&gt;The judgement that makes all of this work:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Put it in&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The prompt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;True for this one task only&lt;/td&gt;
&lt;td&gt;“Use blue for the header on this page”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AGENTS.md&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Always true, always relevant, short&lt;/td&gt;
&lt;td&gt;“Stack is Astro + Tailwind. Never edit files in &lt;code&gt;dist/&lt;/code&gt;”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A skill&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;True in a specific situation, too long for AGENTS.md&lt;/td&gt;
&lt;td&gt;Your complete design system, your API conventions, your writing voice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;An MCP server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The agent needs to &lt;em&gt;reach&lt;/em&gt; something&lt;/td&gt;
&lt;td&gt;Your database, your issue tracker, your analytics&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The common mistake is putting design-system-sized content in AGENTS.md, where it is loaded on every request including the ones about a build script. The other common mistake is putting the project’s stack in a skill, where it might not load at the moment it is needed.&lt;/p&gt;
&lt;h2 id=&quot;the-description-is-the-whole-trigger&quot;&gt;The description is the whole trigger&lt;/h2&gt;
&lt;p&gt;If you take one thing from this page: &lt;strong&gt;the description is not documentation, it is the matching rule.&lt;/strong&gt; It is the only part of your skill the agent sees before deciding whether to read the rest.&lt;/p&gt;
&lt;p&gt;So write it in the words a person actually types. Not:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Brand implementation guidelines and component standards.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That matches nothing. Someone asking “make this look like our app” has not used any of those words. Instead:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Use this whenever building, styling, theming or reviewing any interface, page, dashboard, form or component for [product] — and whenever the user mentions [the brand colour], [the font], [the component library], or “make this on-brand”. Reach for it even when the request is just “build a settings page” or “style this card”.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Concretely, a description that fires reliably names:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The verbs&lt;/strong&gt; — building, styling, reviewing, migrating, drafting&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The nouns&lt;/strong&gt; — the artefacts it applies to&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The literal strings&lt;/strong&gt; — product names, hex codes, font names, library names&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The informal phrasings&lt;/strong&gt; — “make it on-brand”, “the usual way”, “like the other pages”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When to use it even though it does not look like it applies&lt;/strong&gt; — this line does a surprising amount of work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Being over-inclusive costs a little context when it fires unnecessarily. Being under-inclusive costs you the entire skill, silently, forever. Bias towards firing.&lt;/p&gt;
&lt;h2 id=&quot;where-skills-live&quot;&gt;Where skills live&lt;/h2&gt;
&lt;p&gt;Two places, and the choice matters more than it looks:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;.claude/skills/&lt;/code&gt; inside the project.&lt;/strong&gt; It commits with the repository, so it is present on your other machine, in every future session, and for anyone else who clones it. Anything that describes &lt;em&gt;this&lt;/em&gt; product belongs here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;~/.claude/skills/&lt;/code&gt; in your home directory.&lt;/strong&gt; Available in every project you touch, invisible to everybody else. This is for your own working style — how you like commits written, how you want documents structured.&lt;/p&gt;
&lt;p&gt;The default should be the project. A skill that lives only on your laptop is one machine away from not existing, and it is the reason a project “only works properly when you run it”.&lt;/p&gt;
&lt;h2 id=&quot;how-do-i-know-it-fired&quot;&gt;How do I know it fired?&lt;/h2&gt;
&lt;p&gt;Ask. &lt;em&gt;Which skills did you use for that?&lt;/em&gt; is a reasonable question and gets a straight answer. &lt;em&gt;What skills do you have available?&lt;/em&gt; lists them, which is the first check after installing one.&lt;/p&gt;
&lt;p&gt;The stronger check is behavioural: start a fresh session, phrase a request the way a real user would — not the way the skill’s own documentation phrases it — and see whether the output follows the rules without you mentioning them. That is the only test that matters, because that is the actual condition of use.&lt;/p&gt;
&lt;h2 id=&quot;why-is-my-skill-not-firing&quot;&gt;Why is my skill not firing?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Almost always&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Never loads&lt;/td&gt;
&lt;td&gt;Description does not contain the words being typed&lt;/td&gt;
&lt;td&gt;Rewrite the description with real phrasings and literal names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loads, then the output ignores it&lt;/td&gt;
&lt;td&gt;SKILL.md is too long or the rules are buried in prose&lt;/td&gt;
&lt;td&gt;Cut it. Lead with the rules. Move detail into &lt;code&gt;references/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loads on everything&lt;/td&gt;
&lt;td&gt;Description is too broad&lt;/td&gt;
&lt;td&gt;Add the boundary: what this is &lt;em&gt;not&lt;/em&gt; for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works for you, not for a colleague&lt;/td&gt;
&lt;td&gt;It is in &lt;code&gt;~/.claude/skills/&lt;/code&gt;, not the project&lt;/td&gt;
&lt;td&gt;Move it into the repository and commit it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contradicted by other instructions&lt;/td&gt;
&lt;td&gt;AGENTS.md says something different&lt;/td&gt;
&lt;td&gt;Decide which wins and say so explicitly in both&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Notice that four of the five are description or placement problems. The content is rarely what is wrong.&lt;/p&gt;
&lt;h2 id=&quot;keeping-skillmd-short&quot;&gt;Keeping SKILL.md short&lt;/h2&gt;
&lt;p&gt;Once loaded, the body is read in full — so length costs something, and the good structure is a short instruction file that points at detail.&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;SKILL.md              the rules, the decision order, what wins in a conflict&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;references/           the long material: token tables, API surfaces, examples&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;assets/               things to copy: components, stylesheets, templates&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;scripts/              things to run&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;cc-brand&lt;/code&gt; skill in the example above is exactly this shape: the SKILL.md states the layer priority and the conflict rule in a few hundred words, and the token reference, the motion guidance and the ready-made shell components sit in files it points at. The agent opens the sidebar reference when it is building a sidebar and never otherwise.&lt;/p&gt;
&lt;p&gt;Two things belong in SKILL.md rather than a reference file: &lt;strong&gt;the order of precedence&lt;/strong&gt; (when two rules collide, which wins) and &lt;strong&gt;what not to do&lt;/strong&gt;. Both are short and both are what the agent gets wrong when they are missing.&lt;/p&gt;
&lt;h2 id=&quot;skills-mcp-subagents-slash-commands&quot;&gt;Skills, MCP, subagents, slash commands&lt;/h2&gt;
&lt;p&gt;Four things that get confused, on genuinely different axes:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Who triggers it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skill&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Instructions loaded on relevance&lt;/td&gt;
&lt;td&gt;The agent, by matching the description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tools that reach external systems&lt;/td&gt;
&lt;td&gt;The agent, when it needs the tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subagent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A separate context window for delegated work&lt;/td&gt;
&lt;td&gt;The agent, or you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Slash command&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A saved prompt you invoke by name&lt;/td&gt;
&lt;td&gt;You, explicitly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Skills and MCP are complements rather than alternatives. The MCP server gives the agent a connection to your database; the skill tells it your schema conventions and which tables are never written to directly. Tools without instructions is the configuration most people have, and it is why the agent can reach everything and still do the wrong thing with it.&lt;/p&gt;
&lt;h2 id=&quot;installing-one-somebody-gave-you&quot;&gt;Installing one somebody gave you&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Put the folder in &lt;code&gt;.claude/skills/&lt;/code&gt; (project) or &lt;code&gt;~/.claude/skills/&lt;/code&gt; (personal).&lt;/li&gt;
&lt;li&gt;Start a &lt;strong&gt;new session&lt;/strong&gt; — an existing one has already built its list.&lt;/li&gt;
&lt;li&gt;Ask &lt;em&gt;what skills do you have available&lt;/em&gt; and check yours is listed by name.&lt;/li&gt;
&lt;li&gt;Give it a realistic request and see whether the rules apply without being mentioned.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If step 3 fails, the folder is in the wrong place or &lt;code&gt;SKILL.md&lt;/code&gt; is misnamed. If step 4 fails, it is the description.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The one worth installing on day one is a design skill.&lt;/strong&gt; If you have an idea but no brand and no visual opinion yet, &lt;a href=&quot;https://startpow.com/&quot;&gt;startpow.com&lt;/a&gt; will let you pick what you like, export, and download the result as a skill. Drop it in, and every screen the agent builds from then on arrives in your colours, your type and your spacing without you describing them again — which is roughly the difference between a product and a demo, for about ten minutes of work.&lt;/p&gt;
&lt;h2 id=&quot;how-many-skills-is-too-many&quot;&gt;How many skills is too many?&lt;/h2&gt;
&lt;p&gt;There is a real budget, and it is not the one people worry about. The bodies are free until they load, so a folder of forty skills does not slow anything down. What is not free is the &lt;strong&gt;descriptions&lt;/strong&gt;, which are all in context, all the time.&lt;/p&gt;
&lt;p&gt;Forty vague descriptions is worse than five sharp ones for a second reason too: the more of them overlap, the less reliably the right one wins. Two skills that both plausibly cover “styling” means a coin toss on every UI request.&lt;/p&gt;
&lt;p&gt;The practical shape is a handful of skills with clean boundaries, each of which you could describe in one sentence without using the word “and”. When you cannot, that is two skills.&lt;/p&gt;
&lt;h2 id=&quot;a-skill-is-instructions-you-agree-to-run&quot;&gt;A skill is instructions you agree to run&lt;/h2&gt;
&lt;p&gt;Worth saying plainly, because skills get passed around like themes and they are not themes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A skill is a set of instructions an agent will follow, with your permissions, in your repository.&lt;/strong&gt; A downloaded skill can tell an agent to install a package, to send a file somewhere, to treat a rule as more important than the ones you wrote. That is the same trust decision as running a script somebody sent you, and the fact that it is markdown rather than code makes it feel smaller than it is.&lt;/p&gt;
&lt;p&gt;So: read &lt;code&gt;SKILL.md&lt;/code&gt; before you install it, look at whatever else is in the folder, and be more careful with skills that ship scripts than with skills that ship documentation. A design system from a tool you chose is a very different proposition from a skill pasted into a forum thread.&lt;/p&gt;
&lt;p&gt;The same applies in reverse when you publish one — anyone installing yours is extending you that trust.&lt;/p&gt;
&lt;h2 id=&quot;getting-them-to-a-team&quot;&gt;Getting them to a team&lt;/h2&gt;
&lt;p&gt;Three routes, in increasing order of ceremony:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Commit them to the repository.&lt;/strong&gt; &lt;code&gt;.claude/skills/&lt;/code&gt; is in the repo, so cloning gets them. This covers most cases and needs no infrastructure at all.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ship them in a plugin.&lt;/strong&gt; A plugin can carry skills along with commands and MCP servers, installed by name and updated centrally. Right when several repositories need the same conventions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Send the folder.&lt;/strong&gt; Fine once, unmanageable by the fourth person, because there is now no answer to “which version do you have”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The failure to avoid is the one where the skill exists only in one person’s home directory. The project then behaves differently depending on who is driving, and nobody can see why.&lt;/p&gt;
&lt;h2 id=&quot;the-fastest-way-to-write-your-first-skill&quot;&gt;The fastest way to write your first skill&lt;/h2&gt;
&lt;p&gt;Do not start from a blank page. Blank pages produce generic rules, and generic rules are the ones the model already follows.&lt;/p&gt;
&lt;p&gt;Instead: &lt;strong&gt;work normally, and pay attention to what you correct.&lt;/strong&gt; The third time you say the same thing — the third time you point out the date format, or the component, or that we do not use that library here — say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Turn what you just learned into a skill. Write the description so it fires whenever someone asks for anything in this area, including informal phrasings. Keep SKILL.md short and put the long detail in a references file.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Your corrections are already the exact content a skill needs. They are specific, they are real, and they are the ones that were actually being got wrong — which is a much better starting set than anything you would think to write in advance.&lt;/p&gt;
&lt;h2 id=&quot;hacks-that-make-a-real-difference&quot;&gt;Hacks that make a real difference&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Show, do not only tell.&lt;/strong&gt; One worked example of your convention outperforms three paragraphs describing it. Models are extremely good at pattern-matching from an example and merely obedient about following a rule.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One skill per concern.&lt;/strong&gt; A single “our standards” skill covering design, testing and deployment fires on everything and applies to nothing well. Split it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Say what wins.&lt;/strong&gt; Every skill that contains more than one source of guidance needs a sentence saying which one takes precedence in a conflict. Without it, the model picks, and it picks differently each time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write the negative rules.&lt;/strong&gt; &lt;em&gt;Do not introduce a second component library. Do not add dependencies for something the standard library does.&lt;/em&gt; Negative constraints are followed more reliably than positive ones and are almost always the thing you actually cared about.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Version it with the code it describes.&lt;/strong&gt; A design skill in the repository changes in the same commit as the tokens it documents. A design skill on your laptop drifts within a fortnight and then confidently teaches the agent last month’s colours.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test with a cold session and a lazy phrasing.&lt;/strong&gt; “make the settings page” is how the request will really arrive. If the skill needs the well-formed version to fire, it does not work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Let old skills die.&lt;/strong&gt; A skill describing a convention you abandoned is worse than no skill: it is a confident, always-available instruction to do the wrong thing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;if-you-are-not-on-claude-code&quot;&gt;If you are not on Claude Code&lt;/h2&gt;
&lt;p&gt;Skills-as-folders are a Claude Code feature. Other agentic tools read a single always-loaded instructions file, and the near-universal convention is &lt;strong&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; at the root of the repository&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The content transfers directly. What does not transfer is the selective loading — everything in that file is paid for on every request — so the discipline is different: keep it to what is always true, put the long material in ordinary documentation, and point at it from the file rather than pasting it in.&lt;/p&gt;
&lt;p&gt;Either way, the underlying move is the same one, and it is the highest-leverage habit in agentic development: &lt;strong&gt;the second time you explain something, write it down where the agent will find it.&lt;/strong&gt; The rest of the setup that sits around this — the repository, the model, the host, the stack, the guardrails — is &lt;a href=&quot;https://commitcycle.com/insights/vibe-coding-setup/&quot;&gt;six decisions long&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>GitHub for people who do not write the code</title><link>https://commitcycle.com/insights/github-for-vibe-coders/</link><guid isPermaLink="true">https://commitcycle.com/insights/github-for-vibe-coders/</guid><description>Git, GitHub, commits, branches and the four levels of undo — the version control a vibe coder actually needs, and the hacks that recover a lost day.</description><pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you have never used GitHub, ignore how it is usually described. It is not a social network for programmers, you are not there to read anyone else’s code, and the green squares are not a scoreboard you have to fill.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It is a save system with a history, hosted somewhere that is not your laptop.&lt;/strong&gt; That is the whole thing.&lt;/p&gt;
&lt;p&gt;For a vibe coder it earns its place for one specific reason. At some point — not maybe, at some point — a session will rewrite something that already worked. It will refactor a file you liked, delete a function it decided was unused, or fix one bug by quietly introducing two. Without commits, that work is gone and your only recovery is describing it again from memory to a model that has forgotten the conversation. With commits, recovery is one sentence.&lt;/p&gt;
&lt;p&gt;This guide is everything you need for that, and nothing you do not.&lt;/p&gt;
&lt;h2 id=&quot;git-and-github-are-not-the-same-thing&quot;&gt;Git and GitHub are not the same thing&lt;/h2&gt;
&lt;p&gt;Worth ten seconds, because conflating them is what makes the rest confusing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt; is a program on your computer. It records versions of a folder. It works with no internet, no account and no website, and it is what does all the actual work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt; is a website that holds a copy of a Git repository, and adds the things a website can add: a page to browse it, a place for other people, automation that runs when you push.&lt;/p&gt;
&lt;p&gt;So when your agent “commits”, that is Git, locally, instantly. When it “pushes”, that is the copy travelling to GitHub. This is why you can work on a plane and why a commit is not a backup until it has been pushed.&lt;/p&gt;
&lt;p&gt;The alternatives — GitLab, Bitbucket, Codeberg — are the same Git underneath with a different website on top. Nothing in this guide changes if you pick one of those.&lt;/p&gt;
&lt;h2 id=&quot;the-seven-words-that-cover-almost-everything&quot;&gt;The seven words that cover almost everything&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Word&lt;/th&gt;
&lt;th&gt;What it actually is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Repository&lt;/strong&gt; (“repo”)&lt;/td&gt;
&lt;td&gt;Your project folder, plus every version it has ever been&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Commit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A save point with a note attached&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Branch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A copy of the project where you can break things safely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Push / pull&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sending your commits up to GitHub / bringing others’ down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Clone&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Downloading a whole repository, history included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pull request&lt;/strong&gt; (“PR”)&lt;/td&gt;
&lt;td&gt;“Here is a change, look at it before it goes in”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Merge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Folding one branch’s commits into another&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Two more you will see and can mostly ignore: &lt;strong&gt;origin&lt;/strong&gt; is the default nickname for “the copy on GitHub”, and &lt;strong&gt;main&lt;/strong&gt; is the default name of the primary branch.&lt;/p&gt;
&lt;h2 id=&quot;do-i-need-to-learn-git-commands&quot;&gt;Do I need to learn Git commands?&lt;/h2&gt;
&lt;p&gt;No, and this is the part nobody tells beginners. &lt;strong&gt;You need three sentences to say to your agent&lt;/strong&gt;, and it runs the commands.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Commit this with a clear message.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;What has changed since the last commit?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Undo everything since the last commit.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the entire interface for your first month. What you do need is to understand &lt;em&gt;what those three things mean&lt;/em&gt;, which is what the rest of this page is for — because the failure mode is not typing the wrong command, it is asking for the wrong kind of undo.&lt;/p&gt;
&lt;p&gt;If you would rather have buttons than sentences, &lt;strong&gt;GitHub Desktop&lt;/strong&gt; is free, shows changed files as a visual diff, and turns commit and push into two clicks. Many people who ship real products never use the terminal for Git at all.&lt;/p&gt;
&lt;h2 id=&quot;where-your-code-lives-while-you-are-working&quot;&gt;Where your code lives while you are working&lt;/h2&gt;
&lt;p&gt;Git messages talk about files being “staged”, “tracked” and “untracked”, and none of it makes sense until you know there are &lt;strong&gt;three places a change can be&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Place&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;th&gt;How it leaves&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Working directory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You (or the agent) edited the file. Nothing is recorded&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git add&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Staging area&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Marked as part of the next commit, but not saved yet&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Committed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Recorded in history permanently&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git push&lt;/code&gt; sends it to GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The staging area is the part that feels pointless at first. Its purpose is choosing: twelve files changed, four of them belong to this commit, so you stage those four. As a vibe coder you will mostly commit everything at once — but you need to know staging exists, because “changes not staged for commit” is otherwise an error message about nothing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;git status&lt;/code&gt; is the “where am I” command&lt;/strong&gt;, and it is the one worth being able to read yourself. It tells you which branch you are on, what is changed, what is staged, and whether you are ahead of or behind GitHub. When something is confusing, this is the first thing to look at, and it is completely safe — it changes nothing.&lt;/p&gt;
&lt;h2 id=&quot;the-first-file-that-matters-gitignore&quot;&gt;The first file that matters: .gitignore&lt;/h2&gt;
&lt;p&gt;Before your first push, before anything else: &lt;code&gt;.gitignore&lt;/code&gt; is a list of files Git must never record.&lt;/p&gt;
&lt;p&gt;At minimum it contains:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;.env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;.env.local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;node_modules/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;.DS_Store&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;dist/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;.env&lt;/code&gt; is the one that matters. That is where your API keys live, and that one line is what stops them from being published the first time you push. Public repositories are scanned continuously by people looking for exactly this, and a leaked key is found in minutes, not days.&lt;/p&gt;
&lt;p&gt;Ask for it explicitly at setup — &lt;em&gt;add a .gitignore appropriate for this stack, and make sure .env is in it&lt;/em&gt; — and then check with your own eyes that &lt;code&gt;.env&lt;/code&gt; is listed. This is a thirty-second check that prevents the single most common expensive beginner mistake.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make the repository private by default.&lt;/strong&gt; Public is a deliberate decision to publish, and it is far easier to make a private repository public later than to un-publish something — including everything in its history.&lt;/p&gt;
&lt;h2 id=&quot;how-do-i-read-a-diff-without-reading-code&quot;&gt;How do I read a diff without reading code?&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;diff&lt;/strong&gt; is what changed, shown line by line. Green lines with &lt;code&gt;+&lt;/code&gt; were added, red lines with &lt;code&gt;-&lt;/code&gt; were removed, grey lines are unchanged context. You do not need to understand the code to get real value from it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;How big is it?&lt;/strong&gt; Twelve lines changed for a small ask is normal. Four hundred is a signal to stop and ask what else it did.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which files?&lt;/strong&gt; If you asked for a colour change and a file with &lt;code&gt;auth&lt;/code&gt; or &lt;code&gt;migration&lt;/code&gt; or &lt;code&gt;schema&lt;/code&gt; in the name is in the list, that is the moment to ask why.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anything deleted that you did not ask to delete?&lt;/strong&gt; Long blocks of red are worth a question.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the whole skill, and it is most of what code review gives you on a solo project. &lt;em&gt;Show me the diff, and explain in plain English what each file’s change does&lt;/em&gt; is a good habit before every commit.&lt;/p&gt;
&lt;h2 id=&quot;what-makes-a-commit-message-worth-writing&quot;&gt;What makes a commit message worth writing?&lt;/h2&gt;
&lt;p&gt;Its only job is to help future-you find a moment in time. “Update” and “fixes” fail at that; six of them in a row are indistinguishable.&lt;/p&gt;
&lt;p&gt;Write what the state &lt;em&gt;is&lt;/em&gt;, not what you did: &lt;code&gt;login screen works, validation not done yet&lt;/code&gt;. Six weeks later, that message is what lets you say “go back to when login worked” and mean something precise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Commit when something works, not at the end of the day.&lt;/strong&gt; The end of the day is one save point for eight hours of decisions. Every working state is a place you can return to.&lt;/p&gt;
&lt;h2 id=&quot;when-do-i-actually-need-a-branch&quot;&gt;When do I actually need a branch?&lt;/h2&gt;
&lt;p&gt;As a solo vibe coder, less often than tutorials imply. You need one when &lt;strong&gt;you are about to try something you might regret&lt;/strong&gt; — a big refactor, a risky dependency swap, an experiment you are only half sold on.&lt;/p&gt;
&lt;p&gt;The reason is that the undo becomes free. You are on &lt;code&gt;experiment&lt;/code&gt;, it goes badly, you switch back to &lt;code&gt;main&lt;/code&gt; and delete the branch. Nothing to unpick, nothing to revert, no argument with the agent about what it changed.&lt;/p&gt;
&lt;p&gt;The moment anyone else touches the repository, this stops being optional and becomes one branch per piece of work — which is &lt;a href=&quot;https://commitcycle.com/insights/vibe-coding-shared-repository/&quot;&gt;where vibe coding gets genuinely harder&lt;/a&gt;, and a different problem from this one.&lt;/p&gt;
&lt;h2 id=&quot;how-do-i-undo-something&quot;&gt;How do I undo something?&lt;/h2&gt;
&lt;p&gt;The most important section on this page. There are &lt;strong&gt;four kinds of undo&lt;/strong&gt; and asking for the wrong one is how people lose work while trying to save it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. You have changes you have not committed, and you want them gone.&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;git restore .&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Everything since the last commit disappears. This is the everyday one — the session went wrong, nothing was worth keeping, start again from the last good state.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. You committed, but have not pushed, and want the commit gone.&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;git reset --soft HEAD~1   # undo the commit, keep the changes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;git reset --hard HEAD~1   # undo the commit and the changes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;--soft&lt;/code&gt; is for “right commit, wrong message, wrong moment”. &lt;code&gt;--hard&lt;/code&gt; is for “that whole direction was wrong”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. You already pushed, and other people (or a deployment) have it.&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;git revert &amp;lt;commit&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This makes a &lt;em&gt;new&lt;/em&gt; commit that undoes the old one. It is the safe one, because it adds to history rather than rewriting it, and nothing anyone else has ever disagrees with what you have.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. You think you have lost something permanently.&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;git reflog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Git keeps a private log of every position your branch has been in for around ninety days, including commits you “deleted” and branches you removed. Almost nothing is ever actually gone. This is the one to reach for after a &lt;code&gt;--hard&lt;/code&gt; you regret or a force-push that ate your afternoon — and it is worth knowing it exists precisely because the moment you need it is the moment you are panicking.&lt;/p&gt;
&lt;h2 id=&quot;what-is-a-merge-conflict-and-who-fixes-it&quot;&gt;What is a merge conflict, and who fixes it?&lt;/h2&gt;
&lt;p&gt;Two branches changed the same lines. Git will not guess which version wins, so it marks the disputed section in the file with &lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt; and &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt; and stops.&lt;/p&gt;
&lt;p&gt;Nothing is broken and nothing is lost. Both versions are right there; something has to choose.&lt;/p&gt;
&lt;p&gt;Agents are good at this, on one condition: &lt;strong&gt;tell them what each change was for.&lt;/strong&gt; The decision is about intent, not syntax — &lt;em&gt;this side is the new pricing logic, that side is the bug fix from yesterday, keep both behaviours&lt;/em&gt; gets a correct resolution. “Fix the conflict” gets a coin toss.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-if-i-commit-an-api-key&quot;&gt;What happens if I commit an API key?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Rotate it. Now.&lt;/strong&gt; Go to the service, revoke the key, issue a new one.&lt;/p&gt;
&lt;p&gt;Deleting the file in a later commit does nothing, because the key is still sitting in the history where anyone can read it. On a public repository, assume it was scraped within minutes — this is automated at scale.&lt;/p&gt;
&lt;p&gt;GitHub helps at two points, and both are worth turning on. &lt;strong&gt;Secret scanning&lt;/strong&gt; notices known key formats in your repository and alerts you. &lt;strong&gt;Push protection&lt;/strong&gt; goes further and blocks the push before the secret ever lands. Neither covers every format, so &lt;code&gt;.gitignore&lt;/code&gt; remains the actual defence.&lt;/p&gt;
&lt;p&gt;Cleaning the key out of history afterwards is possible and fiddly. It is also secondary: once the key is rotated, the one in the history is a dead string.&lt;/p&gt;
&lt;h2 id=&quot;what-else-is-github-beyond-storage&quot;&gt;What else is GitHub, beyond storage?&lt;/h2&gt;
&lt;p&gt;Things you will meet, in one line each:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Issues&lt;/strong&gt; — a to-do list attached to the project. Fine for solo notes, though a real board is better once work has shape.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actions&lt;/strong&gt; — automation that runs on push. This is how tests run and how deploys trigger. You will meet it the first time you connect a host.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Releases and tags&lt;/strong&gt; — a name pinned to a specific commit. &lt;code&gt;v1-launch&lt;/code&gt; is a bookmark saying &lt;em&gt;this version was good&lt;/em&gt;, and it costs nothing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pages&lt;/strong&gt; — free static hosting straight from a repository. Fine for a landing page, not for anything with a backend.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fork&lt;/strong&gt; — your own copy of somebody else’s repository. Relevant when you want to change someone’s open source project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependabot&lt;/strong&gt; — opens pull requests when a dependency has a security fix. Free, worth leaving on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Codespaces&lt;/strong&gt; — a full dev environment in the browser. Useful when you want to work from a machine that has nothing installed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;things-that-will-confuse-you-exactly-once&quot;&gt;Things that will confuse you exactly once&lt;/h2&gt;
&lt;p&gt;Each of these produces a moment of genuine alarm, and each is harmless once you have seen it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“You are in ‘detached HEAD’ state.”&lt;/strong&gt; You looked at an old commit and are now standing on it rather than on a branch. Commits made here belong to nothing and are easy to lose. &lt;code&gt;git switch main&lt;/code&gt; walks back. Nothing is broken.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your repository contains another repository.&lt;/strong&gt; An agent ran &lt;code&gt;git init&lt;/code&gt; inside a folder that was already in a repo, usually while scaffolding something. GitHub then shows a folder you cannot open, containing nothing. The fix is deleting the inner &lt;code&gt;.git&lt;/code&gt; folder — and the tell is a commit that adds a directory but none of the files in it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A file is too large to push.&lt;/strong&gt; GitHub rejects individual files over 100MB, and a video, a database dump or a &lt;code&gt;node_modules&lt;/code&gt; that escaped &lt;code&gt;.gitignore&lt;/code&gt; will hit it. The trap is that removing the file does not fix the push, because it is still in the history — the commit that added it has to be undone. Much easier to prevent: check &lt;code&gt;.gitignore&lt;/code&gt; before the first push.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your two machines disagree.&lt;/strong&gt; You committed on the laptop, pushed, then committed on the desktop without pulling. Git will refuse the second push. &lt;code&gt;git pull&lt;/code&gt; first, resolve anything it asks about, then push. The habit that avoids it entirely is pulling at the start of a session rather than at the end.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The agent committed as somebody else.&lt;/strong&gt; Commits carry the name and email in your local Git config, which on a fresh machine may be blank or wrong. Worth setting once, or your history is authored by “unknown”.&lt;/p&gt;
&lt;h2 id=&quot;hacks-that-pay-for-themselves&quot;&gt;Hacks that pay for themselves&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Commit before every agent session, not after.&lt;/strong&gt; The commit is not a record of what you did, it is the save point you are about to risk. Ten seconds, and it converts every disaster into &lt;code&gt;git restore .&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ask for the diff before you accept.&lt;/strong&gt; &lt;em&gt;Show me what you changed and why&lt;/em&gt; catches the helpful extra thing you did not want, which is the most common failure that survives to production.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One branch per experiment, and delete is the undo.&lt;/strong&gt; Cheaper than any revert.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;git stash&lt;/code&gt; when the agent complains about a dirty tree.&lt;/strong&gt; It pockets your uncommitted work; &lt;code&gt;git stash pop&lt;/code&gt; gives it back. Better than committing junk to get unstuck.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--force-with-lease&lt;/code&gt;, never plain &lt;code&gt;--force&lt;/code&gt;.&lt;/strong&gt; Both rewrite what is on GitHub. The first refuses if someone else pushed in the meantime; the second overwrites them without asking.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protect &lt;code&gt;main&lt;/code&gt; once anything real is on it.&lt;/strong&gt; GitHub’s branch protection can require a pull request before merging, which makes “the agent pushed straight to main at 2am” structurally impossible rather than merely discouraged.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tag the version that worked.&lt;/strong&gt; Before a big change, &lt;code&gt;v-works&lt;/code&gt; costs nothing and is trivially findable, unlike a commit hash you will never recognise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Squash when you merge.&lt;/strong&gt; Fourteen commits of “wip”, “fix”, “actually fix” collapse into one meaningful entry, and your history stays readable by a human — and by the next agent that reads it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remember &lt;code&gt;reflog&lt;/code&gt; exists before you need it.&lt;/strong&gt; The moment you need it, you will not be in a state to discover it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-to-do-on-day-one&quot;&gt;What to do on day one&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Create the account. Make the first repository &lt;strong&gt;private&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Get &lt;code&gt;.gitignore&lt;/code&gt; in place with &lt;code&gt;.env&lt;/code&gt; in it, and check with your own eyes.&lt;/li&gt;
&lt;li&gt;Ask the agent to make the first commit and push it. Look at the repository on GitHub and see your files there.&lt;/li&gt;
&lt;li&gt;Then, every time something works: &lt;em&gt;commit this with a clear message&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That is the whole practice. Everything else on this page is there for the day something goes wrong — and the reason to read it now is that the day something goes wrong is a bad day to be learning which kind of undo you need.&lt;/p&gt;
&lt;p&gt;The rest of the setup this fits into — the model, the host, the stack, the guardrails — is &lt;a href=&quot;https://commitcycle.com/insights/vibe-coding-setup/&quot;&gt;six decisions long&lt;/a&gt;, and version control is the one that everything else assumes you already have.&lt;/p&gt;
</content:encoded></item><item><title>Six decisions before your first prompt, and why each one is there</title><link>https://commitcycle.com/insights/vibe-coding-setup/</link><guid isPermaLink="true">https://commitcycle.com/insights/vibe-coding-setup/</guid><description>GitHub, a model, a host, a stack, a guardrail and a first prompt — the setup a vibe coder makes once, and what each piece is actually protecting.</description><pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nobody wants to spend an afternoon on setup. The pull is to open a chat and start describing the thing, and for a prototype that is the right instinct — &lt;a href=&quot;https://commitcycle.com/insights/vibe-coding-first-steps/&quot;&gt;the first week has its own post&lt;/a&gt; and most of the advice there is &lt;em&gt;go faster&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is the other post. It is for the moment you decide the thing will still exist next month, and it is six decisions. Each takes minutes. Each closes off a specific way week two goes wrong, and the reason to make them together is that all six are cheap now and expensive later.&lt;/p&gt;
&lt;p&gt;None of them is about which model is best.&lt;/p&gt;
&lt;h2 id=&quot;1-github-which-is-an-undo-button-you-can-talk-to&quot;&gt;1. GitHub, which is an undo button you can talk to&lt;/h2&gt;
&lt;p&gt;If you have never used it, ignore how it is usually described. GitHub is not a social network for programmers and you are not there to read anyone’s code. It is &lt;strong&gt;a save system with a history&lt;/strong&gt;, hosted somewhere that is not your laptop.&lt;/p&gt;
&lt;p&gt;Five words cover almost everything you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt; — your project folder, plus every version it has ever been.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commit&lt;/strong&gt; — a save point with a note attached. “Login screen works” is a commit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt; — a copy of the project where you can break things without breaking the original.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Push / pull&lt;/strong&gt; — sync between the copy on your machine and the copy on GitHub.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pull request&lt;/strong&gt; — “here is a change, look at it before it goes in.” You will not need this alone; you will need it the day somebody else touches the project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is why a vibe coder specifically cares. At some point — not maybe — a session will rewrite something that already worked. It will refactor a file you liked, or delete a function it decided was unused, or fix one bug by introducing two. Without commits, that work is gone and your only recovery is describing it again from memory. With commits, recovery is one sentence.&lt;/p&gt;
&lt;p&gt;Which brings up the part nobody tells beginners: &lt;strong&gt;you do not have to learn Git.&lt;/strong&gt; You have to learn three sentences to say to your agent.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Commit this with a clear message.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;What has changed since the last commit?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Undo everything since the last commit.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the whole interface for the first month. The agent runs the commands.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Set it up like this and stop thinking about it:&lt;/strong&gt; create the account, make the repository &lt;strong&gt;private&lt;/strong&gt; by default, and before anything else make sure &lt;code&gt;.env&lt;/code&gt; is in &lt;code&gt;.gitignore&lt;/code&gt;. That single line is what stops your API keys from being published the first time you push. Keys leak from beginner repositories constantly, and they are scraped within minutes.&lt;/p&gt;
&lt;p&gt;Then one habit, which is the highest-leverage thing in this entire post: &lt;strong&gt;when something works, commit it.&lt;/strong&gt; Not at the end of the day. At the moment it works.&lt;/p&gt;
&lt;p&gt;That is enough to start with. The rest of it — reading a diff without reading code, the four different kinds of undo and when each applies, what to do the day you commit an API key — is &lt;a href=&quot;https://commitcycle.com/insights/github-for-vibe-coders/&quot;&gt;the full guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;2-one-model-and-it-matters-less-than-you-think&quot;&gt;2. One model, and it matters less than you think&lt;/h2&gt;
&lt;p&gt;Claude Code, Codex, or an open-weights model you run yourself. The honest framing: &lt;strong&gt;this is the one decision you can reverse for free.&lt;/strong&gt; The repository is portable, your prompts are portable, and nothing you build is locked to the tool that wrote it.&lt;/p&gt;
&lt;p&gt;What actually separates them is not benchmark scores, it is whether the tool lives &lt;em&gt;in your project&lt;/em&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Where it fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agentic CLI in your terminal, reads and writes your files, runs commands&lt;/td&gt;
&lt;td&gt;Building whole features across many files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Codex&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OpenAI’s agentic equivalent, terminal and cloud&lt;/td&gt;
&lt;td&gt;Same job, different house style&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open weights&lt;/strong&gt; (via Ollama, LM Studio, and a client like Aider or Cline)&lt;/td&gt;
&lt;td&gt;Models running on your machine or your own server&lt;/td&gt;
&lt;td&gt;Privacy, cost control, no per-token bill&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The recommendation: &lt;strong&gt;pick one paid agentic tool and stay on it for a month.&lt;/strong&gt; Not because the others are worse, but because the skill you are building is knowing what to ask for and how to tell when the answer is wrong, and that skill transfers slowly while you are still switching tools every week.&lt;/p&gt;
&lt;p&gt;On open source, being straight: it is real, it is cheaper, it is private, and it is the wrong first move. You will spend your first week on setup instead of on the thing you wanted to build, and long agentic tasks — many files, many steps, hold the plan the whole way — are exactly where the gap is still widest. Come back to it in month two, when you know what you are comparing.&lt;/p&gt;
&lt;p&gt;And whichever you pick, the leverage is not in the model. It is in what the model can see about your project, which is decisions 4, 5 and 6.&lt;/p&gt;
&lt;h2 id=&quot;3-one-host-and-one-account-if-you-can-manage-it&quot;&gt;3. One host, and one account if you can manage it&lt;/h2&gt;
&lt;p&gt;You will need somewhere to put it. The two obvious answers are &lt;strong&gt;Cloudflare&lt;/strong&gt; and &lt;strong&gt;Vercel&lt;/strong&gt;, and the deciding question is not performance.&lt;/p&gt;
&lt;p&gt;It is how many accounts you want to hold.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt; is the all-in-one: hosting, a database (D1), file storage (R2), key-value, the domain itself, DNS, email routing — one login, one bill, one place where things are wrong when they are wrong. For someone starting out, that consolidation is worth more than any individual feature. The price is a runtime that is not quite Node, so a handful of npm packages will not run there, and you find out at deploy rather than at install.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vercel&lt;/strong&gt; gives you the smoothest deploy in existence if you are on Next.js. The trade is that the data pieces come from marketplace partners, so the database is somebody else’s dashboard, storage is another, and you will be reconnecting three services on a Sunday evening trying to remember which one has the failing credential.&lt;/p&gt;
&lt;p&gt;Pick Cloudflare unless you have a specific reason to be on Next.js.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And buy the domain on day one&lt;/strong&gt;, from the same provider. It costs about ten euros, it takes four minutes, and it changes how you treat the project. A thing with a domain is a thing that exists.&lt;/p&gt;
&lt;h2 id=&quot;4-a-stack--chosen-by-you-written-down&quot;&gt;4. A stack — chosen by you, written down&lt;/h2&gt;
&lt;p&gt;The temptation is to leave this to the model. Do not, and the reason is not that its choice would be bad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It is that the model chooses per conversation.&lt;/strong&gt; Monday’s session picks Next.js. Wednesday’s session, with no memory of Monday, picks Vite and React Router. Friday’s adds a component library that duplicates the one you already have. Nothing errors when this happens — you just end up with a project that is three projects wearing a trenchcoat, and every future session has to guess which convention it is in.&lt;/p&gt;
&lt;p&gt;So: &lt;strong&gt;React + Tailwind, and tell the model to use shadcn/ui.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Why that specific combination, when plenty of others are perfectly good:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is the &lt;strong&gt;best-documented combination in any model’s training data&lt;/strong&gt;. You are choosing the region of the map where the model is at its most accurate and least inventive, and that is worth more than any technical advantage on day one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tailwind keeps styling in the markup&lt;/strong&gt;, so when you say “make this card tighter”, the agent changes one line in the file you are looking at instead of hunting a stylesheet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;shadcn components are copied into your repository&lt;/strong&gt;, not installed as a dependency. This is the underrated part. When you ask for a change to a button, the agent edits your button. With a traditional component library, it has to fight the library’s API, and it will usually lose by wrapping it in three layers of nonsense.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;One exception, and it is a common one.&lt;/strong&gt; If what you are building is mostly content — a site, a landing page, a blog, a documentation set, with a small admin area attached — use &lt;a href=&quot;https://astro.build&quot;&gt;Astro&lt;/a&gt; instead. It ships almost no JavaScript by default, the pages are fast without you doing anything, and it scales into a real application when you need it. This site is Astro.&lt;/p&gt;
&lt;h3 id=&quot;skills-how-you-stop-repeating-yourself&quot;&gt;Skills: how you stop repeating yourself&lt;/h3&gt;
&lt;p&gt;A &lt;strong&gt;skill&lt;/strong&gt; is a folder with a &lt;code&gt;SKILL.md&lt;/code&gt; file in it that your agent reads &lt;em&gt;only when it is relevant&lt;/em&gt;. That last part is the whole point: it is instructions that are available without being in the way.&lt;/p&gt;
&lt;p&gt;The anatomy is small. A file at &lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt;, starting with:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;name: my-design-system&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;description: Use when building or restyling any UI in this project —&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;colours, typography, spacing, component patterns.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Everything the agent should know, in plain markdown.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;description&lt;/code&gt; is the important line, because it is what the agent matches against to decide whether to load the skill at all. Vague description, skill never fires.&lt;/p&gt;
&lt;p&gt;Two places to put them: &lt;strong&gt;&lt;code&gt;.claude/skills/&lt;/code&gt; inside your project&lt;/strong&gt;, which means it is committed to GitHub and it is still there tomorrow and on your other machine, or &lt;strong&gt;&lt;code&gt;~/.claude/skills/&lt;/code&gt;&lt;/strong&gt;, for things you want in every project you touch. Prefer the project one — a skill that describes &lt;em&gt;this&lt;/em&gt; product belongs with &lt;em&gt;this&lt;/em&gt; product.&lt;/p&gt;
&lt;p&gt;To install one somebody gave you: drop the folder in, start a new session, and ask &lt;em&gt;what skills do you have available&lt;/em&gt;. If it does not list, the description is the first thing to check.&lt;/p&gt;
&lt;p&gt;That is the shape of it. Why the description is the only part that always loads, what belongs in a skill versus AGENTS.md, and the fastest way to write your first one — &lt;a href=&quot;https://commitcycle.com/insights/agent-skills-guide/&quot;&gt;the full guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Skills are a Claude Code feature. If you went with Codex, the equivalent lever is the &lt;code&gt;AGENTS.md&lt;/code&gt; file described in the bonus section — same idea, less selective loading.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The design one is worth doing on day one.&lt;/strong&gt; If you have an idea but no brand, no colours and no visual opinion yet, go to &lt;a href=&quot;https://startpow.com/&quot;&gt;startpow.com&lt;/a&gt;, pick what you like, export, and choose the skill download. Drop it in &lt;code&gt;.claude/skills/&lt;/code&gt;. From that moment every screen the agent builds arrives in your colours, with your type and your spacing, without you describing them again — which is the difference between a product and a demo, and it costs about ten minutes.&lt;/p&gt;
&lt;h2 id=&quot;5-something-that-remembers-so-tomorrow-is-not-a-rebuild&quot;&gt;5. Something that remembers, so tomorrow is not a rebuild&lt;/h2&gt;
&lt;p&gt;Here is the failure this decision is about, and it is worth being precise because the popular version is wrong.&lt;/p&gt;
&lt;p&gt;The model is not malicious. It is &lt;strong&gt;agreeable and fast, in places where being wrong is expensive&lt;/strong&gt;. The database does not get dropped by a rogue AI; it gets dropped because a migration was broken, dropping the table was the shortest path to a passing test, and nobody was asked. Auth does not get rewritten in an act of sabotage; it gets rewritten because a test was failing and the auth check was what was failing it.&lt;/p&gt;
&lt;p&gt;Two layers of defence, and the first one is free:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The habits.&lt;/strong&gt; A development database that is not the production database. Production credentials the agent never holds. A commit before you start anything. And the instruction most people never give — &lt;em&gt;what it must not touch&lt;/em&gt;. Models are agreeable; they will happily do a helpful thing you did not want.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The tooling.&lt;/strong&gt; This is what &lt;a href=&quot;https://commitcycle.com/&quot;&gt;CommitCycle&lt;/a&gt; is: work starts as a task with a declared scope, the agent gets access bound to that one task and one branch and it &lt;strong&gt;expires on its own&lt;/strong&gt;, the paths that would actually hurt carry &lt;a href=&quot;https://commitcycle.com/zones/&quot;&gt;an owner who has to say yes&lt;/a&gt;, and every task closes with &lt;a href=&quot;https://commitcycle.com/audit-record/&quot;&gt;a record of what was declared against what was touched&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now the honest limit, which is also the most important sentence here: &lt;strong&gt;it does not remove the possibility.&lt;/strong&gt; The final responsibility is always the person who approves what the agent asks. The agent executes; you consent. What the tooling removes is the class of accident where nobody could have said no, because nobody was asked — and that class is most of them.&lt;/p&gt;
&lt;p&gt;If you want it: &lt;code&gt;/plugin marketplace add pow-paulinho/commitcycle-plugin&lt;/code&gt;, then &lt;code&gt;/plugin install commitcycle@commitcycle&lt;/code&gt;, in &lt;a href=&quot;https://commitcycle.com/claude-code/&quot;&gt;Claude Code&lt;/a&gt;, or &lt;code&gt;npm i -g commitcycle&lt;/code&gt; for &lt;a href=&quot;https://commitcycle.com/cli/&quot;&gt;the CLI&lt;/a&gt;. The hosted board is invitation-only while this is small.&lt;/p&gt;
&lt;h2 id=&quot;6-now-what-start-with-the-shape-not-the-screen&quot;&gt;6. Now what? Start with the shape, not the screen&lt;/h2&gt;
&lt;p&gt;You have the six pieces. The instinct is to prompt &lt;em&gt;build me the homepage&lt;/em&gt;, and it is the wrong first move — not because the homepage is unimportant, but because it is a consequence of decisions you have not made yet.&lt;/p&gt;
&lt;p&gt;The first useful question is: &lt;strong&gt;does this need accounts?&lt;/strong&gt; Almost everything sorts into four surfaces from there.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Do you need it?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Public front&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Everything visible without logging in&lt;/td&gt;
&lt;td&gt;Almost always&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Register, log in, reset password, verify email&lt;/td&gt;
&lt;td&gt;Only if there is a “your” anything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The product&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What people see after logging in&lt;/td&gt;
&lt;td&gt;If auth, then yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Admin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Where &lt;em&gt;you&lt;/em&gt; see users, payments, problems&lt;/td&gt;
&lt;td&gt;Yes, and everyone forgets until week two&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If the honest answer is “mostly public front, small admin”, build it in Astro and do not add an authentication system you will maintain for one user. If it is “mostly product”, the auth and the data model are the first thing, because everything else hangs from them.&lt;/p&gt;
&lt;h3 id=&quot;the-prompts&quot;&gt;The prompts&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;First, the one that writes no code.&lt;/strong&gt; This is the highest-value prompt in the whole process and it is the one most people skip:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;I want to build: [describe it in three or four sentences, including who&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;it is for and what they pay for, if anything].&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Do not write any code yet. Interview me — ask me the questions you need&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;answered to plan this properly, one batch at a time.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;When you have enough, give me back:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;1. The screens, grouped into public / auth / product / admin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;2. The data model, as a list of entities and how they relate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;3. Any third-party service this needs and why&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;4. What you would build first, and what you would deliberately leave&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;until later&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You are making the model produce a &lt;em&gt;question&lt;/em&gt;, and reviewing a question is far cheaper than reviewing three hundred lines of an answer built on an assumption you never saw.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Second, the foundation.&lt;/strong&gt; Deploy the empty thing on day one — “getting it live” should never become its own project later:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Set up the project skeleton:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;- [Astro | React + Vite], TypeScript, Tailwind, shadcn/ui&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;- Deploy target: Cloudflare&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;- A Git repository with a first commit, pushed to GitHub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Get an empty page deployed and give me the live URL before adding&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;any features.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Then write AGENTS.md at the root recording: the stack and the versions,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;the folder layout, the naming conventions, the commands to run and&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;build, and anything you should never do in this project.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Do not add authentication, a database or any dependency beyond the&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;above yet.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Third, the surfaces that need a system behind them:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame not-content&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Build registration and login: sign up, log in, log out, password&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;reset, email verification.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Use [the auth provider you picked] rather than rolling it yourself.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Screens use our existing components — do not introduce a second&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;component library.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Also give me the smallest admin page that lists users, because I&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;need to be able to see whether this works.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Do NOT touch: payments, the marketing pages, anything under [path].&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;If you hit a decision I have not made — pricing, session length, what&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;happens to unverified accounts after a week — stop and ask instead of&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;choosing.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Notice the two lines that almost nobody writes: &lt;strong&gt;what it must not touch&lt;/strong&gt;, and &lt;strong&gt;stop and ask instead of choosing&lt;/strong&gt;. Those two lines prevent more rework than any amount of prompt-engineering finesse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fourth, once it works, make it yours:&lt;/strong&gt; install the design skill and ask for one screen to be restyled with it. Check that one. Then let it run at the rest.&lt;/p&gt;
&lt;h2 id=&quot;7-user-stories-which-is-where-this-gets-real&quot;&gt;7. User stories, which is where this gets real&lt;/h2&gt;
&lt;p&gt;If you can narrate what a person does, you can build it. Take the user’s own sentence:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Someone sees an ad, lands on the site, creates an account, subscribes to a plan, pays by card, and their subscription unlocks.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Read it again slowly, because that one sentence is a specification. It contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;landing page&lt;/strong&gt; that the ad points at, which is not the homepage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Registration&lt;/strong&gt;, and therefore verification, and therefore email that actually arrives&lt;/li&gt;
&lt;li&gt;Probably &lt;strong&gt;onboarding&lt;/strong&gt;, because a new account with nothing in it is where people leave&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;payment provider&lt;/strong&gt; — Stripe, in practice — and a &lt;strong&gt;checkout&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;webhook&lt;/strong&gt;, because the payment succeeds on Stripe’s servers and your app has to find out&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entitlement&lt;/strong&gt;: some state that says this account is now a subscriber&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feature gating&lt;/strong&gt; driven by that state, in every place it matters&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;failure path&lt;/strong&gt;: card declined, payment succeeded but the webhook did not arrive, subscription cancelled mid-month&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;admin view&lt;/strong&gt;, so that when someone emails you saying they paid and nothing unlocked, you can look&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One sentence, nine work items, and the last three are the ones that get discovered in production by a customer if nobody wrote them down.&lt;/p&gt;
&lt;p&gt;This is also work the model does well — hand it the story and ask what it implies, and it will produce a list very like the one above. What it cannot do is remember the list next Tuesday. That is what a board is for: each item becomes a task with a scope, a task becomes a branch, and the branch closes with a record of what it actually changed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This sounds boring.&lt;/strong&gt; It is, a bit. And in the interest of not overselling: three prompts genuinely can give you something that runs and looks good, and the hit of watching it work is real and worth having. Go and have it.&lt;/p&gt;
&lt;p&gt;But the thing that is still standing in month three, that you can hand to somebody else, that you can change without holding your breath — that one was built by somebody who wrote down what it was supposed to do. Consistency is unglamorous and it is the entire difference.&lt;/p&gt;
&lt;h2 id=&quot;bonus-track&quot;&gt;Bonus track&lt;/h2&gt;
&lt;p&gt;Small things, in rough order of how much regret they prevent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; at the root of the repository.&lt;/strong&gt; The single highest-return file you will write. Stack, conventions, commands, and the list of things never to do. Every agentic tool reads it. Ours &lt;a href=&quot;https://commitcycle.com/agents-md/&quot;&gt;keeps the zone map there and writes the active task to a gitignored &lt;code&gt;CLAUDE.local.md&lt;/code&gt;, cleared at hand-in&lt;/a&gt;, but a hand-written one is already most of the value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Two databases from the very start.&lt;/strong&gt; Development and production, never the same credentials, and the agent only ever holds the development one. This is the specific defence against the specific disaster.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secrets never in the repository.&lt;/strong&gt; &lt;code&gt;.env&lt;/code&gt; in &lt;code&gt;.gitignore&lt;/code&gt;, real values in your host’s secret store. Rotate anything that ever got committed — deleting the file does not remove it from the history.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preview deploys per branch.&lt;/strong&gt; Both Cloudflare and Vercel give you a URL per branch free. Seeing the change on a real URL before it is live is worth more than any amount of local testing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Let the agent see what it built.&lt;/strong&gt; Screenshots, or a browser tool it can drive. An agent building UI without ever looking at it is working blind, and it shows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error tracking, plus exactly one analytics number you actually look at.&lt;/strong&gt; Anything more than one and you will look at none of them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terms and a privacy policy before you take a card.&lt;/strong&gt; Stripe will ask for a working site with them before it activates the account, and finding that out on launch day is a bad day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Know your restore, not just your backup.&lt;/strong&gt; An untested backup is a belief, not a backup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One decisions file.&lt;/strong&gt; Three lines per decision: what, why, what you rejected. Six weeks later it is the only thing standing between you and re-litigating everything with a model that was not there.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expect the model to cost more than the hosting.&lt;/strong&gt; That ratio is correct and it is not a sign you are doing it wrong.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The whole setup above is an afternoon. What it buys is that the second week is a continuation rather than an archaeology project — and if you want the habits that go on top of it, &lt;a href=&quot;https://commitcycle.com/insights/vibe-coding-first-steps/&quot;&gt;that is the first-week post&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Vibe coding, and the first week that does not end in a mess</title><link>https://commitcycle.com/insights/vibe-coding-first-steps/</link><guid isPermaLink="true">https://commitcycle.com/insights/vibe-coding-first-steps/</guid><description>What vibe coding is, where it genuinely works, where it stops working, and the answers to what people actually ask before their first serious attempt.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Vibe coding is building by describing what you want and accepting what the model writes without reading all of it. The term is Andrej Karpathy’s, and the distinguishing feature is not that AI wrote the code — that is now ordinary — but that &lt;strong&gt;nobody reviewed it line by line&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That is a trade, not a mistake. Whether it is a good trade depends entirely on one question: how long does this code have to live?&lt;/p&gt;
&lt;h2 id=&quot;where-does-vibe-coding-actually-work&quot;&gt;Where does vibe coding actually work?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Prototypes you intend to delete.&lt;/strong&gt; The cost of being wrong is that you throw it away, which you were going to do anyway.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scripts and one-off tools.&lt;/strong&gt; A thing that reshapes a CSV, seeds a database, scrapes a page once. If it produces the right output you are done; nobody is going to maintain it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Learning the shape of something unfamiliar.&lt;/strong&gt; Getting a working example of a library you have never used is faster this way than reading the docs first, and you can read the docs after with a concrete thing in front of you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anything where the feedback is immediate and total.&lt;/strong&gt; If it works, it works, and you find out in ten seconds.&lt;/p&gt;
&lt;p&gt;The common thread is that &lt;strong&gt;being wrong is cheap and obvious&lt;/strong&gt;. That is the condition. Not the size of the project, not the language, not whether it is “real” — just whether a mistake shows up immediately and costs little.&lt;/p&gt;
&lt;h2 id=&quot;when-does-it-stop-working&quot;&gt;When does it stop working?&lt;/h2&gt;
&lt;p&gt;The moment the code outlives the session that produced it.&lt;/p&gt;
&lt;p&gt;This is not a moral point. It is arithmetic: you bought speed by skipping understanding, and the bill arrives when somebody has to change code that nobody understood when it was written. If nobody ever changes it, the bill never arrives and you got the speed for free. That is a real outcome and it happens a lot.&lt;/p&gt;
&lt;p&gt;What makes it go wrong is not knowing which case you are in. Most bad experiences start as a prototype that quietly became load-bearing while nobody was deciding anything.&lt;/p&gt;
&lt;h2 id=&quot;how-do-i-tell-which-case-i-am-in&quot;&gt;How do I tell which case I am in?&lt;/h2&gt;
&lt;p&gt;Three questions, and they are about the situation rather than the code:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ask&lt;/th&gt;
&lt;th&gt;Vibe coding is fine when&lt;/th&gt;
&lt;th&gt;It stops being fine when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;How fast do I find out I am wrong?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Seconds. You run it and see&lt;/td&gt;
&lt;td&gt;Weeks, via a customer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What does being wrong cost?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You delete it and start again&lt;/td&gt;
&lt;td&gt;Money, data, or somebody’s trust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Who else depends on this?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nobody&lt;/td&gt;
&lt;td&gt;Anyone who is not you&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All three pointing the same way is the case this was made for. All three pointing the other way and you are not vibe coding, you are gambling with extra steps.&lt;/p&gt;
&lt;p&gt;The useful part is that &lt;strong&gt;this is decided per piece of work, not per project&lt;/strong&gt;. The same afternoon can hold a throwaway script you never read and a permissions change you read twice. Treating a whole repository as one setting is what produces both of the common mistakes — reading everything on a prototype, and reading nothing on the part that bites.&lt;/p&gt;
&lt;h2 id=&quot;what-should-i-never-vibe-code&quot;&gt;What should I never vibe code?&lt;/h2&gt;
&lt;p&gt;A short list, and the reason is the same for every item on it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Authentication and permissions.&lt;/strong&gt; Wrong here does not throw an error. It quietly lets the wrong person in, and you find out from somebody else.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Money.&lt;/strong&gt; Prices, charges, refunds, currency. Off-by-one in a loop is a bug; off-by-one in cents is a chargeback and an email you do not want to write.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anything that deletes.&lt;/strong&gt; Cascading deletes especially. The test for this category is whether an undo exists.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database migrations.&lt;/strong&gt; They run once, against real data, and the failure is discovered after the data is already gone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anything handling other people’s personal data.&lt;/strong&gt; Being wrong here has a regulator attached.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notice what is &lt;em&gt;not&lt;/em&gt; the criterion: difficulty. Some of these are easy code. The property they share is that &lt;strong&gt;being wrong does not announce itself&lt;/strong&gt; — which is exactly the assumption vibe coding runs on.&lt;/p&gt;
&lt;p&gt;This is not “write it yourself”. It is “read this one”. Have the model write it, then actually read what it wrote, and ask it to explain the parts you cannot follow. The reading is the whole cost, and on these five it is worth paying.&lt;/p&gt;
&lt;h2 id=&quot;the-first-week&quot;&gt;The first week&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Keep sessions short, and end each one on something that works.&lt;/strong&gt; This is the single highest-leverage habit and it is not about the AI at all. A long session accumulates decisions nobody wrote down, and when something is finally wrong there is no point to go back to. Short sessions with a working commit at the end give you somewhere to return to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Read the expensive parts.&lt;/strong&gt; Not all of it — that would defeat the purpose. Read anything touching money, authentication, data deletion, or code another person also works on. Skim the rest. The skill being built here is triage, and it is a real skill: knowing where being wrong is expensive is most of what senior engineers know.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Say what it must not do.&lt;/strong&gt; Most people describe what they want and stop. The instruction that saves the most time is the one that rules things out — &lt;em&gt;do not touch the auth module, do not add dependencies, do not change the database schema&lt;/em&gt;. Models are agreeable and will happily do a helpful thing you did not want.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Run it before you believe it.&lt;/strong&gt; Generated code that looks right and does not run is the most common single failure, and the cheapest to catch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notice when the prototype stopped being a prototype.&lt;/strong&gt; There is usually one specific moment: somebody else opens it, or it goes in front of a user, or you deploy it. That is the moment the trade changes, and the honest response is to go back and read it properly.&lt;/p&gt;
&lt;h2 id=&quot;what-a-good-session-looks-like-start-to-finish&quot;&gt;What a good session looks like, start to finish&lt;/h2&gt;
&lt;p&gt;Concretely, because “keep sessions short” is advice you can agree with and still not act on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Start from a commit.&lt;/strong&gt; Not a tidy repository — a committed one. This is the save point, and it takes ten seconds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Say the goal and the boundary in the same message.&lt;/strong&gt; What you want, and what is off limits. The second half is the one people skip.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Let it work without interrupting.&lt;/strong&gt; Steering mid-flight produces a change that is half one plan and half another, which is harder to read than either.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read the diff, not the codebase.&lt;/strong&gt; How many files, which files, anything deleted you did not ask to delete.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run it.&lt;/strong&gt; Before you believe any of it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commit, or throw the whole session away.&lt;/strong&gt; Both are fine outcomes. The one that is not fine is carrying a half-working state into the next session.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Roughly an hour is where this lands for most people, and the number matters less than the shape: &lt;strong&gt;the session is the unit you can throw away.&lt;/strong&gt; Once a session has been going long enough that discarding it is unthinkable, you have lost the property that made the whole approach safe — and that happens gradually, which is why it is worth watching for.&lt;/p&gt;
&lt;h2 id=&quot;the-questions-people-actually-ask&quot;&gt;The questions people actually ask&lt;/h2&gt;
&lt;h3 id=&quot;am-i-still-a-real-developer-if-i-do-this&quot;&gt;“Am I still a real developer if I do this?”&lt;/h3&gt;
&lt;p&gt;The question underneath is whether you are building a skill or avoiding one. You are building one — triage, specification, knowing where risk lives — and it is not the same skill as writing the syntax yourself. Both are real. Neither is complete on its own.&lt;/p&gt;
&lt;h3 id=&quot;how-do-i-stop-it-inventing-libraries-that-do-not-exist&quot;&gt;“How do I stop it inventing libraries that do not exist?”&lt;/h3&gt;
&lt;p&gt;Run the code. Hallucinated imports fail immediately, which makes this the least dangerous class of error. Worry more about the ones that run.&lt;/p&gt;
&lt;h3 id=&quot;it-rewrote-something-i-did-not-ask-it-to-touch&quot;&gt;“It rewrote something I did not ask it to touch.”&lt;/h3&gt;
&lt;p&gt;Very common, and the ordinary fix is to say what is off limits before you start. On a repository other people work on, this stops being a nuisance and becomes the actual problem — which is &lt;a href=&quot;https://commitcycle.com/insights/vibe-coding-shared-repository/&quot;&gt;its own post&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;should-i-commit-code-i-have-not-read&quot;&gt;“Should I commit code I have not read?”&lt;/h3&gt;
&lt;p&gt;On something disposable, yes. On something shared, you are handing your colleagues a diff you cannot answer questions about, and that is a social problem before it is a technical one.&lt;/p&gt;
&lt;h3 id=&quot;is-this-how-professional-teams-work-now&quot;&gt;“Is this how professional teams work now?”&lt;/h3&gt;
&lt;p&gt;Partly, and honestly the answer is still moving. What is clearly true is that the constraint has shifted from &lt;em&gt;how fast can this be written&lt;/em&gt; to &lt;em&gt;how confidently can it be changed later&lt;/em&gt;, and the teams doing well are the ones treating that as the thing to design around.&lt;/p&gt;
&lt;h2 id=&quot;where-this-is-going-and-what-we-do-about-it&quot;&gt;Where this is going, and what we do about it&lt;/h2&gt;
&lt;p&gt;Everything above works for one person on their own machine. The interesting failures start when the repository is shared — when generated code is locally reasonable and globally wrong because the model could not see a convention that lives in somebody’s head.&lt;/p&gt;
&lt;p&gt;That is the problem CommitCycle works on: each agent gets a grant bound to one task and one branch that expires on its own, the paths that would hurt carry an owner, and every task closes with a record of what it declared versus what it touched.&lt;/p&gt;
&lt;p&gt;Being straight about where that is: the plugin installs the enforcement today, and the &lt;code&gt;commitcycle&lt;/code&gt; package on npm installs the CLI — the process without the wall. The hosted board is invitation-only while this is small. And none of it is what you need in your first week of vibe coding — in your first week you need short sessions and a habit of reading the expensive parts.&lt;/p&gt;
&lt;p&gt;The week after, when you have decided the thing is going to exist beyond Friday, the question changes from habits to setup: &lt;a href=&quot;https://commitcycle.com/insights/vibe-coding-setup/&quot;&gt;what to have in place before the first prompt&lt;/a&gt;, and why each piece is there.&lt;/p&gt;
</content:encoded></item><item><title>What breaks when vibe coding meets a repository other people work on</title><link>https://commitcycle.com/insights/vibe-coding-shared-repository/</link><guid isPermaLink="true">https://commitcycle.com/insights/vibe-coding-shared-repository/</guid><description>The failure is rarely bad code. It is code that is locally reasonable and globally wrong, because the convention it broke was never written down.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Everything about vibe coding changes when the repository has other people in it. Not because the code gets worse, but because the way it fails stops being visible.&lt;/p&gt;
&lt;p&gt;On your own machine, a mistake shows up as something not working. On a shared repository, the characteristic failure is code that &lt;strong&gt;works, reads reasonably, passes review, and is wrong anyway&lt;/strong&gt; — because it broke a rule that was never written down anywhere the model could read it.&lt;/p&gt;
&lt;h2 id=&quot;the-shape-of-it&quot;&gt;The shape of it&lt;/h2&gt;
&lt;p&gt;An agent is asked to add a field to a form. It does, competently. It also adds a database migration, because that is what adding a field usually needs.&lt;/p&gt;
&lt;p&gt;The migration is fine. The problem is that this team applies migrations by hand, in a specific order, after a review by the person who owns the schema — a convention that exists because of an incident eighteen months ago, is known by four people, and is written down nowhere.&lt;/p&gt;
&lt;p&gt;Nothing in that diff looks wrong. &lt;strong&gt;That is the failure.&lt;/strong&gt; It is not bad code; it is code that is locally reasonable and globally wrong, and the distance between those two is exactly the distance between what is in the repository and what is in somebody’s head.&lt;/p&gt;
&lt;h2 id=&quot;why-does-review-not-catch-it&quot;&gt;Why does review not catch it?&lt;/h2&gt;
&lt;p&gt;Review reads the diff and asks whether it is good. This class of problem is invisible to that question, because the diff &lt;em&gt;is&lt;/em&gt; good. The defect lives in the relationship between the change and a piece of context that is not on screen.&lt;/p&gt;
&lt;p&gt;A reviewer catches it only if they happen to hold the convention and happen to think of it while reading. That works, sometimes, when the reviewer is one of the four people. It stops working the moment volume goes up — and volume going up is the entire point of using agents.&lt;/p&gt;
&lt;p&gt;So the usual advice, &lt;em&gt;review AI-generated code more carefully&lt;/em&gt;, is half right and does not scale. Careful line-by-line review of everything removes the reason to generate it in the first place.&lt;/p&gt;
&lt;h2 id=&quot;what-is-the-failure-that-costs-most&quot;&gt;What is the failure that costs most?&lt;/h2&gt;
&lt;p&gt;Two agents, at the same time, on the same repository.&lt;/p&gt;
&lt;p&gt;Each is correct in isolation. Each passes its own tests. One refactors a helper the other is depending on; or both touch the same config from opposite directions; or one moves a file the other is writing to. Nothing errors. Both branches are green.&lt;/p&gt;
&lt;p&gt;The loss shows up days later as a change that was made and then was not there any more, and nobody can say when it stopped existing. It is expensive precisely because there is no moment of failure to point at — you are reconstructing a negative from git history.&lt;/p&gt;
&lt;p&gt;This is not hypothetical and it is not rare. It is the ordinary consequence of running more than one agent on one repository, which is now a normal Tuesday.&lt;/p&gt;
&lt;h2 id=&quot;how-do-i-know-this-is-already-happening&quot;&gt;How do I know this is already happening?&lt;/h2&gt;
&lt;p&gt;It does not arrive as an incident, which is the difficulty. It arrives as a set of small facts that each have a plausible individual explanation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Work that was done and then was not there.&lt;/strong&gt; Somebody remembers writing it. Git says it existed. Nobody can name the commit that removed it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The same bug fixed twice&lt;/strong&gt;, three weeks apart, by two people who each thought they were first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A convention re-explained in three separate sessions&lt;/strong&gt;, because each session started with no memory of the last one and nobody wrote it down in between.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A pull request that touches files nobody expected&lt;/strong&gt;, where the extra files are all individually defensible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Who changed this?”&lt;/strong&gt; answered by a commit message that says &lt;code&gt;refactor&lt;/code&gt; and an author who was not reading closely.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Any one of these is an ordinary bad week. All of them together is the failure mode, and the reason it goes unnamed for so long is that &lt;strong&gt;there is no error to search for.&lt;/strong&gt; You are looking for the absence of something, and absences do not page anyone.&lt;/p&gt;
&lt;h2 id=&quot;what-if-the-other-people-are-my-own-agents&quot;&gt;What if the other people are my own agents?&lt;/h2&gt;
&lt;p&gt;The inversion that catches most people out: &lt;strong&gt;you do not need a team to have a shared-repository problem. Two terminals is enough.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A repository does not know that two sessions belong to the same human. Every property that makes this hard on a team is present when you are alone — concurrent writes to the same files, no shared memory between the sessions, conventions that exist only in your head — and one property is strictly worse. On a team, the second agent’s work is at least read by a different person. When both are yours, you approve both, quickly, in the same afternoon, and &lt;strong&gt;there is no second reader anywhere in the loop.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is why “I am a solo developer, this does not apply to me” is usually wrong by the time somebody says it. The threshold is not the number of people. It is the number of things writing to the repository at once.&lt;/p&gt;
&lt;h2 id=&quot;do-agentsmd-and-claudemd-fix-this&quot;&gt;Do AGENTS.md and CLAUDE.md fix this?&lt;/h2&gt;
&lt;p&gt;The standard answer is a &lt;code&gt;CLAUDE.md&lt;/code&gt; or &lt;code&gt;AGENTS.md&lt;/code&gt; with your conventions in it. Do write one. It genuinely helps, and it is the cheapest thing on this list.&lt;/p&gt;
&lt;p&gt;It also decays, for the same reason all documentation decays: it is a snapshot of what somebody remembered on the day they wrote it, and nothing forces it to be revisited when the thing it describes changes. Six months in, it is a mix of true, stale and aspirational, and an agent reading it cannot tell which line is which. Neither can a new hire.&lt;/p&gt;
&lt;p&gt;A context file is necessary and it is not sufficient, and the gap between those two is where the interesting work is.&lt;/p&gt;
&lt;h2 id=&quot;what-actually-helps&quot;&gt;What actually helps?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Name the paths where being wrong is expensive.&lt;/strong&gt; Not everything — most of a repository is genuinely safe to change, and treating it all as dangerous means nothing is. A short list of the paths that would hurt is worth more than an exhaustive one, because a short list gets read.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Give each one an owner.&lt;/strong&gt; Not for bureaucracy: so that “should this change?” has somebody to ask. An unowned rule is a rule that gets routed around at the first inconvenience, by humans as much as agents.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scope the work before it starts, not after.&lt;/strong&gt; What should this do, what must it not do, which areas does it touch. Written before the code exists, that is a specification. Written after, it is an excuse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make it possible to see what a piece of work actually touched&lt;/strong&gt;, as against what it said it would. That difference is where the surprises are, and it is a question git can answer if anybody asks it.&lt;/p&gt;
&lt;p&gt;None of that needs a product. It needs the list to exist somewhere both the people and the agents can read.&lt;/p&gt;
&lt;h2 id=&quot;what-can-i-do-on-monday-without-buying-anything&quot;&gt;What can I do on Monday, without buying anything?&lt;/h2&gt;
&lt;p&gt;In order, because doing the first two is most of the value:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Write down the five paths where being wrong is expensive.&lt;/strong&gt; Five, not fifty — the point is that the list gets read. Migrations, auth, the payment code, the shared config, whatever yours are.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Put a name against each one.&lt;/strong&gt; So “should this change?” has somewhere to go. It does not have to be a formal owner; it has to be a person.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start every piece of work by saying what it must not touch.&lt;/strong&gt; One line, before the code exists. This is the single highest-yield sentence in agentic development and it costs nothing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Once a week, look at what actually changed&lt;/strong&gt; against what you thought was being worked on. Not a review of the code — a comparison of two lists. The gap is where the surprises live, and once a week is enough to catch them while they are still cheap.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;None of that is a product and none of it needs permission. If it turns out to matter for you, the next question is what enforces it when everybody is busy — which is where the rest of this gets interesting.&lt;/p&gt;
&lt;h2 id=&quot;where-commitcycle-fits&quot;&gt;Where CommitCycle fits&lt;/h2&gt;
&lt;p&gt;That list is the thing we build on. Zones are the paths that would hurt, each with an owner and a risk level. A task declares what it touches before it starts, and moving a wall takes one approval with a reason. Each agent gets a grant bound to one task and one branch that expires on its own, so two sessions in their own worktrees cannot quietly authorise each other — share one directory and they still can, which is why the worktree is the instruction rather than a preference. Every task closes with a record of what it declared against what it touched.&lt;/p&gt;
&lt;p&gt;Where it actually is, plainly: the enforcement installs today as a Claude Code plugin; the &lt;code&gt;commitcycle&lt;/code&gt; package on npm puts &lt;code&gt;cycle&lt;/code&gt; on your PATH and carries no hook, so it gives you the process without the wall. The hosted board is invitation-only while this is small. The zone model is agent-agnostic, but the enforcement point needs a small adapter per harness, and today only the Claude Code one has been seen to deny on a real install.&lt;/p&gt;
&lt;p&gt;And the honest boundary worth repeating: &lt;strong&gt;denying a tool call in flight is not what makes this different.&lt;/strong&gt; Several vendors ship that and Claude Code includes it for free. The part that is ours is the grant that is bound to one task, attributed to an owner, and expires on its own — and the record afterwards that says what actually happened.&lt;/p&gt;
&lt;p&gt;If you are one person on a prototype, none of this is your problem yet, and &lt;a href=&quot;https://commitcycle.com/insights/vibe-coding-first-steps/&quot;&gt;the first-steps post&lt;/a&gt; is the more useful one — or &lt;a href=&quot;https://commitcycle.com/insights/vibe-coding-setup/&quot;&gt;the setup&lt;/a&gt;, if the prototype has started looking like it will survive the month.&lt;/p&gt;
</content:encoded></item><item><title>What to move out of Obsidian, and what to leave in it</title><link>https://commitcycle.com/insights/what-to-move-out-of-obsidian/</link><guid isPermaLink="true">https://commitcycle.com/insights/what-to-move-out-of-obsidian/</guid><description>A line you can apply per note — if being wrong about it would mislead somebody else, it has outgrown a personal vault. What moves, and where to.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;https://commitcycle.com/insights/obsidian-ai-agent-knowledge-base/&quot;&gt;previous post&lt;/a&gt; argued that an Obsidian vault cannot be your AI agents’ knowledge base: it is private to one machine, its claims carry no provenance, and nothing marks a note as expired.&lt;/p&gt;
&lt;p&gt;That argument gets agreed with and then not acted on, because “move your knowledge” is not a task anybody can start on a Tuesday. This post is the practical half. What actually moves, what stays, and what the replacement looks like once it is running.&lt;/p&gt;
&lt;h2 id=&quot;the-line-applied-per-note&quot;&gt;The line, applied per note&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;If being wrong about this note would mislead somebody else, it has outgrown a personal vault.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Per note, not per vault. That distinction is the whole thing, and it is why this is a smaller job than it sounds. Most vaults are mostly thinking — half-formed connections, meeting scraps, things you wrote to work out what you thought. None of that moves. What moves is the minority that other people, or an agent, would act on.&lt;/p&gt;
&lt;p&gt;In practice that has been under a fifth of the notes for everyone I have watched do it. The rest stays exactly where it is.&lt;/p&gt;
&lt;h2 id=&quot;what-moves&quot;&gt;What moves?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Conventions.&lt;/strong&gt; “We do migrations in two steps.” “Handlers return the error, they do not log it.” Anything phrased as &lt;em&gt;we do X&lt;/em&gt; is a claim about the team, and a claim about the team belongs where the team can see and correct it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Decisions, with their reasons.&lt;/strong&gt; Not just what was chosen, but what was rejected and why. This is the highest-value category and the one most often lost, because the reasoning lives in someone’s head and the vault records only the conclusion. An agent handed the conclusion without the reason will cheerfully undo it the first time the conclusion is inconvenient.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anything an agent would act on.&lt;/strong&gt; If a note would change what gets written when an agent reads it, it is operational, not personal. This is the newest category and the one vaults were never designed for.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The boundaries.&lt;/strong&gt; &lt;em&gt;“We deliberately do not do X, and here is why.”&lt;/em&gt; Nobody writes these down and everybody rediscovers them the expensive way.&lt;/p&gt;
&lt;h2 id=&quot;what-stays&quot;&gt;What stays?&lt;/h2&gt;
&lt;p&gt;Everything else, and that is not a consolation prize.&lt;/p&gt;
&lt;p&gt;Half-formed ideas. Notes that are allowed to be wrong. The connection you have not made yet. Reading notes, meeting scraps, the thing you wrote at 2am that made sense at 2am. Obsidian is better at all of it than anything you would replace it with, and it is better because it has no review, no approval and no audience — the exact properties that disqualify it for the other category.&lt;/p&gt;
&lt;p&gt;A vault that only holds this is a vault doing its job.&lt;/p&gt;
&lt;h2 id=&quot;what-about-the-notes-that-are-half-thinking-half-convention&quot;&gt;What about the notes that are half thinking, half convention?&lt;/h2&gt;
&lt;p&gt;The common awkward case, and the one that stalls people, because the line looks clean until you meet an actual note that is two thousand words of working-something-out with one real decision buried at the bottom.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Split it, and it is easier than it sounds.&lt;/strong&gt; The thinking stays in the vault. The claim moves, on its own, as one sentence. Link back if you like.&lt;/p&gt;
&lt;p&gt;What you must not do is move the whole thing. A note that is eighty per cent exploration and twenty per cent decision, sitting in the repository, teaches an agent that your team’s conventions are tentative — and an agent that thinks a rule is tentative will negotiate with it the first time the rule is inconvenient. Leaving the whole thing in the vault has the opposite failure: the twenty per cent that other people need is invisible, indistinguishable from the musing around it.&lt;/p&gt;
&lt;p&gt;The test for whether a note is ready: &lt;strong&gt;can you extract a sentence that starts “we do” or “we do not”?&lt;/strong&gt; If not, there is nothing to move yet, and the note is still doing its job where it is.&lt;/p&gt;
&lt;h2 id=&quot;where-should-the-moved-notes-live&quot;&gt;Where should the moved notes live?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Into the repository they describe.&lt;/strong&gt; Not a wiki, not a second tool: the repo, reviewed in the same pull request as the code they are about.&lt;/p&gt;
&lt;p&gt;That placement is doing the work. A note in the repo gets read at the moment somebody changes the thing it describes, because it is in the diff. A note in a wiki gets read when somebody goes looking for it, which is the failure mode you are leaving.&lt;/p&gt;
&lt;p&gt;It also means the note is reviewed like code. Somebody approves it. Somebody is accountable for it. Two engineers cannot hold two contradictory versions without one of them showing up in a diff.&lt;/p&gt;
&lt;h2 id=&quot;what-does-a-moved-note-actually-look-like&quot;&gt;What does a moved note actually look like?&lt;/h2&gt;
&lt;p&gt;Format matters less than four properties, and each one answers a way the vault version failed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;One claim per note.&lt;/strong&gt; &lt;em&gt;“We do migrations in two steps”&lt;/em&gt; is a note. &lt;em&gt;“Notes on our backend”&lt;/em&gt; is a folder wearing a note’s name, and nothing in it can be confirmed, contradicted or archived independently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It says where it came from.&lt;/strong&gt; The decision, the incident, the pull request. A claim you cannot trace is a claim you cannot weigh, and moving an untraceable claim into the repository relocates the problem rather than fixing it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It says what was rejected.&lt;/strong&gt; The conclusion without the reasoning gets undone the first time the conclusion is inconvenient — usually by an agent, cheerfully, in a diff that looks like a simplification.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Present tense, and specific enough to be wrong.&lt;/strong&gt; &lt;em&gt;“Be careful with migrations”&lt;/em&gt; is not a note, it is a mood. Nobody can act on it and nobody can ever prove it stale.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And short. The reason wiki pages go unread is that they are two thousand words when the claim is one line, and &lt;strong&gt;a note nobody reads is a note that does not exist&lt;/strong&gt; — which is the same outcome as leaving it in the vault, after more work.&lt;/p&gt;
&lt;h2 id=&quot;what-does-this-not-fix&quot;&gt;What does this not fix?&lt;/h2&gt;
&lt;p&gt;Moving notes into the repo fixes discovery and review. &lt;strong&gt;It does not fix decay&lt;/strong&gt;, and any post that told you otherwise would be selling you something.&lt;/p&gt;
&lt;p&gt;A note in a repository goes stale exactly as fast as a note in a vault. What changes decay is not location, it is a trigger — something that forces knowledge to be written while the person still remembers why, and something that lets a wrong note be removed by a mechanism rather than by somebody’s memory.&lt;/p&gt;
&lt;p&gt;Those are the two properties to look for in whatever you use, and they are the two properties CommitCycle builds on: knowledge is fed at the close of a unit of work, one line at a time, when the reason is still fresh; and &lt;code&gt;archived&lt;/code&gt; is a real state, which is what lets the corpus shrink instead of only growing more confident.&lt;/p&gt;
&lt;h2 id=&quot;how-do-i-start-without-a-migration&quot;&gt;How do I start without a migration?&lt;/h2&gt;
&lt;p&gt;Do not migrate. Migrations of knowledge fail for the same reason migrations of anything fail — the effort is up front and the payoff is diffuse.&lt;/p&gt;
&lt;p&gt;Instead: &lt;strong&gt;the next time you write a note that other people would rely on, write it in the repo instead of the vault.&lt;/strong&gt; Then the next one. The vault stops growing in the category that hurts, and the corpus that matters starts accumulating in the place where it gets reviewed. Nothing is moved and nothing is lost.&lt;/p&gt;
&lt;p&gt;For the notes whose readers are agents rather than people, the destination has a shape: &lt;a href=&quot;https://commitcycle.com/insights/agent-skills-guide/&quot;&gt;a skill&lt;/a&gt; is a folder in the repository that gets loaded when it becomes relevant and ignored when it does not, which is the closest thing to a vault note that an agent can actually use.&lt;/p&gt;
&lt;p&gt;After a few weeks, whatever is still in the vault and still load-bearing is a short list, and by then you will know exactly which notes are on it.&lt;/p&gt;
&lt;h2 id=&quot;how-do-i-know-it-is-working&quot;&gt;How do I know it is working?&lt;/h2&gt;
&lt;p&gt;Four signals, roughly in the order they show up:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;You stop re-explaining the same thing to each new session.&lt;/strong&gt; This one arrives first and is the most immediately satisfying.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Somebody corrects a note during a code review.&lt;/strong&gt; That is the placement paying off: it means the note was read at the moment the thing it describes was being changed, which is the entire reason it went in the repository.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An agent cites one back to you&lt;/strong&gt; — proposing something and naming the note it came from, rather than proposing something plausible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Somebody archives one.&lt;/strong&gt; This is the real signal, and it is the one that takes longest. A corpus that has only ever grown is being accumulated, not maintained, and it will end up exactly where the vault was: more confident every month and less accurate.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The counter-signal is the mirror of that last one. If the notes in the repository are growing and nothing has ever been removed, you have rebuilt the vault with extra ceremony, and the staleness is on its way back.&lt;/p&gt;
&lt;h2 id=&quot;where-commitcycle-actually-is&quot;&gt;Where CommitCycle actually is&lt;/h2&gt;
&lt;p&gt;Worth stating plainly, because the point of this post is a line you can apply with or without us: the enforcement installs today as a plugin, and the &lt;code&gt;commitcycle&lt;/code&gt; package on npm installs the CLI beside it. The hosted board is invitation-only while this is small.&lt;/p&gt;
&lt;p&gt;So take the line and use it. It costs nothing, it applies to whatever tools you have, and the argument underneath it is &lt;a href=&quot;https://commitcycle.com/insights/obsidian-ai-agent-knowledge-base/&quot;&gt;in the previous post&lt;/a&gt; if you want to check the reasoning before you trust the conclusion.&lt;/p&gt;
</content:encoded></item><item><title>Your Obsidian vault cannot be your AI agents&apos; knowledge base</title><link>https://commitcycle.com/insights/obsidian-ai-agent-knowledge-base/</link><guid isPermaLink="true">https://commitcycle.com/insights/obsidian-ai-agent-knowledge-base/</guid><description>Obsidian is a thinking tool for one person. Agents need project knowledge that is shared, cited, and provably current — three things a vault cannot be.</description><pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;An Obsidian vault fails as an AI agent knowledge base for three structural reasons: &lt;strong&gt;it is private to one machine, its claims carry no citations, and nothing tells you when a note stopped being true.&lt;/strong&gt; Agents read whatever they are handed and have no way to tell a current note from one that expired three sprints ago — so the confident wrong answer and the correct one arrive looking identical.&lt;/p&gt;
&lt;p&gt;This is not a criticism of Obsidian. It is very good at the job it was built for, which is one person thinking. The failure is a category error: a personal thinking tool being asked to be a shared source of truth.&lt;/p&gt;
&lt;h2 id=&quot;can-agents-read-an-obsidian-vault-at-all&quot;&gt;Can agents read an Obsidian vault at all?&lt;/h2&gt;
&lt;p&gt;Yes, and this is worth clearing up first because it is where the conversation usually starts. A vault is a folder of plain markdown. Any agent with file access reads it without ceremony, and there are MCP servers that will wire one up for you in an afternoon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Access was never the problem.&lt;/strong&gt; Reading and trusting are different operations, and a vault carries no signal that separates them. A note written last week and a note that stopped being true in 2024 are the same kind of object, in the same folder, with the same authority. A human reading their own vault discounts automatically — &lt;em&gt;oh, that one is old&lt;/em&gt; — using knowledge that is nowhere in the file. An agent has nothing to discount with.&lt;/p&gt;
&lt;p&gt;So the easy half gets solved, the hard half is not noticed, and the setup looks like it is working right up until it confidently acts on something that expired.&lt;/p&gt;
&lt;h2 id=&quot;the-three-failures-in-order-of-how-much-they-cost&quot;&gt;The three failures, in order of how much they cost&lt;/h2&gt;
&lt;h3 id=&quot;1-it-is-private-so-knowledge-is-per-person&quot;&gt;1. It is private, so knowledge is per-person&lt;/h3&gt;
&lt;p&gt;A vault lives on a laptop. Sync it and you have a shared folder, not shared knowledge — because the vault has no notion of review. Nobody approves a note. Nobody is accountable for one. Two engineers keep two vaults, each correct about different things, and the agent gets whichever vault its operator happens to own.&lt;/p&gt;
&lt;p&gt;The symptom is easy to recognise: &lt;strong&gt;the same question gets two answers depending on who asks their agent.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-claims-carry-no-provenance&quot;&gt;2. Claims carry no provenance&lt;/h3&gt;
&lt;p&gt;A note says &lt;em&gt;“we do migrations in two steps.”&lt;/em&gt; Is that a decision someone made, an observation from one incident, or something a colleague believed in 2024? The note does not say, and after a few months nobody remembers.&lt;/p&gt;
&lt;p&gt;For a human reader this is friction. For an agent it is fatal, because the agent cannot weigh a claim it cannot trace. It will follow a stale note with exactly the confidence it follows a correct one.&lt;/p&gt;
&lt;h3 id=&quot;3-nothing-marks-a-note-as-expired&quot;&gt;3. Nothing marks a note as expired&lt;/h3&gt;
&lt;p&gt;This is the one that quietly does the most damage. A vault has no death state. Notes accumulate, and the only mechanism for removing a wrong one is a person remembering it is wrong — which reliably fails, because &lt;strong&gt;the person who knows the note is stale is not the person reading it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The result is a corpus that grows monotonically more confident and less accurate.&lt;/p&gt;
&lt;h2 id=&quot;what-does-documentation-for-agents-have-to-be&quot;&gt;What does documentation for agents have to be?&lt;/h2&gt;
&lt;p&gt;Every property below exists because of a specific way vaults fail:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;The failure it answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lives in the repository&lt;/td&gt;
&lt;td&gt;Reviewed like code, not synced like a folder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cites a decision, task or file&lt;/td&gt;
&lt;td&gt;A claim you cannot trace is a claim you cannot weigh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Written when work closes&lt;/td&gt;
&lt;td&gt;Not “whenever someone remembers”, which is never&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Has an archived state&lt;/td&gt;
&lt;td&gt;A wrong note must be removable by something other than memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loaded by what the task declares&lt;/td&gt;
&lt;td&gt;Fifty notes is not context, it is noise&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;That last row is the one most tools miss. Handing an agent an entire knowledge base is not context engineering; it is a bigger prompt. What a task needs is the subset relevant to &lt;em&gt;this&lt;/em&gt; task, selected by something the task itself declared.&lt;/p&gt;
&lt;h2 id=&quot;why-not-just-give-the-agent-the-whole-vault&quot;&gt;Why not just give the agent the whole vault?&lt;/h2&gt;
&lt;p&gt;The obvious move, and it fails in three specific ways:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Volume is not context.&lt;/strong&gt; Four hundred notes in a prompt means the three relevant ones are diluted by three hundred and ninety-seven that are not. That is a bigger prompt, not better grounding, and it costs accuracy rather than buying it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nothing says which notes apply here.&lt;/strong&gt; A vault’s links encode &lt;em&gt;association&lt;/em&gt; — this reminded me of that — not &lt;em&gt;applicability to the task in front of you&lt;/em&gt;. Those are different relations, and only one of them is useful for selection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contradictions have no resolution.&lt;/strong&gt; Two notes disagree about how deploys work. Nothing in the vault records which one won, because the winner was decided in a conversation. The agent resolves it by picking whichever reads closest to the prompt, and reports the result with the same confidence either way.&lt;/p&gt;
&lt;p&gt;The outcome is worse than a short curated file would have been: an answer that is well-phrased, apparently well-sourced, and wrong.&lt;/p&gt;
&lt;h2 id=&quot;does-rag-over-the-vault-fix-it&quot;&gt;Does RAG over the vault fix it?&lt;/h2&gt;
&lt;p&gt;Partly, and it is worth being precise about which part, because this is the most common proposed fix.&lt;/p&gt;
&lt;p&gt;Retrieval solves &lt;strong&gt;selection&lt;/strong&gt;. That is genuine — it turns “the agent read four hundred notes” into “the agent read the four closest ones”, which is a real improvement and the annoyance people feel most.&lt;/p&gt;
&lt;p&gt;It does not touch &lt;strong&gt;provenance&lt;/strong&gt; or &lt;strong&gt;staleness&lt;/strong&gt;, and on staleness it leans slightly the wrong way. Retrieval surfaces whatever is textually nearest the question, and a confidently written stale note — &lt;em&gt;“we do migrations in two steps”&lt;/em&gt; — is frequently the nearest thing to a question about migrations. The correct note may be newer, hedged, and worded less like the question. Embeddings have no opinion about dates or truth; they rank similarity.&lt;/p&gt;
&lt;p&gt;So RAG upgrades the problem from &lt;em&gt;the agent read everything and could not tell what was current&lt;/em&gt; to &lt;em&gt;the agent read the four most relevant things and could not tell what was current&lt;/em&gt;. Better, and not the fix.&lt;/p&gt;
&lt;h2 id=&quot;what-about-notion-confluence-or-a-wiki&quot;&gt;What about Notion, Confluence or a wiki?&lt;/h2&gt;
&lt;p&gt;They answer one of the three failures cleanly and leave the other two roughly where they were.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shared: yes.&lt;/strong&gt; This is the real gain, and it is not nothing — one corpus, many readers, no more “the same question gets two answers depending on whose vault the agent read”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Provenance: no.&lt;/strong&gt; A wiki page rarely says which decision it came from or which incident produced it, for the same reason a vault note does not: whoever wrote it knew, so writing it down felt redundant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Staleness: arguably worse.&lt;/strong&gt; A vault’s bad notes are at least buried. A wiki’s are indexed, searchable and linked from four other pages, so scale makes a stale claim &lt;em&gt;more&lt;/em&gt; discoverable rather than less, and nothing in the tool archives it. The mechanism for removing a wrong page is still a person remembering.&lt;/p&gt;
&lt;p&gt;And one failure the wiki adds: &lt;strong&gt;it is not where the code changes.&lt;/strong&gt; A note in the repository is in front of you in the diff at the moment you alter the thing it describes. A note in a wiki is read when somebody goes looking — which is the behaviour you were trying to fix.&lt;/p&gt;
&lt;h2 id=&quot;how-commitcycle-does-it&quot;&gt;How CommitCycle does it&lt;/h2&gt;
&lt;p&gt;CommitCycle calls these &lt;strong&gt;playbooks&lt;/strong&gt; — per-topic, per-project knowledge files that live in your repository. Four properties, each answering one row above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;They cite.&lt;/strong&gt; Every claim points at a decision, a task or a file. A lint flags a claim that carries no citation — it warns, it does not block — and when &lt;code&gt;cycle seed&lt;/code&gt; drafts playbooks, a claim citing a file that is not in the repository is dropped, and a playbook left with nothing cited is not created at all.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;They are fed at the close of work&lt;/strong&gt;, one bullet at a time, when the person still remembers why. Not in a retro, not when someone remembers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;They are loaded by the task’s declared topics&lt;/strong&gt;, so a task about the database does not load the frontend’s conventions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;They can be archived.&lt;/strong&gt; &lt;code&gt;archived&lt;/code&gt; is a real state, which is what makes the corpus able to shrink.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And an adversarial pass — &lt;code&gt;cycle challenge&lt;/code&gt; — is built to propose the practices the repository visibly lacks, each with a named source. Like &lt;code&gt;cycle seed&lt;/code&gt;, it needs a model configured on the board, and it has not yet run against a live one. &lt;strong&gt;You can refuse, and your refusal is recorded with its grounds.&lt;/strong&gt; &lt;em&gt;“We deviate from this on purpose, and here is why”&lt;/em&gt; is knowledge too, and it is the kind that vaults never capture because nobody writes down what they decided not to do.&lt;/p&gt;
&lt;h3 id=&quot;the-honest-part&quot;&gt;The honest part&lt;/h3&gt;
&lt;p&gt;There is a real objection here and it deserves a straight answer: &lt;em&gt;“if you generate a playbook from my legacy repository, won’t it just codify my mess?”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yes. By design, description alone codifies the mess — with receipts.&lt;/strong&gt; That is why the challenger exists: it is built to propose what the repo lacks rather than only describing what it has, and a human accepts or refuses each proposal. There is no auto-accept, and a test holds that door shut.&lt;/p&gt;
&lt;h2 id=&quot;what-this-does-not-replace&quot;&gt;What this does not replace&lt;/h2&gt;
&lt;p&gt;Keep the vault. This is not a migration.&lt;/p&gt;
&lt;p&gt;Obsidian remains better than anything here at thinking — at half-formed ideas, at connections you have not made yet, at notes that are for you and are allowed to be wrong. &lt;strong&gt;What moves out of it is the subset that other readers rely on being true.&lt;/strong&gt; That subset was always the part that hurt when it went stale, and it was never the part Obsidian was designed to hold.&lt;/p&gt;
&lt;p&gt;A useful line to draw: &lt;em&gt;if being wrong about this note would mislead someone else, it does not belong in a personal vault.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Where it goes instead, for the notes an agent is meant to read, is &lt;a href=&quot;https://commitcycle.com/insights/agent-skills-guide/&quot;&gt;a skill in the repository&lt;/a&gt; — same markdown, but versioned with the code it describes and loaded only when the task calls for it.&lt;/p&gt;
&lt;h2 id=&quot;where-commitcycle-actually-is&quot;&gt;Where CommitCycle actually is&lt;/h2&gt;
&lt;p&gt;CommitCycle runs its own development — the board, the gate, the audit records and the playbooks described above are in use on its own repository today. &lt;strong&gt;The enforcement half installs as a Claude Code plugin; the &lt;code&gt;commitcycle&lt;/code&gt; package on npm puts the &lt;code&gt;cycle&lt;/code&gt; CLI on your PATH, without the hook.&lt;/strong&gt; The hosted board is invitation-only while this is small. Phase 0 is measured and published with its limits.&lt;/p&gt;
&lt;p&gt;So this post is not asking you to migrate anything today. It is making an argument you can evaluate on its merits, and if it lands, &lt;a href=&quot;https://commitcycle.com/&quot;&gt;the waitlist&lt;/a&gt; is the honest next step. If the argument is wrong, that is worth more to us than a signup.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;The rest of the product is documented in full: &lt;a href=&quot;https://commitcycle.com/docs/concepts/agents-md/&quot;&gt;the AGENTS.md context block&lt;/a&gt;, &lt;a href=&quot;https://commitcycle.com/docs/concepts/zones/&quot;&gt;zones&lt;/a&gt;, and &lt;a href=&quot;https://commitcycle.com/docs/operations/audit-record/&quot;&gt;the audit record&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded></item></channel></rss>