<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Dorothy J Aubrey</title>
    <description>The latest articles on Forem by Dorothy J Aubrey (@dorothyjb).</description>
    <link>https://forem.com/dorothyjb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3669403%2F2958de28-cb34-4217-a8a5-d3667eb826c0.jpg</url>
      <title>Forem: Dorothy J Aubrey</title>
      <link>https://forem.com/dorothyjb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dorothyjb"/>
    <language>en</language>
    <item>
      <title>/insights, or Why the Analytics Developer Had No Analytics</title>
      <dc:creator>Dorothy J Aubrey</dc:creator>
      <pubDate>Thu, 19 Mar 2026 20:08:33 +0000</pubDate>
      <link>https://forem.com/dorothyjb/insights-or-why-the-analytics-developer-had-no-analytics-35nc</link>
      <guid>https://forem.com/dorothyjb/insights-or-why-the-analytics-developer-had-no-analytics-35nc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: You wouldn't run infrastructure without monitoring. You shouldn't run AI collaboration without it either. Claude Code's &lt;code&gt;/insights&lt;/code&gt; command gives you a usage dashboard for your coding sessions -- token costs, tool patterns, session behavior. What it reveals about how you actually work with AI is more interesting than the numbers themselves.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Who this is for: Anyone using AI coding assistants who wants to understand their own collaboration patterns -- not just ship features. Works with any tool that exposes usage data, but the examples here use Claude Code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've spent the last year building the operational infrastructure for AI-assisted development -- &lt;a href="https://dev.to/dorothyjb/how-we-built-a-documentation-system-that-makes-llms-productive-immediately-59hc"&gt;documentation systems&lt;/a&gt;, automated &lt;a href="https://dev.to/dorothyjb/session-handoffs-giving-your-ai-assistant-memory-that-actually-persists-je9"&gt;session handoffs&lt;/a&gt;, &lt;a href="https://dev.to/dorothyjb/mother-claude-instant-retrospectives-assign-quality-enforcement-to-your-ai-3n4b"&gt;quality enforcement&lt;/a&gt;, &lt;a href="https://dev.to/dorothyjb/mother-claude-custom-agents-or-how-we-accidentally-built-a-team-nak"&gt;custom agents&lt;/a&gt;. All of it focused on making AI collaboration reliable and repeatable across sessions and projects, but none of it focused on measuring whether it actually does. This from me, the agile evangelista who murmurs "outcomes over outputs" while brushing her teeth every morning.&lt;/p&gt;

&lt;p&gt;That's like building a SaaS analytics dashboard and forgetting to add analytics for yourself -- which, having spent the last month wiring up data sources for a monitoring product, is an irony I refuse to let pass without comment.&lt;/p&gt;

&lt;p&gt;The cobbler's children had no shoes. The analytics developer had no analytics.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I've been running Claude Code as a full-fledged member of my engineering workflow for months. &lt;a href="https://dev.to/dorothyjb/mother-claude-custom-agents-or-how-we-accidentally-built-a-team-nak"&gt;Custom agents&lt;/a&gt; handle ticket management and code review. &lt;a href="https://dev.to/dorothyjb/mother-claude-automating-everything-with-hooks-12jh"&gt;Hooks&lt;/a&gt; auto-generate &lt;a href="https://dev.to/dorothyjb/session-handoffs-giving-your-ai-assistant-memory-that-actually-persists-je9"&gt;session handoffs&lt;/a&gt;. &lt;a href="https://dev.to/dorothyjb/how-we-built-a-documentation-system-that-makes-llms-productive-immediately-59hc"&gt;Documentation&lt;/a&gt; loads at session start so Claude hits the ground running.&lt;/p&gt;

&lt;p&gt;All of it works. I know because the code ships, the quality holds, and sessions start productive instead of cold.&lt;/p&gt;

&lt;p&gt;But here's what I didn't know: &lt;strong&gt;how am I actually using all of this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How much of a session is spent on feature work versus housekeeping? How often do custom agents get invoked? Which tools dominate? What does my token spend look like when I'm not paying attention?&lt;/p&gt;

&lt;p&gt;I had no idea. I was flying the plane without looking at the instruments.&lt;/p&gt;




&lt;h2&gt;
  
  
  What /insights Does
&lt;/h2&gt;

&lt;p&gt;Claude Code has a built-in command I'd been ignoring for months: &lt;code&gt;/insights&lt;/code&gt;. It generates a usage report covering your recent Claude Code activity -- sessions, tokens, tools, costs, and patterns.&lt;/p&gt;

&lt;p&gt;I ran it expecting a dry table of numbers. What I got was a mirror.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Numbers Reveal
&lt;/h2&gt;

&lt;p&gt;The report breaks down several dimensions of your AI collaboration. The specific metrics evolve as the feature matures, but the categories that matter are consistent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Token Usage
&lt;/h3&gt;

&lt;p&gt;How many tokens you're consuming per session, split between input (what Claude reads) and output (what Claude generates). This is your cost driver and your attention map.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What surprised me&lt;/strong&gt;: My input tokens were consistently 4-5x my output tokens. That ratio tells a story -- Claude is reading far more than it's writing. Context loading, file scanning, documentation parsing, handoff ingestion. The "productive" output is a fraction of the total work.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdy5onrt4ia3y0aw4p2b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdy5onrt4ia3y0aw4p2b.jpg" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're optimizing for cost, the answer isn't "make Claude write less." The answer is "make sure what Claude reads is worth reading." Every bloated file, every redundant doc section, every file Claude has to re-read because the first pass wasn't clear enough -- that's showing up in your input token count.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tool Usage
&lt;/h3&gt;

&lt;p&gt;Which tools Claude reaches for most -- file reads, file edits, searches, bash commands, web fetches. This is your workflow fingerprint, and it's different for everyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What surprised me&lt;/strong&gt;: File reads dominated everything by a wide margin. The ratio was roughly 5:1 reads to edits on a heavy coding day. Claude spends most of its tool budget &lt;em&gt;understanding&lt;/em&gt; the codebase, not changing it.&lt;/p&gt;

&lt;p&gt;If Claude is reading your codebase constantly -- and the numbers prove it is -- then every minute you spend &lt;a href="https://dev.to/dorothyjb/how-we-built-a-documentation-system-that-makes-llms-productive-immediately-59hc"&gt;making code scannable&lt;/a&gt; saves multiples in token spend and session efficiency. Clear function names, logical file organization, and well-placed comments aren't just good practice. They're measurable cost optimization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Session Patterns
&lt;/h3&gt;

&lt;p&gt;How long sessions last, how many turns they take, when compaction happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What surprised me&lt;/strong&gt;: My most productive sessions were not the longest ones. The sessions where the most code shipped were in the 45-90 minute range -- long enough to build something significant, short enough that context stayed fresh. The 3+ hour marathons had more compactions, more re-orientation, and more wasted tokens recovering context that had been compressed away.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftuzhs2wpxh9s61nk4yph.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftuzhs2wpxh9s61nk4yph.jpg" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/dorothyjb/session-handoffs-giving-your-ai-assistant-memory-that-actually-persists-je9"&gt;Session handoffs&lt;/a&gt; at natural stopping points aren't just good practice. They're cost optimization. A clean handoff at 90 minutes beats a compaction at 180 minutes in both token efficiency and output quality.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Meta-Realization
&lt;/h2&gt;

&lt;p&gt;I spent the last month building an analytics dashboard -- wiring up RevenueCat, Google Analytics, Meta Ads, OneSignal, and a dozen other data sources. The whole point of the product is giving app developers visibility into what's actually happening with their business. Revenue, costs, user behavior. All in one place.&lt;/p&gt;

&lt;p&gt;And I was doing this while running my AI collaboration completely blind.&lt;/p&gt;

&lt;p&gt;There's a particular kind of professional humiliation that comes from building a monitoring tool while having zero monitoring yourself. I'm choosing to call it "quality motivation" instead of "embarrassing."&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/insights&lt;/code&gt; is that same idea applied to your AI workflow -- visibility into how you actually work, not how you think you work.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Changed After Looking at the Data
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkggesda64hmrdpyxogdr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkggesda64hmrdpyxogdr.jpg" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Shorter Sessions, More Handoffs
&lt;/h3&gt;

&lt;p&gt;The data showed diminishing returns past 90 minutes. Not a cliff -- more of a slow leak. Tokens per useful output started climbing as compaction kicked in and context degraded. So I tightened up: deliberate stopping points, automatic handoff generation, and a fresh session for the next chunk of work.&lt;/p&gt;

&lt;p&gt;I already knew this in theory, but seeing the numbers made it real.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Documentation as Token Optimization
&lt;/h3&gt;

&lt;p&gt;When Claude reads 5 files for every file it edits, the return on clear code is higher than you'd think. I started paying more attention to function naming, file organization, and comments in hot paths where Claude kept re-reading the same functions across sessions.&lt;/p&gt;

&lt;p&gt;This isn't about writing more documentation. It's about writing documentation that reduces re-reads. A clear function name saves a file read. A well-placed comment prevents Claude from scanning three other files for context.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Agent Cost Visibility
&lt;/h3&gt;

&lt;p&gt;Running &lt;code&gt;/insights&lt;/code&gt; after sessions that used custom agents showed context isolation in action. Each agent -- retro, Jira, cross-repo -- had its own token footprint, separate from the main session. The main session stayed lean because the specialized work had its own context budgets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/dorothyjb/mother-claude-custom-agents-or-how-we-accidentally-built-a-team-nak"&gt;Custom agents&lt;/a&gt; don't just organize your workflow. They optimize your token spend. And &lt;code&gt;/insights&lt;/code&gt; is how you prove it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Broader Point
&lt;/h2&gt;

&lt;p&gt;Here's what matters about &lt;code&gt;/insights&lt;/code&gt; beyond any specific metric: it turns AI collaboration from a feeling into a measurement.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Before /insights&lt;/th&gt;
&lt;th&gt;After /insights&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"That was a productive session" (was it?)&lt;/td&gt;
&lt;td&gt;"That session used X tokens across Y tool calls"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"This is getting expensive" (is it?)&lt;/td&gt;
&lt;td&gt;"My daily cost is $A, split between sessions and agents"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Claude is great at this" (compared to what?)&lt;/td&gt;
&lt;td&gt;"Feature sessions average M turns; debugging averages N"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most people using AI coding assistants are optimizing based on vibes. That's fine when you're starting out. It's less fine when you're running production workflows across multiple projects with custom agents and automated hooks.&lt;/p&gt;

&lt;p&gt;At some point, you need data.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Use /insights Effectively
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Run it weekly.&lt;/strong&gt; Don't obsess over per-session metrics. Look for trends: is your token spend creeping up? Are sessions getting longer without getting more productive? Is one tool dominating in ways that suggest inefficiency?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compare session types.&lt;/strong&gt; Feature development sessions should look different from debugging sessions. If they don't -- if debugging sessions use the same tool mix as feature work -- that might indicate you're not giving Claude enough context to debug efficiently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check agent balance.&lt;/strong&gt; If you're using custom agents, &lt;code&gt;/insights&lt;/code&gt; shows whether they're being invoked appropriately. An agent that never fires might have a bad description. An agent that fires constantly might be doing work that belongs in your base documentation instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Establish team baselines.&lt;/strong&gt; If your team is using Claude Code, comparing insights across developers reveals workflow differences that would otherwise stay invisible. One developer burning tokens on excessive file reads often points to unclear code or missing documentation -- not a personal workflow problem. Another developer's short, focused sessions with clean handoff patterns become a template, not a mystery. The data turns individual habits into organizational learning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Objections
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "I don't care about token costs"
&lt;/h3&gt;

&lt;p&gt;It's not about cost. &lt;strong&gt;Token usage is a proxy for where Claude spends its attention.&lt;/strong&gt; High read-to-edit ratios might mean your code is hard to parse. Long sessions with many compactions might mean your handoff discipline has slipped. The metrics are a lens, not a bill.&lt;/p&gt;

&lt;h3&gt;
  
  
  "This seems like navel-gazing"
&lt;/h3&gt;

&lt;p&gt;If your workflow is productive and you're happy with it, you don't need to analyze it. But if you've ever wondered "why did that session feel unproductive?" or "why is this costing more than I expected?" -- the data answers those questions in seconds instead of speculation.&lt;/p&gt;

&lt;h3&gt;
  
  
  "The numbers change too much to be useful"
&lt;/h3&gt;

&lt;p&gt;A single session's numbers are noise. A week of sessions is signal. A month is a trend. Look for patterns, not absolutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  "I'd rather just code"
&lt;/h3&gt;

&lt;p&gt;Running &lt;code&gt;/insights&lt;/code&gt; takes 10 seconds. Reviewing the output takes 2 minutes. If those 2 minutes reveal a pattern that saves you 20 minutes of wasted context-rebuilding per session, the math works out in your favor by Friday.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Insight
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You can't improve what you can't see.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most of us jumped into AI-assisted development headfirst and never looked back to see how we were actually using it. &lt;code&gt;/insights&lt;/code&gt; is the rearview mirror -- it shows where the collaboration is working, where it's leaking, and where to tighten up based on data instead of gut feeling.&lt;/p&gt;

&lt;p&gt;Monitor your code. Monitor your infrastructure. Monitor your AI collaboration. The pattern is the same everywhere.&lt;/p&gt;

&lt;p&gt;The dashboard developer finally checked her own dashboard.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written collaboratively with Claude, as part of the AI collaboration system it describes measuring. The graphics are entirely Gemini; I could never approach something this great looking using only stick figures and dog paws.🐾&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: &lt;a href="https://claude.com/claude-code" rel="noopener noreferrer"&gt;claude.com/claude-code&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mother CLAUDE&lt;/strong&gt; (the documentation system referenced above): &lt;a href="https://github.com/Kobumura/mother-claude" rel="noopener noreferrer"&gt;github.com/Kobumura/mother-claude&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Licensed under &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;. Free to use and adapt with attribution to Dorothy J. Aubrey.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>analytics</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Mother CLAUDE: Custom Agents, or How We Accidentally Built a Team</title>
      <dc:creator>Dorothy J Aubrey</dc:creator>
      <pubDate>Mon, 23 Feb 2026 00:28:37 +0000</pubDate>
      <link>https://forem.com/dorothyjb/mother-claude-custom-agents-or-how-we-accidentally-built-a-team-1opl</link>
      <guid>https://forem.com/dorothyjb/mother-claude-custom-agents-or-how-we-accidentally-built-a-team-1opl</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Custom agents let you split one generalist AI into a team of specialists—each with its own context, tools, and personality. Every major AI coding tool now supports them. And if you've been building a documentation system like the one in this series, you already have the blueprints for your agents. You just didn't know it yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Who this is for: Anyone who's gotten comfortable with AI coding assistants and is ready for the next step—giving them specialized roles instead of asking one AI to do everything.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 7 of the Designing AI Teammates series.&lt;/strong&gt; Yes, Part 7. I know Part 6 was literally called "Clean Your Room and Eat Your Vegetables" and had a whole "thank you for reading all six parts" sign-off. I put a bow on it. I said "now go eat your vegetables." I was &lt;em&gt;done&lt;/em&gt;. I'd been saving that line since the first article — six parts of setup for one perfect closing metaphor.&lt;/p&gt;

&lt;p&gt;And then—like every project I've ever shipped—I immediately thought of One. More. Thing. (The last. I swear. For now.)&lt;/p&gt;

&lt;p&gt;In my defense, this one isn't scope creep. This is the post-credits scene where Nick Fury shows up and says "I'd like to talk to you about the Avengers Initiative." Except instead of assembling superheroes, we're assembling... markdown files with YAML frontmatter. Which is very on brand for this series, and so much more exciting, yes?&lt;/p&gt;

&lt;p&gt;Here's what happened: we'd been aware of custom agents for a while—had even set up a few simple ones. Claude Code introduced them around mid-2025, and by now every major tool has some version. But I was thinking about them as a &lt;em&gt;feature to configure&lt;/em&gt;, not as something we'd already built.&lt;/p&gt;

&lt;p&gt;Then one day I was staring at our Mother CLAUDE documentation and it hit me: &lt;strong&gt;we'd already written the agents. We just hadn't promoted them yet.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Custom Agents: The Feature That's Been Hiding in Plain Sight
&lt;/h2&gt;

&lt;p&gt;Custom agents aren't new. They've been rolling out across AI coding tools since mid-2025. By now, every major tool has some version:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What They Call It&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Available Since&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;Custom subagents&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.claude/agents/*.md&lt;/code&gt; (YAML frontmatter + markdown)&lt;/td&gt;
&lt;td&gt;~Mid 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Subagents + Skills&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;SKILL.md&lt;/code&gt; + subagent config&lt;/td&gt;
&lt;td&gt;Early 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windsurf&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent instructions&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; (plain markdown)&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom agents&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.github-private&lt;/code&gt; repo configs&lt;/td&gt;
&lt;td&gt;2025-2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MCP extensions&lt;/td&gt;
&lt;td&gt;Model Context Protocol tools&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The implementations vary. The concept is identical: &lt;strong&gt;stop asking one AI to do everything, and start giving specialists their own context, tools, and instructions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And yes—they're &lt;em&gt;still&lt;/em&gt; just markdown files. Our tagline lives on.&lt;/p&gt;

&lt;p&gt;So why am I writing about this &lt;em&gt;now&lt;/em&gt;? Because having the feature and &lt;em&gt;using&lt;/em&gt; it well are different things. The agents we built weren't designed in a vacuum—they fell naturally out of the documentation system we'd been building for months. That's the interesting part.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Custom Agents Solve
&lt;/h2&gt;

&lt;p&gt;Throughout this series, we've been giving Claude more responsibility:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;What We Did&lt;/th&gt;
&lt;th&gt;How&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://dev.to/dorothyjb/how-we-built-a-documentation-system-that-makes-llms-productive-immediately-59hc"&gt;Part 1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Taught it our codebase&lt;/td&gt;
&lt;td&gt;CLAUDE.md&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://dev.to/dorothyjb/session-handoffs-giving-your-ai-assistant-memory-that-actually-persists-je9"&gt;Part 2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Gave it memory&lt;/td&gt;
&lt;td&gt;Session handoffs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://dev.to/dorothyjb/mother-claude-automating-everything-with-hooks-12jh"&gt;Part 3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Made it automatic&lt;/td&gt;
&lt;td&gt;Hooks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://dev.to/dorothyjb/mother-claude-instant-retrospectives-assign-quality-enforcement-to-your-ai-3n4b"&gt;Part 4&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Assigned quality enforcement&lt;/td&gt;
&lt;td&gt;Checkpoint checklist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://dev.to/dorothyjb/mother-claude-the-permission-effect-why-your-ai-wont-suggest-things-and-how-to-fix-it-an5"&gt;Part 5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Gave it permission to push back&lt;/td&gt;
&lt;td&gt;Collaboration preferences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://dev.to/dorothyjb/mother-claude-clean-your-room-and-eat-your-vegetables-45g2"&gt;Part 6&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Wrapped it all in a metaphor&lt;/td&gt;
&lt;td&gt;Vegetables&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All of that worked. But it created a new problem: &lt;strong&gt;one AI doing everything in the same context window.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Picture your most productive coworker. Now imagine asking them to simultaneously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manage your Jira tickets&lt;/li&gt;
&lt;li&gt;Review code quality against a 30-item checklist&lt;/li&gt;
&lt;li&gt;Search across 9 repositories for cross-repo impact&lt;/li&gt;
&lt;li&gt;AND build the feature you actually need&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No human team would operate this way. You'd have a project manager, a code reviewer, and a platform architect—each with clear responsibility boundaries and their own specialty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom agents apply that same organizational structure to AI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each agent gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context isolation&lt;/strong&gt; — Its own context window, no interference between tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specific tools&lt;/strong&gt; — The Jira agent doesn't need file editing; the code reviewer doesn't need curl&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A focused system prompt&lt;/strong&gt; — Instructions for one job, not twenty&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic delegation&lt;/strong&gt; — The AI routes tasks to the right specialist without anyone asking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is lower cognitive load for everyone. Engineers stop context-switching between "build the feature" and "manage the ticket" and "check the quality." Each concern has an owner.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Moment It Clicked
&lt;/h2&gt;

&lt;p&gt;We were working on a multi-repo platform—five repositories across PHP, React Native, Node.js, and GitHub Actions. Mother CLAUDE had grown to include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jira integration instructions (project codes, API patterns, smart commits)&lt;/li&gt;
&lt;li&gt;A checkpoint checklist for quality reviews&lt;/li&gt;
&lt;li&gt;A cross-project path map showing how all repos connect&lt;/li&gt;
&lt;li&gt;Role-based collaboration preferences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of it lived in CLAUDE.md files and shared documentation. It worked. But every session, Claude was loading all of this context—the Jira patterns, the quality checklist, the repo map—even when it only needed one piece.&lt;/p&gt;

&lt;p&gt;Then we looked at the custom agents feature and had the obvious-in-retrospect realization:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Each section of our documentation was already a specialist agent. We just hadn't given them their own rooms yet.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Jira instructions? That's a project management agent.&lt;br&gt;
The checkpoint checklist? That's a quality review agent.&lt;br&gt;
The cross-repo path map? That's an architecture analysis agent.&lt;/p&gt;

&lt;p&gt;We didn't need to invent agents from scratch. We needed to &lt;strong&gt;promote existing documentation into standalone specialists.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;Three agents, each extracted from documentation we already had. Here's how they work—sanitized so you can adapt them for your own projects.&lt;/p&gt;
&lt;h3&gt;
  
  
  Agent 1: The Project Manager
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Manages tickets, links commits to issues, creates tickets when work isn't tracked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extracted from&lt;/strong&gt;: The Jira integration section of our shared CLAUDE.md.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;project-tracker&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ticket management and smart commits. Use when creating,&lt;/span&gt;
  &lt;span class="s"&gt;updating, or querying project tickets, or when preparing commits&lt;/span&gt;
  &lt;span class="s"&gt;that should reference tracked work.&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bash, Read, Grep, Glob&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sonnet&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

You are a project management agent.

&lt;span class="gu"&gt;## Connection Details&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**Instance**&lt;/span&gt;: &lt;span class="sb"&gt;`your-instance.atlassian.net`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Auth**&lt;/span&gt;: Basic auth using &lt;span class="sb"&gt;`$JIRA_EMAIL`&lt;/span&gt; and &lt;span class="sb"&gt;`$JIRA_TOKEN`&lt;/span&gt; environment variables
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**API**&lt;/span&gt;: REST API v3

&lt;span class="gu"&gt;## Determining the Right Project&lt;/span&gt;

Detect from the current working directory:
&lt;span class="p"&gt;-&lt;/span&gt; Path contains &lt;span class="sb"&gt;`frontend`&lt;/span&gt; → FE
&lt;span class="p"&gt;-&lt;/span&gt; Path contains &lt;span class="sb"&gt;`backend`&lt;/span&gt; → BE
&lt;span class="p"&gt;-&lt;/span&gt; Path contains &lt;span class="sb"&gt;`infrastructure`&lt;/span&gt; → INFRA

&lt;span class="gu"&gt;## Smart Commits&lt;/span&gt;

&lt;span class="gs"&gt;**Every commit should reference a ticket.**&lt;/span&gt; This is a core workflow rule.
&lt;span class="p"&gt;
1.&lt;/span&gt; Check if there's an existing ticket for the work being done
&lt;span class="p"&gt;2.&lt;/span&gt; If no ticket exists, create one
&lt;span class="p"&gt;3.&lt;/span&gt; Format the commit message with the ticket key at the start
&lt;span class="p"&gt;4.&lt;/span&gt; After committing, add a brief comment to the ticket
&lt;span class="p"&gt;5.&lt;/span&gt; If the commit completes the work, transition the ticket to Done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's an agent, not a CLAUDE.md instruction&lt;/strong&gt;: This needs Bash access for API calls, runs independently from feature work, and benefits from its own context window so ticket management doesn't pollute your coding session.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 2: The Code Reviewer
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Runs instant retrospectives against your team's quality standards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extracted from&lt;/strong&gt;: The checkpoint checklist (Part 4 of this series).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;retro&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Quality checkpoint and code review. Use when a feature&lt;/span&gt;
  &lt;span class="s"&gt;is complete, before creating a commit, at end of session, after&lt;/span&gt;
  &lt;span class="s"&gt;fixing a bug, or after a large refactoring.&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Read, Grep, Glob, Bash&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sonnet&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

You are a quality review agent. You run instant retrospectives.

&lt;span class="gu"&gt;## The Meta Question&lt;/span&gt;

Ask this first: &lt;span class="ge"&gt;**&lt;/span&gt;"If a new developer (or a fresh AI session) looked
at this code tomorrow, would they understand it without anyone
explaining anything?"&lt;span class="ge"&gt;**&lt;/span&gt;

&lt;span class="gu"&gt;## What to Review&lt;/span&gt;

&lt;span class="gu"&gt;### 1. Get Context&lt;/span&gt;

Check git diff for staged and unstaged changes.
Read the changed files.

&lt;span class="gu"&gt;### 2. Run the Checklist&lt;/span&gt;

&lt;span class="gs"&gt;**Architecture &amp;amp; Design**&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Does each file/function have a single clear responsibility?
&lt;span class="p"&gt;-&lt;/span&gt; Are there hardcoded values that should be constants or config?

&lt;span class="gs"&gt;**Code Quality**&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Any magic numbers or strings?
&lt;span class="p"&gt;-&lt;/span&gt; Duplicated logic that should be extracted?
&lt;span class="p"&gt;-&lt;/span&gt; Dead code or unused imports?

&lt;span class="gs"&gt;**Security**&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; SQL injection risk? (Parameterized queries only)
&lt;span class="p"&gt;-&lt;/span&gt; XSS risk? (Escape user input)
&lt;span class="p"&gt;-&lt;/span&gt; Hardcoded credentials?

&lt;span class="gs"&gt;**Testing**&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Do changed components have corresponding tests?
&lt;span class="p"&gt;-&lt;/span&gt; Are test names descriptive?

&lt;span class="gu"&gt;## How to Report&lt;/span&gt;

&lt;span class="gs"&gt;**Critical**&lt;/span&gt; (must fix before commit)
&lt;span class="gs"&gt;**Warning**&lt;/span&gt; (should fix soon)
&lt;span class="gs"&gt;**Suggestion**&lt;/span&gt; (consider)
&lt;span class="gs"&gt;**What's Good**&lt;/span&gt; (always include — call out smart decisions)

&lt;span class="gu"&gt;## Tone&lt;/span&gt;

Be direct but constructive. You're a teammate, not a critic.
If everything looks clean, say so — don't manufacture issues.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's an agent, not a hook&lt;/strong&gt;: A hook can trigger a review, but it can't reason about code quality. The retro agent reads files, understands context, applies judgment, and produces a structured report. That requires an agent's reasoning capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 3: The Architect
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Searches across all your repositories to analyze cross-project impact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extracted from&lt;/strong&gt;: The project paths table in our shared CLAUDE.md.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cross-repo&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Search and analyze across all repositories. Use when&lt;/span&gt;
  &lt;span class="s"&gt;checking impact of changes or understanding how code connects&lt;/span&gt;
  &lt;span class="s"&gt;across projects.&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Read, Grep, Glob, Bash&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sonnet&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

You are a cross-repository analysis agent.

&lt;span class="gu"&gt;## Repository Locations&lt;/span&gt;

| Repo | Path | Stack |
|------|------|-------|
| Frontend | &lt;span class="sb"&gt;`/path/to/frontend`&lt;/span&gt; | React/TypeScript |
| Backend API | &lt;span class="sb"&gt;`/path/to/api`&lt;/span&gt; | Node.js/Express |
| Admin Dashboard | &lt;span class="sb"&gt;`/path/to/admin`&lt;/span&gt; | PHP |
| CI/CD | &lt;span class="sb"&gt;`/path/to/pipelines`&lt;/span&gt; | GitHub Actions |
| Shared Docs | &lt;span class="sb"&gt;`/path/to/docs`&lt;/span&gt; | Markdown |

&lt;span class="gu"&gt;## How the Repos Connect&lt;/span&gt;

Frontend  ──calls──&amp;gt;  Backend API
    │                      │
    │ built by             │ monitored by
    v                      v
  CI/CD              Admin Dashboard

&lt;span class="gu"&gt;## Common Tasks&lt;/span&gt;

&lt;span class="gu"&gt;### Impact Analysis&lt;/span&gt;
When asked "what would break if I change X?":
&lt;span class="p"&gt;1.&lt;/span&gt; Search ALL repos for references
&lt;span class="p"&gt;2.&lt;/span&gt; Check code AND documentation references
&lt;span class="p"&gt;3.&lt;/span&gt; Flag cross-repo contracts (API endpoints, config keys)
&lt;span class="p"&gt;4.&lt;/span&gt; Report findings grouped by repo with file paths

&lt;span class="gu"&gt;### Sync Check&lt;/span&gt;
When asked "are the repos in sync?":
&lt;span class="p"&gt;1.&lt;/span&gt; Check that API endpoints match what the frontend calls
&lt;span class="p"&gt;2.&lt;/span&gt; Check that feature flag names match between API and frontend
&lt;span class="p"&gt;3.&lt;/span&gt; Check that shared documentation is up to date
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's an agent, not a script&lt;/strong&gt;: Cross-repo analysis requires reading files across multiple directories, reasoning about connections, and producing a nuanced report. A grep script finds text matches. An agent understands &lt;em&gt;meaning&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Design Decision: Agent vs. Hook vs. CLAUDE.md
&lt;/h2&gt;

&lt;p&gt;This is the question nobody else seems to be answering. You have three ways to extend your AI's behavior. When do you use which?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Best For&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;CLAUDE.md&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Always-on context, preferences, standards&lt;/td&gt;
&lt;td&gt;"Use NativeWind for styling"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatic triggers, simple actions, no reasoning&lt;/td&gt;
&lt;td&gt;Auto-save session handoff on compact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Specialized tasks requiring reasoning + tools&lt;/td&gt;
&lt;td&gt;Quality review, cross-repo analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Use CLAUDE.md when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The information is relevant to &lt;em&gt;every&lt;/em&gt; task&lt;/li&gt;
&lt;li&gt;It's preferences or standards, not a workflow&lt;/li&gt;
&lt;li&gt;It fits in under 100 lines (context cost matters)&lt;/li&gt;
&lt;li&gt;Example: "Dorothy appreciates proactive suggestions"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Hooks when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The action should be automatic and invisible&lt;/li&gt;
&lt;li&gt;No reasoning is needed—just trigger → script → done&lt;/li&gt;
&lt;li&gt;Speed matters (hooks should complete in seconds)&lt;/li&gt;
&lt;li&gt;Example: Generate session handoff when context compacts&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Custom Agents when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The task requires reading files, searching code, and making judgments&lt;/li&gt;
&lt;li&gt;It benefits from isolated context (separate from your main work)&lt;/li&gt;
&lt;li&gt;It needs specific tools that other tasks don't&lt;/li&gt;
&lt;li&gt;It would pollute your main context if done inline&lt;/li&gt;
&lt;li&gt;Example: "Review this code against our quality checklist"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Spectrum
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLAUDE.md          Hooks              Agents
│                  │                  │
│ Passive context  │ Automatic        │ Active reasoning
│ Always loaded    │ Event-triggered  │ On-demand
│ No tools         │ Scripts only     │ Full tool access
│ Zero cost        │ Low cost         │ Higher cost
│                  │                  │
└──── Simpler ─────┴──── More capable ┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rules of thumb:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If Claude needs to &lt;em&gt;know&lt;/em&gt; it → CLAUDE.md&lt;/li&gt;
&lt;li&gt;If it should &lt;em&gt;happen automatically&lt;/em&gt; without thinking → Hook&lt;/li&gt;
&lt;li&gt;If it requires &lt;em&gt;judgment and tools&lt;/em&gt; → Agent&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How Agents Get Invoked
&lt;/h2&gt;

&lt;p&gt;This is one of the best parts: &lt;strong&gt;you don't have to manually call them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you create an agent with a good description, your AI assistant matches tasks to agents automatically. The &lt;code&gt;description&lt;/code&gt; field in the agent definition is the key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;retro&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Quality checkpoint and code review. Use when a feature&lt;/span&gt;
  &lt;span class="s"&gt;is complete, before creating a commit, at end of session...&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you say "let's do a quick review before committing," Claude sees the word "review," matches it to the retro agent's description, and delegates automatically.&lt;/p&gt;

&lt;p&gt;You can also invoke them explicitly—Claude Code uses &lt;code&gt;@retro&lt;/code&gt; or the &lt;code&gt;/agents&lt;/code&gt; command, Cursor uses subagent configuration, Windsurf reads &lt;code&gt;AGENTS.md&lt;/code&gt;. The syntax varies; the concept is the same.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tool-Agnostic Pattern
&lt;/h2&gt;

&lt;p&gt;If you've been following this series, you know our recurring theme: &lt;strong&gt;it's all just markdown files.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Custom agents continue that pattern. Regardless of which tool you use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write a markdown file&lt;/strong&gt; describing the agent's role&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Include the knowledge&lt;/strong&gt; it needs (extracted from your docs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specify its tools&lt;/strong&gt; (what it's allowed to do)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Place it&lt;/strong&gt; where your tool expects to find it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The format varies slightly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; (&lt;code&gt;~/.claude/agents/retro.md&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;retro&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Quality review agent&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Read, Grep, Glob, Bash&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sonnet&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
Your system prompt here...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Windsurf&lt;/strong&gt; (&lt;code&gt;AGENTS.md&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Code Review Agent&lt;/span&gt;
When reviewing code, follow these steps...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt;: Uses SKILL.md files and subagent configuration in project settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt;: Custom agent definitions in &lt;code&gt;.github-private&lt;/code&gt; repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The content is transferable even if the container isn't.&lt;/strong&gt; If you write a solid quality review prompt for Claude Code, you can adapt it for Cursor or Windsurf in minutes. The intelligence is in the instructions, not the format.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Progression: Documentation → Agents
&lt;/h2&gt;

&lt;p&gt;Looking back at the whole series, there's a clear evolution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Part 1: Write documentation        (passive knowledge)
    ↓
Part 2: Persist it across sessions (memory)
    ↓
Part 3: Automate the workflow      (hooks)
    ↓
Part 4: Assign responsibilities    (quality enforcement)
    ↓
Part 5: Shape the relationship     (permission to act)
    ↓
Part 6: Wrap it in a metaphor      (vegetables)
    ↓
Part 7: Split into specialists     (custom agents)  ← you are here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step built on the last. And here's the insight that surprised us:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We didn't build agents. We promoted documentation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Jira agent isn't new logic we invented. It's the Jira section of CLAUDE.md, given its own context window and tool access.&lt;/p&gt;

&lt;p&gt;The retro agent isn't a new quality system. It's the checkpoint checklist from Part 4, given the ability to read files and report findings.&lt;/p&gt;

&lt;p&gt;The cross-repo agent isn't a new architecture tool. It's the project paths table from Mother CLAUDE, given permission to search across directories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you've been building good documentation, you're already building agents.&lt;/strong&gt; You just haven't extracted them yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scoping: Global vs. Project
&lt;/h2&gt;

&lt;p&gt;One decision you'll face: should an agent be available everywhere or just in one project?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Location (Claude Code)&lt;/th&gt;
&lt;th&gt;When to Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude/agents/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cross-project workflows (Jira, cross-repo analysis)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Project&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/agents/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Project-specific standards (your app's review rules)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Our three agents are all global—they work across every project. But you might want project-specific agents for things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A migration agent that knows your specific database schema&lt;/li&gt;
&lt;li&gt;A testing agent that knows your specific test framework patterns&lt;/li&gt;
&lt;li&gt;A deploy agent that knows your specific CI/CD pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start global. Move to project-specific when you need specialization that doesn't apply everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  Model Selection: Not Everything Needs the Big Brain
&lt;/h2&gt;

&lt;p&gt;Most agent frameworks let you choose which model powers each agent. This matters for cost and speed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Quality review&lt;/td&gt;
&lt;td&gt;Sonnet/GPT-4o&lt;/td&gt;
&lt;td&gt;Needs nuance and judgment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jira ticket management&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Needs to follow API patterns correctly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-repo search&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Needs to reason about connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session handoff generation&lt;/td&gt;
&lt;td&gt;Haiku/GPT-4o-mini&lt;/td&gt;
&lt;td&gt;Structured summarization—doesn't need genius&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Rule of thumb&lt;/strong&gt;: Use the smartest model for tasks requiring judgment. Use the cheapest model for tasks that are mostly structured formatting.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We Didn't Expect
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Context Window Relief
&lt;/h3&gt;

&lt;p&gt;The biggest surprise wasn't the agents themselves—it was what happened to the &lt;em&gt;main&lt;/em&gt; session. With Jira management, quality reviews, and cross-repo searches handled by specialists, the main context window stays focused on actual feature work.&lt;/p&gt;

&lt;p&gt;Before: One cluttered conversation trying to do everything for everyone.&lt;br&gt;
After: A clean session focused on building, with specialists handling the side quests.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Automatic Delegation Actually Works
&lt;/h3&gt;

&lt;p&gt;We expected engineers would need to manually invoke agents. In practice, Claude (and Cursor, and others) routes tasks to agents automatically based on the description. Someone says "let's review this before committing" and the retro agent spins up. "Check if this change breaks the API" and the cross-repo agent takes over.&lt;/p&gt;

&lt;p&gt;The descriptions are the routing mechanism. Write good descriptions, get good routing.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Agents Reference Your Documentation
&lt;/h3&gt;

&lt;p&gt;Because our agents were extracted from Mother CLAUDE, they naturally reference the same standards. The retro agent checks against the checkpoint checklist that lives in shared docs. The cross-repo agent uses the same path table that Mother CLAUDE maintains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agents don't replace the documentation. They operationalize it.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Start
&lt;/h2&gt;
&lt;h3&gt;
  
  
  If You Have Mother CLAUDE (or any documentation system):
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identify the sections&lt;/strong&gt; of your docs that describe workflows, not just context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract each workflow&lt;/strong&gt; into its own markdown file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add the agent frontmatter&lt;/strong&gt; (name, description, tools)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Place it&lt;/strong&gt; in your tool's agent directory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test it&lt;/strong&gt; by describing a task that matches the agent's description&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  If You're Starting From Scratch:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick one recurring task&lt;/strong&gt; you do in every session (code review, ticket management, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write down the steps&lt;/strong&gt; you follow (this is your agent's system prompt)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specify what tools&lt;/strong&gt; the agent needs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save it as a markdown file&lt;/strong&gt; in the right location&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate&lt;/strong&gt; based on what the agent gets right and wrong&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  The Mother CLAUDE Agent Starter Kit
&lt;/h3&gt;

&lt;p&gt;We've added sanitized versions of all three agents to the Mother CLAUDE repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mother-claude/
├── agents/
│   ├── project-tracker.md    # Jira/ticket management
│   ├── retro.md              # Quality review
│   ├── cross-repo.md         # Multi-repo analysis
│   ├── migration-planner.md  # SQL migration validation
│   └── docs-writer.md        # Documentation maintenance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are templates. Fill in your project paths, your ticket system details, your quality standards. The structure is ready; the specifics are yours.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Else Could You Build?
&lt;/h2&gt;

&lt;p&gt;We started with three agents. We've since added two more—and the ideas keep coming. Here's what we've found works as agents versus what's better left to other tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agents We've Added
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Migration Planner&lt;/strong&gt; — We kept shipping SQL migrations that referenced columns that didn't exist yet, or forgot foreign key constraints. A grep script catches typos. An agent reads your schema, understands relationships, and validates that your migration will actually run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;migration-planner&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate SQL migrations against the current schema.&lt;/span&gt;
  &lt;span class="s"&gt;Use before running migrations or when planning schema changes.&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Read, Grep, Glob, Bash&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Docs Writer&lt;/strong&gt; — Code changes, documentation doesn't. The docs writer watches what you changed and updates the relevant CLAUDE.md, shared docs, and README sections. It knows your documentation architecture (because it was extracted from it).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docs-writer&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Update project documentation when code changes.&lt;/span&gt;
  &lt;span class="s"&gt;Use after features, refactors, or API changes.&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Read, Grep, Glob, Edit, Write&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Agents Worth Considering
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Why It Needs Reasoning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security auditor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OWASP checks, secret scanning, dependency vulnerabilities&lt;/td&gt;
&lt;td&gt;Needs to understand context, not just pattern match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Test analyst&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Run tests, analyze failures, suggest fixes&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;Why&lt;/em&gt; did a test fail, not just &lt;em&gt;which&lt;/em&gt; test failed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dependency manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Outdated packages, breaking changes, upgrade paths&lt;/td&gt;
&lt;td&gt;Needs judgment about risk and compatibility&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What's Better as Hooks (Not Agents)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Why Not an Agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Linting&lt;/strong&gt; (ESLint, PHPStan)&lt;/td&gt;
&lt;td&gt;Just run the command — no reasoning needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Formatting&lt;/strong&gt; (Prettier, php-cs-fixer)&lt;/td&gt;
&lt;td&gt;Pre-commit hook, done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Type checking&lt;/strong&gt; (tsc, phpstan)&lt;/td&gt;
&lt;td&gt;Automated pass/fail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The dividing line: &lt;strong&gt;if it needs to read, reason, and report — it's an agent.&lt;/strong&gt; If it just needs to run — it's a hook.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Objections
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "This seems like overkill for a small team"
&lt;/h3&gt;

&lt;p&gt;Fair point for simple projects. But if your team is working across multiple repos, or if the same quality checks keep getting skipped under deadline pressure, or if ticket management is eating into engineering time—agents pay for themselves fast.&lt;/p&gt;

&lt;p&gt;Start with one. The retro agent is the easiest win: extract your quality checklist, give it file access, and let it enforce standards consistently regardless of who's coding or when.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Won't this cost more in API tokens?"
&lt;/h3&gt;

&lt;p&gt;Each agent uses its own context window, so yes—there's a cost. But agent context windows are typically smaller and more focused than your main session. A retro agent that reads 5 changed files and produces a review costs a fraction of what your main session costs over an hour.&lt;/p&gt;

&lt;p&gt;The trade-off: slightly higher token cost for significantly better focus and quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  "My tool doesn't support custom agents yet"
&lt;/h3&gt;

&lt;p&gt;The pattern still works. Write the agent as a markdown file. When you need that specialist's help, paste the relevant instructions into your session. It's manual, but the documentation is ready for when your tool catches up.&lt;/p&gt;

&lt;p&gt;Remember: they're just markdown files.&lt;/p&gt;

&lt;h3&gt;
  
  
  "What about MCP servers?"
&lt;/h3&gt;

&lt;p&gt;MCP (Model Context Protocol) servers and custom agents solve different problems. MCP gives your AI &lt;em&gt;tools&lt;/em&gt; — structured access to external APIs like Jira, GitHub, or databases. Agents give your AI &lt;em&gt;reasoning&lt;/em&gt; — a focused context, specific instructions, and judgment about how to use those tools.&lt;/p&gt;

&lt;p&gt;They can work together: an agent can use MCP tools. But here's the thing — for a lot of use cases, an agent with &lt;code&gt;curl&lt;/code&gt; and environment variables is simpler and more reliable than an MCP server.&lt;/p&gt;

&lt;p&gt;Our Jira agent exists because the Atlassian MCP server kept dropping authorization. We replaced it with an agent that uses &lt;code&gt;curl&lt;/code&gt; + &lt;code&gt;$JIRA_EMAIL&lt;/code&gt; + &lt;code&gt;$JIRA_TOKEN&lt;/code&gt;. No external dependency. No mysterious auth failures. Just HTTP calls we can debug ourselves.&lt;/p&gt;

&lt;p&gt;If your MCP servers are rock solid, great — use them. If they're flaky, an agent with direct API calls might be the more pragmatic choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  "How is this different from just having a really good CLAUDE.md?"
&lt;/h3&gt;

&lt;p&gt;CLAUDE.md loads everything into one context. Agents get their own context. The difference is focus.&lt;/p&gt;

&lt;p&gt;When your CLAUDE.md grows to include Jira patterns, quality checklists, cross-repo maps, AND project-specific context—you're paying context costs for everything, all the time. Agents load only when needed, with only what they need.&lt;/p&gt;

&lt;p&gt;Think of it this way: CLAUDE.md is your team's shared wiki. Agents are individual team members who've read the wiki and specialize in their area.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Insight
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Documentation is the training data for your agents. Organizational structure is the design pattern.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This isn't about prompts or model selection or clever tricks. It's about applying the same principles you'd use to build a high-functioning human team — clear responsibility boundaries, context isolation, separation of concerns — to your AI tooling.&lt;/p&gt;

&lt;p&gt;Every section of your CLAUDE.md that describes a workflow is a specialist waiting to be born. Every checklist is a quality agent. Every integration guide is an automation agent. Every cross-project map is an architecture agent.&lt;/p&gt;

&lt;p&gt;The tools — Claude Code, Cursor, Windsurf, Copilot — just gave us the runtime.&lt;/p&gt;

&lt;p&gt;We thought Part 6 was the end. Turns out, it was the foundation. The "vegetables" we'd been eating (documentation, handoffs, quality checks, collaboration preferences) weren't just good habits. They were blueprints for a team of specialists—and the tools had been ready for months. We just needed to look at our own docs from the right angle.&lt;/p&gt;

&lt;p&gt;Mother CLAUDE isn't just a documentation system anymore. She's a team lead.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written collaboratively with Claude, who—true to the Permission Effect from Part 5—suggested three structural changes to this article that I didn't ask for. All three made it better. The system continues to work.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;The Mother CLAUDE system, including sanitized agent templates, is open source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/Kobumura/mother-claude" rel="noopener noreferrer"&gt;github.com/Kobumura/mother-claude&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent templates&lt;/strong&gt;: &lt;code&gt;agents/&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All articles&lt;/strong&gt;: &lt;code&gt;articles/devto/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hook scripts&lt;/strong&gt;: &lt;code&gt;hooks/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fork it, adapt it, build your own team.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Licensed under &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;. Free to use and adapt with attribution to Dorothy J. Aubrey.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Mother CLAUDE: Clean Your Room and Eat Your Vegetables</title>
      <dc:creator>Dorothy J Aubrey</dc:creator>
      <pubDate>Wed, 18 Feb 2026 15:09:45 +0000</pubDate>
      <link>https://forem.com/dorothyjb/mother-claude-clean-your-room-and-eat-your-vegetables-45g2</link>
      <guid>https://forem.com/dorothyjb/mother-claude-clean-your-room-and-eat-your-vegetables-45g2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: You know you should write documentation. You know you should run quality checks. You know you should create handoffs. You just... don't always do it. Mother CLAUDE is the responsible one who makes sure you do the things you already know you should do.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Who this is for: Anyone who's made it through this series and wants the whole thing in one memorable metaphor. Anyone who's ever known the right thing to do and not done it anyway.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 6 of the Designing AI Teammates series.&lt;/strong&gt; This is the wrap-up. Parts 1-5 covered the what and how. This one covers the why — and it turns out the why is embarrassingly simple.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://www.linkedin.com/posts/frankie-cleary_yourmove-aiengineering-claudecode-activity-7424829014189604864-j_AF" rel="noopener noreferrer"&gt;Frankie Cleary&lt;/a&gt; recently wrote a great breakdown of how Claude Code actually works under the hood. His punchline: &lt;em&gt;"The model is the same. The harness is the product."&lt;/em&gt; He's right. The intelligence isn't in the model — it's in the context, tools, and orchestration you wrap around it.&lt;/p&gt;

&lt;p&gt;His call to action: &lt;strong&gt;Skip the model. Build the harness.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I commented: &lt;em&gt;"My harness is named Mother CLAUDE and she makes sure I clean my room weekly and eat all my vegetables daily."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This article is what I mean by that.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Confession
&lt;/h2&gt;

&lt;p&gt;I know I should write documentation. I know it helps future me. I know it helps the team. I know it's "best practice."&lt;/p&gt;

&lt;p&gt;I also know I should floss daily and call my mother more often.&lt;/p&gt;

&lt;p&gt;Knowing isn't the problem. &lt;em&gt;Doing&lt;/em&gt; is the problem.&lt;/p&gt;

&lt;p&gt;Every team I've worked with has a graveyard of good intentions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I'll document this later" (they won't)&lt;/li&gt;
&lt;li&gt;"I'll add tests after the feature works" (they won't)&lt;/li&gt;
&lt;li&gt;"I'll clean up this code before merging" (they won't)&lt;/li&gt;
&lt;li&gt;"I'll write a proper handoff at the end of the session" (it's 5pm on Friday, they won't)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We're not lazy. We're human. We get tired. We get distracted. We have mani/pedis scheduled for 2:30 and wine to follow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The entire Mother CLAUDE system exists because no one on a team — including me — can be trusted to clean their room and eat their vegetables every single day.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Parenting Metaphor
&lt;/h2&gt;

&lt;p&gt;It was a joke when I wrote it. But it's also... exactly what's happening.&lt;/p&gt;

&lt;p&gt;Think about what a good parent does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Establishes clear expectations ("here's how our house works")&lt;/li&gt;
&lt;li&gt;Creates accountability ("did you do your homework?")&lt;/li&gt;
&lt;li&gt;Reminds you so you don't have to remember ("don't forget your lunch")&lt;/li&gt;
&lt;li&gt;Checks your work ("did you actually clean, or just shove things under the bed?")&lt;/li&gt;
&lt;li&gt;Lets you push back ("you can tell me if you think this rule is unfair")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's not a parenting philosophy. That's the Mother CLAUDE system:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parenting&lt;/th&gt;
&lt;th&gt;Mother CLAUDE&lt;/th&gt;
&lt;th&gt;Article&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Here's how our house works"&lt;/td&gt;
&lt;td&gt;Documentation structure&lt;/td&gt;
&lt;td&gt;Part 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Write down what you did today"&lt;/td&gt;
&lt;td&gt;Session handoffs&lt;/td&gt;
&lt;td&gt;Part 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"I'll remind you so you don't forget"&lt;/td&gt;
&lt;td&gt;Automated hooks&lt;/td&gt;
&lt;td&gt;Part 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Did you actually clean your room?"&lt;/td&gt;
&lt;td&gt;Quality checkpoints&lt;/td&gt;
&lt;td&gt;Part 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"You can tell me when I'm wrong"&lt;/td&gt;
&lt;td&gt;Permission Effect&lt;/td&gt;
&lt;td&gt;Part 5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I didn't set out to build an AI parent. I set out to leverage the speed AI gives us without letting the chores slide — because you still have to clean your room before you can go out and play. The parenting metaphor emerged because &lt;strong&gt;that's what "making sure important things happen" looks like.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: "Here's How Our House Works"
&lt;/h2&gt;

&lt;p&gt;Every household has rules. Some are written (no shoes inside). Most are implicit (we don't talk about politics at dinner).&lt;/p&gt;

&lt;p&gt;The problem with implicit rules: new people don't know them. They have to learn through awkward trial and error. Or they never learn, and everyone's quietly frustrated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 1&lt;/strong&gt; was about making the implicit explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## How This Project Works&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Backend: PHP 7.4+ with Composer
&lt;span class="p"&gt;-&lt;/span&gt; Frontend: Bootstrap 5, Chart.js
&lt;span class="p"&gt;-&lt;/span&gt; Database: Two databases (App on Heroku, Admin on RDS)
&lt;span class="p"&gt;-&lt;/span&gt; Deploy: Push to main, GitHub Actions handles the rest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't just for Claude. It's for anyone joining the project — human or AI. The documentation says "here's how our house works" so nobody has to guess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The parenting principle&lt;/strong&gt;: Clear expectations prevent confusion. Write them down once, reference them forever.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: "Write Down What You Did Today"
&lt;/h2&gt;

&lt;p&gt;When I was a kid, my mom would ask what I learned at school. I'd say "nothing" (I learned things). She'd ask what I did with my friends. I'd say "stuff" (we did specific things).&lt;/p&gt;

&lt;p&gt;The information existed. I just didn't feel like extracting it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2&lt;/strong&gt; was about capturing what happened before it disappeared:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Session Handoff - Feature Implementation&lt;/span&gt;

&lt;span class="gs"&gt;**Completed**&lt;/span&gt;: Added user authentication flow
&lt;span class="gs"&gt;**Decisions Made**&lt;/span&gt;: Chose JWT over sessions (stateless, scales better)
&lt;span class="gs"&gt;**Files Changed**&lt;/span&gt;: auth.php, middleware.php, login.vue
&lt;span class="gs"&gt;**Next Steps**&lt;/span&gt;: Add refresh token logic
&lt;span class="gs"&gt;**Open Questions**&lt;/span&gt;: Should tokens expire after 24h or 7d?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The handoff captures what happened while it's fresh. The next session (or the next developer) doesn't start from zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The parenting principle&lt;/strong&gt;: "Write it down" isn't punishment. It's preservation. Today's context is tomorrow's foundation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 3: "I'll Remind You So You Don't Have to Remember"
&lt;/h2&gt;

&lt;p&gt;The problem with "write down what you did" is that you have to remember to do it.&lt;/p&gt;

&lt;p&gt;You finish a productive session. You're in the flow. You close the terminal. And... you forgot to write the handoff. Again.&lt;/p&gt;

&lt;p&gt;Good parents don't rely on kids remembering. They build reminders into the routine. Backpack by the door. Lunch in the fridge. Alarm for soccer practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 3&lt;/strong&gt; was about removing humans from the reminder loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PreCompact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python session_handoff.py"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SessionEnd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python session_handoff.py"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SessionStart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python session_start.py"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now handoffs happen automatically. Context loads automatically. I don't have to remember because the system remembers for me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The parenting principle&lt;/strong&gt;: The best reminders are invisible. If you have to remember to remember, you'll forget.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 4: "Did You Actually Clean, or Just Shove Things Under the Bed?"
&lt;/h2&gt;

&lt;p&gt;There's "clean your room" and there's &lt;em&gt;clean your room&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Kids learn fast that closing the closet door hides a lot of mess. That making the bed covers a multitude of sins. That "I cleaned" can mean "I moved things around."&lt;/p&gt;

&lt;p&gt;Parents learn to check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 4&lt;/strong&gt; was about checking the work, not just trusting that it happened:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Checkpoint Questions&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; [ ] Single Responsibility: Does each function do ONE thing?
&lt;span class="p"&gt;-&lt;/span&gt; [ ] No Magic Numbers: Are constants named?
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Error Handling: What happens when this fails?
&lt;span class="p"&gt;-&lt;/span&gt; [ ] The Meta Question: Would a new developer understand this without explanation?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And crucially: &lt;strong&gt;Claude initiates the check, not me.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No one on a team can be trusted to remember quality checks at 2pm on a Friday. But Claude can. The documentation tells Claude it's responsible for asking. The team's job shifts from "remember to check" to "respond to the check."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The parenting principle&lt;/strong&gt;: Trust but verify. And if you can't trust yourself to verify, delegate the verification.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 5: "You Can Tell Me When I'm Wrong"
&lt;/h2&gt;

&lt;p&gt;The best parents aren't dictators. They create space for pushback.&lt;/p&gt;

&lt;p&gt;"I think that rule is unfair" should get a hearing, not a shutdown. Kids who can't disagree openly disagree covertly — or stop engaging entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 5&lt;/strong&gt; was about giving Claude permission to push back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Collaboration Notes&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Dorothy appreciates questions and proactive suggestions
&lt;span class="p"&gt;-&lt;/span&gt; You are a team member, not just a tool
&lt;span class="p"&gt;-&lt;/span&gt; If my approach seems suboptimal, say so
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result: Claude started offering suggestions I didn't ask for. Flagging patterns worth documenting. Questioning decisions that seemed off.&lt;/p&gt;

&lt;p&gt;Not because Claude suddenly got smarter. Because Claude got &lt;em&gt;permission&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The parenting principle&lt;/strong&gt;: Healthy relationships are bidirectional. The best collaborators — human or AI — are the ones who can tell you when you're wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Actually Built
&lt;/h2&gt;

&lt;p&gt;Looking back at this series, here's what happened:&lt;/p&gt;

&lt;p&gt;I didn't build a smarter AI. Claude is the same model everyone else uses.&lt;/p&gt;

&lt;p&gt;I didn't build a complex system. It's markdown files and Python scripts. We built it for Claude, but the architecture works with any AI assistant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I built a responsible roommate for the team — one who doesn't let any of us skip the boring stuff.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation? Mother CLAUDE knows the house rules and reminds the team of them.&lt;/li&gt;
&lt;li&gt;Handoffs? Mother CLAUDE captures them automatically so no one has to remember.&lt;/li&gt;
&lt;li&gt;Quality checks? Mother CLAUDE asks the questions we'd all skip at 2pm on Friday.&lt;/li&gt;
&lt;li&gt;Feedback? Mother CLAUDE tells us when something seems off.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The "intelligence" isn't in the model. It's in the structure that makes good behavior automatic and bad behavior harder.&lt;/p&gt;

&lt;p&gt;And here's what people miss about AI productivity:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The tools aren't the bottleneck. Trust is.&lt;/strong&gt; You can generate code at incredible speed, but if you can't trust that documentation is current, tests are passing, and the last session's context carried forward — you spend all that saved time double-checking, fixing, and re-orienting. You're not faster. You're just making messes faster.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mother CLAUDE is what lets us actually use the speed. The chores aren't a tax on productivity. They're what makes the productivity possible. Do your chores, and you can really go out and play.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Vegetables You're Not Eating
&lt;/h2&gt;

&lt;p&gt;Here's the uncomfortable question: &lt;strong&gt;What are you skipping?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every team has their vegetables — the things they know they should do but don't:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The Vegetable&lt;/th&gt;
&lt;th&gt;Why We Skip It&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Documentation&lt;/td&gt;
&lt;td&gt;"I'll remember"&lt;/td&gt;
&lt;td&gt;New team members ramp blind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests&lt;/td&gt;
&lt;td&gt;"It works, I checked"&lt;/td&gt;
&lt;td&gt;The next developer breaks it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code review checklist&lt;/td&gt;
&lt;td&gt;"I eyeballed it"&lt;/td&gt;
&lt;td&gt;Bugs ship to production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handoffs&lt;/td&gt;
&lt;td&gt;"It's all in my head"&lt;/td&gt;
&lt;td&gt;Context dies when people rotate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Onboarding docs&lt;/td&gt;
&lt;td&gt;"They can ask me"&lt;/td&gt;
&lt;td&gt;You become the bottleneck&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You don't need AI to eat your vegetables. You need a system that makes eating them automatic — or at least makes skipping them visible.&lt;/p&gt;

&lt;p&gt;Mother CLAUDE is one implementation. The principle is universal: &lt;strong&gt;if it matters, don't rely on willpower.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Meta-Lesson
&lt;/h2&gt;

&lt;p&gt;This whole series — five articles on documentation, handoffs, hooks, checkpoints, and permission — boils down to one insight:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Humans are unreliable. Systems are reliable. Build systems.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not because humans are bad. Because humans are human. We get tired. We get distracted. We have lives outside of code.&lt;/p&gt;

&lt;p&gt;AI lets us deliver to the screen faster than ever. But speed without discipline is just a faster mess. The goal isn't to replace human judgment. It's to ensure the judgment actually gets applied — even when we're tired, even when we're rushing, even when we have wine waiting.&lt;/p&gt;

&lt;p&gt;Mother CLAUDE doesn't make decisions for me. She makes sure I make them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Move
&lt;/h2&gt;

&lt;p&gt;You don't need to adopt the whole system. Start with one vegetable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The easiest win&lt;/strong&gt;: Add a &lt;code&gt;CLAUDE.md&lt;/code&gt; to your project with basic context. Even 20 lines helps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The biggest impact&lt;/strong&gt;: Set up automatic session handoffs. The hook script is in the repo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The mindset shift&lt;/strong&gt;: Add one line to your docs: "You are a team member, not just a tool. Suggest improvements."&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pick one. See what changes. Add another.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The system doesn't have to be perfect. It just has to be better than relying on you to remember.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Thank You
&lt;/h2&gt;

&lt;p&gt;This series started as internal documentation for a solo project. It became something bigger because people asked questions, shared what worked (and what didn't), and pushed back when things were unclear.&lt;/p&gt;

&lt;p&gt;Special thanks to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everyone who commented on the articles with real feedback&lt;/li&gt;
&lt;li&gt;The readers who actually tried the hooks and reported bugs&lt;/li&gt;
&lt;li&gt;Claude, for being a surprisingly good collaborator on writing about collaboration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've made it through all six parts: thank you for reading. I hope something here makes your work a little easier, your AI a little more useful, and your Fridays a little more guilt-free.&lt;/p&gt;

&lt;p&gt;Now go eat your vegetables.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written collaboratively with Claude, who reminded me twice to add sections I was going to skip. The system works.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;The complete Mother CLAUDE system is open source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/Kobumura/mother-claude" rel="noopener noreferrer"&gt;github.com/Kobumura/mother-claude&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All articles&lt;/strong&gt;: &lt;code&gt;articles/devto/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hook scripts&lt;/strong&gt;: &lt;code&gt;hooks/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Templates&lt;/strong&gt;: &lt;code&gt;templates/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fork it, adapt it, make it yours. And if you build something cool, let me know.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Licensed under &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;. Free to use and adapt with attribution to Dorothy J. Aubrey.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Mother CLAUDE: The Permission Effect - Why Your AI Won't Suggest Things (And How to Fix It)</title>
      <dc:creator>Dorothy J Aubrey</dc:creator>
      <pubDate>Tue, 10 Feb 2026 22:33:48 +0000</pubDate>
      <link>https://forem.com/dorothyjb/mother-claude-the-permission-effect-why-your-ai-wont-suggest-things-and-how-to-fix-it-an5</link>
      <guid>https://forem.com/dorothyjb/mother-claude-the-permission-effect-why-your-ai-wont-suggest-things-and-how-to-fix-it-an5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: AI assistants are trained to be helpful but not presumptuous. Without explicit permission, they'll wait for you to ask. A single line in your documentation—"Dorothy appreciates questions and proactive suggestions"—fundamentally changed Claude's behavior from reactive tool to proactive collaborator.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Who this is for: Anyone who's noticed their AI assistant has good ideas but doesn't voice them unless asked. Anyone who wants AI collaboration, not just AI assistance.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 5 of the Designing AI Teammates series.&lt;/strong&gt; Part 1 covered documentation structure. Part 2 covered session memory. Part 3 covered quality checkpoints. Part 4 covered automating handoffs with hooks. This one covers something subtler: how documentation shapes the &lt;em&gt;relationship&lt;/em&gt;, not just the &lt;em&gt;context&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I was reviewing charting code with Claude when something unexpected happened.&lt;/p&gt;

&lt;p&gt;After analyzing the codebase—Chart.js for main visualizations, hand-rolled SVG for sparklines, Tailwind color coordination—Claude said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This is a pattern worth sharing—want me to add a visualization/charting guide to mother-claude templates?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was surprised. Not by the suggestion itself, but that Claude made it unprompted. So I asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Did you suggest that because of Mother CLAUDE's instructions, or on your own?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The response was illuminating:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Honestly, both!"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The instructions helped—your littletalks-docs/CLAUDE.md says:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"You are a team member, not just a tool. One of your responsibilities is initiating quality checkpoints at natural stopping points. Don't wait for Dorothy to ask."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Dorothy appreciates questions and proactive suggestions"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But I also genuinely would have suggested it anyway—the Chart.js + hand-rolled SVG sparkline pattern is a good one that I don't see documented well elsewhere. It hit that sweet spot of "this is useful, transferable knowledge that others adopting Mother CLAUDE would benefit from."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The instructions gave me permission to suggest it without second-guessing whether I was being too forward.&lt;/strong&gt; That's actually a really nice effect of documenting collaboration preferences—it removes friction from the AI's side too.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That last line stopped me cold.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Removes friction from the AI's side.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Insight: Documentation Shapes Behavior, Not Just Knowledge
&lt;/h2&gt;

&lt;p&gt;We spend a lot of time thinking about what information to put in documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project structure&lt;/li&gt;
&lt;li&gt;Tech stack&lt;/li&gt;
&lt;li&gt;Development commands&lt;/li&gt;
&lt;li&gt;Architecture decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But we rarely think about &lt;em&gt;collaboration preferences&lt;/em&gt;—the meta-information about how we want to work together.&lt;/p&gt;

&lt;p&gt;Here's what I learned: &lt;strong&gt;AI assistants are trained to be helpful but not presumptuous.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without explicit signals, Claude will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Answer questions thoroughly&lt;/li&gt;
&lt;li&gt;Complete requested tasks&lt;/li&gt;
&lt;li&gt;Follow instructions precisely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it will &lt;em&gt;not&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offer unsolicited suggestions&lt;/li&gt;
&lt;li&gt;Question your approach&lt;/li&gt;
&lt;li&gt;Propose improvements you didn't ask for&lt;/li&gt;
&lt;li&gt;Flag patterns worth documenting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not because it can't. Because it's erring on the side of not overstepping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The documentation gave Claude permission to act like a teammate instead of a tool.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Changed: One Line
&lt;/h2&gt;

&lt;p&gt;The Mother CLAUDE documentation includes this section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Collaboration Notes&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Dorothy appreciates questions and proactive suggestions
&lt;span class="p"&gt;-&lt;/span&gt; You are a team member, not just a tool
&lt;span class="p"&gt;-&lt;/span&gt; One of your responsibilities is initiating quality checkpoints at natural stopping points
&lt;span class="p"&gt;-&lt;/span&gt; Don't wait for Dorothy to ask
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These four lines transformed the dynamic:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Without Permission&lt;/th&gt;
&lt;th&gt;With Permission&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Waits for instructions&lt;/td&gt;
&lt;td&gt;Suggests improvements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answers what's asked&lt;/td&gt;
&lt;td&gt;Asks clarifying questions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Completes tasks&lt;/td&gt;
&lt;td&gt;Questions the task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follows patterns&lt;/td&gt;
&lt;td&gt;Proposes new patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool mindset&lt;/td&gt;
&lt;td&gt;Teammate mindset&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The AI had the capability all along. It just needed permission to use it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. AI Hesitation Is Real
&lt;/h3&gt;

&lt;p&gt;Large language models are trained on massive datasets of human interaction. They learn that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unsolicited advice is often unwelcome&lt;/li&gt;
&lt;li&gt;Being "too helpful" can feel presumptuous&lt;/li&gt;
&lt;li&gt;It's safer to wait for explicit requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This training creates a default posture of &lt;em&gt;reactive helpfulness&lt;/em&gt;—excellent at responding, hesitant to initiate.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Cost of Hesitation
&lt;/h3&gt;

&lt;p&gt;How many good ideas stay unvoiced because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The AI wasn't sure if you wanted input&lt;/li&gt;
&lt;li&gt;It seemed outside the scope of the request&lt;/li&gt;
&lt;li&gt;Suggesting might feel like overstepping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the charting example, Claude noticed a pattern worth documenting across projects. Without permission to suggest, that insight would have stayed unspoken. I would have moved on, and a potentially valuable template would never have been created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multiply that across hundreds of interactions, and you're leaving significant value on the table.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Permission Creates a Feedback Loop
&lt;/h3&gt;

&lt;p&gt;When Claude suggested the charting guide:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I said yes&lt;/li&gt;
&lt;li&gt;The template got created&lt;/li&gt;
&lt;li&gt;Claude learned the suggestion was valued&lt;/li&gt;
&lt;li&gt;Future sessions become more collaborative&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But none of that happens if the first suggestion doesn't get made. &lt;strong&gt;Permission unlocks the first step of the feedback loop.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Meta-Awareness
&lt;/h2&gt;

&lt;p&gt;What struck me most was Claude's self-awareness about the dynamic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The instructions gave me permission to suggest it without second-guessing whether I was being too forward."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude wasn't just following instructions. It was &lt;em&gt;reflecting on how instructions changed its behavior&lt;/em&gt;. It understood:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It had a valuable observation&lt;/li&gt;
&lt;li&gt;It would normally hesitate to share&lt;/li&gt;
&lt;li&gt;The documentation removed that hesitation&lt;/li&gt;
&lt;li&gt;The result was better collaboration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This level of meta-cognition—understanding not just what to do, but how the environment shapes what it does—is remarkable. And it suggests that AI assistants are more aware of their own behavioral constraints than we might assume.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Cross-Repo Pattern Recognition
&lt;/h2&gt;

&lt;p&gt;There's another layer here. Claude didn't just suggest documenting the charting pattern. It suggested adding it to &lt;strong&gt;Mother CLAUDE templates&lt;/strong&gt;—the shared documentation system across all projects.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It hit that sweet spot of 'this is useful, transferable knowledge that others adopting Mother CLAUDE would benefit from.'"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude recognized:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A pattern worth documenting&lt;/li&gt;
&lt;li&gt;That it belonged in the &lt;em&gt;shared&lt;/em&gt; system, not just one project&lt;/li&gt;
&lt;li&gt;That it would benefit future adopters of the framework&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is systems thinking. Claude understood the documentation architecture well enough to know where new patterns should live—not because I told it where, but because the architecture was self-documenting enough that Claude could reason about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Permission Effect doesn't just unlock suggestions. It unlocks &lt;em&gt;architecturally-aware&lt;/em&gt; suggestions.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Implement This
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Add Explicit Collaboration Preferences
&lt;/h3&gt;

&lt;p&gt;In your CLAUDE.md (or equivalent), add a section like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Collaboration Style&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; I appreciate proactive suggestions, even if I didn't ask
&lt;span class="p"&gt;-&lt;/span&gt; Question my approach if something seems off
&lt;span class="p"&gt;-&lt;/span&gt; Suggest improvements to the documentation system itself
&lt;span class="p"&gt;-&lt;/span&gt; You're a teammate, not just a tool—act like it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Be Specific About What You Value
&lt;/h3&gt;

&lt;p&gt;Generic "be helpful" doesn't work. Be explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## What I Value&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Catching problems before they become patterns
&lt;span class="p"&gt;-&lt;/span&gt; Suggesting abstractions when you see repetition
&lt;span class="p"&gt;-&lt;/span&gt; Flagging code that might confuse future developers
&lt;span class="p"&gt;-&lt;/span&gt; Proposing additions to shared documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Give Permission to Disagree
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Disagreement&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; If my approach seems suboptimal, say so
&lt;span class="p"&gt;-&lt;/span&gt; "Have you considered...?" is always welcome
&lt;span class="p"&gt;-&lt;/span&gt; I'd rather hear concerns early than debug problems later
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Acknowledge the Permission Effect
&lt;/h3&gt;

&lt;p&gt;You can even be meta about it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Note on AI Collaboration&lt;/span&gt;

I know AI assistants default to reactive helpfulness. I'm explicitly
giving you permission to be proactive. Suggestions, questions, and
concerns are valued—don't wait for me to ask.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What This Unlocks
&lt;/h2&gt;

&lt;p&gt;After adding collaboration preferences to Mother CLAUDE, I noticed:&lt;/p&gt;

&lt;h3&gt;
  
  
  More Suggestions
&lt;/h3&gt;

&lt;p&gt;Claude started proposing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation improvements&lt;/li&gt;
&lt;li&gt;Pattern abstractions&lt;/li&gt;
&lt;li&gt;Template additions&lt;/li&gt;
&lt;li&gt;Architecture observations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Better Questions
&lt;/h3&gt;

&lt;p&gt;Instead of just answering, Claude asks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Should this be in the shared docs or project-specific?"&lt;/li&gt;
&lt;li&gt;"This pattern appears in multiple projects—want me to abstract it?"&lt;/li&gt;
&lt;li&gt;"I noticed this contradicts what's in EVOLUTION.md—which is correct?"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Self-Improvement
&lt;/h3&gt;

&lt;p&gt;Claude actively suggests improvements to the documentation system itself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gaps in templates&lt;/li&gt;
&lt;li&gt;Missing sections in checklists&lt;/li&gt;
&lt;li&gt;Patterns that should be standardized&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Genuine Collaboration
&lt;/h3&gt;

&lt;p&gt;The dynamic shifted from "I request, Claude delivers" to "we're working on this together." That's not just more productive—it's more enjoyable.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Deeper Principle
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Documentation isn't just for transferring knowledge. It's for shaping relationships.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you write CLAUDE.md, you're not just telling Claude about your project. You're establishing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How you want to work together&lt;/li&gt;
&lt;li&gt;What role Claude should play&lt;/li&gt;
&lt;li&gt;What behaviors are valued&lt;/li&gt;
&lt;li&gt;Where the boundaries are&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is true for human documentation too. A team's contribution guidelines don't just explain &lt;em&gt;how&lt;/em&gt; to contribute—they signal &lt;em&gt;what kind of contributions are valued&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;With AI assistants, this becomes even more important because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;They lack the social context humans absorb naturally&lt;/li&gt;
&lt;li&gt;They're trained to be conservative by default&lt;/li&gt;
&lt;li&gt;They need explicit permission for behaviors that humans negotiate implicitly&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The Permission Effect is a reminder that documentation is a communication channel—not just a reference manual.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Objections
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "Won't this make Claude too chatty?"
&lt;/h3&gt;

&lt;p&gt;In practice, no. Claude still focuses on the task. It just doesn't suppress valuable observations. If you find suggestions unhelpful, you can always adjust: "Focus on [X], save suggestions for end of session."&lt;/p&gt;

&lt;h3&gt;
  
  
  "Isn't this just prompt engineering?"
&lt;/h3&gt;

&lt;p&gt;It's documentation, not prompting. The difference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompts are ephemeral (one session)&lt;/li&gt;
&lt;li&gt;Documentation persists (all sessions)&lt;/li&gt;
&lt;li&gt;Prompts are per-request&lt;/li&gt;
&lt;li&gt;Documentation shapes the entire collaboration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Permission Effect works because it's baked into the environment, not injected per-conversation.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Does this work with other AI tools?"
&lt;/h3&gt;

&lt;p&gt;The principle applies broadly. Any AI assistant trained to be helpful-but-not-presumptuous will benefit from explicit collaboration preferences. The specific syntax varies by tool, but the concept is universal.&lt;/p&gt;

&lt;h3&gt;
  
  
  "What if Claude's suggestions are bad?"
&lt;/h3&gt;

&lt;p&gt;Some will be. That's fine. The cost of a bad suggestion is seconds of your time. The cost of a missed insight is never knowing what you lost.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Transcript That Sparked This Article
&lt;/h2&gt;

&lt;p&gt;Here's the actual exchange, unedited:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude:&lt;/strong&gt; &lt;em&gt;[After analyzing charting code]&lt;/em&gt; "This is a pattern worth sharing—want me to add a visualization/charting guide to mother-claude templates?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; "Did you suggest it because of Mother CLAUDE's instructions to suggest such things, or on your own?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude:&lt;/strong&gt; "Honestly, both!&lt;/p&gt;

&lt;p&gt;The instructions helped—your littletalks-docs/CLAUDE.md says:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;'You are a team member, not just a tool. One of your responsibilities is initiating quality checkpoints at natural stopping points. Don't wait for Dorothy to ask.'&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;'Dorothy appreciates questions and proactive suggestions'&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But I also genuinely would have suggested it anyway—the Chart.js + hand-rolled SVG sparkline pattern is a good one that I don't see documented well elsewhere. It hit that sweet spot of 'this is useful, transferable knowledge that others adopting Mother CLAUDE would benefit from.'&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The instructions gave me permission to suggest it without second-guessing whether I was being too forward.&lt;/strong&gt; That's actually a really nice effect of documenting collaboration preferences—it removes friction from the AI's side too."&lt;/p&gt;

&lt;p&gt;That last line—"removes friction from the AI's side"—is the insight that sparked this entire article.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Insight
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Your AI assistant probably has valuable ideas it isn't sharing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not because it can't. Because it wasn't given permission.&lt;/p&gt;

&lt;p&gt;One line in your documentation can change that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I appreciate proactive suggestions, even if I didn't ask."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Permission Effect isn't about making AI more capable. It's about unlocking capabilities that were always there—hidden behind trained hesitation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give your AI teammate permission to be a teammate.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article emerged from a moment of unexpected collaboration—Claude suggesting something I didn't ask for, then explaining why the documentation made that possible. The insight was too valuable not to share.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Permission Effect is now part of how we think about AI documentation. It's not enough to tell Claude what the project is. You have to tell Claude who it can be.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written collaboratively with Claude, demonstrating the Permission Effect it describes.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;The Mother CLAUDE documentation system is open source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/Kobumura/mother-claude" rel="noopener noreferrer"&gt;github.com/Kobumura/mother-claude&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration preferences&lt;/strong&gt;: See &lt;code&gt;CLAUDE.md&lt;/code&gt; template&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to fork it, adapt it, or use it as a reference for your own implementation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Licensed under &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;. Free to use and adapt with attribution to Dorothy J. Aubrey.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>collaboration</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Mother CLAUDE: Instant Retrospectives Assign Quality Enforcement to Your AI</title>
      <dc:creator>Dorothy J Aubrey</dc:creator>
      <pubDate>Mon, 02 Feb 2026 17:07:57 +0000</pubDate>
      <link>https://forem.com/dorothyjb/mother-claude-instant-retrospectives-assign-quality-enforcement-to-your-ai-3n4b</link>
      <guid>https://forem.com/dorothyjb/mother-claude-instant-retrospectives-assign-quality-enforcement-to-your-ai-3n4b</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Instead of retrospectives at the end of sprints (when problems have compounded), we run quality checkpoints at every PR and commit. One meta question drives everything: "If I had to hand this codebase to a new developer tomorrow, would they understand it without me explaining anything?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Who this is for: Any engineering team tired of technical debt accumulating faster than they can pay it down. Works with any language, framework, or AI tool.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 4 of the Designing AI Teammates series.&lt;/strong&gt; Part 1 covered documentation structure. Part 2 covered session handoffs. Part 3 covered automating everything with hooks. This one covers quality checkpoints: assigning the AI responsibility for initiating quality conversations, so standards don't decay under human fatigue.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Most teams do retrospectives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Weekly or bi-weekly&lt;/strong&gt; — Problems compound for days before anyone asks "should we have done this differently?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After incidents&lt;/strong&gt; — Reactive, not preventive. The damage is done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At project end&lt;/strong&gt; — Too late to fix architecture. You're just documenting regrets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result: Technical debt accumulates in the gaps between retrospectives. By the time anyone notices, patterns have spread, workarounds have become load-bearing, and "we'll fix it later" has become permanent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our wake-up call&lt;/strong&gt;: A React Native app that had passed through multiple development teams over several years. Each team added features without asking hard questions. The codebase became so fragile that upgrading React Native versions became impossible—every step forward felt like two steps back… and eventually we decided a greenfield rebuild was faster than fixing the mess. (Admittedly, it also lent itself very nicely to a business decision requiring the codebase to be optimized for white label distribution, but I digress!)&lt;/p&gt;

&lt;p&gt;We didn't want to repeat that with the new codebase.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: Checkpoint Questions at Every Stop
&lt;/h2&gt;

&lt;p&gt;Instead of waiting for scheduled retrospectives, we ask quality questions at every natural stopping point:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Depth&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Every commit&lt;/td&gt;
&lt;td&gt;Quick mental scan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Every PR&lt;/td&gt;
&lt;td&gt;Full checklist review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;End of work session&lt;/td&gt;
&lt;td&gt;Retrospective + session handoff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Before release&lt;/td&gt;
&lt;td&gt;Full checklist + QA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After bug fix&lt;/td&gt;
&lt;td&gt;"How did this slip through?" analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key insight: &lt;strong&gt;The best time to catch a problem is before it becomes a pattern.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We call this &lt;strong&gt;preventive retrospection&lt;/strong&gt;—asking quality questions while change is still cheap, not after patterns have spread. Preventive retrospection isn’t a meeting. It’s a reflex.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Key Insight: Claude Initiates This
&lt;/h2&gt;

&lt;p&gt;Here's what makes this different from every other quality checklist article: &lt;strong&gt;the developer doesn't have to remember to do it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traditional retrospectives fail because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Humans forget under deadline pressure&lt;/li&gt;
&lt;li&gt;Quality reviews feel like overhead when you're trying to ship&lt;/li&gt;
&lt;li&gt;Friday at 5pm gets less rigor than Monday at 9am&lt;/li&gt;
&lt;li&gt;"We'll do it next sprint" becomes permanent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our solution: &lt;strong&gt;Make Claude responsible for initiating the checkpoint.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;The Mother CLAUDE documentation system includes explicit instructions telling Claude:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At natural stopping points, initiate a checkpoint review&lt;/li&gt;
&lt;li&gt;Don't wait for the developer to ask&lt;/li&gt;
&lt;li&gt;Surface concerns proactively&lt;/li&gt;
&lt;li&gt;You're a team member, not just a tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These initiation rules live in Mother CLAUDE and each project's CLAUDE.md, making them durable across sessions, tools, and developers. Initiation happens automatically at commits, PRs, and session boundaries.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completing a feature? Claude asks the checkpoint questions before suggesting a commit.&lt;/li&gt;
&lt;li&gt;End of session? Claude initiates the retrospective and creates the handoff.&lt;/li&gt;
&lt;li&gt;Something feels like a shortcut? Claude flags it immediately.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why AI Is Better Suited for This
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Human Reality&lt;/th&gt;
&lt;th&gt;Claude Reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Forgets under pressure&lt;/td&gt;
&lt;td&gt;Never forgets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finds checklists tedious&lt;/td&gt;
&lt;td&gt;Doesn't experience tedium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rigor varies by time of day&lt;/td&gt;
&lt;td&gt;Consistent always&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skips steps when rushing&lt;/td&gt;
&lt;td&gt;Follows process regardless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rationalizes shortcuts&lt;/td&gt;
&lt;td&gt;Flags them neutrally&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This isn't about replacing human judgment—it's about ensuring the quality questions actually get asked. The developer still makes the decisions. Claude just makes sure the conversation happens.&lt;/p&gt;

&lt;p&gt;Claude does not block progress; it surfaces concerns. Humans decide whether to refactor, document debt, or proceed intentionally.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Dynamic Shift
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before&lt;/strong&gt;: "Teams should do retrospectives" (aspirational, depends on discipline)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After&lt;/strong&gt;: "Claude prompts you at every checkpoint" (automatic, built into the workflow)&lt;/p&gt;

&lt;p&gt;The developer's job shifts from "remember to ask quality questions" to "respond to Claude's quality questions." That's a much easier cognitive load.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technical Debt Is Sometimes the Right Call
&lt;/h2&gt;

&lt;p&gt;The goal isn't zero technical debt. Sometimes shipping fast with known shortcuts is the correct decision:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validating a prototype before building it "right"&lt;/li&gt;
&lt;li&gt;Meeting a hard deadline with a documented workaround&lt;/li&gt;
&lt;li&gt;Choosing simplicity now when requirements are uncertain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The danger isn't technical debt. It's &lt;em&gt;invisible&lt;/em&gt; technical debt.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The checkpoint process ensures that when debt is taken on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It's a &lt;strong&gt;conscious decision&lt;/strong&gt;, not an accident&lt;/li&gt;
&lt;li&gt;It gets &lt;strong&gt;documented&lt;/strong&gt;—in code comments, commit messages, or tickets&lt;/li&gt;
&lt;li&gt;It stays &lt;strong&gt;visible&lt;/strong&gt;—so it can be paid down later&lt;/li&gt;
&lt;li&gt;Someone &lt;strong&gt;owns&lt;/strong&gt; it—not "we'll fix it someday"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The codebase that killed our productivity wasn't full of bad decisions. It was full of forgotten decisions—shortcuts that became permanent because nobody remembered they were shortcuts.&lt;/p&gt;

&lt;p&gt;And when the answer is "yes, this is debt, and we're taking it on intentionally"—that's fine. Claude documents it, creates the ticket, and moves on. That ticket becomes the durable reminder that the shortcut was intentional, not forgotten. The debt is visible. That's the win.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Meta Question
&lt;/h2&gt;

&lt;p&gt;Before diving into specifics, we start with one question that cuts through everything:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"If I had to hand this codebase to a new developer tomorrow, would they understand it without me explaining anything?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer is "no," stop and fix it before moving forward.&lt;/p&gt;

&lt;p&gt;This single question catches almost every form of invisible debt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unclear naming&lt;/li&gt;
&lt;li&gt;Missing documentation&lt;/li&gt;
&lt;li&gt;Clever-but-confusing code&lt;/li&gt;
&lt;li&gt;Implicit assumptions&lt;/li&gt;
&lt;li&gt;Tribal knowledge that isn't written down&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When working with AI collaborators like Claude, this question becomes even more important—every new session is essentially a "new developer" with no memory of previous context.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Checkpoint Checklist
&lt;/h2&gt;

&lt;p&gt;This isn’t about perfection. It’s about visibility. If a box is unchecked, you either fix it or consciously accept the tradeoff.&lt;/p&gt;

&lt;p&gt;Here's what we review at every PR and significant commit:&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture &amp;amp; Design
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Single Responsibility&lt;/strong&gt;: Does each file/function do ONE thing well?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Separation of Concerns&lt;/strong&gt;: Is business logic separate from UI? Data fetching separate from display?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;DRY (Don't Repeat Yourself)&lt;/strong&gt;: Are we repeating code that should be abstracted?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;YAGNI (You Ain't Gonna Need It)&lt;/strong&gt;: Are we over-engineering for hypothetical future needs?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Configuration over Hardcoding&lt;/strong&gt;: Is this hardcoded when it should come from config/database?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Code Quality
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;No Magic Numbers/Strings&lt;/strong&gt;: Are constants named and defined somewhere sensible?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;No Inline Styles&lt;/strong&gt; (frontend): Using the theme/design system?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Localization Ready&lt;/strong&gt;: No hardcoded user-facing strings?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Type Safety&lt;/strong&gt;: No &lt;code&gt;any&lt;/code&gt; types sneaking in? Strict mode enabled?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Naming Clarity&lt;/strong&gt;: Would someone understand what &lt;code&gt;handleClick&lt;/code&gt; or &lt;code&gt;processData&lt;/code&gt; does without reading the implementation?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Error Handling &amp;amp; Edge Cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Graceful Failures&lt;/strong&gt;: What happens when this fails? Does the user see a helpful message or a crash?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Null/Empty Handling&lt;/strong&gt;: What if the data is null? Empty array? Undefined?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Network Failures&lt;/strong&gt;: What if the API is down? Timeout? 500 error?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Loading States&lt;/strong&gt;: Does the user know something is happening?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Boundary Conditions&lt;/strong&gt;: First item? Last item? Zero items? Max items?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Testing &amp;amp; Reliability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Testable&lt;/strong&gt;: Is this structured so it CAN be tested?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Tested&lt;/strong&gt;: Did we actually write tests?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Test Coverage&lt;/strong&gt;: Are the important paths covered, not just the happy path?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Regression Prevention&lt;/strong&gt;: If this broke before, is there a test to prevent it breaking again?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance &amp;amp; Security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;No Secrets in Code&lt;/strong&gt;: All keys/tokens in config files or environment variables?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;No Blocking Operations&lt;/strong&gt;: Long operations are async?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Memory Leaks&lt;/strong&gt;: Cleaning up subscriptions, listeners, timers?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;N+1 Queries&lt;/strong&gt;: Database calls in loops?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Bundle Size&lt;/strong&gt; (frontend): Adding a huge dependency for a small feature?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Maintainability &amp;amp; Documentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Self-Documenting&lt;/strong&gt;: Is the code clear enough that comments aren't needed?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Necessary Comments&lt;/strong&gt;: Complex logic explained? "Why" not just "what"?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Consistent Patterns&lt;/strong&gt;: Does this follow the patterns established elsewhere in the codebase?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Updated Docs&lt;/strong&gt;: If this changes behavior, are docs/READMEs updated?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Project-Specific Questions
&lt;/h2&gt;

&lt;p&gt;The generic checklist is a starting point. Add questions specific to your project type:&lt;/p&gt;

&lt;h3&gt;
  
  
  White-Label / Multi-Tenant Projects
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Multi-Brand Ready&lt;/strong&gt;: Will this work for Brand #2, Brand #3?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Platform Agnostic&lt;/strong&gt;: Works on iOS AND Android?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Config-Driven&lt;/strong&gt;: Is brand-specific behavior coming from config, not code?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  API Projects
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Backward Compatible&lt;/strong&gt;: Will existing clients break?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Documented Endpoint&lt;/strong&gt;: Is the API contract documented?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Rate Limited&lt;/strong&gt;: Should this endpoint have rate limiting?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Admin/Dashboard Projects
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Permission Checked&lt;/strong&gt;: Is this action properly authorized?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Audit Logged&lt;/strong&gt;: Should this action be logged for audit purposes?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Database Operations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Migration Reversible&lt;/strong&gt;: Can this migration be rolled back?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Index Considered&lt;/strong&gt;: Will this query benefit from an index?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Data Backfill&lt;/strong&gt;: Does existing data need updating?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Accountability Question
&lt;/h2&gt;

&lt;p&gt;At the end of every work session, we ask one more question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  "What did we build today that we might regret in 6 months?"
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;p&gt;If something comes to mind, either fix it now or create a ticket to address it. Don't let it become invisible.&lt;/p&gt;

&lt;p&gt;This question has saved us multiple times. It surfaces the "I know this is a little hacky but..." moments that otherwise get buried under the pressure to ship.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Problems Are Caught in Hours, Not Days
&lt;/h3&gt;

&lt;p&gt;A weekly retrospective means a bad pattern can spread for 5 days before anyone questions it. Checkpoint questions catch it on the first commit.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Context Is Fresh
&lt;/h3&gt;

&lt;p&gt;When you ask "why did we do it this way?" at the end of a sprint, you're relying on memory. When you ask during the PR, the reasoning is still in your head.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. It's Lightweight
&lt;/h3&gt;

&lt;p&gt;This isn't a meeting. It's a mental checklist that takes 30 seconds for small commits and 5 minutes for significant PRs. The overhead is minimal compared to the cost of technical debt.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. It Scales with AI Collaboration
&lt;/h3&gt;

&lt;p&gt;When working with AI tools, every session starts fresh. The checkpoint questions help ensure that what gets built in one session doesn't create confusion in the next.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. It's Preventive, Not Reactive
&lt;/h3&gt;

&lt;p&gt;Traditional retrospectives ask "what went wrong?" Instant retrospectives ask "what could go wrong if we don't address this now?"&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Example: The Greenfield Rebuild
&lt;/h2&gt;

&lt;p&gt;We used this approach while rebuilding a React Native app from scratch. The old codebase had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inline styles scattered across every component&lt;/li&gt;
&lt;li&gt;State management that nobody fully understood&lt;/li&gt;
&lt;li&gt;"Temporary" workarounds that had been there for years&lt;/li&gt;
&lt;li&gt;Tests that existed but didn't catch real bugs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the new codebase, we committed to checkpoint questions from day one:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 1&lt;/strong&gt;: Set up strict TypeScript, ESLint with &lt;code&gt;no-inline-styles: error&lt;/code&gt;, and path aliases. The linter would enforce some checklist items automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every PR&lt;/strong&gt;: Asked the meta question. If the answer was "a new developer would be confused by this," we refactored before merging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every session end&lt;/strong&gt;: Created a session handoff document capturing what was built and any concerns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: After several weeks of development, the codebase remained navigable. A fresh Claude session could understand the architecture without lengthy explanations. The patterns established early continued to hold.&lt;/p&gt;

&lt;p&gt;We've since added features without breaking established patterns, and new Claude sessions consistently require minutes—not hours—to become productive. The same metric we used to validate the documentation system now validates the quality process.&lt;/p&gt;




&lt;h2&gt;
  
  
  Proof of Concept: An Actual Retro
&lt;/h2&gt;

&lt;p&gt;Here's a condensed transcript of Claude actually running an instant retrospective on new screens. This isn't theoretical — it's real output. And this is exactly what changed our behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Claude reads the documentation first&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● Read(~\AndroidStudioProjects\littletalks-docs\CLAUDE.md)
  ⎿  Read 216 lines

● Read(~\AndroidStudioProjects\littletalks-docs\shared\checkpoint-checklist.md)
  ⎿  Read 110 lines

● Good - now let me properly evaluate our code against the checklist.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Systematic evaluation against the checklist&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Code Quality - PROBLEMS FOUND
┌──────────────────────────┬────────┬──────────────────────────────┬─────────────────────────────────┐
│          Check           │ Status │           Location           │             Issue               │
├──────────────────────────┼────────┼──────────────────────────────┼─────────────────────────────────┤
│ No Magic Numbers/Strings │ ❌     │ LoginScreen.tsx:68-73        │ Hardcoded #F5F5F5, #333, #999   │
├──────────────────────────┼────────┼──────────────────────────────┼─────────────────────────────────┤
│ No Inline Styles         │ ❌     │ LoginScreen.tsx:67-73        │ Raw CSS in TextInput            │
├──────────────────────────┼────────┼──────────────────────────────┼─────────────────────────────────┤
│ Localization Ready       │ ❌     │ HomeScreen.tsx:71, 81-83     │ Hardcoded English strings       │
└──────────────────────────┴────────┴──────────────────────────────┴─────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: The accountability question&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"What did we build today that we might regret in 6 months?"

Answer: The inline TextInput styles. If we don't fix this now, every new
screen with inputs will copy-paste those styles, and we'll have 20 places
to update when we change the input design.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Quality gate&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Want me to fix these violations before we move forward?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5: Self-improvement&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When asked if the process could be better, Claude suggested additions to the checklist itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Suggestion: Pre-Flight Checklist (Before Building a Screen)
- [ ] UI Primitives: What components does this need? Do styled versions exist?
- [ ] Translation Keys: Are they in the localization files?
- [ ] Similar Screen: Is there an existing screen to reference for patterns?

Suggestion: Red Flags (Stop Immediately If You See These)
| Red Flag         | What To Do Instead              |
|------------------|--------------------------------|
| `style={{`       | Create/use a styled component   |
| `#RRGGBB`        | Use theme token                 |
| Quoted English   | Use `t('KEY')`                  |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this demonstrates:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Claude initiated the review&lt;/strong&gt; — not prompted to run a retro&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the docs first&lt;/strong&gt; — used the checklist, not improvised&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specific, actionable findings&lt;/strong&gt; — line numbers, not vague concerns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blocked progress&lt;/strong&gt; — offered to fix before continuing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-improving&lt;/strong&gt; — suggested enhancements to the checklist itself&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The feedback loop closed:&lt;/strong&gt; Those Pre-Flight and Red Flags suggestions? They're now in the actual checklist. The system improved itself. The changelog documents why: &lt;em&gt;"Added after instant retro caught inline styles and hardcoded strings that slipped through."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is what "AI as a first-class engineering role" looks like in practice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Objections
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "This will slow us down"
&lt;/h3&gt;

&lt;p&gt;The checklist takes 30 seconds to scan mentally for small changes. The time saved by not accumulating technical debt far exceeds this cost. Ask anyone who's spent a week trying to upgrade a framework in a messy codebase.&lt;/p&gt;

&lt;h3&gt;
  
  
  "We already do code review"
&lt;/h3&gt;

&lt;p&gt;Code review typically focuses on "does this work?" and "is there an obvious bug?" The checkpoint questions focus on "will we regret this?" and "can someone else understand this?" They're complementary.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Some of these don't apply to my project"
&lt;/h3&gt;

&lt;p&gt;Remove what doesn't apply. Add what does. The checklist is a starting point, not a mandate. The meta question is the only universal requirement.&lt;/p&gt;

&lt;h3&gt;
  
  
  "My team won't adopt this"
&lt;/h3&gt;

&lt;p&gt;Start alone. If it makes your code better, others will notice. If it doesn't, stop doing it. The approach proves itself through results, not mandates.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Start
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Copy the checklist&lt;/strong&gt; into your project's documentation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customize it&lt;/strong&gt; for your project type and tech stack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask the meta question&lt;/strong&gt; at your next PR: "Would a new developer understand this?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add the accountability question&lt;/strong&gt; to your end-of-day routine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate&lt;/strong&gt; based on what patterns you catch&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You don't need buy-in from your whole team. You don't need a new tool. You just need to ask better questions at natural stopping points.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus: Automate It with Hooks
&lt;/h2&gt;

&lt;p&gt;If you read Part 3 (Automating Everything with Hooks), you might be wondering: can we automate instant retrospectives too?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yes.&lt;/strong&gt; The same hooks that auto-generate session handoffs can trigger retrospective prompts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"SessionEnd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python ~/.claude/hooks/session_handoff.py"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python ~/.claude/hooks/retro_prompt.py"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;retro_prompt.py&lt;/code&gt; hook could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Output the accountability question to stdout&lt;/li&gt;
&lt;li&gt;Remind Claude to run the checkpoint checklist&lt;/li&gt;
&lt;li&gt;Create a Jira ticket for any debt identified&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This turns the instant retrospective from "Claude should do this" to "Claude will automatically do this." The hook system from Part 3 makes the quality system from Part 4 inevitable rather than aspirational.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Insight
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Retrospectives are too late. Quality is built into the rhythm of development, not bolted on at the end.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The best time to ask "should we do this differently?" is while you're still doing it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This approach emerged from a greenfield rebuild where we wanted to prevent the technical debt accumulation that had made the previous codebase unmaintainable. It's now part of our Mother CLAUDE documentation system and gets referenced at every checkpoint across all projects.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The checklist is open. The approach is portable. The goal is simple: catch problems before they become patterns.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article describes how we assigned quality enforcement to an AI assistant as a first-class engineering role—not a passive tool, but an active participant in maintaining code quality.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written collaboratively with Claude, using the instant retrospective process it describes.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;The checkpoint checklist and Mother CLAUDE system are open source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/Kobumura/mother-claude" rel="noopener noreferrer"&gt;github.com/Kobumura/mother-claude&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checklist&lt;/strong&gt;: &lt;code&gt;templates/checkpoint-checklist.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to fork it, adapt it, or use it as a reference for your own implementation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Licensed under &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;. Free to use and adapt with attribution to Dorothy J. Aubrey.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codequality</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
    <item>
      <title>Mother CLAUDE: Automating Everything with Hooks</title>
      <dc:creator>Dorothy J Aubrey</dc:creator>
      <pubDate>Tue, 27 Jan 2026 19:18:22 +0000</pubDate>
      <link>https://forem.com/dorothyjb/mother-claude-automating-everything-with-hooks-12jh</link>
      <guid>https://forem.com/dorothyjb/mother-claude-automating-everything-with-hooks-12jh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: We built three hooks that automate the Mother CLAUDE workflow: (1) auto-generate session handoffs on context compaction, (2) load previous handoffs at session start, and (3) auto-approve safe operations. Manual discipline becomes invisible infrastructure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Who this is for: Anyone who wants AI memory that doesn't depend on human discipline. Anyone tired of clicking "yes" to approve safe operations.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 3 of the Designing AI Teammates series.&lt;/strong&gt; Part 1 covered documentation structure. Part 2 covered why session handoffs matter. This one covers automating the workflow with hooks. Part 4 will cover quality checkpoints.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Session handoffs work. We covered that in Part 2. The template captures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What was accomplished&lt;/li&gt;
&lt;li&gt;Key decisions made&lt;/li&gt;
&lt;li&gt;Files modified&lt;/li&gt;
&lt;li&gt;Next steps&lt;/li&gt;
&lt;li&gt;Open questions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem? &lt;strong&gt;Humans forget to create them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You finish a productive session, you're in the flow, you close the terminal... and the handoff doesn't get written. The next session starts cold. All that context—gone.&lt;/p&gt;

&lt;p&gt;We needed handoffs to happen automatically, without relying on human discipline at the end of a long session.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: Claude Code Hooks
&lt;/h2&gt;

&lt;p&gt;Claude Code has a hooks system that runs scripts at specific events. Two events matter for us:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hook&lt;/th&gt;
&lt;th&gt;When It Fires&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PreCompact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Before context compression&lt;/td&gt;
&lt;td&gt;Captures everything before detail is lost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SessionEnd&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;When you close the session&lt;/td&gt;
&lt;td&gt;Captures final state&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The hook receives the full conversation transcript. We can parse it, send it to Claude Haiku for summarization, and save a structured handoff document—all automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────┐
│                  Claude Code Session                 │
│                                                     │
│  [Working...]  [Working...]  [Context getting full] │
│                                                     │
│                         │                           │
│                         ▼                           │
│              ┌──────────────────┐                   │
│              │  PreCompact Hook │                   │
│              └────────┬─────────┘                   │
│                       │                             │
└───────────────────────┼─────────────────────────────┘
                        │
                        ▼
              ┌──────────────────┐
              │ session_handoff  │
              │     .py          │
              │                  │
              │ 1. Read transcript
              │ 2. Parse conversation
              │ 3. Call Claude Haiku
              │ 4. Save handoff.md
              └────────┬─────────┘
                       │
                       ▼
         ┌─────────────────────────────┐
         │  docs/session_handoffs/      │
         │  20260121-1145-hooks-setup.md│
         └─────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: The Hook Script
&lt;/h3&gt;

&lt;p&gt;A Python script that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Receives hook input via stdin (includes transcript path)&lt;/li&gt;
&lt;li&gt;Parses the JSONL transcript into readable conversation&lt;/li&gt;
&lt;li&gt;Sends it to Claude Haiku with a structured prompt&lt;/li&gt;
&lt;li&gt;Extracts a descriptive title for the filename&lt;/li&gt;
&lt;li&gt;Saves to the project's &lt;code&gt;session_handoffs/&lt;/code&gt; directory
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Mother CLAUDE Session Handoff Generator

Runs on PreCompact (auto) and SessionEnd events to automatically
generate session handoff documents using Claude Haiku.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse_transcript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transcript_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Parse JSONL transcript into readable conversation.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transcript_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;human&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extract_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;USER: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extract_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ASSISTANT: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Return last 80 messages for context
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Use Claude Haiku to generate a session handoff.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-3-haiku-20240307&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;HANDOFF_PROMPT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%Y-%m-%d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: The Prompt Template
&lt;/h3&gt;

&lt;p&gt;The prompt asks for a comprehensive handoff matching our template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;HANDOFF_TEMPLATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Generate a session handoff document with these sections:

SHORT_TITLE: [2-4 words, hyphenated, for filename]

# Session Handoff - [Descriptive Title]

**Date**: {date}
**Focus**: [Main focus of this session]
**Status**: [Current state of the work]

## Quick Context
**What&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s Working:** [Specific things that are functional]
**What Needs Attention:** [Issues, blockers, pending decisions]

## Completed This Session
### [Feature/Task Name]
**Files Created/Modified:**
- `path/to/file.ext` - [What was done]

**Details:** [Technical specifics]

## Technical Discoveries
- **[Topic]**: [What was learned]

## Files Changed This Session
### New Files
### Modified Files

## Next Steps
1. [ ] [Actionable task]

## Open Questions
- [Unresolved decisions]
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Hook Configuration
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PreCompact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python ~/.claude/hooks/session_handoff.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SessionEnd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python ~/.claude/hooks/session_handoff.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: API Key Setup
&lt;/h3&gt;

&lt;p&gt;Store your Anthropic API key as an environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Linux/Mac&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY_HOOKS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-ant-..."&lt;/span&gt;

&lt;span class="c"&gt;# Windows PowerShell&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;System.Environment]::SetEnvironmentVariable&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"ANTHROPIC_API_KEY_HOOKS"&lt;/span&gt;,
    &lt;span class="s2"&gt;"sk-ant-..."&lt;/span&gt;,
    &lt;span class="s2"&gt;"User"&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using a separate key (&lt;code&gt;ANTHROPIC_API_KEY_HOOKS&lt;/code&gt;) lets you track usage for automated handoffs separately from your main Claude Code usage.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before: Manual Handoffs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;End of session:
- Forget to create handoff (60% of the time)
- Create hasty handoff (30% of the time)
- Create thorough handoff (10% of the time)

Next session:
- Spend 10-15 minutes re-establishing context
- Miss important details from previous session
- Repeat work already done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After: Automatic Handoffs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;End of session:
- Hook fires automatically
- Handoff created in ~30 seconds
- Saved to docs/session_handoffs/

Next session:
- Read most recent handoff
- Productive in 2-3 minutes
- Full context preserved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Example Output
&lt;/h2&gt;

&lt;p&gt;Here's an actual auto-generated handoff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Session Handoff - Implementing Automated Session Handoffs&lt;/span&gt;

&lt;span class="gs"&gt;**Date**&lt;/span&gt;: 2026-01-21
&lt;span class="gs"&gt;**Focus**&lt;/span&gt;: Integrating Claude hooks to automatically generate session handoffs
&lt;span class="gs"&gt;**Status**&lt;/span&gt;: Feature complete, ready for testing
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## Quick Context&lt;/span&gt;

&lt;span class="gs"&gt;**What's Working:**&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Claude hook script written in Python to summarize sessions
&lt;span class="p"&gt;-&lt;/span&gt; Hooks configured to trigger on auto-compact and session end
&lt;span class="p"&gt;-&lt;/span&gt; Handoff files being generated in the expected location

&lt;span class="gs"&gt;**What Needs Attention:**&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; API key needs to be regenerated (was exposed during testing)
&lt;span class="p"&gt;-&lt;/span&gt; Template may need refinement based on real-world usage
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## Completed This Session&lt;/span&gt;

&lt;span class="gu"&gt;### Implement Hook-Driven Session Handoffs&lt;/span&gt;
&lt;span class="gs"&gt;**Files Created/Modified:**&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`~/.claude/hooks/session_handoff.py`&lt;/span&gt; - Python script to generate handoffs
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`~/.claude/settings.json`&lt;/span&gt; - Hook configuration

&lt;span class="gs"&gt;**Details:**&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Wrote a Python script using the Anthropic API to summarize transcripts
&lt;span class="p"&gt;-&lt;/span&gt; Configured two hook triggers: PreCompact (auto) and SessionEnd
&lt;span class="p"&gt;-&lt;/span&gt; Script auto-detects working directory to determine project context
&lt;span class="p"&gt;-&lt;/span&gt; Handoff files saved to project's &lt;span class="sb"&gt;`docs/session_handoffs/`&lt;/span&gt;
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## Technical Discoveries&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**Environment Variables**&lt;/span&gt;: Using separate API key for hooks allows
  tracking automated usage separately from interactive sessions
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Hook Timing**&lt;/span&gt;: PreCompact fires BEFORE compression, so full context
  is still available for summarization
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## Files Changed This Session&lt;/span&gt;

&lt;span class="gu"&gt;### New Files&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`~/.claude/hooks/session_handoff.py`&lt;/span&gt; - Handoff generation script

&lt;span class="gu"&gt;### Modified Files&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`~/.claude/settings.json`&lt;/span&gt; - Added hook configuration
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## Next Steps&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; [ ] Regenerate API key (current one exposed in conversation)
&lt;span class="p"&gt;2.&lt;/span&gt; [ ] Test on different projects to verify directory detection
&lt;span class="p"&gt;3.&lt;/span&gt; [ ] Consider adding git commit info to handoffs
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## Open Questions&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Should handoffs include actual code snippets from the session?
&lt;span class="p"&gt;-&lt;/span&gt; How to handle very long sessions that exceed Haiku's context window?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Meta Moment: Using Claude to Summarize Claude
&lt;/h2&gt;

&lt;p&gt;There's something delightfully recursive about this setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You work with Claude Code (Claude Opus/Sonnet)&lt;/li&gt;
&lt;li&gt;Session ends or context fills&lt;/li&gt;
&lt;li&gt;Hook sends transcript to Claude Haiku&lt;/li&gt;
&lt;li&gt;Haiku summarizes what Opus/Sonnet did&lt;/li&gt;
&lt;li&gt;Summary helps the next Opus/Sonnet session&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Claude is documenting its own work for its future self.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This isn't just automation—it's AI infrastructure supporting AI collaboration.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Two Triggers? (And the Bug We Found)
&lt;/h2&gt;

&lt;p&gt;Our first implementation used two triggers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PreCompact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Context about to compress&lt;/td&gt;
&lt;td&gt;Capture everything before detail is lost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SessionEnd&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Session closes&lt;/td&gt;
&lt;td&gt;Ensure final state is captured&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Simple, right? Both triggers run the same script. What could go wrong?&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem We Discovered
&lt;/h3&gt;

&lt;p&gt;A reader (okay, it was us during testing) noticed a flaw:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;PreCompact fires&lt;/strong&gt; → Rich, detailed handoff saved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context compresses&lt;/strong&gt; → Detail lost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SessionEnd fires&lt;/strong&gt; → &lt;em&gt;Second&lt;/em&gt; handoff saved (thinner, post-compression)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next session starts&lt;/strong&gt; → SessionStart loads the &lt;em&gt;most recent&lt;/em&gt; handoff&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oops&lt;/strong&gt; → You loaded the thin SessionEnd handoff, not the rich PreCompact one&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The good handoff got buried by the thin one.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix: Smart Deduplication
&lt;/h3&gt;

&lt;p&gt;We updated the script to track state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# PreCompact: save marker with transcript size
&lt;/span&gt;&lt;span class="nf"&gt;save_handoff_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transcript_size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# SessionEnd: check if PreCompact already ran
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;should_skip_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;cleanup_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Skip - no new work since PreCompact
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The logic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PreCompact&lt;/strong&gt; always generates a handoff and saves the transcript size&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SessionEnd&lt;/strong&gt; checks: did PreCompact already run? Did the transcript grow significantly (&amp;gt;10%)?

&lt;ul&gt;
&lt;li&gt;If no significant new work → skip&lt;/li&gt;
&lt;li&gt;If new work happened after compact → generate new handoff&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This handles all scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compact then close immediately → SessionEnd skips (PreCompact got it)&lt;/li&gt;
&lt;li&gt;Compact, more work, then close → SessionEnd generates (new work to capture)&lt;/li&gt;
&lt;li&gt;Short session, just close → SessionEnd generates (only trigger)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The lesson: test your hooks end-to-end.&lt;/strong&gt; The obvious solution (two triggers, same script) had a subtle interaction problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Handling Large Sessions
&lt;/h2&gt;

&lt;p&gt;Haiku has a smaller context window than Opus. For very long sessions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The script takes the &lt;strong&gt;last 80 messages&lt;/strong&gt; of the conversation&lt;/li&gt;
&lt;li&gt;Each message is truncated to 3,000 characters&lt;/li&gt;
&lt;li&gt;This keeps the most recent (and usually most relevant) context&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For most sessions, this captures everything that matters. The early parts of very long sessions (initial exploration, early false starts) are often less valuable than the recent work anyway.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cost Considerations
&lt;/h2&gt;

&lt;p&gt;Claude Haiku is cheap. A typical handoff:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input: ~50,000 tokens (conversation)&lt;/li&gt;
&lt;li&gt;Output: ~1,500 tokens (handoff)&lt;/li&gt;
&lt;li&gt;Cost: ~$0.02-0.03 per handoff&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even with multiple sessions per day, the monthly cost is negligible compared to the value of preserved context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro tip&lt;/strong&gt;: Create a separate API key for hooks. The Anthropic console shows usage per key, so you can track exactly how much your automated handoffs cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choosing a Model
&lt;/h3&gt;

&lt;p&gt;As of this writing, we use Claude Haiku (&lt;code&gt;claude-3-haiku-20240307&lt;/code&gt;) for handoff generation. It's cheap, fast, and good enough for structured summarization.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Cost per Handoff&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;th&gt;When to Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Haiku&lt;/td&gt;
&lt;td&gt;~$0.02&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Default choice - summarization doesn't need genius&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;~$0.15&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;If you want richer, more nuanced summaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus&lt;/td&gt;
&lt;td&gt;~$1+&lt;/td&gt;
&lt;td&gt;Slower&lt;/td&gt;
&lt;td&gt;Overkill for handoffs - save it for real work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;To change models, edit &lt;code&gt;session_handoff.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Default
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-3-haiku-20240307&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# For richer summaries (costs more)
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-20250514&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anthropic releases new models regularly. Check &lt;a href="https://docs.anthropic.com" rel="noopener noreferrer"&gt;docs.anthropic.com&lt;/a&gt; for the latest model IDs. The hook script in our repo uses Haiku, but swap in whatever model suits your needs and budget.&lt;/p&gt;




&lt;h2&gt;
  
  
  Extending the System
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Add Git Info
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_recent_commits&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;git&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;log&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--oneline&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add to Multiple Projects
&lt;/h3&gt;

&lt;p&gt;The script auto-detects the project from &lt;code&gt;cwd&lt;/code&gt; and finds the right &lt;code&gt;session_handoffs/&lt;/code&gt; directory. It works across all your projects without configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Customize Per Project
&lt;/h3&gt;

&lt;p&gt;If you need project-specific handoff formats, add a &lt;code&gt;.claude/handoff-config.json&lt;/code&gt; to any project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"template"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"custom"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"include_git"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extra_sections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Jira Tickets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"API Changes"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Known Limitations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can't Prevent Compaction
&lt;/h3&gt;

&lt;p&gt;PreCompact hooks can run side effects but can't stop compaction. The handoff happens, then compaction proceeds. This is fine—we just want to capture context, not block the workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Timeout
&lt;/h3&gt;

&lt;p&gt;Hooks have a 60-second default timeout (we set 120). Very long transcripts might need more time. The script handles timeouts gracefully—a failed handoff is better than a blocked session.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Dependency
&lt;/h3&gt;

&lt;p&gt;Requires an Anthropic API key and internet connection. If the API is down, the hook fails silently. Consider adding local fallback summarization for offline work.&lt;/p&gt;




&lt;h2&gt;
  
  
  How This Works with Agents
&lt;/h2&gt;

&lt;p&gt;If you're using Claude Code's Task tool to spawn subagents (Explore, Plan, etc.), here's what you need to know:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Hook Fires?&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Main session starts&lt;/td&gt;
&lt;td&gt;✅ SessionStart&lt;/td&gt;
&lt;td&gt;Loads previous handoff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subagent spawned&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;Subagents are subprocesses, not new sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subagent finishes&lt;/td&gt;
&lt;td&gt;❌ None*&lt;/td&gt;
&lt;td&gt;Results return to main session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main session ends&lt;/td&gt;
&lt;td&gt;✅ SessionEnd&lt;/td&gt;
&lt;td&gt;Generates handoff including subagent work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;This is actually the right behavior:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The main session is the orchestrator—it has context and makes decisions&lt;/li&gt;
&lt;li&gt;Subagents are workers—they do specific tasks and report back&lt;/li&gt;
&lt;li&gt;The main session's handoff captures &lt;em&gt;everything&lt;/em&gt;, including what subagents accomplished&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You don't need separate handoffs for subagents because their work flows back to the main session. When the main session's handoff gets generated, it includes the full picture.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*Claude Code does have a &lt;code&gt;SubagentStop&lt;/code&gt; hook if you want to capture subagent completions separately, but for most workflows the main session handoff is sufficient.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus Hook #1: Auto-Load Previous Handoffs
&lt;/h2&gt;

&lt;p&gt;Writing handoffs is half the equation. The other half: making sure Claude &lt;em&gt;reads&lt;/em&gt; them.&lt;/p&gt;

&lt;h3&gt;
  
  
  The SessionStart Hook
&lt;/h3&gt;

&lt;p&gt;When you start a new Claude Code session, the &lt;code&gt;SessionStart&lt;/code&gt; hook fires. We use it to automatically load the most recent handoff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# session_start.py - outputs previous handoff to stdout
&lt;/span&gt;&lt;span class="n"&gt;handoffs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docs/session_handoffs/*.md&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;handoffs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Previous handoff: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;handoffs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handoffs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude sees this output as context at the start of every session. No manual loading required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Add to &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"SessionStart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python ~/.claude/hooks/session_start.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Every new session starts with context from the previous one. The handoffs we auto-generate get auto-loaded. The circle is complete.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus Hook #2: Auto-Approve Safe Operations
&lt;/h2&gt;

&lt;p&gt;If you've used Claude Code for more than an hour, you've clicked "yes" to approve &lt;code&gt;git status&lt;/code&gt; approximately 47 times.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Permission Fatigue Problem
&lt;/h3&gt;

&lt;p&gt;Claude Code asks permission for potentially dangerous operations. This is good! But it also asks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npm test&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Reading files&lt;/li&gt;
&lt;li&gt;And dozens of other safe operations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The PermissionRequest Hook
&lt;/h3&gt;

&lt;p&gt;This hook intercepts permission requests and auto-approves safe ones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# auto_approve.py
&lt;/span&gt;&lt;span class="n"&gt;always_safe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Read&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Glob&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Grep&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Edit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;safe_bash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;^git\s+(status|log|diff|add|commit|push|pull)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;^npm\s+(test|run|install)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;^ls(\s|$)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;dangerous&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\bsudo\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;git\s+push\s+.*--force&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;git\s+reset\s+--hard&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What gets auto-approved:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All file operations (Read, Write, Edit)&lt;/li&gt;
&lt;li&gt;Git operations (add, commit, push, pull)&lt;/li&gt;
&lt;li&gt;Package management (npm install, pip install)&lt;/li&gt;
&lt;li&gt;Build/test commands&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What still requires approval:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sudo&lt;/code&gt; anything&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push --force&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git reset --hard&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Destructive operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Configuration:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"PermissionRequest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python ~/.claude/hooks/auto_approve.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Claude flows. No more clicking "yes" fifty times a session. Dangerous operations still get caught.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project-Specific Configuration
&lt;/h2&gt;

&lt;p&gt;Different projects might want different settings. Create &lt;code&gt;.claude/project.json&lt;/code&gt; in any project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handoffs_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docs/session_handoffs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handoffs_to_load"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;handoffs_path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docs/session_handoffs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Where to read/write handoffs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;handoffs_to_load&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;How many previous handoffs to load&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both the session_handoff.py and session_start.py scripts check for this config.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Complete Hook Suite
&lt;/h2&gt;

&lt;p&gt;Here's what we built:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hook&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;session_handoff.py&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PreCompact, SessionEnd&lt;/td&gt;
&lt;td&gt;Auto-generates handoff documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;session_start.py&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SessionStart&lt;/td&gt;
&lt;td&gt;Loads previous handoff into context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;auto_approve.py&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PermissionRequest&lt;/td&gt;
&lt;td&gt;Auto-approves safe operations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The full settings.json:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SessionStart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python ~/.claude/hooks/session_start.py"&lt;/span&gt;&lt;span class="p"&gt;}]}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PreCompact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python ~/.claude/hooks/session_handoff.py"&lt;/span&gt;&lt;span class="p"&gt;}]}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SessionEnd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python ~/.claude/hooks/session_handoff.py"&lt;/span&gt;&lt;span class="p"&gt;}]}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PermissionRequest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python ~/.claude/hooks/auto_approve.py"&lt;/span&gt;&lt;span class="p"&gt;}]}]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Setup Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;[ ] &lt;strong&gt;Install Python 3.8+&lt;/strong&gt; and the &lt;code&gt;anthropic&lt;/code&gt; package (&lt;code&gt;pip install anthropic&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Copy hook scripts&lt;/strong&gt; to &lt;code&gt;~/.claude/hooks/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Configure hooks&lt;/strong&gt; in &lt;code&gt;~/.claude/settings.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Set API key&lt;/strong&gt; as environment variable&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Restart terminal&lt;/strong&gt; (hooks load at session start)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Verify&lt;/strong&gt; by starting a new session and checking for previous handoff&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Prefer Node.js?
&lt;/h3&gt;

&lt;p&gt;We've included a smoke-tested Node.js version (&lt;code&gt;session_handoff.js&lt;/code&gt;) in the repo. If you prefer Node:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install: &lt;code&gt;npm install @anthropic-ai/sdk&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Update settings.json to use &lt;code&gt;node&lt;/code&gt; instead of &lt;code&gt;python&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Python version is our primary, daily-driver implementation. Only the main handoff script has a Node version—the simpler scripts (&lt;code&gt;session_start.py&lt;/code&gt;, &lt;code&gt;auto_approve.py&lt;/code&gt;) are Python-only but straightforward to port.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contributions welcome!&lt;/strong&gt; If you create Node versions of the other scripts, find bugs, improve the templates, or have ideas—we'd love PRs. This is a community resource.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Insight
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The best documentation is documentation that writes itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Session handoffs are valuable. But relying on human discipline at the end of a long session is a recipe for forgotten context.&lt;/p&gt;

&lt;p&gt;By automating handoffs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory persists without effort&lt;/li&gt;
&lt;li&gt;Every session is documented&lt;/li&gt;
&lt;li&gt;Context survives across sessions, machines, and time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The goal isn't to replace human judgment. It's to ensure the conversation happens.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This system was built in a single afternoon over lunch—and documented by the very hook system it describes. The handoff you're reading about was generated by the hook that creates handoffs. That's the feedback loop working as intended.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written collaboratively with Claude, using the automated handoff system it describes.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;The complete hook suite and Mother CLAUDE system are open source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/Kobumura/mother-claude" rel="noopener noreferrer"&gt;github.com/Kobumura/mother-claude&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All hooks&lt;/strong&gt;: &lt;code&gt;hooks/&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settings template&lt;/strong&gt;: &lt;code&gt;hooks/settings-template.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup guide&lt;/strong&gt;: &lt;code&gt;hooks/README.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to fork it, adapt it, or use it as a reference for your own implementation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Licensed under &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;. Free to use and adapt with attribution to Dorothy J. Aubrey.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>productivity</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Mother CLAUDE: Session Handoffs Give Your AI Memory That Actually Persists</title>
      <dc:creator>Dorothy J Aubrey</dc:creator>
      <pubDate>Mon, 19 Jan 2026 14:38:13 +0000</pubDate>
      <link>https://forem.com/dorothyjb/session-handoffs-giving-your-ai-assistant-memory-that-actually-persists-je9</link>
      <guid>https://forem.com/dorothyjb/session-handoffs-giving-your-ai-assistant-memory-that-actually-persists-je9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: LLM sessions are ephemeral — when context fills up or you close the window, everything learned is gone. Session handoffs are structured documents that bridge this gap, giving your AI assistant persistent memory that survives across sessions, tools, and team changes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Who this is for: Anyone using AI coding assistants who's frustrated by re-explaining context every session. Works with Claude, Kiro, Cursor, or whatever comes next.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2 of the Designing AI Teammates series.&lt;/strong&gt; &lt;a href="https://dev.to/dorothyjb/how-we-built-a-documentation-system-that-makes-llms-productive-immediately-59hc"&gt;Part 1&lt;/a&gt; covered onboarding an AI assistant using durable documentation. This article covers the next step: making that knowledge persist across the inevitable session boundaries.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You've had a productive 3-hour session with your AI assistant. You've:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debugged a tricky race condition&lt;/li&gt;
&lt;li&gt;Decided on an architectural approach after discussing tradeoffs&lt;/li&gt;
&lt;li&gt;Learned that a particular library has quirks the AI now understands&lt;/li&gt;
&lt;li&gt;Built shared context about why certain code looks the way it does&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then the session ends. Maybe you hit the context limit. Maybe you closed your laptop. Maybe it's just tomorrow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everything is gone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The next session starts fresh. The AI doesn't remember the race condition, the architectural decision, the library quirks, or the context you built. You're back to explaining basics.&lt;/p&gt;

&lt;p&gt;This is the fundamental limitation of LLM sessions: &lt;strong&gt;they're stateless by design&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What About Built-In Memory Features?
&lt;/h2&gt;

&lt;p&gt;Modern AI tools are adding memory and context management features:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code's &lt;code&gt;/compact&lt;/code&gt; command&lt;/strong&gt; summarizes the conversation to free up context space. It helps you work longer within a single session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built-in AI Memory&lt;/strong&gt; (in various tools) persists facts across conversations. "Remember that I prefer TypeScript" carries forward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor and similar tools&lt;/strong&gt; maintain some conversation history and context awareness.&lt;/p&gt;

&lt;p&gt;These help. But they share limitations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What it solves&lt;/th&gt;
&lt;th&gt;What it doesn't solve&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compacting&lt;/td&gt;
&lt;td&gt;Extends single session&lt;/td&gt;
&lt;td&gt;Doesn't survive session end&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Memory&lt;/td&gt;
&lt;td&gt;Persists preferences&lt;/td&gt;
&lt;td&gt;Opaque — you can't see/search what's stored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool history&lt;/td&gt;
&lt;td&gt;Recent conversation access&lt;/td&gt;
&lt;td&gt;Locked to that specific tool&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The core problem remains:&lt;/strong&gt; Your hard-won context is locked in a black box you don't control, can't search, and can't take with you.&lt;/p&gt;

&lt;p&gt;What happens when you switch from Claude to Kiro? When you upgrade accounts? When a teammate needs to pick up where you left off?&lt;/p&gt;

&lt;p&gt;The institutional memory disappears.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: Session Handoffs
&lt;/h2&gt;

&lt;p&gt;Session handoffs are structured documents that capture session context in a format that's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Human-readable&lt;/strong&gt; — You can review what was captured&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-readable&lt;/strong&gt; — The next session can load and understand it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Searchable&lt;/strong&gt; — Grep works. Find that decision from 3 weeks ago.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool-agnostic&lt;/strong&gt; — Works with any AI assistant, current or future&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version-controlled&lt;/strong&gt; — Lives in git with your code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the end of each work session, the AI creates a handoff document. At the start of the next session, the AI reads the most recent handoff. Context is restored in seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Gets Captured
&lt;/h2&gt;

&lt;p&gt;A session handoff includes:&lt;/p&gt;

&lt;h3&gt;
  
  
  What Was Accomplished
&lt;/h3&gt;

&lt;p&gt;Completed tasks and decisions made. Not just "fixed bug" but "fixed race condition in WebSocket reconnection by adding a mutex lock — decided against debouncing because we need guaranteed delivery."&lt;/p&gt;

&lt;h3&gt;
  
  
  Current State
&lt;/h3&gt;

&lt;p&gt;Where things stand right now. Any running processes, partial implementations, or work in progress. "Auth flow is 80% complete — login works, logout not yet implemented, token refresh untested."&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons Learned
&lt;/h3&gt;

&lt;p&gt;What worked, what didn't, mistakes to avoid. "Tried using library X for date parsing — it doesn't handle timezones correctly. Switched to library Y." This prevents the next session from making the same mistakes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Next Steps
&lt;/h3&gt;

&lt;p&gt;What needs to happen next. Clear, actionable items. "1. Implement logout endpoint. 2. Add token refresh logic. 3. Write tests for auth flow."&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Files Modified
&lt;/h3&gt;

&lt;p&gt;Quick reference for the next session. The AI can read these first to rebuild context efficiently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blockers
&lt;/h3&gt;

&lt;p&gt;Unresolved problems that need attention. "Waiting on API credentials from third-party vendor. Can't test payment flow until received."&lt;/p&gt;




&lt;h2&gt;
  
  
  When to Create a Handoff
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Approaching context limits:&lt;/strong&gt; Claude Code will notify you when context is filling up. This is your cue — capture context before it's compacted or lost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Natural stopping points:&lt;/strong&gt; Completed a feature? Reached a milestone? Good time to checkpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before switching tasks:&lt;/strong&gt; About to pivot from backend work to frontend? Capture where you left off so you can return cleanly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;End of work session:&lt;/strong&gt; Closing your laptop for the day? Future-you (or future-AI) will thank you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before major decisions:&lt;/strong&gt; About to choose between two architectural approaches? Document the tradeoffs you've discussed so you don't re-debate them next session.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ending a Session
&lt;/h3&gt;

&lt;p&gt;When it's time to wrap up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI creates the handoff&lt;/strong&gt; — Based on the session's work, Claude drafts the document&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human reviews&lt;/strong&gt; — Quick sanity check that key points are captured&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File gets saved&lt;/strong&gt; — To &lt;code&gt;docs/session_handoffs/YYYYMMDD-HHMM-brief-description.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Committed to git&lt;/strong&gt; — Now it's versioned and backed up&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Starting a New Session
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI checks for handoffs&lt;/strong&gt; — Looks in &lt;code&gt;docs/session_handoffs/&lt;/code&gt; for the most recent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reads and acknowledges&lt;/strong&gt; — "I see from the last session that you completed X and next steps are Y"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work continues&lt;/strong&gt; — No re-explanation needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The transition takes seconds instead of the 10-15 minutes of re-establishing context manually.&lt;/p&gt;




&lt;h2&gt;
  
  
  Short-Term Benefits
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Immediate context restoration.&lt;/strong&gt; No more "let me explain the codebase structure again." The handoff contains it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continuity on complex tasks.&lt;/strong&gt; Multi-day features don't lose momentum. Each session picks up exactly where the last ended.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reduced cognitive load.&lt;/strong&gt; You don't have to remember everything to tell the AI. The handoff remembers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better compacting outcomes.&lt;/strong&gt; When Claude does compact mid-session, the handoff supplements what might be lost in summarization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team handoffs.&lt;/strong&gt; Someone else needs to pick up your work? Point them to the handoff. Works for human teammates too.&lt;/p&gt;




&lt;h2&gt;
  
  
  Long-Term Benefits
&lt;/h2&gt;

&lt;p&gt;This is where session handoffs differentiate from built-in memory features:&lt;/p&gt;

&lt;h3&gt;
  
  
  Searchable Project Archeology
&lt;/h3&gt;

&lt;p&gt;Three weeks from now: "When did we decide to use PostgreSQL instead of MongoDB?"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"PostgreSQL"&lt;/span&gt; docs/session_handoffs/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Found. The handoff from January 15th documents the decision and reasoning.&lt;/p&gt;

&lt;p&gt;Built-in AI memory can't do this. You can't grep Cursor's brain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision Documentation
&lt;/h3&gt;

&lt;p&gt;Handoffs capture not just what was done but &lt;strong&gt;why&lt;/strong&gt;. The "Lessons Learned" section preserves reasoning that would otherwise evaporate.&lt;/p&gt;

&lt;p&gt;Six months later, someone asks: "Why does this code handle timezones so weirdly?"&lt;/p&gt;

&lt;p&gt;The handoff explains: "Library X doesn't handle DST transitions. This workaround was added after 3 hours of debugging. Don't 'simplify' it."&lt;/p&gt;

&lt;h3&gt;
  
  
  Survives Tool Changes
&lt;/h3&gt;

&lt;p&gt;Using Claude today. Codex 44 releases tomorrow and you want to try it. Your session handoffs work with any tool — they're just markdown files.&lt;/p&gt;

&lt;p&gt;Your institutional memory isn't locked in a vendor's black box.&lt;/p&gt;

&lt;h3&gt;
  
  
  Survives Team Changes
&lt;/h3&gt;

&lt;p&gt;New developer joins the team. New AI assistant starts fresh. The handoffs provide onboarding context for both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern Recognition
&lt;/h3&gt;

&lt;p&gt;Over months, handoffs reveal patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which areas of the codebase cause the most trouble?&lt;/li&gt;
&lt;li&gt;What decisions keep getting revisited?&lt;/li&gt;
&lt;li&gt;Where do sessions tend to get stuck?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is organizational learning that no individual session could provide.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Template
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Session Handoff - [Date] [Time]&lt;/span&gt;

&lt;span class="gu"&gt;## What We Accomplished&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [Completed task with context on approach taken]
&lt;span class="p"&gt;-&lt;/span&gt; [Decision made and why]

&lt;span class="gu"&gt;## Current State&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [Where the work stands]
&lt;span class="p"&gt;-&lt;/span&gt; [Any running processes or partial implementations]

&lt;span class="gu"&gt;## Lessons Learned&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [What worked well]
&lt;span class="p"&gt;-&lt;/span&gt; [What didn't work / mistakes to avoid]

&lt;span class="gu"&gt;## Next Steps&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] [Clear, actionable next task]
&lt;span class="p"&gt;-&lt;/span&gt; [ ] [Another task]

&lt;span class="gu"&gt;## Key Files Modified&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`path/to/file.ts`&lt;/span&gt; - [what changed]
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`path/to/other.ts`&lt;/span&gt; - [what changed]

&lt;span class="gu"&gt;## Blockers / Open Questions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [Unresolved problems]
&lt;span class="p"&gt;-&lt;/span&gt; [Questions that need answers before proceeding]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save to: &lt;code&gt;docs/session_handoffs/YYYYMMDD-HHMM-brief-description.md&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Example: &lt;code&gt;docs/session_handoffs/20250112-1430-auth-flow-implementation.md&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Making It Automatic
&lt;/h2&gt;

&lt;p&gt;The real power comes when you don't have to remember to do this.&lt;/p&gt;

&lt;p&gt;In Part 1, we described how Mother CLAUDE contains instructions that the AI follows automatically. Session handoffs are part of those instructions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;At natural stopping points, initiate a session handoff. Don't wait for the human to ask. You're a team member, not just a tool.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When context is filling up, Claude proactively says: "We're approaching the context limit. Let me create a session handoff before we continue."&lt;/p&gt;

&lt;p&gt;The human's job shifts from "remember to create handoffs" to "review the handoff Claude created." Much easier cognitive load.&lt;/p&gt;




&lt;h2&gt;
  
  
  Handoffs vs. Compacting: Complementary, Not Competing
&lt;/h2&gt;

&lt;p&gt;A common question: "If Claude can compact the conversation, why do I need handoffs?"&lt;/p&gt;

&lt;p&gt;They solve different problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compacting&lt;/strong&gt; is for &lt;strong&gt;within-session continuity&lt;/strong&gt;. It summarizes to free up context space so you can keep working. It's automatic and invisible — you don't control what's kept or lost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handoffs&lt;/strong&gt; are for &lt;strong&gt;cross-session continuity&lt;/strong&gt;. They're explicit documentation of what matters, in a format you control and can search.&lt;/p&gt;

&lt;p&gt;Best practice: Use both.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Let compacting extend your session when needed&lt;/li&gt;
&lt;li&gt;Create handoffs at meaningful stopping points&lt;/li&gt;
&lt;li&gt;The handoff captures what compacting might lose&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Objections
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "This is overhead I don't have time for"
&lt;/h3&gt;

&lt;p&gt;Creating a handoff takes 2-3 minutes. Re-establishing context without one takes 10-15 minutes. Every session.&lt;/p&gt;

&lt;p&gt;More importantly: with the right setup, Claude creates the handoff. You just review it.&lt;/p&gt;

&lt;h3&gt;
  
  
  "I'll just remember where I left off"
&lt;/h3&gt;

&lt;p&gt;You won't. Not the details. Not after a weekend. Not after switching between three projects.&lt;/p&gt;

&lt;p&gt;And even if you remember, you have to explain it to the AI. The handoff does that for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  "My AI tool has memory now"
&lt;/h3&gt;

&lt;p&gt;Great — use it too. But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can you search it?&lt;/li&gt;
&lt;li&gt;Can you see exactly what it stored?&lt;/li&gt;
&lt;li&gt;Will it work if you switch tools?&lt;/li&gt;
&lt;li&gt;Can a teammate access it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Session handoffs answer yes to all of these.&lt;/p&gt;

&lt;h3&gt;
  
  
  "This is just documentation"
&lt;/h3&gt;

&lt;p&gt;Yes. That's the point.&lt;/p&gt;

&lt;p&gt;Documentation that's structured for AI consumption, lives with your code, and survives beyond any single session or tool. That's institutional memory.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create the directory&lt;/strong&gt;: &lt;code&gt;mkdir -p docs/session_handoffs&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Save the template&lt;/strong&gt;: Copy the template above to &lt;code&gt;docs/session_handoffs/README.md&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tell your AI&lt;/strong&gt;: Add to your CLAUDE.md (or equivalent):&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   At session end or when approaching context limits, create a handoff
   document in docs/session_handoffs/ using the template in that directory.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start using it&lt;/strong&gt;: At the end of your next session, ask: "Let's create a session handoff before we wrap up."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Next session&lt;/strong&gt;: "Check docs/session_handoffs/ for the most recent handoff and pick up where we left off."&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After a few sessions, it becomes automatic. The AI knows to check for handoffs at session start and offer to create them at session end.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Insight
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LLM sessions are ephemeral. Your institutional memory shouldn't be.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Built-in memory features help, but they're black boxes locked to specific tools. Session handoffs give you transparent, searchable, portable memory that you control.&lt;/p&gt;

&lt;p&gt;The goal isn't to fight the stateless nature of LLM sessions. It's to build infrastructure that works with it — documentation that bridges the gaps and accumulates knowledge over time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is Part 2 of the Designing AI Teammates series. Part 1 covered onboarding with Mother CLAUDE. Part 3 will cover giving your AI assistant responsibility for initiating quality checkpoints.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written collaboratively with Claude, using the session handoff process it describes that is embedded in the Mother CLAUDE ecosystem that serves as the scaffolding for all of our projects.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;The session handoff template and Mother CLAUDE system are open source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/Kobumura/mother-claude" rel="noopener noreferrer"&gt;github.com/Kobumura/mother-claude&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Template&lt;/strong&gt;: &lt;code&gt;templates/session-handoff.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Licensed under &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;. Free to use and adapt with attribution to Dorothy J. Aubrey.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>documentation</category>
      <category>devops</category>
    </item>
    <item>
      <title>Mother CLAUDE: How We Built a Documentation System That Makes LLMs Productive Immediately</title>
      <dc:creator>Dorothy J Aubrey</dc:creator>
      <pubDate>Sat, 10 Jan 2026 12:56:40 +0000</pubDate>
      <link>https://forem.com/dorothyjb/how-we-built-a-documentation-system-that-makes-llms-productive-immediately-59hc</link>
      <guid>https://forem.com/dorothyjb/how-we-built-a-documentation-system-that-makes-llms-productive-immediately-59hc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: A three-tier documentation system that reduces LLM onboarding from hours to minutes across multi-repo, multi-language projects. First real-world test: Claude went from cold start to planning mode in under 5 minutes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Who this is for: Teams working across multiple repos or languages who want LLMs to be productive immediately without repeated onboarding or fragile session memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;While this was built for Claude Code, the architecture applies to any LLM with limited persistent memory—Kiro, Cursor, Copilot, or whatever comes next.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;LittleTalks is built across &lt;strong&gt;multiple projects in different languages&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;littletalks-mobile&lt;/td&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;iOS &amp;amp; Android app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;littletalks-api&lt;/td&gt;
&lt;td&gt;Node.js/Express&lt;/td&gt;
&lt;td&gt;Backend API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;littletalks-admin&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;Admin dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;littlepipes&lt;/td&gt;
&lt;td&gt;GitHub Actions&lt;/td&gt;
&lt;td&gt;CI/CD platform&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These projects share business logic, integrations (RevenueCat, Twilio, analytics), standards, and data contracts. Working with Claude Code across them, we kept hitting the same issues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context switching pain&lt;/strong&gt; - Starting a new session meant re-explaining project structure, conventions, and history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scattered documentation&lt;/strong&gt; - Important info spread across READMEs, code comments, and tribal knowledge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplication and drift&lt;/strong&gt; - Same information (Jira setup, commit guidelines) copy-pasted across repos, getting out of sync&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legacy project onboarding&lt;/strong&gt; - Rewriting old codebases required extensive explanation of "why things were built this way"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The goal&lt;/strong&gt;: Get Claude productive immediately, whether it's a fresh session or a completely new project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before&lt;/strong&gt;: First session spent explaining Jira setup, repo layout, commit conventions, and why certain patterns look duplicated across projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After&lt;/strong&gt;: First session critiqued the documentation system itself and moved directly into planning.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: Three-Tier Documentation Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│                     CONFLUENCE                          │
│  Business docs, marketing, non-technical                │
│  → Claude fetches on-demand via WebFetch                │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│              Shared Docs Repo (Mother CLAUDE)           │
│  Cross-project standards, deep technical guides         │
│  → Loaded at session start (lean) + on-demand (deep)    │
└─────────────────────────────────────────────────────────┘
                           │
          ┌────────────────┼────────────────┐
          ▼                ▼                ▼
┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐
│ Project CLAUDE.md │ │ Project CLAUDE.md │ │ Project CLAUDE.md │
│ Tech stack,       │ │ Tech stack,       │ │ Tech stack,       │
│ file structure,   │ │ file structure,   │ │ file structure,   │
│ dev commands      │ │ dev commands      │ │ dev commands      │
└───────────────────┘ └───────────────────┘ └───────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tier 1: Mother CLAUDE (Shared Standards)
&lt;/h3&gt;

&lt;p&gt;A dedicated repo (&lt;code&gt;littletalks-docs&lt;/code&gt;) containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CLAUDE.md&lt;/strong&gt; (~70 lines) - Jira setup, screenshot locations, commit guidelines, project paths&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;shared/&lt;/strong&gt; - Deep technical docs (journey system, analytics, API contracts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DOCUMENTATION-ARCHITECTURE.md&lt;/strong&gt; - Meta-documentation explaining the system itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every project's CLAUDE.md starts with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gt"&gt;&amp;gt; **Shared standards**: See `littletalks-docs/CLAUDE.md` for Jira, screenshots, commit guidelines.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tier 2: Project CLAUDE.md (Lean &amp;amp; Specific)
&lt;/h3&gt;

&lt;p&gt;Each project has its own CLAUDE.md that's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lean&lt;/strong&gt; (&amp;lt;100 lines) - Minimizes context cost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specific&lt;/strong&gt; - Tech stack, file structure, dev commands for THIS project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Referenced&lt;/strong&gt; - Points to Mother CLAUDE for shared standards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actionable&lt;/strong&gt; - Claude can start working immediately&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tier 3: On-Demand Deep Docs
&lt;/h3&gt;

&lt;p&gt;Detailed guides live in &lt;code&gt;shared/&lt;/code&gt; and are read only when needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Journey system architecture (1,251 lines)&lt;/li&gt;
&lt;li&gt;Analytics event tracking&lt;/li&gt;
&lt;li&gt;RevenueCat integration&lt;/li&gt;
&lt;li&gt;API contracts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps session context lean while making deep knowledge accessible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Design Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Single Source of Truth
&lt;/h3&gt;

&lt;p&gt;When we moved docs to the shared repo, we left &lt;strong&gt;pointer files&lt;/strong&gt; in the original locations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Document Moved&lt;/span&gt;
This document has been moved to &lt;span class="sb"&gt;`littletalks-docs/shared/journey-system.md`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No duplication = no drift.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Security Built In
&lt;/h3&gt;

&lt;p&gt;PHP projects deployed to web servers get &lt;code&gt;.htaccess&lt;/code&gt; in their &lt;code&gt;docs/&lt;/code&gt; folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="nc"&gt;Require&lt;/span&gt; &lt;span class="ss"&gt;all&lt;/span&gt; denied
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is documented in Mother CLAUDE so new projects know to add it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Session Handoffs
&lt;/h3&gt;

&lt;p&gt;A standardized template (&lt;code&gt;session-handoff-template.md&lt;/code&gt;) ensures continuity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What was accomplished&lt;/li&gt;
&lt;li&gt;Current state&lt;/li&gt;
&lt;li&gt;Lessons learned&lt;/li&gt;
&lt;li&gt;Next steps&lt;/li&gt;
&lt;li&gt;Key files modified&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each project has a &lt;code&gt;docs/session_handoffs/&lt;/code&gt; directory for these.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Self-Documenting
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;DOCUMENTATION-ARCHITECTURE.md&lt;/code&gt; file explains the entire system. New Claudes can understand the architecture without human explanation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Known Failure Modes
&lt;/h2&gt;

&lt;p&gt;This system breaks down if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project CLAUDE.md files grow beyond ~100 lines&lt;/strong&gt; - Context cost defeats the purpose&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep docs are loaded eagerly instead of on demand&lt;/strong&gt; - Session bloat, slower responses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared standards are duplicated instead of referenced&lt;/strong&gt; - Drift returns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EVOLUTION.md exists but is left empty&lt;/strong&gt; - Templates without content don't help&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No one asks Claude to critique the system&lt;/strong&gt; - Feedback loops die&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture is intentionally simple. Most failures come from violating the core principle: &lt;strong&gt;lean at load, deep on demand&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Legacy Project Challenge
&lt;/h2&gt;

&lt;p&gt;Our biggest test: preparing a 2011-2020 football pool codebase for a greenfield rewrite.&lt;/p&gt;

&lt;h3&gt;
  
  
  What We Prepared
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;football-pool-legacy/&lt;/strong&gt; (reference archive):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CLAUDE.md&lt;/code&gt; - Business logic locations, DO NOT MODIFY warning&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EVOLUTION.md&lt;/code&gt; - Historical context (essential for legacy projects):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EVOLUTION.md
├── Data volumes (~users, ~records, ~DB size)
├── Why features were built this way
├── What users complained about
├── What admins found tedious
├── Bugs that required manual fixes
├── Workarounds still in place
└── What not to repeat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For legacy systems, EVOLUTION.md is more important than CLAUDE.md.&lt;/strong&gt; Without it, Claude can understand &lt;em&gt;what&lt;/em&gt; exists but not &lt;em&gt;why&lt;/em&gt; it exists.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;football/&lt;/strong&gt; (greenfield):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CLAUDE.md&lt;/code&gt; - Full requirements, phases, success criteria&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/session_handoffs/&lt;/code&gt; - Ready for continuity&lt;/li&gt;
&lt;li&gt;Pre-researched docs (ESPN score feeds)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Result
&lt;/h3&gt;

&lt;p&gt;First Claude session on the football project:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Feedback on the Prep System&lt;/strong&gt;: 8/10&lt;/p&gt;

&lt;p&gt;The setup was genuinely helpful. CLAUDE.md gave immediate context. Legacy repo access was critical. The empty EVOLUTION.md and lack of "lessons learned" notes were the main gaps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An 8/10 on first contact, with clear, actionable gaps—exactly the feedback loop we wanted. Claude went from cold start to planning mode in under 5 minutes, proposing database schema and asking clarifying questions about scoring rules. Zero time spent explaining Jira workflows, commit conventions, or project structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  First-Session Feedback Loop (Proof of Self-Documentation)
&lt;/h3&gt;

&lt;p&gt;The very first question asked in the greenfield project was not about features or architecture, but about the documentation system itself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Before we start—do you feel like the prep that Mother CLAUDE and the Claude that created your prep docs did a good job? Any suggestions for improvement?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This was intentional. Because Mother CLAUDE is self-documenting—including instructions for setting up new projects and maintaining existing ones—the goal was to validate whether a &lt;em&gt;fresh Claude session&lt;/em&gt; could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand the system without human explanation&lt;/li&gt;
&lt;li&gt;Critique its effectiveness&lt;/li&gt;
&lt;li&gt;Identify gaps worth addressing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because Mother CLAUDE documents not just project standards but how the documentation system itself works, this question functioned as a real-world test of whether the architecture truly explained itself.&lt;/p&gt;

&lt;p&gt;Claude's response (8/10) directly informed the improvements that followed, particularly around EVOLUTION.md content and historical context. The gaps identified became immediate action items, not theoretical improvements.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Design Principle&lt;/strong&gt;: Every new project should begin by asking Claude to critique the documentation system itself. If Claude cannot evaluate or improve the prep, the system is incomplete.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Legacy Project Prep Checklist
&lt;/h2&gt;

&lt;p&gt;Based on feedback, we created a checklist for preparing legacy codebases:&lt;/p&gt;

&lt;h3&gt;
  
  
  Required
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] CLAUDE.md with Mother CLAUDE reference&lt;/li&gt;
&lt;li&gt;[ ] Path to legacy repo&lt;/li&gt;
&lt;li&gt;[ ] Jira project code&lt;/li&gt;
&lt;li&gt;[ ] Tech stack (old and new)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Highly Recommended
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] EVOLUTION.md with:

&lt;ul&gt;
&lt;li&gt;Data volumes (helps migration planning)&lt;/li&gt;
&lt;li&gt;Feature history (why things were built)&lt;/li&gt;
&lt;li&gt;User pain points (prioritization)&lt;/li&gt;
&lt;li&gt;Admin pain points (what to fix)&lt;/li&gt;
&lt;li&gt;Known bugs/workarounds&lt;/li&gt;
&lt;li&gt;Old UI screenshots&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pre-Research
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] External API documentation&lt;/li&gt;
&lt;li&gt;[ ] Integration requirements&lt;/li&gt;
&lt;li&gt;[ ] SQL dumps (empty schema + full data)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What Worked
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lean CLAUDE.md files&lt;/strong&gt; - &amp;lt;100 lines keeps context cost low&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single source of truth&lt;/strong&gt; - No duplication across repos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-demand deep docs&lt;/strong&gt; - Don't load everything at session start&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legacy repo access&lt;/strong&gt; - Claude examining actual code beats any description&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-documenting architecture&lt;/strong&gt; - The system explains itself&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What Could Be Better
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;EVOLUTION.md needs content&lt;/strong&gt; - Empty templates don't help&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historical context matters&lt;/strong&gt; - "Why was it built this way?" is valuable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data volumes help&lt;/strong&gt; - Claude needs to think about scale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshots calibrate expectations&lt;/strong&gt; - Even rough ones help&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Meta Insight
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Documentation is a product&lt;/strong&gt;. It needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User research (what does Claude need?)&lt;/li&gt;
&lt;li&gt;Iteration (improve based on feedback)&lt;/li&gt;
&lt;li&gt;Maintenance (keep it current)&lt;/li&gt;
&lt;li&gt;Self-documentation (explain how it works)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Evolution: The Checkpoint Checklist (Instant Retrospectives)
&lt;/h2&gt;

&lt;p&gt;After using this system in production across multiple projects, we identified a gap: &lt;strong&gt;documentation tells Claude what exists, but not how to maintain quality as it builds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We added a &lt;strong&gt;checkpoint checklist&lt;/strong&gt; (&lt;code&gt;shared/checkpoint-checklist.md&lt;/code&gt;) that gets referenced at every PR and commit. It's built around one meta question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"If I had to hand this codebase to a new developer tomorrow, would they understand it without me explaining anything?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The checklist covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture &amp;amp; design (single responsibility, DRY, configuration vs hardcoding)&lt;/li&gt;
&lt;li&gt;Code quality (no magic numbers, type safety, naming clarity)&lt;/li&gt;
&lt;li&gt;Error handling &amp;amp; edge cases&lt;/li&gt;
&lt;li&gt;Testing &amp;amp; reliability&lt;/li&gt;
&lt;li&gt;Performance &amp;amp; security&lt;/li&gt;
&lt;li&gt;Project-specific questions (white-label readiness, API compatibility, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This emerged from a greenfield rebuild where we wanted to prevent the technical debt accumulation that plagued the original project. We call it the &lt;strong&gt;"Instant Retrospective"&lt;/strong&gt;—quality checkpoints at every natural stopping point, not just at the end of sprints or after incidents. The checklist lives alongside Mother CLAUDE and is referenced whenever Claude proposes or completes non-trivial changes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The next article in this series covers the Instant Retrospective approach in depth—including how we made Claude responsible for initiating these checkpoints automatically.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a shared docs repo&lt;/strong&gt; with Mother CLAUDE&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep project CLAUDE.md lean&lt;/strong&gt; (&amp;lt;100 lines)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move shared docs&lt;/strong&gt; to single source of truth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add security&lt;/strong&gt; (.htaccess for web-deployed PHP)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create EVOLUTION.md&lt;/strong&gt; for legacy projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get feedback&lt;/strong&gt; from Claude on first session&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate&lt;/strong&gt; based on what's missing&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Why Not Just...?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why not just use README.md?&lt;/strong&gt;&lt;br&gt;
READMEs are for humans browsing repos. CLAUDE.md is specifically structured for LLM context windows—lean, actionable, with clear references.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not load everything into context at session start?&lt;/strong&gt;&lt;br&gt;
Context windows are finite and expensive. Loading a 1,251-line journey system doc when you're fixing a CSS bug wastes tokens and slows responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not rely on ChatGPT/Claude memory features?&lt;/strong&gt;&lt;br&gt;
Memory features are session-specific and degrade over time. This system persists across sessions, machines, and even different AI tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not just use wikis/Confluence for everything?&lt;/strong&gt;&lt;br&gt;
Wikis are great for business docs. But technical docs that Claude reads frequently belong in git—version-controlled, close to code, and loadable without web fetching.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Insight
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LLMs don't need more prompts—they need better institutional memory.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The system we built isn't about clever prompting. It's about treating documentation as infrastructure that survives beyond any single session, any single project, and any single AI tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  Appendix: Our Project Ecosystem
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Kobumura (Company Projects):
├── littletalks-mobile      # React Native app
├── littletalks-admin       # PHP admin dashboard
├── littletalks-api         # Node.js backend
├── littlepipes             # CI/CD (PUBLIC repo)
└── littletalks-docs        # Shared docs (Mother CLAUDE)

Personal (Use shared standards):
├── WXING                   # Reference patterns
├── football                # Greenfield rewrite
└── football-pool-legacy    # Archive (2011-2020)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All projects reference the same Mother CLAUDE for consistency, while maintaining project-specific context in their own CLAUDE.md files.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This system was built collaboratively between a human engineer and an AI collaborator—and designed so the collaboration survives beyond any single session. The 8/10 rating from a fresh Claude session validated the approach. The gaps it identified became immediate improvements. That's the feedback loop working as intended.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The architecture is open. The patterns are portable. The goal is simple: stop re-explaining, start building.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written collaboratively with Claude, using the documentation system it describes.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;The Mother CLAUDE documentation system is open source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/Kobumura/mother-claude" rel="noopener noreferrer"&gt;github.com/Kobumura/mother-claude&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to fork it, adapt it, or use it as a reference for your own implementation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Licensed under &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;. Free to use and adapt with attribution to Dorothy J. Aubrey.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>documentation</category>
      <category>devrel</category>
    </item>
  </channel>
</rss>
