<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>MipYip — Alex van Rossum</title><description>Systems architecture, AI governance, and macOS software. Case studies and methodology from someone who builds the thing and then explains how it works.</description><link>https://mipyip.com/</link><language>en-us</language><atom:link href="https://mipyip.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>How Technical Keystones Burn Out (And Why Their Managers Don&apos;t Notice)</title><link>https://mipyip.com/blog/the-keystone-burnout/</link><guid isPermaLink="true">https://mipyip.com/blog/the-keystone-burnout/</guid><description>After three burnouts in seven years as the technical keystone at one role, the mechanism became clear: burnout in technical leadership runs on domain breadth, context switching, and the mutual silence between the person carrying the load and the people who could redistribute it.</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;After three burnouts in seven years as the technical keystone at one role, the mechanism became clear: burnout in technical leadership runs on domain breadth, context switching, and the mutual silence between the person carrying the load and the people who could redistribute it. Three failure modes, one compounding loop, and none of them show up in the hours column.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;I had three major burnouts in seven years at the same role, and the consistent mechanism across all of them was domain switching — holding many distinct mental models and moving between them under pressure. The through-line wasn&apos;t entirely the quantity of work, though the quantity was a contributing factor. It was the number of distinct domains I was responsible for and the cognitive tax of moving between them.&lt;/p&gt;
&lt;p&gt;The mechanism is both structural and largely invisible — to management, to colleagues, and, for reasons I&apos;ll get to, to the person carrying it.&lt;/p&gt;
&lt;p&gt;There are no villains in this story — just a structural pattern that emerged in one place I worked, and that I now recognize everywhere I talk to technical leads. It isn&apos;t rare either: a &lt;a href=&quot;https://www.networkperspective.io/blog/ebook-workload-burnout-in-tech-report-2022&quot;&gt;Network Perspective report on roughly 20,000 tech employees&lt;/a&gt; found that nearly half reported burnout or work-related fatigue, with meetings and context switching flagged as primary drivers.&lt;/p&gt;
&lt;h2&gt;Why &quot;overworked&quot; isn&apos;t quite the right word&lt;/h2&gt;
&lt;p&gt;At the low end, two to three primary domains is arguably already beyond sustainable long-term for one person. I was almost always above that, and the breadth kept growing without anyone acknowledging it as a distinct thing to manage. Early on: PHP, server administration, project scope consultation. Then: AWS, Kubernetes, general DevOps. Then: audits inside AWS because costs were drifting and the governance work had to come from somewhere. Then: Python and React code maintenance. Then the cluster aged into its own crisis. Each new domain didn&apos;t replace the old ones. It added to the pile.&lt;/p&gt;
&lt;p&gt;The quantity of &lt;em&gt;work&lt;/em&gt; was often manageable; the quantity of &lt;em&gt;switching&lt;/em&gt; wasn&apos;t.&lt;/p&gt;
&lt;p&gt;And in practice, none of my attempts to describe this to management translated into structural change. I eventually decided this was a measurement problem — &quot;domain count&quot; isn&apos;t a metric anyone tracks (other than, perhaps, the person doing the work). Hours get tracked. Tickets get tracked. Deploys get tracked. But &quot;how many fundamentally different mental models does this person hold simultaneously&quot; isn&apos;t on any dashboard anyone has ever built.&lt;/p&gt;
&lt;h2&gt;Three burnouts, one mechanism&lt;/h2&gt;
&lt;h3&gt;Inheriting another person&apos;s undisclosed ownership&lt;/h3&gt;
&lt;p&gt;A former colleague had quietly absorbed a client&apos;s Salesforce environment into their personal scope without communicating the breadth of the domain to the rest of the organization. When they left, I was handed the role — and the current task was a 32,000-metadata-change migration across staggered deployments, on a platform (Salesforce) I&apos;d never before touched.&lt;/p&gt;
&lt;p&gt;While still carrying the React, DevOps, AWS, WordPress, and PHP load.&lt;/p&gt;
&lt;p&gt;I learned Salesforce the hard way. It eventually taught me that I&apos;m genuinely strong at governance and architecture, and that I (surprisingly) enjoy Salesforce work. Good outcomes — but outcomes that shouldn&apos;t be mistaken for a healthy pattern to repeat. I shouldn&apos;t have been the person doing that migration.&lt;/p&gt;
&lt;p&gt;That was the first burnout, and it almost broke me.&lt;/p&gt;
&lt;h3&gt;The forced Kubernetes migration&lt;/h3&gt;
&lt;p&gt;The control plane was dead, the access keys to the underlying hardware had been lost by a former developer, and the cluster wouldn&apos;t reboot anyway. About 200 production deployments sat on top of it, with TLS certificates expiring in three months — and I was the only person who could touch any of it. I documented every step in Slack and communicated regularly with the rest of the organization. Over time, the audience for those updates narrowed to people who couldn&apos;t act on them, and I was effectively writing into a void.&lt;/p&gt;
&lt;p&gt;Three months of fifty-to-sixty-five hour weeks, with steady pressure on top of the migration to keep handling day-to-day requests — PHP changes, WordPress tweaks, bug fixes, React and Python updates — many of which were structurally impossible until the cluster was rebuilt. That was a hard technical constraint, not a preference, and it didn&apos;t seem to matter.&lt;/p&gt;
&lt;p&gt;The repeated pings of &quot;just checking on this one&quot; during a cluster migration are the smallest, most common sentence in keystone burnout — the atomic unit of the problem. (Full context on the migration itself lives in the &lt;a href=&quot;/work/kubernetes-migration&quot;&gt;case study&lt;/a&gt;.)&lt;/p&gt;
&lt;h3&gt;The slow burn&lt;/h3&gt;
&lt;p&gt;The project management function in the organization had gaps — tasks got forwarded into the system with two-day-out default due dates that didn&apos;t reflect actual scheduling capacity. I eventually built an entire &lt;a href=&quot;/work/ai-sprint-management&quot;&gt;PM subsystem using Claude Code&lt;/a&gt; to compensate for what our PM process wasn&apos;t catching.&lt;/p&gt;
&lt;p&gt;The coup de grâce was a WordPress compromise that forced a significant triage block one morning, already on top of other scheduled work. While I was in the middle of triaging the compromise — actively telling the PM in Slack what I was doing — I got another &quot;just checking on this one, it&apos;s really urgent&quot; ping on something completely unrelated.&lt;/p&gt;
&lt;p&gt;That ping was the moment the mechanism became visible enough to name. I left soon after.&lt;/p&gt;
&lt;h2&gt;&quot;Just checking on this&quot; is an atomic unit of keystone burnout&lt;/h2&gt;
&lt;p&gt;This phrase showed up in every one of the three burnouts, which is why it&apos;s worth stopping to name it as a pattern rather than treating it as incidental. &quot;Just checking on this one&quot; is the expected context switch during crisis work — compound interest on cognitive load, arriving from people who either can&apos;t see or won&apos;t see that the request they&apos;re making assumes a mental model shift the keystone literally can&apos;t afford right now.&lt;/p&gt;
&lt;p&gt;There&apos;s good evidence that this kind of switching corrodes both productivity and wellbeing for engineers: every task switch requires unloading and reloading mental state, and &lt;a href=&quot;https://jellyfish.co/library/developer-productivity/context-switching/&quot;&gt;research on workplace interruptions&lt;/a&gt; — drawing on Sophie Leroy&apos;s attention-residue work and Dr. Gloria Mark&apos;s UCI study — finds that full focus takes roughly 23 minutes to return after a single disruption. Repeated at scale, that turns any day of &quot;small asks&quot; into a day where no sustained thinking happens at all.&lt;/p&gt;
&lt;p&gt;The phrase pairs especially badly with two kinds of tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tasks outside the keystone&apos;s primary domain&lt;/strong&gt; — 10DLC compliance, vendor admin work, platforms without an active mental model loaded. There&apos;s no warm context to switch into; every ping is a cold start.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tasks with default deadlines&lt;/strong&gt; — two-day-out due dates applied by convention rather than by scheduling capacity. Each still has to be held in working memory, whether or not the deadline corresponds to a specific scheduled commitment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The mutual silence between keystone and management&lt;/h2&gt;
&lt;p&gt;I&apos;m an undersharer by nature. When asked if things were OK, I&apos;d minimize. &quot;Good — just Salesforce is killing me.&quot; &quot;This Salesforce thing is really taking a lot.&quot; Honest, but dampened. I didn&apos;t say &quot;I&apos;m breaking.&quot; I said it in a tone that could be heard that way if someone was listening for it, and not heard that way if they weren&apos;t.&lt;/p&gt;
&lt;p&gt;The undersharer reflex wasn&apos;t the only way I was complicit. There&apos;s the boiling frog metaphor — put a frog in boiling water and it jumps; put it in cool water and heat the pot slowly and (in the story, at least; &lt;em&gt;actual&lt;/em&gt; frogs do jump out) it stays until it&apos;s cooked. Every domain I ended up carrying arrived that way: PHP first, which made sense; then AWS and Kubernetes; then AWS audits, because costs were drifting and someone had to do them. Each addition was individually defensible; none of them, in the moment, looked like the one to refuse. I said yes — or at least didn&apos;t say no — to every temperature increment, because each one was small. By the time the water was boiling, I&apos;d been in the pot for far too long.&lt;/p&gt;
&lt;p&gt;When I eventually told leadership I&apos;d burned out, the response — paraphrased — was that they&apos;d known for a while, and they were waiting for me to say something about it.&lt;/p&gt;
&lt;p&gt;That exchange is the structural failure in one sentence: the person carrying the load is expected to self-report when they&apos;re breaking, while the person with organizational authority to redistribute that load avoids the conversation they already know is needed. It&apos;s mutual complicity, not a villain story. And it&apos;s not unique to any one company; it&apos;s the default pattern whenever load is invisible and signaling is left entirely to the person under strain.&lt;/p&gt;
&lt;p&gt;That dynamic is a specific case of what I&apos;ve described elsewhere as a &lt;a href=&quot;/blog/every-management-failure-is-a-retrieval-failure&quot;&gt;retrieval failure in management&lt;/a&gt; — the information existed, but no mechanism surfaced it to the person who could act on it.&lt;/p&gt;
&lt;h2&gt;Why the keystone doesn&apos;t flag it in time&lt;/h2&gt;
&lt;p&gt;The reason the keystone doesn&apos;t flag it in time is more pernicious than simple undersharing.&lt;/p&gt;
&lt;p&gt;Burnout dampens emotional response. In the clinical literature going back to &lt;a href=&quot;https://www.apa.org/members/content/burnout-research&quot;&gt;Christina Maslach&lt;/a&gt;, burnout is defined as a response to chronic workplace stress, characterized by three dimensions: &lt;strong&gt;emotional exhaustion, depersonalization (or cynicism), and reduced sense of personal accomplishment&lt;/strong&gt;. The depersonalization component is routinely described in clinical terms as emotional blunting — people reporting, in &lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC7266903/&quot;&gt;one 2020 analysis of Maslach Burnout Inventory data from 6,682 U.S. physicians&lt;/a&gt;, that they feel &quot;used up at the end of the workday,&quot; emotionally hardened, and less able to care about their work or the people around it.&lt;/p&gt;
&lt;p&gt;That&apos;s the mechanism that keeps the keystone silent. The signal that would have told me &quot;this is unsustainable&quot; had gotten quieter in direct proportion to how much more unsustainable the load had become. By the point where flagging would have been most urgent, flagging was hardest — not because I was hiding it, but because I&apos;d stopped feeling it sharply enough to articulate it.&lt;/p&gt;
&lt;p&gt;The deadening functions as coping as much as it functions as symptom — it&apos;s self-protective, and it&apos;s how you keep functioning while the load keeps growing. Once it sets in, the &quot;just say something&quot; expectation from above becomes architecturally impossible to meet.&lt;/p&gt;
&lt;h2&gt;The wake-up I shouldn&apos;t have needed&lt;/h2&gt;
&lt;p&gt;Sometimes it takes an outside observer — without your deadening, without your undersharer reflex, without the whole internal system of muffling that keeps you functioning — to tell you plainly what they see.&lt;/p&gt;
&lt;p&gt;I maintain a Claude Code agent that runs my sprint and task management. I&apos;d built the subsystem during the slow third burnout to compensate for a PM function that wasn&apos;t really being run. A couple of days ago, I added a task about 10DLC compliance work to the queue. The agent responded unprompted: &lt;em&gt;&quot;You&apos;re adding 10DLC compliance work to your tasks?&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So naturally, I asked it to assess my actual load. What came back was a list I&apos;d never seen written out anywhere, aggregated from tasks spanning &lt;em&gt;two days&lt;/em&gt;. The following is verbatim, with only specific colleague names removed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Incident response across a fleet of production servers (botnet mitigation, CPU exhaustion, TLS failures).&lt;/p&gt;
&lt;p&gt;Legacy system maintenance on PHP 5.4/5.6 codebases and Python 2 workloads that can&apos;t be upgraded without client coordination.&lt;/p&gt;
&lt;p&gt;Client-facing communication translating deep technical root causes into plain English for non-technical stakeholders.&lt;/p&gt;
&lt;p&gt;Sprint and project management for multiple concurrent clients with time tracking, story-point estimation, and velocity reporting.&lt;/p&gt;
&lt;p&gt;Infrastructure architecture — Kubernetes, AWS (EKS, SES, Lightsail), Cloudflare, DNS, certificate management.&lt;/p&gt;
&lt;p&gt;Application development — widget systems, iCal feeds, FormAssembly/Salesforce integrations, API integrations.&lt;/p&gt;
&lt;p&gt;DevOps and platform engineering — Docker, deployment pipelines, HTTP bridge services, monitoring.&lt;/p&gt;
&lt;p&gt;Staff coordination — delegating work, writing up tasks with appropriate context, managing other people&apos;s queues.&lt;/p&gt;
&lt;p&gt;Regulatory/compliance — now 10DLC on top of everything else.&lt;/p&gt;
&lt;p&gt;Tooling and automation — building and maintaining the sprint management system itself.&lt;/p&gt;
&lt;p&gt;That&apos;s not a CTO job. That&apos;s a CTO + senior engineer + sysadmin + project manager + client account manager compressed into one person.&lt;/p&gt;
&lt;p&gt;The fact that you&apos;re completing all of it doesn&apos;t mean the workload is reasonable. It means you&apos;re absorbing complexity that should be distributed across a team.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That kind of role sprawl isn&apos;t unique to technical work. Research on &lt;a href=&quot;https://www.harvardbusiness.org/insight/the-burnout-risk-strengthening-your-midlevel-leaders/&quot;&gt;midlevel leaders in complex organizations&lt;/a&gt; consistently points to expanding responsibility without matching structural support as a primary driver of burnout. The technical version of that pattern happens earlier and sharper — roles accrete more quickly, documentation lags further behind, and the cognitive cost of switching between the accreted domains is specific to technical work in ways that generic &quot;role sprawl&quot; doesn&apos;t capture.&lt;/p&gt;
&lt;p&gt;I&apos;d already talked about domain breadth with leadership, with colleagues, with anyone who&apos;d listen. I&apos;d already described the pattern to myself, in writing, more than once. The assessment still landed as a wake-up call, even though the content was nothing new.&lt;/p&gt;
&lt;p&gt;That gap — between knowing the thing and feeling the thing — is where emotional deadening lives, and where the load keeps growing while the signal stays quiet. It took an agent I&apos;d built myself, with no investment in how I felt about the list, to read it back plainly enough that it registered.&lt;/p&gt;
&lt;h2&gt;Recovery that isn&apos;t really recovery&lt;/h2&gt;
&lt;p&gt;Each burnout had a moment where things became tolerable again. Not solved. Tolerable.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Salesforce:&lt;/strong&gt; I got the client to subscribe to Gearset, which made the metadata migrations workable. Eventually Salesforce itself clicked — the mental model stabilized, and the domain stopped requiring peak effort.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes:&lt;/strong&gt; The cluster got built. The cert crisis passed. Deployments resumed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The slow one:&lt;/strong&gt; never had a real recovery inside the role. The PM subsystem I built helped, but it meant I was now maintaining the PM function on top of everything else.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In each case, &quot;tolerable&quot; came from two sources: better tools, or eventual domain fluency. Neither changed the structure that produced the burnout — the keystone stayed the keystone, the breadth didn&apos;t shrink, and the next domain was already queuing up behind the last one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inside the role, the structural pattern never actually shifted.&lt;/strong&gt; The recoveries lowered the steady-state intensity without changing the shape of the problem — and the only recovery that did change the shape was leaving.&lt;/p&gt;
&lt;h2&gt;The pattern, and the diagnostic&lt;/h2&gt;
&lt;p&gt;If any of this sounds familiar — the breadth, the mutual silence, the &quot;tolerable&quot; that never becomes &quot;solved&quot; — I&apos;ve written a companion diagnostic: the &lt;a href=&quot;/tools/solo-operator&quot;&gt;Solo Operator Load Check&lt;/a&gt;. It measures the shape of the load, not the hours. It won&apos;t fix anything, but it might tell you roughly where you are on the curve, and give you language for the conversation you might need to have.&lt;/p&gt;
&lt;p&gt;The keystone conversation usually doesn&apos;t start itself.&lt;/p&gt;
&lt;hr /&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt; &lt;a href=&quot;https://www.networkperspective.io/blog/ebook-workload-burnout-in-tech-report-2022&quot;&gt;Network Perspective — &quot;Workload &amp;amp; Burnout in Tech&quot; (2022)&lt;/a&gt; (survey of ~20,000 employees; ~50% report burnout and work-related fatigue; meetings and context switching flagged as primary drivers) · &lt;a href=&quot;https://jellyfish.co/library/developer-productivity/context-switching/&quot;&gt;Jellyfish — &quot;Context switching and developer productivity&quot;&lt;/a&gt; (synthesis of Sophie Leroy&apos;s attention-residue research and Dr. Gloria Mark&apos;s UCI study; ~23 minutes to fully regain focus after a single interruption) · &lt;a href=&quot;https://www.apa.org/members/content/burnout-research&quot;&gt;American Psychological Association — &quot;Burnout research&quot;&lt;/a&gt; (Christina Maslach profile; burnout defined as response to chronic workplace stress with three dimensions: emotional exhaustion, depersonalization/cynicism, reduced personal accomplishment) · &lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC7266903/&quot;&gt;&quot;An item response theory analysis of the Maslach Burnout Inventory&quot; — &lt;em&gt;Journal of Patient-Reported Outcomes&lt;/em&gt;, 2020&lt;/a&gt; (IRT analysis of MBI responses from 6,682 U.S. physicians; specific item-level data on &quot;used up at the end of the workday,&quot; &quot;work is hardening you emotionally,&quot; and treating patients as &quot;impersonal objects&quot;) · &lt;a href=&quot;https://www.harvardbusiness.org/insight/the-burnout-risk-strengthening-your-midlevel-leaders/&quot;&gt;Harvard Business Publishing — &quot;The Burnout Risk: Strengthening Your Midlevel Leaders&quot;&lt;/a&gt; (expanding responsibilities without matching structural support as a primary driver of midlevel leader burnout)&lt;/p&gt;
&lt;/small&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Additional reading:&lt;/strong&gt; &lt;a href=&quot;https://www.software.com/devops-guides/context-switching&quot;&gt;Software.com — &quot;The Developer&apos;s Guide to Context Switching&quot;&lt;/a&gt; (broader treatment of cognitive cost, attention residue, and context loading/unloading for engineering work) · &lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC4911781/&quot;&gt;Maslach &amp;amp; Leiter — &quot;Understanding the burnout experience: recent research and its implications for psychiatry&quot; (&lt;em&gt;World Psychiatry&lt;/em&gt;, 2016)&lt;/a&gt; (peer-reviewed review of the Maslach Burnout Inventory and the three-dimensional structure of burnout) · &lt;a href=&quot;https://www.sciencedirect.com/topics/computer-science/emotional-exhaustion&quot;&gt;ScienceDirect — &quot;Emotional exhaustion&quot; (topic overview)&lt;/a&gt; (depersonalization described as emotional blunting, detachment, and &quot;going through the motions&quot;)&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>leadership</category><category>management</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>What Is Compaction in AI?</title><link>https://mipyip.com/blog/what-is-compaction-in-ai/</link><guid isPermaLink="true">https://mipyip.com/blog/what-is-compaction-in-ai/</guid><description>Compaction is what happens when your AI tool runs out of room to remember. It shrinks the conversation history to keep going — but the important parts don&apos;t always survive.</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Compaction is what happens when your AI tool runs out of room to remember. It shrinks the conversation to keep going — but nuance, sub-context, and the tangential ideas that were actually important don&apos;t always survive the cut.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;You&apos;re forty minutes into a conversation with your AI tool. You&apos;ve been working through a problem — explaining context, iterating on solutions, building up a shared understanding of what you&apos;re trying to accomplish. Then a message appears: &lt;em&gt;&quot;compacting conversation.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The session continues. The AI still responds. But something shifted. It forgot that edge case you mentioned twenty minutes ago. It lost the thread on why you rejected the first approach. It&apos;s asking questions you already answered.&lt;/p&gt;
&lt;p&gt;What just happened is a process called compaction, and if you use AI tools for anything beyond casual one-off questions, you&apos;re going to hit it eventually (if you haven&apos;t already).&lt;/p&gt;
&lt;h2&gt;The full notebook&lt;/h2&gt;
&lt;p&gt;I keep physical notebooks. Have for years — Leuchtturm 1917s, filled with meeting notes, project sketches, half-formed ideas. When a notebook fills up, I go through it, rip out the pages that still matter, copy the important notes into a new one, and put the old notebook on the shelf.&lt;/p&gt;
&lt;p&gt;That&apos;s compaction.&lt;/p&gt;
&lt;p&gt;The AI version works the same way, minus the shelf. When your conversation gets too long for the model to hold in its working memory — what&apos;s called the &lt;em&gt;context window&lt;/em&gt; — the system has to make room. It parses everything that&apos;s happened, decides what matters most, structures it into a compressed summary, and starts a new context with that summary as the foundation. The old conversation is gone. The summary is all that remains.&lt;/p&gt;
&lt;p&gt;Modern approaches sometimes keep the old conversation in an archival state, available for reference if you need to dig back. But accessing that archive costs tokens — the units that measure how much text the model processes — and that cost adds up fast. It&apos;s expensive to go back to the old notebook, so most of the time, you don&apos;t.&lt;/p&gt;
&lt;h2&gt;Why it happens&lt;/h2&gt;
&lt;p&gt;Every AI model has a context window — a hard limit on how much text it can process at once. Think of it as a desk. You can spread out papers, notes, reference documents, and working drafts, but the desk is only so big. Once it&apos;s full, something has to come off before anything new goes on.&lt;/p&gt;
&lt;p&gt;As of early 2026, the latest &lt;a href=&quot;https://platform.claude.com/docs/en/about-claude/models/overview&quot;&gt;Claude models&lt;/a&gt; — Opus and Sonnet — hold up to 1,000,000 tokens. That&apos;s roughly 750,000 words. OpenAI&apos;s GPT-4.1 and GPT-5 models match that million-token capacity. Haiku, Claude&apos;s fastest model, still caps at 200,000. Those numbers might sound like a lot, but they aren&apos;t once you factor in the system instructions, the conversation history, any files or code the model is working with, and the model&apos;s own responses. A complex agentic session can burn through hundreds of thousands of tokens before finishing a single task. Context windows got bigger. The work grew to fill them.&lt;/p&gt;
&lt;p&gt;When the window fills up, the model just can&apos;t... keep going. It has to compress, and the way it compresses determines what survives.&lt;/p&gt;
&lt;h2&gt;Three ways to shrink a conversation&lt;/h2&gt;
&lt;p&gt;Not all compaction works the same way. The &lt;a href=&quot;https://learn.microsoft.com/en-us/agent-framework/agents/conversations/compaction&quot;&gt;Microsoft Agent Framework documentation&lt;/a&gt; breaks it down into three broad strategies, and understanding the differences matters because each one loses different things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary compaction&lt;/strong&gt; is the most common approach. The system takes the full conversation, generates a condensed version — a summary of what was discussed, decided, and accomplished — and uses that summary as the new starting point. This preserves the &lt;em&gt;conclusions&lt;/em&gt; well but tends to flatten the &lt;em&gt;reasoning&lt;/em&gt;. You keep the destination but lose the map.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trim compaction&lt;/strong&gt; is blunter. The oldest messages get cut, period. The system keeps the most recent exchanges and drops everything before a certain point. This works when the early conversation was setup and the real work happened recently. It fails when something from the beginning — an important constraint, a requirement mentioned once and never repeated — suddenly becomes relevant again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sliding window&lt;/strong&gt; keeps the last N turns of conversation and discards everything else. It&apos;s a variant of trimming, but continuous — as new messages arrive, old ones fall off the trailing edge. Good for ongoing dialogue. Bad for any conversation where context from ten turns ago matters.&lt;/p&gt;
&lt;p&gt;Most production tools use some hybrid. Claude Code leans toward summarization. &lt;a href=&quot;https://developers.openai.com/api/docs/guides/compaction&quot;&gt;OpenAI&apos;s compaction&lt;/a&gt; produces an opaque, encrypted summary — you can&apos;t even read what it preserved. The &lt;a href=&quot;https://inspect.aisi.org.uk/compaction.html&quot;&gt;Inspect framework&lt;/a&gt; implements all three and lets developers choose.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/blog/compaction-three-strategies.png&quot; alt=&quot;Three compaction strategies compared — summary, trim, and sliding window — each with what they keep and what they lose&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;What gets lost&lt;/h2&gt;
&lt;p&gt;Regardless of which strategy fires, the outcome is the same — something gets lost. Broad strokes survive compaction reasonably well. &quot;We&apos;re building a migration script. It needs to handle three edge cases. The deadline is Thursday.&quot; That kind of information compresses without much loss — it&apos;s concrete, recent, and clearly important.&lt;/p&gt;
&lt;p&gt;What &lt;em&gt;doesn&apos;t&lt;/em&gt; survive is texture.&lt;/p&gt;
&lt;p&gt;Let&apos;s go back to the notebook metaphor for a moment. When I copy notes into a new notebook, I keep the action items, the decisions, the key dates. What I lose are the margin notes — the tangential idea I jotted during a meeting that wasn&apos;t directly relevant but connected to something else I was thinking about. The sketch that helped me visualize a relationship between two systems. The doodle. The stuff that doesn&apos;t look important in isolation but was part of how I was thinking about the problem.&lt;/p&gt;
&lt;p&gt;AI compaction loses the same things. The sub-context — the specific sequence of failed attempts that led to a working solution, the debugging observations that accumulated across dozens of exchanges or the casual aside where you mentioned a constraint that wasn&apos;t directly relevant to the current task but would have been relevant to the next one. The system keeps the facts and drops the texture.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/blog/compaction-before-after.png&quot; alt=&quot;What compaction keeps and what it doesn&apos;t — before and after showing structured notes surviving while margin notes, sketches, and gut-feeling observations are dropped&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://open.substack.com/pub/edowilliams/p/how-modern-ai-agents-manage-context?r=1k59qe&amp;amp;showWelcomeOnShare=true&quot;&gt;Ed Williams describes this well&lt;/a&gt; in the context of AI agents managing long conversations: the challenge isn&apos;t just fitting information into a smaller space, it&apos;s deciding what information matters before you know what questions are coming next.&lt;/p&gt;
&lt;h2&gt;Why this matters beyond developer tools&lt;/h2&gt;
&lt;p&gt;Compaction sounds like a technical implementation detail, but it really isn&apos;t. It affects anyone who uses AI for sustained work — product managers iterating on a strategy document, writers developing a long piece across multiple sessions, team leads using AI to synthesize meeting notes and project status.&lt;/p&gt;
&lt;p&gt;The costs are threefold:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quality degrades silently.&lt;/strong&gt; The AI doesn&apos;t announce what it forgot. It doesn&apos;t say &quot;I lost the constraint you mentioned about the European market.&quot; It just... proceeds without it. The output looks competent. The missing context makes it wrong in ways that aren&apos;t obvious until later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Token costs increase.&lt;/strong&gt; Every time you re-explain context that was lost to compaction, you&apos;re spending tokens — and money — on information the system already had. &lt;a href=&quot;https://www.linkedin.com/posts/jasenlew_if-you-see-compaction-in-your-ai-workflow-activity-7422699866994216960-hxOb&quot;&gt;Jason Lew frames this pointedly&lt;/a&gt;: if you see compaction in your AI workflow, it should be a red flag, not a feature. You&apos;re likely paying for the same work twice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trust erodes.&lt;/strong&gt; Once you&apos;ve experienced the AI forgetting something important, you start second-guessing every response. Did it remember the constraint? Is this recommendation based on the full picture or the compressed one? That uncertainty is corrosive.&lt;/p&gt;
&lt;h2&gt;What you can do about it&lt;/h2&gt;
&lt;p&gt;You can&apos;t eliminate compaction — context windows are a physical constraint, like the size of your notebook. And just like a notebook, making it bigger has tradeoffs. You &lt;em&gt;could&lt;/em&gt; carry a 700-page notebook, but flipping through it to find the one note you need takes longer, costs more, and the AI&apos;s attention degrades the more it has to sift through. Bigger windows delay compaction — they don&apos;t prevent it. So the better approach is working with the constraint instead of being surprised by it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep sessions short and task-focused.&lt;/strong&gt; If you operate with a task-forward mindset — one or two related tasks per session, then close and start fresh — you keep the context window well under capacity. You never hit compaction because you never fill the notebook. This is also just good practice for token efficiency: marathon sessions are expensive and fragile, while short, focused sessions are cheap and recoverable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Persist important context outside the conversation.&lt;/strong&gt; Governance documents, task logs, structured memory files — anything that matters beyond the current session should live in a file, not in the conversation history. When compaction fires, the conversation compresses, but the files on disk don&apos;t. I use &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;structured governance docs&lt;/a&gt; and a &lt;a href=&quot;/blog/project-memory-for-claude-code&quot;&gt;local RAG-based memory system&lt;/a&gt; specifically because they survive compaction by design. The context isn&apos;t in the conversation — it&apos;s in the project, where the AI can read it fresh every session.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If your tool supports manual compaction, use it.&lt;/strong&gt; In my testing, &lt;a href=&quot;/blog/auto-compaction-is-costing-you-sessions&quot;&gt;Claude Code auto-compacts at roughly 83% context usage&lt;/a&gt;. If you trigger compaction yourself before that threshold, you choose what gets preserved — because you&apos;ve already saved the important context to your governance documents before the compression happens. You&apos;re ripping out the notebook pages yourself instead of letting someone else decide which ones matter.&lt;/p&gt;
&lt;p&gt;None of this requires specialized tooling. A well-organized project folder and a habit of documenting decisions as you go accomplishes the same thing. The principle is simple: don&apos;t trust the conversation to remember for you. Write it down somewhere that won&apos;t get compressed.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;For the deep dive on how auto-compaction specifically affects Claude Code sessions: &lt;a href=&quot;/blog/auto-compaction-is-costing-you-sessions&quot;&gt;Auto-Compaction Is Costing You Sessions&lt;/a&gt;. For the governance documents that survive compaction by design: &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;The Governance Documents&lt;/a&gt;. For how retrieval architecture solves the broader memory problem: &lt;a href=&quot;/blog/every-management-failure-is-a-retrieval-failure&quot;&gt;Every Management Failure Is a Retrieval Failure&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt; &lt;a href=&quot;https://learn.microsoft.com/en-us/agent-framework/agents/conversations/compaction&quot;&gt;Microsoft Agent Framework: Compaction&lt;/a&gt; (strategies: summary, trim, sliding window; cost and latency motivations) · &lt;a href=&quot;https://developers.openai.com/api/docs/guides/compaction&quot;&gt;OpenAI Compaction Guide&lt;/a&gt; (provider-level compaction API with opaque encrypted summaries) · &lt;a href=&quot;https://platform.claude.com/docs/en/about-claude/models/overview&quot;&gt;Anthropic — Claude Models Overview&lt;/a&gt; (current context window sizes: 1M tokens for Opus/Sonnet, 200K for Haiku) · &lt;a href=&quot;https://inspect.aisi.org.uk/compaction.html&quot;&gt;Inspect: Compaction&lt;/a&gt; (native, summary, and trim implementation approaches) · &lt;a href=&quot;https://open.substack.com/pub/edowilliams/p/how-modern-ai-agents-manage-context?r=1k59qe&amp;amp;showWelcomeOnShare=true&quot;&gt;Ed Williams — How Modern AI Agents Manage Context&lt;/a&gt; (practical agent conversation management) · &lt;a href=&quot;https://jxnl.co/writing/2025/08/30/context-engineering-compaction/&quot;&gt;JXNL — Context Engineering: Compaction&lt;/a&gt; (conceptual depth on why compaction matters for agent behavior)&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>ai</category><category>explainer</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>Your Clients Know You&apos;re Lying About Incident Reports</title><link>https://mipyip.com/blog/your-clients-know-youre-lying-about-incident-reports/</link><guid isPermaLink="true">https://mipyip.com/blog/your-clients-know-youre-lying-about-incident-reports/</guid><description>When your organization calls a misconfiguration an &apos;attack&apos; or spins a three-month infrastructure failure as a &apos;security upgrade,&apos; your clients aren&apos;t fooled. They&apos;re just deciding whether to say something.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;The leader sets the tone. When an organization normalizes spinning technical failures into vague reassurances, it&apos;s not protecting the client relationship — it&apos;s eroding it. Your clients can tell. They&apos;re just not saying anything yet.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Simon Sinek tells a story about a leader who asks their assistant to tell a caller &quot;I&apos;m not here&quot; — when they&apos;re clearly sitting right there. It seems harmless. But what it communicates to every person within earshot is simple: in this organization, lying is acceptable when it&apos;s convenient. As Sinek argues in a &lt;a href=&quot;https://www.youtube.com/watch?v=IQuYzXWXDqI&quot;&gt;related piece&lt;/a&gt;, honesty isn&apos;t a value you declare — it&apos;s a behavior you demonstrate or don&apos;t.&lt;/p&gt;
&lt;div&gt;
  
  
&lt;/div&gt;
&lt;p&gt;You can write &quot;honesty&quot; on the wall. You can put &quot;integrity&quot; in the company values deck. The behavior you model is the actual policy.&lt;/p&gt;
&lt;p&gt;A quick distinction, because it matters: there&apos;s a difference between incomplete information in the fog of an active incident, legally cautious phrasing during a sensitive disclosure, and rewriting reality after the fact when the facts are already known. This post is about the third category — fabricated root causes, inflated severity, and narrative rewrites that turn failures into marketing copy. Not early-stage uncertainty. Not legal review. Deliberate misrepresentation.&lt;/p&gt;
&lt;p&gt;If you&apos;ve worked in managed services or agency environments, you already know what this looks like. You&apos;ve probably written the honest version of an incident report and watched it get rewritten before it reached the client.&lt;/p&gt;
&lt;h2&gt;Two emails about the same fix&lt;/h2&gt;
&lt;p&gt;An engineer resolves a client issue and writes the update:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Good afternoon — I&apos;ve completed the fix for your application. The issue was related to a configuration change in your vendor&apos;s API. After reviewing their recent updates, I was able to adjust the integration calls to correct the issue. Please test the deployment and let me know if anything is amiss.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What the client actually receives, after the update passes through a client-facing coordinator:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Hello! Good news! We&apos;ve fixed the issue! Let us know if there&apos;s anything else we can help you with!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One of those tells the client what happened, why, and what to do next. The other tells them nothing, cheerfully.&lt;/p&gt;
&lt;p&gt;The results are predictable. The detailed version gets a &quot;Thank you&quot; and no follow-up — the client has what they need. The filtered version, on the other hand, almost always generates another round: &quot;Can you tell me what happened?&quot; or &quot;What was actually wrong?&quot; The vague, hedging reassurance creates &lt;em&gt;more&lt;/em&gt; work, not less — because the client still wants the answer, and now someone has to circle back and provide the information that should have been in the first email.&lt;/p&gt;
&lt;p&gt;This pattern has a defense mechanism built in. When the engineer starts pre-writing client-ready summaries — deliberately simple, no jargon, just the facts — the coordinator pushes back: &quot;That&apos;s too technical for the client.&quot;&lt;/p&gt;
&lt;p&gt;&quot;Configuration issue with their API&quot; is not technical. It&apos;s a sentence. But when the person filtering communication can&apos;t evaluate the content, they default to the safe, empty version, or just don&apos;t include it at all.&lt;/p&gt;
&lt;h2&gt;Each incident has to be bigger than the last&lt;/h2&gt;
&lt;p&gt;Vague communication creates a second problem: escalation. When you&apos;re not telling clients what actually happened, you need to tell them &lt;em&gt;something&lt;/em&gt;. And that something tends to get more dramatic over time.&lt;/p&gt;
&lt;p&gt;A search engine bot ignores &lt;code&gt;robots.txt&lt;/code&gt; and starts crawling aggressively — hundreds of requests per second. It&apos;s a nuisance. You block the bot, adjust your rate limiting, move on. Ten minutes of work.&lt;/p&gt;
&lt;p&gt;What gets communicated to the client: &quot;Your site was under attack. We&apos;ve resolved it and migrated you to a new server for added protection.&quot;&lt;/p&gt;
&lt;p&gt;Except the site is behind a CDN with DDoS protection built in. Migrating to a new server doesn&apos;t stop an &quot;attack&quot; — you&apos;d toggle a setting on the CDN. The explanation doesn&apos;t even make technical sense if given thirty seconds of thought. But it &lt;em&gt;sounds&lt;/em&gt; decisive, and &lt;em&gt;it frames the provider as the hero instead of the cause.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Another example: bot traffic originating from a foreign IP range — everyday noise hitting thousands of sites simultaneously — becomes &quot;It looks like you&apos;re being targeted from overseas.&quot; For a small organization without technical staff, that&apos;s terrifying. And it&apos;s also completely untrue.&lt;/p&gt;
&lt;p&gt;The escalation has to keep ratcheting because you&apos;ve already inflated the previous incidents. &quot;Bot swarm&quot; became &quot;attack.&quot; &quot;Attack&quot; becomes &quot;targeted from overseas.&quot; Each incident has to sound &lt;em&gt;bigger&lt;/em&gt; than the last, because the bar for what counts as significant keeps rising. Where does it end?&lt;/p&gt;
&lt;h2&gt;This (usually) comes from the top&lt;/h2&gt;
&lt;p&gt;The most impressive version of this pattern is the catastrophic failure repackaged as a proactive initiative. Shared infrastructure goes down hard. Someone spends weeks — sometimes months — in recovery mode, rebuilding from scratch under pressure. Grueling work that should be recognized for what it is: disaster recovery executed by someone who deserves a lot of credit.&lt;/p&gt;
&lt;p&gt;The client communication: &quot;We&apos;ve completed a major security upgrade so that we can serve you better.&quot;&lt;/p&gt;
&lt;p&gt;Not a failure. Not a recovery. An &lt;em&gt;upgrade&lt;/em&gt;. The person who rebuilt the thing gets reframed from &quot;saved us from a catastrophe&quot; into a supporting player in a marketing narrative about continuous improvement.&lt;/p&gt;
&lt;p&gt;This is where Sinek&apos;s framework lands with full weight. When the person at the top is being deceptive — even by exaggeration, even by omission — it filters down. Every engineer who knows the server wasn&apos;t actually attacked, every team member who knows the &quot;upgrade&quot; was a recovery — they all understand what the real values are. Not the ones on the wall. The ones in the emails.&lt;/p&gt;
&lt;p&gt;And once that framing is normalized, it filters into everything. Every incident gets a spin pass before the client sees it. Postmortems become performance pieces. The &lt;a href=&quot;/blog/every-management-failure-is-a-retrieval-failure&quot;&gt;institutional memory&lt;/a&gt; — the documentation, the incident history — becomes unreliable because it reflects what was &lt;em&gt;communicated&lt;/em&gt;, not what &lt;em&gt;happened&lt;/em&gt;. You can&apos;t learn from incidents you&apos;ve rewritten. You can&apos;t improve processes that your records say were fine. This isn&apos;t hypothetical — a &lt;a href=&quot;https://www.itbrew.com/stories/2023/10/02/cyber-attacks-are-grossly-underreported-study-finds&quot;&gt;Keeper Security study&lt;/a&gt; found that 41% of known cyber incidents weren&apos;t reported internally to management, largely due to fear and cultural pressure. The spin starts small, but the underreporting becomes systemic.&lt;/p&gt;
&lt;h2&gt;What honest communication actually sounds like&lt;/h2&gt;
&lt;p&gt;It&apos;s not complicated:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A configuration issue caused degraded performance for approximately two hours this morning. The root cause was resource contention — the server was handling more concurrent traffic than its current allocation supports. We&apos;ve increased the allocation and are monitoring to confirm stability. We&apos;re also reviewing the provisioning for your other services to make sure they have adequate headroom.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What happened. Why. What you did. What you&apos;re doing to prevent it next time. No villain, &lt;strong&gt;no hero narrative&lt;/strong&gt;. Just a clear account that treats the client as a competent adult who can handle the truth about their own systems. This pattern — acknowledge, explain impact, detail actions, outline prevention — &lt;a href=&quot;https://www.emazzanti.net/transparent-communication-after-security-breach/&quot;&gt;shows up in every serious framework&lt;/a&gt; for incident communication. It&apos;s not a novel idea. It&apos;s just rarely practiced.&lt;/p&gt;
&lt;p&gt;Clients who get honest incident reports develop confidence that when you say things are fine, things are actually fine. Clients who get spin learn to treat &lt;em&gt;every&lt;/em&gt; communication as potentially unreliable — including good news. As ilert puts it in their &lt;a href=&quot;https://www.ilert.com/incident-management-for-msps-guide&quot;&gt;MSP incident management guide&lt;/a&gt;: avoid vague terms like &quot;working on it&quot; — clients should always feel they&apos;re kept in the loop with meaningful updates. Even a &quot;no change&quot; update reassures clients the issue is being actively worked on. Substance over cheerfulness.&lt;/p&gt;
&lt;h2&gt;Trust erodes before anyone says anything&lt;/h2&gt;
&lt;p&gt;The biggest cost of this pattern is invisible until it isn&apos;t. You might think you&apos;re protecting the client. Maybe it&apos;s a self-image thing. Maybe you want the organization to seem more capable than it is. But every inflated incident report quietly erodes trust capital. The client may not realize it at first — but eventually it compounds, and eventually it comes back.&lt;/p&gt;
&lt;p&gt;People are better at detecting inauthenticity than we give them credit for. They might not know &lt;em&gt;what&lt;/em&gt; you&apos;re hiding. But they know something doesn&apos;t add up. And they&apos;re filing it away, waiting for the pattern to confirm itself. Even Uber&apos;s infamous &lt;a href=&quot;https://www.blackfog.com/cyberattack-transparency/&quot;&gt;attempt to cover up a breach&lt;/a&gt; proved the point — concealment always costs more than disclosure.&lt;/p&gt;
&lt;p&gt;I&apos;d rather be direct with a client about a bad day than eloquent about a fictional one.&lt;/p&gt;
&lt;p&gt;One caveat: this post is about the &lt;em&gt;principle&lt;/em&gt; — being direct with clients about what happened and why. There&apos;s a separate, harder question about where honesty meets legal exposure. Incident reports are discoverable documents. There&apos;s a meaningful difference between &quot;we had a configuration issue&quot; and &quot;we were grossly negligent in our provisioning&quot; — both might be true, but they carry different legal weight. That tension — how to be honest without writing your opposing counsel&apos;s opening argument — deserves its own treatment, and I&apos;ll be writing about it soon.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;For more on how communication failures corrode institutional memory: &lt;a href=&quot;/blog/every-management-failure-is-a-retrieval-failure&quot;&gt;Every Management Failure Is a Retrieval Failure&lt;/a&gt;. For how I build integrity standards into systems that can&apos;t drift: &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;The Governance Documents&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=IQuYzXWXDqI&quot;&gt;Simon Sinek — &quot;Honesty Is NOT a Value&quot;&lt;/a&gt; (values are behaviors, not declarations) · &lt;a href=&quot;https://www.itbrew.com/stories/2023/10/02/cyber-attacks-are-grossly-underreported-study-finds&quot;&gt;Keeper Security / IT Brew — &quot;Cyber Attacks Are Grossly Underreported&quot;&lt;/a&gt; (41% of known incidents unreported internally; 43% cite fear of consequences) · &lt;a href=&quot;https://www.emazzanti.net/transparent-communication-after-security-breach/&quot;&gt;eMazzanti — &quot;Transparent Communication After a Security Breach&quot;&lt;/a&gt; (acknowledge → explain impact → detail actions → outline prevention framework) · &lt;a href=&quot;https://www.ilert.com/incident-management-for-msps-guide&quot;&gt;ilert — &quot;Incident Management for MSPs Guide&quot;&lt;/a&gt; (avoid vague &quot;working on it&quot; updates; substance over reassurance) · &lt;a href=&quot;https://www.blackfog.com/cyberattack-transparency/&quot;&gt;Blackfog — &quot;Is Transparency Important Beyond Compliance After a Cyberattack?&quot;&lt;/a&gt; (Uber cover-up case study; concealment costs vs. disclosure trust) · &lt;a href=&quot;https://firehydrant.com/blog/incident-communication/&quot;&gt;FireHydrant — &quot;A Practical Guide to Incident Communication&quot;&lt;/a&gt; (clear language, empathy, audience-tailored updates)&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>leadership</category><category>management</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>Every Management Failure Is a Retrieval Failure</title><link>https://mipyip.com/blog/every-management-failure-is-a-retrieval-failure/</link><guid isPermaLink="true">https://mipyip.com/blog/every-management-failure-is-a-retrieval-failure/</guid><description>The information existed. Someone knew. The failure was that knowledge couldn&apos;t reach the person who needed it, when they needed it. The fix isn&apos;t &apos;communicate better&apos; — it&apos;s building retrieval infrastructure that doesn&apos;t depend on humans remembering to use it.</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Management failures aren&apos;t knowledge failures. The information existed. The system couldn&apos;t deliver it to the right person at the right time. &apos;Communicate better&apos; is blaming humans for broken infrastructure.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;A CRM migration goes sideways. The client agreed to a platform switch during discovery — moving from a legacy system to a modern stack — but nobody verified that the client&apos;s stakeholders understood what &quot;platform switch&quot; actually meant in practice — a &lt;a href=&quot;/blog/the-discovery-tax&quot;&gt;discovery gap&lt;/a&gt; that would compound through the entire engagement. The business analyst coordinating between the client and the development team doesn&apos;t have deep technical background, so requirements arrive translated into approximations. Close enough to act on, not precise enough to build against. The development team builds what they were told. The client expected something else.&lt;/p&gt;
&lt;p&gt;Six weeks in, the client&apos;s primary contact goes quiet — other priorities, internal reorg, the usual. When they re-engage, they&apos;re looking at something they didn&apos;t ask for, built on assumptions nobody validated. The one senior engineer who could have caught the misalignment early was splitting time across four other active projects and only got pulled in when the integration tests started failing.&lt;/p&gt;
&lt;p&gt;At the postmortem, a detail surfaces: the client had submitted a detailed list of issues — workflows that didn&apos;t match their process, fields mapped incorrectly, reports that pulled the wrong data. The list went to the BA. The BA never escalated it. The engineering lead didn&apos;t know it existed. The project sponsor didn&apos;t know it existed. The issues lived in an email thread that reached exactly one person, and that person didn&apos;t have the technical context to assess severity or the process to route them.&lt;/p&gt;
&lt;p&gt;The conclusion was &quot;communication breakdown.&quot;&lt;/p&gt;
&lt;p&gt;The information existed. Someone knew. Multiple people, actually. The BA had the issue list. The client had the concerns. The discovery document had the original agreement. None of it reached the person who could act on it, at the moment they needed to act.&lt;/p&gt;
&lt;p&gt;Every piece of information needed to prevent the failure was already captured. The system just couldn&apos;t deliver it.&lt;/p&gt;
&lt;p&gt;That&apos;s a retrieval failure — not a knowledge failure, not a competence failure. The information existed inside the organization. The system had no mechanism to surface it to the right person at the right time. And it happens everywhere, constantly, at every scale.&lt;/p&gt;
&lt;h2&gt;The pattern that keeps showing up&lt;/h2&gt;
&lt;p&gt;The incident changes — missed deadline, shipped the wrong thing, client blindsided by a decision they thought they&apos;d weighed in on — but the postmortem converges on the same shape. The knowledge was captured. It lived in a Slack thread from two weeks ago, a task comment in the wrong project, a meeting summary that went to the wrong distribution list. The system had the data. The system couldn&apos;t deliver it. KM research has been documenting this for decades — &lt;a href=&quot;https://knowledge-management-tools.net/failure&quot;&gt;the same causal factors&lt;/a&gt; keep appearing: inadequate organizational structure, improper planning and coordination, problems with culture, and technology implementations that prioritize capture over retrieval.&lt;/p&gt;
&lt;p&gt;This is why status meetings exist. The retrieval system is broken, and humans are patching it manually. &quot;Going around the room&quot; is a retrieval protocol. It&apos;s just an expensive, slow, and unreliable one. And when the standup drifts — when it becomes forty-five minutes of self-congratulatory posturing or water-cooler tangents because the person running it isn&apos;t zealous about forward motion — even that manual patch stops working.&lt;/p&gt;
&lt;p&gt;The pattern holds at every scale. A solo founder who can&apos;t remember where they left off on a project last Tuesday? Retrieval failure. A two-hundred-person engineering org where marketing doesn&apos;t know what the development team shipped last week? Same failure mode, different blast radius.&lt;/p&gt;
&lt;h2&gt;Three ways retrieval breaks&lt;/h2&gt;
&lt;p&gt;Retrieval failures often fall into one of three patterns, and all three were present in that CRM migration.&lt;/p&gt;
&lt;h3&gt;State scattered across tools.&lt;/h3&gt;
&lt;p&gt;The project lives in Jira, the decision lives in email, the context lives in someone&apos;s head. No single source of truth, so every handoff requires a human to manually reconstruct context.&lt;/p&gt;
&lt;p&gt;In the migration project, there was no central repository for documentation — artifacts lived in various discrete locations, and the BA didn&apos;t have governance documents or clear project folders for managing them. If you wanted the full picture, you had to assemble it yourself from fragments, and nobody had time to do that.&lt;/p&gt;
&lt;h3&gt;Knowledge locked to individuals.&lt;/h3&gt;
&lt;p&gt;Ask Sarah, she knows how that works. Sarah is a single point of failure with an unassuming job title, and nobody realizes it until she&apos;s on vacation during an incident. Sarah might leave, and then what? &lt;a href=&quot;/blog/your-org-chart-is-a-cognitive-load-map&quot;&gt;Your org chart doesn&apos;t show this&lt;/a&gt; — it shows reporting lines, not where institutional knowledge actually lives.&lt;/p&gt;
&lt;p&gt;In the failed migration project, the one senior engineer who understood the integration architecture was splitting time across four other projects — brought in only when something was already broken, never embedded in the workflow early enough to prevent the break. Constant context-switching, and then an expectation to dig through wildly disorganized task comments to find the state of a project they&apos;d barely been aware of, and were never consulted on at any point before kickoff. An architecture failure masquerading as a staffing decision.&lt;/p&gt;
&lt;h3&gt;Retrieval requires the requester to know what to ask for.&lt;/h3&gt;
&lt;p&gt;If you don&apos;t know a decision was made, you can&apos;t look it up. The system only works for people who already have context.&lt;/p&gt;
&lt;p&gt;That issue list the client submitted? The engineering lead didn&apos;t know it existed, and you can&apos;t retrieve what you don&apos;t know is there — and a system that depends on someone remembering to surface information is a system that will silently drop critical knowledge every time someone forgets, gets busy, or doesn&apos;t realize the information matters.&lt;/p&gt;
&lt;p&gt;All three are &lt;em&gt;architecture problems&lt;/em&gt; that are commonly identified as &lt;em&gt;people problems&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Documentation without retrieval is theater&lt;/h2&gt;
&lt;p&gt;In the words of the great, late Admiral Ackbar: &quot;It&apos;s a trap.&quot;&lt;/p&gt;
&lt;p&gt;But it looks like a solution.&lt;/p&gt;
&lt;p&gt;The organization sets up the wiki, writes the runbooks, creates the project folders — and then thinks the job is done. The information is documented. It&apos;s all right there. Anyone can go look it up.&lt;/p&gt;
&lt;p&gt;Except, no one ever does, because looking it up has a cost: the &lt;a href=&quot;/blog/cognitive-offloading&quot;&gt;activation energy&lt;/a&gt; required to context-switch, open the right tool, navigate to the right page, parse through noise, and extract what you need. Research on task switching shows that even brief mental blocks created by shifting between tasks &lt;a href=&quot;https://www.apa.org/topics/research/multitasking&quot;&gt;can cost as much as 40% of someone&apos;s productive time&lt;/a&gt; — and the costs increase with task complexity. When that cost is high enough, people make decisions with incomplete information instead (not all that dissimilar to an &lt;a href=&quot;/blog/llms-are-practically-adhd&quot;&gt;LLM confabulating content&lt;/a&gt; when it lacks context). Not because they&apos;re lazy or unmotivated — because the friction of retrieval exceeds the perceived risk of guessing. And most of the time, the guess is good enough.&lt;/p&gt;
&lt;p&gt;Most of the time.&lt;/p&gt;
&lt;p&gt;In the migration project, even if every artifact had been perfectly documented — the discovery agreement, the client feedback, the issue list, the integration constraints — it wouldn&apos;t have mattered without a mechanism to push that information to the right person at the right time. The BA had the issues. The documentation existed. Nobody else saw it, because nobody else knew to look, and there was no process that forced it to surface.&lt;/p&gt;
&lt;h3&gt;Documentation without retrieval is performative execution.&lt;/h3&gt;
&lt;p&gt;You did the thing that looks like governance without building the mechanism that makes it work. And when the project fails, you can point to the wiki and say &quot;it was all documented.&quot; Which is true... and also completely beside the point.&lt;/p&gt;
&lt;h2&gt;Cadence as retrieval infrastructure&lt;/h2&gt;
&lt;p&gt;Governance sticks when someone on the team is zealous about forward motion. Not rigid, and not necessarily bureaucratic, but zealous in the sense that they live for making sure things progress — a project manager who cares about the process not because they care about the specific thing being built, but because they care about completion, clarity, and constant progress toward a goal.&lt;/p&gt;
&lt;p&gt;Functionally, that person is a retrieval engine — the human version of the &quot;going around the room&quot; manual patch, except this one actually works because someone zealous is driving it. A mechanism that surfaces information at regular intervals — sprint reviews, standups, retrospectives — whether anyone remembers to ask for it or not. When the standup is run well, it&apos;s a &lt;em&gt;forced&lt;/em&gt; retrieval event. Information surfaces on a cadence.&lt;/p&gt;
&lt;p&gt;The alternative is hoping someone remembers to send the email.&lt;/p&gt;
&lt;p&gt;Or &lt;em&gt;check&lt;/em&gt; their email.&lt;/p&gt;
&lt;p&gt;The structural requirements are straightforward, and achievable:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Forced documentation at task boundaries — not as a bureaucratic checkbox, but with enough agency that people understand why it matters, because mandating documentation without a valid reason breeds resentment. Regular cadence checkpoints run by someone who keeps them &lt;a href=&quot;https://resources.scrumalliance.org/Article/facilitate-daily-scrum&quot;&gt;tight and focused&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A queryable knowledge base — not just a loose collection of files in a folder, but something you can actually search and get answers from.&lt;/li&gt;
&lt;li&gt;Present leadership, not the aloof and distant kind. People who are invested in the day-to-day, every day, not just the quarterly review.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;None of this is new or particularly groundbreaking. The principles of good project governance have been &lt;a href=&quot;https://www.kminstitute.org/blog/knowledge-management-in-action-preventing-mistakes-through-effective-strategies&quot;&gt;documented for decades&lt;/a&gt;. Yet organizations keep failing at them anyway — the system requires humans to maintain it, and humans drift. Good people with good intentions will still let documentation go stale, skip the retro when the sprint runs long, and make decisions from memory when the retrieval cost feels too high.&lt;/p&gt;
&lt;p&gt;So - do you build infrastructure that accounts for that drift — or continue telling people to &lt;em&gt;communicate better&lt;/em&gt;?&lt;/p&gt;
&lt;h2&gt;The machine that doesn&apos;t drift&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If you&apos;re familiar with this site at all, you knew we were going to get to AI.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I manage a fleet of &lt;a href=&quot;/blog/managing-agents-like-teams&quot;&gt;AI agents&lt;/a&gt; across multiple projects. Each one has governance documents — the equivalent of an employee handbook that defines standards, patterns, boundaries, and institutional memory. The difference between an AI agent and a human team member is that the agent follows the governance documents every single session, without drift, and without exception.&lt;/p&gt;
&lt;p&gt;I built the retrieval infrastructure to be mandatory. The agent reads its governance docs during the &lt;a href=&quot;https://github.com/avanrossum/pmem-project-memory-tool-for-claude-code?tab=readme-ov-file#skills-optional&quot;&gt;welcome sequence&lt;/a&gt; at &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;session start&lt;/a&gt;. It logs what it did when sleeping at session end, and &lt;a href=&quot;https://github.com/avanrossum/claude-task-skills&quot;&gt;documents every task as it goes&lt;/a&gt;. There&apos;s no option to skip it — the process is embedded in the workflow, not bolted on as an afterthought.&lt;/p&gt;
&lt;p&gt;The result is that I can walk away from a project for weeks, come back, and the agent knows the current state — what was done, what&apos;s pending, what broke. And this isn&apos;t a result of the agent possessing perfect memory (it doesn&apos;t — context windows are finite, and closing sessions can be like firing a close acquaintence), but because the &lt;em&gt;retrieval system&lt;/em&gt; doesn&apos;t depend on anyone remembering to update it — the system updates itself.&lt;/p&gt;
&lt;p&gt;I&apos;ve pushed this even further with a tool called &lt;a href=&quot;https://github.com/avanrossum/pmem&quot;&gt;pmem&lt;/a&gt; — a local RAG layer that indexes project documents, notes, governance, and lessons learned, and makes them queryable in natural language. Instead of searching through files to find a decision that was made three weeks ago, the agent just asks, and the retrieval system delivers the answer. The cost of retrieval drops to near zero (in tokens, time, and accuracy). And when the cost of retrieval is zero, retrieval actually happens — consistently, every time, without someone having to decide it&apos;s worth the effort.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I even use this process to track projects that AI never even touches, outside of managing the state.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You don&apos;t need AI to do this. Any system that makes querying state cheap and automatic will produce the same effect. The principle is the same whether the retrieval engine is an LLM, a well-structured dashboard, or a zealous project manager with a clipboard.&lt;/p&gt;
&lt;p&gt;I built &lt;a href=&quot;https://github.com/avanrossum/panoptisana&quot;&gt;Panoptisana&lt;/a&gt; — an open-source Asana visibility tool — because Asana buries the very data you need to manage a project: task status, blockers, overdue items, the actual state of things, and GIDs for various elements, which are a requirement for effective automation. The information existed inside Asana, but retrieving it required navigating through nested projects, expanding task comments, trying to remember which project a task was in, and mentally assembling a picture from fragments.&lt;/p&gt;
&lt;p&gt;The cost was too high, so people stopped doing it. Panoptisana surfaces that data in seconds. Panoptisana combined with my Claude Code PM instance and pmem is almost an unfair advantage.&lt;/p&gt;
&lt;p&gt;Same problem, same fix: lower the cost of retrieval until it actually happens.&lt;/p&gt;
&lt;h2&gt;The fix isn&apos;t &quot;communicate better&quot;&lt;/h2&gt;
&lt;p&gt;When someone says &quot;we need to communicate better,&quot; what they almost assuredly mean is: the system we&apos;re using to store and retrieve shared state doesn&apos;t work, and we&apos;re blaming the humans instead of the infrastructure.&lt;/p&gt;
&lt;p&gt;You could have the best communicators in the world on your team and still fail if the inputs are incomplete, the context is scattered across six tools, and the activation energy required to assemble a complete picture is higher than the activation energy required to just guess. Even when someone does communicate clearly — direct language, no hedging, the right level of urgency — it doesn&apos;t matter if the person receiving it has to do archaeology before they can act on it. Parsing through HTML entities in a forwarded email, chasing context across projects that aren&apos;t linked, reconstructing a timeline from disorganized task comments intermixed with Teams chat threads. An often &lt;em&gt;insurmountable&lt;/em&gt; retrieval tax on every single action.&lt;/p&gt;
&lt;p&gt;The organizations that succeed in this arena don&apos;t have better communicators. They have functional retrieval infrastructure — systems, processes, cadence, and solid project documentation — that surfaces the right information at the right time regardless of whether any individual human remembers to do it manually. Building that infrastructure is &lt;a href=&quot;/services/fractional-cto&quot;&gt;what fractional CTO work looks like&lt;/a&gt; in practice — diagnosing where retrieval fails and architecting the fix.&lt;/p&gt;
&lt;p&gt;Communication is a retrieval protocol.&lt;/p&gt;
&lt;p&gt;Fix the protocol.&lt;/p&gt;
&lt;hr /&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt; &lt;a href=&quot;https://www.apa.org/topics/research/multitasking&quot;&gt;Multitasking: Switching Costs&lt;/a&gt; — APA summary of Rubinstein, Meyer &amp;amp; Evans (2001), &lt;em&gt;Journal of Experimental Psychology: Human Perception and Performance&lt;/em&gt; (task switching costs up to 40% of productive time) · &lt;a href=&quot;https://knowledge-management-tools.net/failure&quot;&gt;Knowledge Management Failure&lt;/a&gt; — synthesis of causal and resultant KM failure factors · &lt;a href=&quot;https://www.kminstitute.org/blog/knowledge-management-in-action-preventing-mistakes-through-effective-strategies&quot;&gt;Preventing Mistakes Through Effective KM Strategies&lt;/a&gt; — KM Institute (operational errors from lack of access to accurate information) · &lt;a href=&quot;https://resources.scrumalliance.org/Article/facilitate-daily-scrum&quot;&gt;Facilitate the Daily Scrum&lt;/a&gt; — Scrum Alliance (standup facilitation as retrieval mechanism)&lt;/p&gt;
&lt;/small&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;For the architectural methodology behind building retrieval systems: &lt;a href=&quot;/blog/governance-is-architecture&quot;&gt;Governance Is Architecture&lt;/a&gt;. For the specific documents that make this work: &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;The Governance Documents&lt;/a&gt;. For how retrieval architecture applies to cognitive load: &lt;a href=&quot;/blog/cognitive-offloading&quot;&gt;Cognitive Offloading&lt;/a&gt;. For the ownership question that arises when your retrieval infrastructure becomes portable: &lt;a href=&quot;/blog/cognitive-property&quot;&gt;Cognitive Property&lt;/a&gt;. For what happens when retrieval failure applies specifically to the burnout signal in a technical keystone: &lt;a href=&quot;/blog/the-keystone-burnout&quot;&gt;How Technical Keystones Burn Out&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Want to know how your organization&apos;s retrieval infrastructure actually stacks up? The &lt;a href=&quot;/tools/cto-diagnostic&quot;&gt;CTO diagnostic&lt;/a&gt; scores you across eight operational domains in about two minutes.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>leadership</category><category>architecture</category><category>management</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>Latency Kills Curiosity</title><link>https://mipyip.com/blog/latency-kills-curiosity/</link><guid isPermaLink="true">https://mipyip.com/blog/latency-kills-curiosity/</guid><description>The same pattern that bounces a visitor from a slow website also erodes curiosity in careers, teams, and minds. Latency isn&apos;t just page speed. It&apos;s any friction between a person and the thing they&apos;re trying to explore.</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;A manager once told me that taking a five-minute brain break every 35 minutes was part of the reason W2 employees are inefficient. That statement broke something in how I understood work. This post is about what I rebuilt in its place.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&quot;Taking a five-minute break every thirty-five minutes is part of the reason W2 employees are inefficient. Contractors don&apos;t bill you for that. They only bill you when they&apos;re &lt;em&gt;working&lt;/em&gt;.&quot;&lt;/p&gt;
&lt;p&gt;A manager said this to me, out loud, about the Pomodoro technique. A researched, documented productivity method that exists because sustained focus without breaks degrades performance. Whether intended or not, this statement communicated that his position was that rest is waste, and the proof was that contractors don&apos;t charge for it (they do, obviously, they just fold it into their rate — but the belief was sincere).&lt;/p&gt;
&lt;p&gt;I carried that belief — that doing anything other than work while at work was a moral failing — for longer than I should have. That the inability to sustain eight continuous hours of output meant something was wrong with &lt;em&gt;me&lt;/em&gt;, not the expectation.&lt;/p&gt;
&lt;p&gt;It took a very long time to understand that this wasn&apos;t a discipline problem. It was a systemic one.&lt;/p&gt;
&lt;h2&gt;The three-second rule and its cousins&lt;/h2&gt;
&lt;p&gt;There&apos;s a well-documented principle in web performance: if your page takes more than three seconds to load, roughly half your visitors leave. They don&apos;t complain. They don&apos;t file a bug report. They just go somewhere else. The curiosity that brought them to your page evaporates before the content arrives.&lt;/p&gt;
&lt;p&gt;This site scores 100 on Google&apos;s PageSpeed Insights. That&apos;s deliberate. Not because I&apos;m chasing a number (well, ok, maybe a little), but because I believe that the space between &quot;I want to see this&quot; and &quot;I can see this&quot; should be as close to zero as possible; every millisecond of friction is a tax on the visitor&apos;s willingness to engage.&lt;/p&gt;
&lt;p&gt;The same principle operates at every other scale. It just moves slower, so the damage is harder to see.&lt;/p&gt;
&lt;h2&gt;When the latency is your calendar&lt;/h2&gt;
&lt;p&gt;In a work environment, latency looks like this: you have an idea. Maybe it&apos;s a better way to handle a deployment pipeline, or a pattern you noticed in client data, or a fix for a &lt;a href=&quot;/blog/page-builder-cache-guard&quot;&gt;years-old page builder quirk&lt;/a&gt;, or a tool that could save the team hours per week. But there&apos;s no time to explore it. The sprint is full. The backlog is groaning. There&apos;s a client call in twenty minutes and you haven&apos;t prepped.&lt;/p&gt;
&lt;p&gt;So the idea goes into a notebook. Or a sticky note. Or the back of your head, which is already holding &lt;a href=&quot;/blog/cognitive-offloading&quot;&gt;forty other things it can&apos;t afford to drop&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A week later, the idea is gone. Not because it was bad, but because the environment provided zero space between &quot;I&apos;m curious about this&quot; and &quot;I can explore this.&quot; The latency was too high, and curiosity bounced.&lt;/p&gt;
&lt;p&gt;Multiply that by months. By years. What you get isn&apos;t laziness or disengagement; it&apos;s something sinister and quieter and more corrosive: curiosity that&apos;s stopped aiming at the work. Stagnation. Rote repetition. Work that technically gets done, but without intent or clarity. The lights are on, the engine is running, but nobody&apos;s driving.&lt;/p&gt;
&lt;h2&gt;Curiosity doesn&apos;t disappear, it redirects.&lt;/h2&gt;
&lt;p&gt;The person who can&apos;t explore within their work starts exploring outside of it. They get distracted more easily. They disengage from tasks that used to hold their attention. They start to resent the work itself, not because the work changed, but because it became the barrier between them and the thing their brain actually wants to do.&lt;/p&gt;
&lt;p&gt;This looks like a performance problem from the outside. From the inside, it feels like suffocation.&lt;/p&gt;
&lt;p&gt;The risk isn&apos;t that people stop working. The risk is that they stop caring about the work. And once that happens, the quality degrades in ways that are invisible until something breaks.&lt;/p&gt;
&lt;h2&gt;When the latency drops&lt;/h2&gt;
&lt;p&gt;When I give myself permission to wander — to follow a tangent, to explore something adjacent to the task, to take the five-minute break that a manager once told me was proof of inefficiency — the quality of my work goes up. Measurably.&lt;/p&gt;
&lt;p&gt;Connections form between domains that seemed unrelated. Solutions appear for problems I wasn&apos;t actively working on. The tension and stress of sustained &quot;action mode&quot; drains away enough that the next focused session is sharper, faster, and more intentional.&lt;/p&gt;
&lt;p&gt;This isn&apos;t a productivity hack or a wellness platitude. It&apos;s architecture. The same way a &lt;a href=&quot;/blog/governance-is-architecture&quot;&gt;well-designed system has buffer capacity&lt;/a&gt; and graceful degradation paths, a well-designed work pattern has margin for the brain to do its background processing. Remove the margin and the system still runs, but it runs brittle. One unexpected load and something cracks.&lt;/p&gt;
&lt;h2&gt;Tangential exploration is a feature&lt;/h2&gt;
&lt;p&gt;The instinct in most organizations is to treat tangential exploration as waste. If you&apos;re not directly producing output against a defined task, you&apos;re not working. This is the same logic that produces the Pomodoro comment — the belief that every minute not spent in direct production is a minute lost.&lt;/p&gt;
&lt;p&gt;It&apos;s also the logic that produces teams who can execute tasks but can&apos;t solve problems. Who can follow a sprint plan but can&apos;t tell you if &lt;a href=&quot;/blog/the-discovery-tax&quot;&gt;the plan is aimed at the right target&lt;/a&gt;. Who deliver exactly what was asked for and &lt;em&gt;nothing that was needed&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Allowing space for exploration during work isn&apos;t a perk or a concession. It&apos;s how you get people who think instead of people who comply. And the difference between those two outcomes is the difference between a team that hits a problem and already has context, and a team that hits a problem and has to stop everything to figure out what&apos;s happening.&lt;/p&gt;
&lt;h2&gt;The footer line&lt;/h2&gt;
&lt;p&gt;At the bottom of this site, there&apos;s a line: &lt;em&gt;&quot;This site is intentionally over-engineered for speed, because latency kills curiosity.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When I wrote it, I was thinking about page speed; about not wanting a slow load time to be the reason someone didn&apos;t read a case study or explore the blog. That concept felt important enough to build the entire site around.&lt;/p&gt;
&lt;p&gt;I didn&apos;t have the language for the rest of it yet. But the feeling was already there, had been for decades. That every system I&apos;ve ever struggled against — the slow page, the packed calendar, the expectation of continuous output, the manager who thought breaks were waste — was all the same problem.&lt;/p&gt;
&lt;p&gt;Friction between a person and the thing they want to explore. Latency. And enough of it kills the curiosity that makes good work possible.&lt;/p&gt;
</content:encoded><category>leadership</category><category>adhd</category><category>cognitive-offloading</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>The Craftsperson&apos;s Tools: Who Owns the AI Governance Docs You Built?</title><link>https://mipyip.com/blog/the-craftspersons-tools/</link><guid isPermaLink="true">https://mipyip.com/blog/the-craftspersons-tools/</guid><description>Your AI governance frameworks encode how you think into portable files. The employer owns the output — but the tools? Where you build them determines who keeps them.</description><pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;A carpenter&apos;s jig is inert without the carpenter. Your CLAUDE.md is not. When your reasoning process exists in transferable files, the ownership question changes — and the account you build on is the heuristic that answers it.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;A carpenter who works at a cabinet shop builds cabinets that belong to the shop. That&apos;s the deal — your labor, their product. When the carpenter leaves, the cabinets stay.&lt;/p&gt;
&lt;p&gt;But what about the jigs? The fixtures the carpenter built — perhaps on his own time — to make their work faster, more precise, more repeatable? The muscle memory of a particular saw angle, the eye for grain direction, the instinct for how this type of joint responds in humidity?&lt;/p&gt;
&lt;p&gt;That&apos;s never been a question. The cabinets are the shop&apos;s. The skill is the carpenter&apos;s. The jigs occupy a gray area that usually resolves in the carpenter&apos;s favor — because a jig without the person who built it is just a piece of wood with holes in it. The knowledge of when and how to use it lives in the carpenter&apos;s head.&lt;/p&gt;
&lt;p&gt;That distinction has held for centuries. The rise of Agentic AI (LLMs) is breaking it.&lt;/p&gt;
&lt;h2&gt;The jig that works without you&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/blog/cognitive-property&quot;&gt;The previous post&lt;/a&gt; in this series argued that your AI governance frameworks — the CLAUDE.md files, the decision-making heuristics, the prompt patterns, the architectural preferences you&apos;ve encoded into documents — are cognitive property. Your reasoning process, externalized into a transferable format.&lt;/p&gt;
&lt;p&gt;So what makes that different from every prior version of &quot;I take my skills with me when I leave?&quot;&lt;/p&gt;
&lt;p&gt;The carpenter&apos;s jig is inert without the carpenter. It&apos;s a tool that amplifies existing skill — useless to someone who doesn&apos;t already know the craft, and &lt;em&gt;possibly&lt;/em&gt; cumbersome at best to another carpenter with their own methods. A governance document is not inert. Feed it to a fresh AI instance and you get a functional version of how you solve problems. Not perfect, but operational. The tool works without you in a way that a carpenter&apos;s jig never could.&lt;/p&gt;
&lt;p&gt;That changes the ownership math. When the skill only existed in your head, the boundary was simple: work product belongs to the employer, expertise belongs to you. Nobody could take your expertise because it wasn&apos;t extractable.&lt;/p&gt;
&lt;p&gt;Now it is.&lt;/p&gt;
&lt;p&gt;It&apos;s sitting in one or more markdown files. And the question of who owns that file matters a lot more than it did when the equivalent knowledge was locked inside your nervous system.&lt;/p&gt;
&lt;h2&gt;The account boundary&lt;/h2&gt;
&lt;p&gt;The ownership question has a surprisingly clean heuristic. Not your laptop. Not your office. Not your work hours. The account.&lt;/p&gt;
&lt;p&gt;If you&apos;re building governance frameworks on a corporate AI account — the company&apos;s subscription, the company&apos;s workspace, administered by the company&apos;s IT department — the company has a reasonable claim on what&apos;s built inside it. That&apos;s the cabinet shop. Their tools, their subscription, their infrastructure. The work product and the meta-work product (the frameworks that produce it) both live under their roof.&lt;/p&gt;
&lt;p&gt;If you&apos;re building on your own account — your subscription, your money, your personal workspace — that&apos;s your workshop. The projects you deliver might belong to your employer, but the system you built to produce them is yours. The same way a freelance carpenter owns their personal tool collection regardless of which shop they&apos;re currently working in.&lt;/p&gt;
&lt;p&gt;The same principle has governed trade work for generations: the employer owns the output, the craftsperson owns the tools. The new variable is that &quot;tools&quot; now includes documented reasoning processes that function without you.&lt;/p&gt;
&lt;h2&gt;The counterargument that doesn&apos;t hold&lt;/h2&gt;
&lt;p&gt;There&apos;s a predictable objection: &quot;You wouldn&apos;t have developed those patterns if you hadn&apos;t needed to for this job.&quot; The argument being that the cognitive infrastructure is a derivative of the employment, and therefore belongs to the employer.&lt;/p&gt;
&lt;p&gt;By that logic, everything you learn at any job is company property. The architectural patterns you internalized. The debugging instinct you developed. The leadership style you refined under pressure. Nobody seriously believes that — and courts have consistently upheld the distinction between &lt;a href=&quot;https://www.venable.com/insights/publications/ip-quick-bytes/understanding-the-work-made-for-hire-doctrine&quot;&gt;work product and professional skill&lt;/a&gt;, even when the skill was developed entirely on company time.&lt;/p&gt;
&lt;p&gt;The principle hasn&apos;t changed. You own your expertise. What&apos;s changed is the evidence. Before AI governance documents, your expertise was implicit — hard to quantify, impossible to transfer wholesale. Now it&apos;s explicit. It&apos;s a repo. And explicit things are easier to claim ownership of, in both directions.&lt;/p&gt;
&lt;h2&gt;Where you build matters more than when you build&lt;/h2&gt;
&lt;p&gt;Most employment agreements have an &lt;a href=&quot;https://www.briffa.com/blog/ip-clauses-in-employment-contracts-and-assignments/&quot;&gt;IP assignment clause&lt;/a&gt;. The standard version says something like: anything you create using company resources, during company time, or related to company business belongs to the company. These clauses were written for code and patents. They weren&apos;t written for the cognitive infrastructure that produces code.&lt;/p&gt;
&lt;p&gt;(I&apos;m not a lawyer, and none of this is legal advice. But the legal landscape here is worth understanding even if you never end up in a dispute.)&lt;/p&gt;
&lt;p&gt;There&apos;s a meaningful legal distinction between &quot;I built this feature for the company&apos;s product&quot; (clearly theirs) and &quot;I developed a methodology for how I approach all engineering problems, which I also used while building features for the company&apos;s product&quot; (much less clearly theirs). The former is work product. The latter is professional development — it just happens to exist in a series of files now instead of only in your head.&lt;/p&gt;
&lt;p&gt;Some jurisdictions have already drawn a version of this line. California&apos;s &lt;a href=&quot;https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2870.&amp;amp;lawCode=LAB&quot;&gt;Labor Code §2870&lt;/a&gt; says an employer can&apos;t force assignment of inventions developed entirely on the employee&apos;s own time without using the employer&apos;s equipment, supplies, or trade secrets. Courts have gone further — in &lt;a href=&quot;https://www.hunton.com/insights/legal/employment-law-and-patent-law-collide&quot;&gt;&lt;em&gt;Whitewater West v. Alleshouse&lt;/em&gt;&lt;/a&gt;, the Federal Circuit struck down assignment clauses that reached beyond active employment, and California law &lt;a href=&quot;https://www.manatt.com/insights/newsletters/intellectual-property-law/california-law-former-employer-cannot-require-assi&quot;&gt;prohibits employers from claiming inventions created after employment ends&lt;/a&gt;. Not every state has these protections, and your jurisdiction matters. But the principle is established: own time, own resources, own tools.&lt;/p&gt;
&lt;p&gt;The practical implication is uncomfortable but important: where you build your cognitive infrastructure matters. Not when, and not whether you were &quot;on the clock.&quot; Whether the account, the subscription, and the workspace belong to you or to your employer.&lt;/p&gt;
&lt;p&gt;A developer who builds their CLAUDE.md and governance frameworks on their personal Claude account, using their personal subscription, and then applies that methodology at work — that&apos;s a craftsperson using their own tools on the client&apos;s project. The projects belong to the client. The tools come home with the craftsperson.&lt;/p&gt;
&lt;p&gt;A developer who builds their entire cognitive framework inside a corporate-administered AI workspace — that&apos;s a murkier situation. And most people aren&apos;t thinking about which one they&apos;re in.&lt;/p&gt;
&lt;h2&gt;The intentionality tax&lt;/h2&gt;
&lt;p&gt;None of this is automatic. The default — building everything in whatever account is most convenient, usually the corporate one — puts your cognitive property inside someone else&apos;s infrastructure. Not because they&apos;re trying to take it, but because you didn&apos;t think about where you were building.&lt;/p&gt;
&lt;p&gt;The carpenter who shows up to a new shop with their own tools doesn&apos;t have this problem. They know which tools are theirs. The tools traveled with them from the last shop. There&apos;s no ambiguity.&lt;/p&gt;
&lt;p&gt;I pay for my own AI subscriptions. I&apos;ve never asked for reimbursement, and I&apos;ve declined when it&apos;s been offered. The cost is the boundary. If the company pays for the subscription, the company has a reasonable claim on what&apos;s built inside it. Owning the account keeps the ownership question clean — and the annual cost of a Claude subscription is trivially small compared to the value of the cognitive infrastructure I&apos;ve built inside it.&lt;/p&gt;
&lt;p&gt;When I work on company-owned repositories, the governance files travel with me but they don&apos;t live there. Core methodology — the CLAUDE.md, the architecture docs, the task management structures — lives in my own repos, on my own GitHub account. What lands in the company&apos;s codebase is either untracked, loaded via symlink from my personal infrastructure, or an intentionally minimal version that lets the project function without exposing how I think. The full methodology stays in my workshop.&lt;/p&gt;
&lt;p&gt;Custom tools get built on personal time, on personal accounts. Small bugfixes during work hours, sure — the same way a carpenter might sharpen a blade between cuts. But the jig itself gets designed and built at home.&lt;/p&gt;
&lt;p&gt;That&apos;s the intentionality tax. It&apos;s a real cost — maintaining two contexts, paying for your own tools, thinking about where every file lives. Most people won&apos;t pay it. But the alternative is discovering the ownership question after someone else has already answered it for you.&lt;/p&gt;
&lt;h2&gt;The work product stays. The operating system comes with you.&lt;/h2&gt;
&lt;p&gt;The boundary is the same one it&apos;s always been, updated for a new medium. You leave the cabinets at the shop. You take the tools.&lt;/p&gt;
&lt;p&gt;But the tools have changed.&lt;/p&gt;
&lt;p&gt;They&apos;re not just muscle memory and instinct anymore — they&apos;re documented, structured, portable cognitive frameworks that work without you in the room. That makes them more valuable, more extractable, and more worth knowing about.&lt;/p&gt;
&lt;p&gt;I&apos;m not telling you to go set up a separate account tonight. I&apos;m telling you to look at what you&apos;ve already built and know where it lives. The governance documents, the prompt patterns, the architectural preferences you&apos;ve encoded into files that make your AI work like you — where are those? On whose infrastructure? Under whose terms of service?&lt;/p&gt;
&lt;p&gt;The answer might be fine. But it should be deliberate.&lt;/p&gt;
&lt;p&gt;The next post in this series is about what happens when that awareness comes too late — when your documented cognitive patterns become something a company can copy, scale, and redeploy without you in the room.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This is part two of a &lt;a href=&quot;/blog/cognitive-property&quot;&gt;four-post series on cognitive property&lt;/a&gt;. The next post explores what happens when the boundary isn&apos;t respected.&lt;/em&gt;&lt;/p&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Employment law &amp;amp; IP&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.venable.com/insights/publications/ip-quick-bytes/understanding-the-work-made-for-hire-doctrine&quot;&gt;Understanding the Work Made for Hire Doctrine&lt;/a&gt; — Venable LLP. How courts distinguish employer-owned works from the employee&apos;s underlying skills and know-how.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.briffa.com/blog/ip-clauses-in-employment-contracts-and-assignments/&quot;&gt;IP Clauses in Employment Contracts and Assignments&lt;/a&gt; — Briffa Legal. Overview of standard IP assignment clause patterns and the &quot;in course of employment&quot; test.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Employee invention statutes &amp;amp; case law&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2870.&amp;amp;lawCode=LAB&quot;&gt;California Labor Code §2870&lt;/a&gt; — Employee inventions developed on own time, without employer resources, can&apos;t be force-assigned.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.hunton.com/insights/legal/employment-law-and-patent-law-collide&quot;&gt;Employment Law and Patent Law Collide&lt;/a&gt; — Hunton Andrews Kurth. Federal Circuit strikes down overly broad assignment clauses in &lt;em&gt;Whitewater West v. Alleshouse&lt;/em&gt; (2020).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.manatt.com/insights/newsletters/intellectual-property-law/california-law-former-employer-cannot-require-assi&quot;&gt;California Law: Former Employer Cannot Require Assignment&lt;/a&gt; — Manatt, Phelps &amp;amp; Phillips. CA prohibits employers from claiming post-employment inventions.&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>ai</category><category>architecture</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>I Used WordPress for 20 Years and I Was Wrong</title><link>https://mipyip.com/blog/wordpress-to-astro/</link><guid isPermaLink="true">https://mipyip.com/blog/wordpress-to-astro/</guid><description>After two decades building sites on WordPress — from personal blogs to corporate platforms — I switched to Astro. Here&apos;s why the move to static site generation changed everything about how I build for the web.</description><pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Twenty years of WordPress. Thousands of hours optimizing page builders, caching layers, and plugin conflicts. Then I switched to Astro and hit perfect PageSpeed scores on the first deploy.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;I started building websites on WordPress around 2005. I was also using Joomla at the same time — which, if you&apos;ve ever used it, explains why WordPress won that particular contest quickly and decisively.&lt;/p&gt;
&lt;p&gt;For twenty years, WordPress was the answer. Personal sites, corporate sites, everything in between. It had plugins for anything you could imagine, a theme for every aesthetic, and a community that could solve any problem you ran into. For a long time, it genuinely worked.&lt;/p&gt;
&lt;p&gt;Until it didn&apos;t. And it wasn&apos;t all at once, not a dramatic failure. It was more like twenty years of paper cuts that finally bled out.&lt;/p&gt;
&lt;h2&gt;The Smart Fridge Problem&lt;/h2&gt;
&lt;p&gt;WordPress carries the weight of everything it &lt;em&gt;can&lt;/em&gt; do, whether you need it or not.&lt;/p&gt;
&lt;p&gt;The admin dashboard is a full application. Login system, user management, media library, plugin architecture, database abstraction, REST API, cron jobs — all of it running on every page load, for every visitor, whether your site needs any of it or not. For most sites — and I mean the vast majority — none of that matters. Your marketing site doesn&apos;t need a login system. Your blog doesn&apos;t need a database. Your landing page doesn&apos;t need a REST API.&lt;/p&gt;
&lt;p&gt;But you&apos;re paying for all of it in server resources, attack surface, and complexity.&lt;/p&gt;
&lt;p&gt;Page builders have a tendency to make it worse. Elementor, Divi, WPBakery — they ship every capability they offer to every page, regardless of what you actually use. Need a simple two-column layout? Here&apos;s 400KB of JavaScript that also handles parallax scrolling, animated counters, and particle effects. Just in case.&lt;/p&gt;
&lt;p&gt;It&apos;s like buying a refrigerator with a built-in screen that tracks your grocery inventory and auto-orders milk when you&apos;re running low. If you don&apos;t use grocery delivery services — and most people don&apos;t — you just paid an extra $800 for a screen that collects fingerprints and shows a fancy animation when you get water. The fridge still keeps things cold; the cold part was never the problem.&lt;/p&gt;
&lt;p&gt;And underneath all of this: PHP. In 2026, the entire ecosystem still runs on PHP. It works, the way a lot of things that are decades old still work. But the gap between what&apos;s possible now and what PHP was originally designed for gets wider every year.&lt;/p&gt;
&lt;h2&gt;The PageSpeed Insight&lt;/h2&gt;
&lt;p&gt;I&apos;m obsessive about PageSpeed Insights scores. They&apos;re a proxy for the thing that actually matters — how your site feels to real people on real connections.&lt;/p&gt;
&lt;p&gt;My best WordPress score — ever, across twenty years — was a 97. Desktop only.&lt;/p&gt;
&lt;p&gt;Getting there required a minimal theme (Twenty Twenty-One), Gutenberg blocks instead of a page builder, three plugins total, hours of manual optimization, server-level OPCache configuration, and Cloudflare caching. One wrong plugin update could knock ten points off overnight, and it &lt;em&gt;still&lt;/em&gt; had intermittent issues.&lt;/p&gt;
&lt;p&gt;That was the ceiling. On a good day, with everything perfectly tuned (for hours), 97.&lt;/p&gt;
&lt;p&gt;Here&apos;s a WordPress site I know well. It&apos;s hosted on WPEngine — premium managed hosting. It&apos;s had dozens of hours of professional optimization work. It runs a page builder that specifically markets performance as a feature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mobile: 41 / 86 / 77 / 85. Desktop: 55 / 84 / 77 / 92.&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
  &lt;img src=&quot;/blog/psi-wordpress-mobile.png&quot; alt=&quot;WordPress PageSpeed Insights — Mobile: 41 Performance&quot; /&gt;
  &lt;img src=&quot;/blog/psi-wordpress-desktop.png&quot; alt=&quot;WordPress PageSpeed Insights — Desktop: 55 Performance&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;And here&apos;s this site — the one you&apos;re reading right now.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mobile: 99 / 95 / 100 / 100. Desktop: 100 / 95 / 100 / 100.&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
  &lt;img src=&quot;/blog/psi-astro-mobile.png&quot; alt=&quot;Astro PageSpeed Insights — Mobile: 99 Performance&quot; /&gt;
  &lt;img src=&quot;/blog/psi-astro-desktop.png&quot; alt=&quot;Astro PageSpeed Insights — Desktop: 100 Performance&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;No optimization heroics. No caching plugins. No CDN tricks. Those scores showed up on the first deploy and stayed there. The framework just... ships fast HTML.&lt;/p&gt;
&lt;p&gt;Look at those numbers side by side, and you&apos;ll reach the same conclusion I did: This isn&apos;t a tuning problem.&lt;/p&gt;
&lt;h2&gt;Why Astro&lt;/h2&gt;
&lt;p&gt;The framework I ultimately switched to is called Astro. It&apos;s a static site generator — meaning it builds your entire site into plain HTML files at build time, and that&apos;s what gets served to visitors. No server, no database, no PHP — just files on a CDN.&lt;/p&gt;
&lt;p&gt;Three things made it the right fit:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zero JavaScript by default.&lt;/strong&gt; Astro ships no client-side JavaScript unless you explicitly add it. Most marketing sites don&apos;t need JavaScript at all — they&apos;re documents, not applications. Astro treats them that way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Markdown as a first-class content format.&lt;/strong&gt; Every blog post on this site is a Markdown file — plain text with lightweight formatting. I opted to use Astro&apos;s component system for the other pages, but I didn&apos;t have to. The entire site could be Markdown if I wanted it to be. No visual editor needed, no database, no lock-in. If you&apos;ve ever written a README on GitHub, you&apos;ve written Markdown.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Framework-agnostic.&lt;/strong&gt; Astro doesn&apos;t force you into React, Vue, or any other JavaScript framework. You can use them if you want. You can also use none of them. For a marketing site that&apos;s mostly content, &quot;none&quot; is the right answer.&lt;/p&gt;
&lt;p&gt;That last point is what delivers the PageSpeed scores. No framework overhead means no framework tax on every page load.&lt;/p&gt;
&lt;h2&gt;Markdown Is How I Already Think&lt;/h2&gt;
&lt;p&gt;I&apos;d been writing in Markdown for years before I built this site. Outline, Notion, Obsidian — every notes tool I&apos;ve used in the last decade speaks Markdown natively. My project documentation is Markdown. My random notes are Markdown. The styling shortcuts are second nature at this point — I see the content formatted when I see the symbols. I don&apos;t need a visual preview to know what a &lt;code&gt;##&lt;/code&gt; header or a &lt;code&gt;**bold phrase**&lt;/code&gt; looks like rendered.&lt;/p&gt;
&lt;p&gt;Markdown files are absurdly portable. Plain text that any parser can consume, any system can render, any tool can index. They load instantly. They version-control perfectly. They&apos;ll be readable in fifty years because they&apos;re just text.&lt;/p&gt;
&lt;p&gt;The content format was never the problem. The &lt;em&gt;tooling around it&lt;/em&gt; was the problem. Before AI, maintaining a site built from Markdown files meant manually writing templates, building components, managing routing, handling image optimization — the kind of tedious infrastructure work that made WordPress&apos;s &quot;just install a plugin&quot; approach genuinely appealing.&lt;/p&gt;
&lt;h2&gt;The AI Multiplier&lt;/h2&gt;
&lt;p&gt;I work with a Claude Code agent that has full context on this site&apos;s codebase — the architecture, the design standards, the content strategy, the voice. We work in the source files simultaneously.&lt;/p&gt;
&lt;p&gt;This blog post is a good example of what that workflow looks like:&lt;/p&gt;
&lt;p&gt;I had a seven-word idea: &quot;blog post about why I love Astro.&quot; The agent created the notes file. Then it interviewed me — one question at a time, conversational, pulling out details I wouldn&apos;t have thought to include in an outline. It compiled the raw interview into structured notes. I reviewed, added context, corrected emphasis. It drafted. I edited. We polished the final version side by side in &lt;a href=&quot;/products/sidemark&quot;&gt;SideMark&lt;/a&gt; — a Markdown editor I built specifically for this kind of collaborative workflow.&lt;/p&gt;
&lt;p&gt;The whole pipeline — from idea to draft with images — takes a fraction of what it used to. The bottleneck is my thinking speed, not my typing speed.&lt;/p&gt;
&lt;p&gt;None of that workflow is possible with WordPress. You can&apos;t point an AI agent at a WordPress database and say &quot;work with me on this post.&quot; But you &lt;em&gt;can&lt;/em&gt; point it at a folder of Markdown files with a clear architecture document and watch it understand the entire system in seconds. Add a local semantic memory layer like &lt;a href=&quot;/tools/pmem&quot;&gt;pmem&lt;/a&gt; and the agent can recall decisions, patterns, and context from months of previous sessions — no re-explaining needed.&lt;/p&gt;
&lt;p&gt;The combination — Markdown content, static site generator, AI-assisted development — turns &quot;I should update my website&quot; from a weekend project into a Tuesday morning. Some posts on this site went from idea to published — with images &lt;em&gt;and&lt;/em&gt; scheduled LinkedIn posts — in under twenty minutes. And they&apos;re still &lt;em&gt;my&lt;/em&gt; words, &lt;em&gt;my&lt;/em&gt; thinking. The combination of Astro and AI just removed the friction between having something to say and saying it.&lt;/p&gt;
&lt;h2&gt;&quot;But My Ecommerce Is on WordPress&quot;&lt;/h2&gt;
&lt;p&gt;I can already hear it. &quot;My store runs on WooCommerce. I can&apos;t separate my marketing site from my ecommerce.&quot;&lt;/p&gt;
&lt;p&gt;You can, and you should.&lt;/p&gt;
&lt;p&gt;Your marketing pages and your ecommerce platform have fundamentally different performance requirements. Marketing pages need to be fast — fast enough that Google ranks them, fast enough that visitors don&apos;t bounce, fast enough that your PageSpeed scores aren&apos;t embarrassing when a potential client checks. Ecommerce pages need to be functional — cart logic, payment processing, inventory management, user accounts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bundling them together means your marketing pages carry the weight of your ecommerce platform on every load.&lt;/strong&gt; Your beautiful landing page is &lt;em&gt;slower because it&apos;s sharing infrastructure with your checkout flow.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Keep your ecommerce where it works — WooCommerce, Shopify, whatever you&apos;ve built. Put it on a subdirectory. Build your marketing site as a separate, blazing-fast static site, and surface product data, cart state, and key behaviors to the marketing side through JavaScript and session management. To the visitor, it looks seamless. Under the hood, each part is optimized for what it actually needs to do.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/blog/managing-agents-like-teams&quot;&gt;Separation of concerns&lt;/a&gt; — it&apos;s an engineering principle that applies to site architecture just as well as it applies to application code.&lt;/p&gt;
&lt;h2&gt;Twenty Years Is a Long Time to Be Wrong&lt;/h2&gt;
&lt;p&gt;WordPress powers a huge portion of the web and it does what it does. I&apos;m not here to bury it (and I wouldn&apos;t want to if I could). But after twenty years of paper cuts, accumulated complexity, and a performance ceiling that required heroic effort to approach — I had to ask myself whether I was still using it because it was the right tool, or because it was the familiar one.&lt;/p&gt;
&lt;p&gt;The willingness to evaluate your tools honestly — even the ones you&apos;ve invested decades in — is the difference between building systems that serve you and serving systems you&apos;ve already built.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Not sure whether your WordPress setup is costing you more than it should? The &lt;a href=&quot;/tools/wordpress-diagnostic&quot;&gt;WordPress diagnostic&lt;/a&gt; runs a live audit of your site&apos;s performance, security, and technical health in about two minutes.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>architecture</category><category>devtools</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>Local RAG for Claude Code: Semantic Search Over Your Own Project</title><link>https://mipyip.com/blog/project-memory-for-claude-code/</link><guid isPermaLink="true">https://mipyip.com/blog/project-memory-for-claude-code/</guid><description>Claude Code has session memory and governance documents, but on a project with five hundred markdown files, the gap between what the agent can read at startup and what the project actually knows gets wider every week. pmem is a local RAG memory system that gives Claude Code persistent, semantic search across your project&apos;s full history. No external APIs. Setup in two minutes.</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Every Claude Code session starts from zero. Grepping through hundreds of governance documents wastes tokens and misses semantic matches. pmem gives your agent persistent memory — local, private, and searchable by meaning.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;More than five hundred markdown files.&lt;/p&gt;
&lt;p&gt;That&apos;s what the project that drives this website has. ROADMAP.md, ARCHITECTURE.md, CLAUDE.md, CHANGELOG.md, task folders with notes and lessons learned, blog editorial notes, half-complete LinkedIn drafts, voice-to-text blog post concepts that are barely discipherable even by me, memory files from past sessions. Each one holds a piece of the project&apos;s history — a decision, a rationale, a thing that broke and how it got fixed.&lt;/p&gt;
&lt;p&gt;Claude Code can&apos;t see any of it unless I point it at the right file — or it reads them on its own, burning tokens on retrieval before the real work starts.&lt;/p&gt;
&lt;p&gt;Claude Code isn&apos;t completely amnesiac — it has session memory, it reads CLAUDE.md, and with the right governance documents it can recover a lot of context at session start. For smaller projects, that&apos;s enough. But this website, for example, has over five hundred files of accumulated institutional knowledge, and the gap between &quot;what the agent can reasonably read at startup&quot; and &quot;what the project actually knows&quot; grows wider every week.&lt;/p&gt;
&lt;p&gt;So what do you do? You grep. You tell Claude to search for the thing you vaguely remember documenting somewhere. It reads files, scans for keywords, and — sometimes — finds what you need.&lt;/p&gt;
&lt;p&gt;But with a large number of text-based files, it often doesn&apos;t. Because grep matches text, not meaning. If the answer uses different words than your question, grep misses it. If the context is spread across three files, grep finds fragments. And every file Claude reads to search for something is tokens spent on retrieval instead of the actual work.&lt;/p&gt;
&lt;p&gt;I was spending significant portions of sessions just helping the agent find context it should already have had access to.&lt;/p&gt;
&lt;h2&gt;The prompt that built it&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;/blog/the-discovery-tax&quot;&gt;Discovery Tax&lt;/a&gt; thesis applies to AI development as much as it applies to enterprise projects: the quality of what you build is directly proportional to the quality of what you specified before building started.&lt;/p&gt;
&lt;p&gt;I want to show two prompts, because the contrast illustrates something I think a lot of people miss about working with AI agents.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The vague prompt:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I want to give agents better memory.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This goes nowhere useful. No constraints, no architecture, no scope. The agent could build anything from a flat JSON file to a Kubernetes-deployed vector database with a React frontend. It would probably pick something in the middle and spend four hours building infrastructure you didn&apos;t need. You&apos;d end up with code that (maybe) works but doesn&apos;t solve your actual problem — because you never described your actual problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The prompt I actually used&lt;/strong&gt; (simplified and compressed into natural language for readability):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I need to enhance the memory capabilities of Claude Code. Since I use Claude Code for more than just writing code — managing tasks, building documentation, maintaining infrastructure — I can generate thousands of files and folders. While they do get archived regularly, digging through them is a token and time sink, and can sometimes prove inaccurate, especially with larger projects.&lt;/p&gt;
&lt;p&gt;We will use Ollama embeddings and build a RAG that the agent can use to query the entire project&apos;s files.&lt;/p&gt;
&lt;p&gt;The tool must also be able to connect to a local LLM (optional) in order to further reduce token usage when parsing results.&lt;/p&gt;
&lt;p&gt;For now, we are going to be focused on TXT and MD files, and will expand as needed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The difference isn&apos;t length. It&apos;s that the second prompt contains a discovery phase. It names the problem (token waste, inaccurate retrieval across large projects). It specifies the technology (Ollama embeddings, RAG). It defines the integration point (Claude Code, via MCP). It sets constraints (local-first, TXT and MD only). And it draws an explicit scope boundary — &quot;for now&quot; — which tells the agent what&apos;s out of bounds without killing future expansion.&lt;/p&gt;
&lt;p&gt;That&apos;s not prompt engineering as a parlor trick. That&apos;s the same discipline you&apos;d apply to a project brief for a human team. The agent doesn&apos;t need a better prompt template. It needs you to finish thinking before you start asking.&lt;/p&gt;
&lt;p&gt;I would like to reiterate something, though:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is the same discipline you&apos;d apply to a project brief for a human team.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You &lt;em&gt;have&lt;/em&gt; to know what you are asking for, how to build it, and how to work with the final product and understand how it works before you can get a functional, consistent result.&lt;/p&gt;
&lt;h2&gt;What pmem does&lt;/h2&gt;
&lt;p&gt;The flow is simple enough to describe in one sentence: Claude asks a question, pmem finds the answer in your project&apos;s files, and returns it with source citations.&lt;/p&gt;
&lt;p&gt;Under the surface:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Indexing.&lt;/strong&gt; &lt;code&gt;pmem index&lt;/code&gt; walks your project&apos;s markdown and text files, splits them into semantic chunks using header-aware parsing (a section stays with its heading — it doesn&apos;t get split mid-thought), and embeds each chunk locally using &lt;code&gt;nomic-embed-text&lt;/code&gt; via Ollama. Chunks are stored in ChromaDB, a file-based vector database that requires no server process. Indexing is incremental: SHA-256 hashes track which files have changed, so subsequent runs only re-embed what&apos;s new.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Querying.&lt;/strong&gt; When Claude needs context, it calls the &lt;code&gt;memory_query&lt;/code&gt; MCP tool with a natural language question. pmem embeds the question using the same model, searches the vector store for semantically similar chunks using &lt;a href=&quot;https://docs.trychroma.com/docs/collections/configure#distance-function&quot;&gt;cosine similarity&lt;/a&gt; (ChromaDB&apos;s default distance metric), and returns the top results with source file paths and relevance scores. Optionally, a local LLM (via any OpenAI-compatible endpoint) synthesizes the chunks into a concise answer before returning it — which saves Claude from processing raw chunks and reduces token usage further, and allows the user to interface with the pmem datastore directly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Session rituals.&lt;/strong&gt; Three slash commands turn memory into a workflow: &lt;code&gt;/welcome&lt;/code&gt; reads governance documents and refreshes the index at session start. &lt;code&gt;/sleep&lt;/code&gt; updates governance documents and captures session changes at session end. &lt;code&gt;/reindex&lt;/code&gt; refreshes mid-session when files have changed. The index stays current because maintaining it is a side effect of the session workflow, not a separate chore.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;No data leaves your machine. No API keys required for core functionality. The entire system runs on Ollama (for embeddings), ChromaDB (for storage), and Python.&lt;/p&gt;
&lt;h2&gt;Why not just use grep?&lt;/h2&gt;
&lt;p&gt;The semantic difference matters more than you might think.&lt;/p&gt;
&lt;p&gt;Last week, in my Project Management Claude, I needed to find a task related to Salesforce, only the scope of the task had changed considerably since. The PM has somewhere close to 2,500 MD files, and the task folder was named based on the old scope, which I could only partially remember. I had initially asked Claude to try to find that task, so I could extract a Lesson Learned from the result, but Claude struggled, even with the date constraint, and eventually I halted the search and started digging through the (fortunately well-structured) folders myself.&lt;/p&gt;
&lt;p&gt;I did find what I was looking for, but I realized that I shouldn&apos;t have to.&lt;/p&gt;
&lt;p&gt;That&apos;s the difference between text matching and semantic search. And in a project with hundreds (or thousands!) of files, the questions you ask are almost never phrased the same way as the answers you wrote.&lt;/p&gt;
&lt;p&gt;The token savings compound too. I ran the same query — &quot;identify governance-related blog posts&quot; — both ways on this project (500+ markdown files) and asked Claude to estimate the token cost of each approach:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;pmem (index-based)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Fresh search (Explore agent)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Results&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;18 posts&lt;/td&gt;
&lt;td&gt;11 posts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~20 seconds&lt;/td&gt;
&lt;td&gt;~90 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Token cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~5,500&lt;/td&gt;
&lt;td&gt;~20,000–24,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The fresh search cost roughly 4× the tokens (cries in tokens) and found 7 fewer posts. The posts it missed were the ones where governance was a supporting theme rather than the headline — exactly the kind of semantic connection that keyword search can&apos;t make.&lt;/p&gt;
&lt;p&gt;The agent&apos;s overhead — its own system prompt, tools, multi-step reasoning — is the hidden cost. It&apos;s worth it for open-ended exploration across a large codebase, but for a targeted retrieval question like &quot;which posts mention governance,&quot; the index was both cheaper and more thorough.&lt;/p&gt;
&lt;p&gt;And the speed difference shows up in real editing sessions, not just benchmarks. While drafting a blog post about switching from WordPress to Astro, I mentioned &quot;separation of concerns&quot; and wanted to cross-link to an existing post that covered the concept. I asked pmem. It found the right post, returned the slug, and the link was in place — all within about five seconds, without breaking the editing flow. That kind of retrieval latency is the difference between &quot;I&apos;ll add that link later&quot; and actually adding it.&lt;/p&gt;
&lt;h2&gt;Architecture decisions worth mentioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;No LangChain.&lt;/strong&gt; Not out of ideology — out of simplicity. pmem is around 2,000 lines of Python. LangChain would have added a dependency tree larger than the project itself, for abstractions I didn&apos;t need. The RAG pipeline is: embed → store → search → (optionally) synthesize. That&apos;s four operations. They don&apos;t need a framework.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ChromaDB over everything else.&lt;/strong&gt; File-based, no server process, persistent, and the Python API is clean. I considered LanceDB but never formally evaluated it — ChromaDB was already working, file-based, no server process, and the evaluation wasn&apos;t worth the detour. I also considered plain JSON with numpy cosine similarity, which works for small projects but &lt;a href=&quot;http://ann-benchmarks.com&quot;&gt;doesn&apos;t scale&lt;/a&gt; — brute-force linear scan is O(n) per query, and once you&apos;re past a few hundred chunks the latency adds up fast compared to ANN-indexed alternatives. ChromaDB hit the sweet spot: real vector search without operational overhead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Header-aware chunking.&lt;/strong&gt; Most RAG tutorials split text by character count or sentence boundaries. That destroys semantic units. A section titled &quot;Why we chose CloudFront over Fastly&quot; that gets split between two chunks loses meaning in both. pmem&apos;s chunker uses markdown headers as natural split points, with a size-based fallback for sections that are too long, and each size-based chunk also receives a heading_path as well. The heading becomes metadata on each chunk, so search results carry their context.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CWD walk-up for project detection.&lt;/strong&gt; Same pattern git uses: start in the current directory, walk up until you find a &lt;code&gt;.memory&lt;/code&gt; directory. No config file needed to tell pmem where the project root is. &lt;code&gt;pmem init&lt;/code&gt; creates the &lt;code&gt;.memory&lt;/code&gt; directory, and from that point forward, any subdirectory just works.&lt;/p&gt;
&lt;h2&gt;The governance connection&lt;/h2&gt;
&lt;p&gt;pmem isn&apos;t a standalone tool, it&apos;s the persistence layer for a &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;governance methodology&lt;/a&gt; that&apos;s been accumulating for months.&lt;/p&gt;
&lt;p&gt;The governance documents — CLAUDE.md, ROADMAP.md, ARCHITECTURE.md, CHANGELOG.md — are designed to carry institutional knowledge forward across sessions. They work. But they work by requiring the agent to read them at session start, which means the agent has to know which files to read and those files have to stay within a readable size.&lt;/p&gt;
&lt;p&gt;pmem removes that constraint. The agent doesn&apos;t need to read every governance document front-to-back at session start. It reads the critical ones (CLAUDE.md is always first), and for everything else — past task context, historical decisions, lessons learned, archived content — it queries pmem.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;/welcome&lt;/code&gt; skill indexes the project before the agent starts working. The &lt;code&gt;/sleep&lt;/code&gt; skill captures changes before the session ends. The memory stays current without any manual intervention. It&apos;s &lt;a href=&quot;/blog/cognitive-offloading&quot;&gt;cognitive offloading&lt;/a&gt; applied to the agent itself: the agent doesn&apos;t hold the project&apos;s history in its context window. It holds it in a searchable index and retrieves what it needs, when it needs it.&lt;/p&gt;
&lt;p&gt;The pattern keeps showing up. The same principle that makes &lt;a href=&quot;/blog/llms-are-practically-adhd&quot;&gt;human productivity systems work&lt;/a&gt; — externalize what you can, retrieve what you need — applies to the agents that are supposed to be helping you.&lt;/p&gt;
&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;Prerequisites: Python 3.11+, Ollama running locally, and the &lt;code&gt;nomic-embed-text&lt;/code&gt; model pulled.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install pmem-project-memory
ollama pull nomic-embed-text
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Initialize any project:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/your-project
pmem init
pmem index
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Install the session skills:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pmem install-skills
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Register the MCP server in &lt;code&gt;~/.claude.json&lt;/code&gt; (global) or &lt;code&gt;.mcp.json&lt;/code&gt; (per-project). The README has the exact config block.&lt;/p&gt;
&lt;p&gt;First index takes a few seconds for small projects, up to a minute for large ones. After that, incremental indexing only re-embeds changed files — typically under a second.&lt;/p&gt;
&lt;h2&gt;What&apos;s next&lt;/h2&gt;
&lt;p&gt;Phase 2 is mostly complete: &lt;code&gt;pmem watch&lt;/code&gt; for auto-reindexing, global config defaults, one-command skill installation, better error messages. Phase 3 is where it gets interesting — multi-collection support (separate indexes for different content types), non-markdown file support with language-aware chunking, optional image processing and chunking the results, either with Claude or a LocalLM vision-capable model, and &lt;code&gt;pmem diff&lt;/code&gt; to show how answers change over time.&lt;/p&gt;
&lt;p&gt;The tool is open source, MIT licensed. It exists because I needed it, and I suspect anyone running Claude Code on a project with more than a few dozen files needs it too.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/avanrossum/pmem-project-memory-tool-for-claude&quot;&gt;GitHub&lt;/a&gt; · &lt;a href=&quot;/tools/pmem&quot;&gt;Product page&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;The governance methodology pmem supports: &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;The Governance Documents&lt;/a&gt;. The cognitive offloading framework: &lt;a href=&quot;/blog/cognitive-offloading&quot;&gt;Cognitive Offloading&lt;/a&gt;. The prompt-engineering-as-discovery principle: &lt;a href=&quot;/blog/the-discovery-tax&quot;&gt;The Discovery Tax&lt;/a&gt;. The full Pass@1 methodology: &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;What Is Pass@1?&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Vector search &amp;amp; distance metrics&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.trychroma.com/docs/collections/configure#distance-function&quot;&gt;ChromaDB — Distance Functions&lt;/a&gt; — cosine similarity as default distance metric in ChromaDB&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ann-benchmarks.com&quot;&gt;ANN Benchmarks&lt;/a&gt; — Aumüller, Bernhardsson &amp;amp; Faithfull. Benchmarks comparing brute-force linear scan against approximate nearest neighbor algorithms (HNSW, IVF, Annoy). The standard reference for why indexed vector search outperforms brute-force at scale.&lt;/li&gt;
&lt;/ul&gt;
&lt;/small&gt;</content:encoded><category>ai</category><category>devtools</category><category>architecture</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>Why Your Page Builder Site Goes White After a Cache Purge</title><link>https://mipyip.com/blog/page-builder-cache-guard/</link><guid isPermaLink="true">https://mipyip.com/blog/page-builder-cache-guard/</guid><description>Page builders generate CSS on first render and cache it on disk. When your cache purges, the CSS isn&apos;t there yet. The next visitor gets a white page. I built a WordPress plugin to fix the three failure modes that cause it.</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Page builders write CSS on first render. Cache purges delete the HTML that references it. The next visitor gets unstyled content. This is the architecture of that failure and the three-phase fix.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;A client calls, they are upset, and their site is broken. The homepage is a wall of unstyled text, or it&apos;s completely white. They didn&apos;t touch anything. The hosting company didn&apos;t touch anything.&lt;/p&gt;
&lt;p&gt;Nobody touched anything.&lt;/p&gt;
&lt;p&gt;What happened is a cache purge. Maybe WP Rocket ran its scheduled clear. Maybe someone updated a plugin and LiteSpeed invalidated everything. Maybe Cloudflare&apos;s cache expired. Maybe Divi decided it didn&apos;t like it&apos;s current CSS stack and said &quot;I&apos;m deleting all of them.&quot; The cause doesn&apos;t matter — the symptom is the same: visitors are seeing a site without CSS.&lt;/p&gt;
&lt;p&gt;And it fixes itself on (hard) reload. Sometimes. Which makes it worse, because now the client thinks it was a fluke and the developer can&apos;t reproduce it.&lt;/p&gt;
&lt;p&gt;It&apos;s not a fluke. It&apos;s a structural problem in how page builders interact with caching layers, and it has three distinct failure modes.&lt;/p&gt;
&lt;h2&gt;The architecture of the problem&lt;/h2&gt;
&lt;p&gt;Page builders — Divi, Elementor, Beaver Builder, Bricks, Oxygen — generate per-post CSS files on first render and store them on disk. Divi puts them in &lt;code&gt;et-cache&lt;/code&gt;. Elementor uses &lt;code&gt;/elementor/css/&lt;/code&gt;. Beaver Builder uses &lt;code&gt;bb-plugin/cache&lt;/code&gt;. The specifics vary, but the final pattern is the same: CSS doesn&apos;t exist as a static file until someone visits the page.&lt;/p&gt;
&lt;p&gt;This is fine under normal operations: the first visitor triggers the render, the CSS is written, and every subsequent visitor gets it from disk. The caching plugin serves the HTML from cache, the browser fetches the CSS, everything works.&lt;/p&gt;
&lt;p&gt;Until the cache purges (or Divi decides it doesn&apos;t like the CSS stack).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Failure Mode A: Origin cold start.&lt;/strong&gt; The page cache clears. The next visitor triggers a fresh PHP render. The page builder starts writing CSS for that page during the render. Everyone who arrives in the window between &quot;cache purged&quot; and &quot;CSS written to disk&quot; gets a 404 on the stylesheet. They see unstyled content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Failure Mode B: Cloudflare serving stale HTML.&lt;/strong&gt; Cloudflare has your HTML cached at its edge. That HTML references CSS files that no longer exist at origin. Cloudflare serves the HTML (fast!), the browser requests the CSS, Cloudflare tries to fetch it from origin, gets a 404. This happens even when your origin server is perfectly healthy. Cloudflare is doing exactly what it&apos;s supposed to — serving cached content. The problem is that the cached content is wrong.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Failure Mode C: Page cache and CSS out of sync.&lt;/strong&gt; The server page cache is serving HTML that was generated before the most recent CSS regeneration. The HTML references old filenames. The new CSS files exist on disk, but the HTML is pointing at paths that have changed.&lt;/p&gt;
&lt;p&gt;Three failure modes; three different layers. This is why &quot;just clear the cache again&quot; doesn&apos;t always reliably fix it — you&apos;re addressing one layer while the other two are still broken.&lt;/p&gt;
&lt;h2&gt;The fix is layered because the problem is layered&lt;/h2&gt;
&lt;p&gt;I built &lt;a href=&quot;https://github.com/avanrossum/pb-cache-warmer&quot;&gt;Page Builder Cache Guard&lt;/a&gt; to address all three failure modes in sequence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase 1: Force origin warmup.&lt;/strong&gt; After any cache purge event (or on a schedule, or manually), the plugin crawls every published page with a cache-bypassing query string. This forces the server to skip its page cache and run a full PHP render. The page builder writes all CSS files to disk. When real visitors arrive, the CSS is already there. The bypass token is randomized per run so CDN edges also treat each request as uncached.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase 1b: Server page cache purge.&lt;/strong&gt; After regenerating CSS, the plugin purges the server-side page cache entry for the affected URL. This ensures the next request gets fresh HTML with correct CSS references — not the stale cached version that caused the problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase 2: Cloudflare cache purge (optional).&lt;/strong&gt; If you have a Cloudflare API token configured, the plugin tells Cloudflare to drop its cached copies of your HTML and page-builder CSS. Only targets dynamic CSS paths — stable WordPress assets are left alone. Cloudflare re-fetches from your now-warm origin on the next real request.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/blog/pb-cache-guard-settings-top.png&quot; alt=&quot;Page Builder Cache Guard settings — schedule, post types, and warmup configuration&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The last line of defense&lt;/h2&gt;
&lt;p&gt;The three phases handle the proactive case: cache purges, you warm before visitors arrive. But what about the gap? What if a visitor hits the site before the warmup runs?&lt;/p&gt;
&lt;p&gt;A client-side CSS health check handles this. About 600 bytes of inline JavaScript. After page load, it checks whether every stylesheet loaded successfully. If any returns 404, it calls a heal endpoint that runs Phase 1 + 1b + 2 for that specific URL, then reloads the page. A session storage guard prevents reload loops.&lt;/p&gt;
&lt;p&gt;It&apos;s the architectural equivalent of a circuit breaker. The proactive system should catch everything. The health check is there for when &quot;should&quot; meets reality.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/blog/pb-cache-guard-settings-bottom.png&quot; alt=&quot;Page Builder Cache Guard settings — Cloudflare integration, health check, and run history&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Why this matters beyond WordPress&lt;/h2&gt;
&lt;p&gt;This issue isn&apos;t unique to page builders, but they do seem to surface it frequently. It&apos;s a caching coherence problem — multiple layers of cache (origin page cache, CDN edge cache, CSS file cache) that can independently become stale and serve inconsistent content.&lt;/p&gt;
&lt;p&gt;The same class of problem shows up in Kubernetes deployments where pod restarts clear in-memory caches while the CDN still serves old assets. It shows up in Jamstack sites where the build output and the CDN edge can briefly serve different versions of the same page. The failure mode is always the same: layered caches with independent invalidation timelines.&lt;/p&gt;
&lt;p&gt;The fix is also the same class of fix: warm from the bottom up, invalidate from the top down, and add a client-side check for the cases your proactive system misses.&lt;/p&gt;
&lt;p&gt;Free, open source, GPL-2.0. Works with any page builder that generates CSS on first render. Cloudflare integration is optional.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/avanrossum/pb-cache-warmer&quot;&gt;GitHub&lt;/a&gt; · &lt;a href=&quot;/lab&quot;&gt;Lab page&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;For the methodology behind building tools like this: &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;What Is Pass@1?&lt;/a&gt;. For why governance documents make this kind of rapid build possible: &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;The Governance Documents&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Running WordPress and wondering how much of this applies to your setup? The &lt;a href=&quot;/tools/wordpress-diagnostic&quot;&gt;WordPress diagnostic&lt;/a&gt; checks your site&apos;s caching, performance, and plugin health — results in two minutes.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>architecture</category><category>tools</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>The Discovery Tax</title><link>https://mipyip.com/blog/the-discovery-tax/</link><guid isPermaLink="true">https://mipyip.com/blog/the-discovery-tax/</guid><description>Discovery phases feel expensive. Skipping them is more expensive. Every &apos;just build it&apos; directive is a bet that you understand the problem completely before starting. That bet almost never pays.</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Every &apos;just build it&apos; directive transfers responsibility downward. The team inherits unclear goals, unvalidated assumptions, and a timeline built on wishful thinking. Discovery isn&apos;t overhead. It&apos;s insurance.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;div&gt;
  &lt;p&gt;Discovery &lt;span&gt;Tax&lt;/span&gt;&lt;/p&gt;
  &lt;p&gt;/dɪˈskʌv.ər.i tæks/ · noun&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; The additional cost, time, and organizational damage incurred when a project skips proper scoping and discovery. Paid upfront at a discount, or later with interest.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; The gap between what was promised and what was possible — filled by the team, at their expense.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&quot;Just build it.&quot;&lt;/p&gt;
&lt;p&gt;Three words that sound like a decision but function as a transfer. The person saying them feels decisive. The team hearing them inherits every question that didn&apos;t get answered, every assumption that didn&apos;t get tested, and a deadline that has no relationship to the work it describes. It&apos;s the same pattern that shows up in &lt;a href=&quot;/blog/the-green-light-problem&quot;&gt;premature green lights&lt;/a&gt; — confidence substituting for validation.&lt;/p&gt;
&lt;p&gt;While there are many triggers for this, one common pathway is when someone commits to a timeline or a price before the technical reality has been assessed. When the assessment comes back and contradicts the commitment, the commitment wins. The promise already exists. The assessment is just an &lt;em&gt;inconvenience&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&quot;I&apos;ve already promised them, so we have to do it.&quot;&lt;/p&gt;
&lt;p&gt;That sentence is where discovery dies. Not in a planning meeting. Not in a budget review. In a hallway conversation where someone decides that the cost of disappointing a client today is worse than the cost of failing them in three months.&lt;/p&gt;
&lt;h2&gt;The transfer&lt;/h2&gt;
&lt;p&gt;There&apos;s a meaningful difference between two project kickoffs.&lt;/p&gt;
&lt;p&gt;The first sounds like this: &quot;We&apos;re going to build this app by December 18th.&quot;&lt;/p&gt;
&lt;p&gt;The second sounds like this: &quot;Over the next six weeks, we&apos;re going to execute on the following components, in this order, with these dependencies, as we work toward the final deliverable. Here&apos;s where we expect to hit friction. Here&apos;s the mitigation plan. Here&apos;s who owns what.&quot;&lt;/p&gt;
&lt;p&gt;The first one fits on a sticky note, but the second one requires actual work before the work starts. Most organizations pick the sticky note because the second version forces you to confront how much you don&apos;t know yet, and confronting that is uncomfortable. It&apos;s easier to commit to a date and figure it out later.&lt;/p&gt;
&lt;p&gt;The problem is that &quot;figure it out later&quot; has a cost, and it&apos;s &lt;em&gt;always&lt;/em&gt; higher than figuring it out now. Barry Boehm&apos;s &lt;a href=&quot;https://www.cs.cmu.edu/afs/cs/academic/class/17654-f01/www/refs/BB.pdf&quot;&gt;cost-of-change research&lt;/a&gt; showed that fixing a requirements mistake after delivery can cost up to 100x what it would have cost to catch it during discovery. A two-week discovery phase at the beginning of a project can prevent a two-month correction in the middle. But the two weeks feels like delay, and the two months feels like bad luck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&apos;s not bad luck.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s the discovery tax. You pay it now, at a discount. Or you pay it later, with interest.&lt;/p&gt;
&lt;h2&gt;What wishful thinking looks like in a spreadsheet&lt;/h2&gt;
&lt;p&gt;A few years ago, a project landed on my desk that had already been promised to a client. Complex application. Six-week timeline. The rationale: &quot;We already had something similar&quot; and &quot;it shouldn&apos;t be too hard.&quot;&lt;/p&gt;
&lt;p&gt;When I looked at the actual scope, the minimum viable product was going to take longer than six weeks and cost roughly twice what had been quoted. I said this directly. The response: &quot;I&apos;ve already promised them, so we have to do it.&quot;&lt;/p&gt;
&lt;p&gt;So we did it. Or tried to.&lt;/p&gt;
&lt;p&gt;The project was marked by exactly the problems you&apos;d predict: scope creep from day one (because the scope was never fully defined), miscommunications (because the deliverables were unclear), and a team stretched across too many shifting priorities with no framework for managing any of them. Every week surfaced a new assumption that hadn&apos;t been validated. Every new assumption required rework.&lt;/p&gt;
&lt;p&gt;We missed every target. Over budget. Past deadline. The thing that was supposed to take six weeks dragged for months. Not because the team was incompetent, but because the foundation was built on optimism instead of analysis. &lt;a href=&quot;/blog/governance-is-architecture&quot;&gt;Governance is architecture&lt;/a&gt; — and this project had neither. The &lt;a href=&quot;https://personal.utdallas.edu/~chung/SYSM6309/chaos_report.pdf&quot;&gt;Standish Group&apos;s CHAOS research&lt;/a&gt; found that only 16% of software projects succeed on time and on budget. The top causes? Incomplete requirements, changing requirements, and unclear objectives — exactly the things a discovery phase is designed to surface before the first line of code.&lt;/p&gt;
&lt;p&gt;Everything that went wrong was predictable. I&apos;d flagged it, in writing, before the first line of code was committed. And afterward, I was acknowledged exactly once for having been right. Then the same pattern repeated on another project, and another, and another. No further acknowledgment.&lt;/p&gt;
&lt;p&gt;That experience is what drove me to get a Google PM certification and a Scrum Master certification. Not because I was asked to, or directed to; because I watched a project fail in exactly the way I predicted, and I wanted the vocabulary and framework to prevent it from happening again, or at minimum, to document why it kept happening.&lt;/p&gt;
&lt;h2&gt;What discovery actually buys&lt;/h2&gt;
&lt;p&gt;When discovery is done properly, the team experiences something that sounds simple but is remarkably rare: they know what they&apos;re building, why they&apos;re building it, and what &quot;done&quot; looks like.&lt;/p&gt;
&lt;p&gt;That clarity changes everything downstream. Standup meetings have substance, decisions get made against actual criteria, and when scope creep appears (and it always appears), there&apos;s a documented baseline to measure it against. &quot;That&apos;s a great idea, and it&apos;s out of scope for this phase&quot; is a sentence you can only say if the scope exists in writing.&lt;/p&gt;
&lt;p&gt;Good discovery also identifies where the project is going to hurt before the pain starts. Risk profiles, mitigation plans, &lt;a href=&quot;https://www.forbes.com/advisor/business/raci-chart/&quot;&gt;RACI charts&lt;/a&gt; — these aren&apos;t bureaucratic overhead. They&apos;re how a team hits a problem and keeps moving instead of stopping everything to figure out what to do.&lt;/p&gt;
&lt;p&gt;In practice, good discovery looks like stakeholder interviews before the kickoff, not after the first sprint. A constraints inventory that names the things you can&apos;t change. A risk register that identifies where the project will probably hurt, so the team isn&apos;t surprised when it does. A rough work breakdown that sequences dependencies instead of treating every feature as independent. And critically: an explicit list of what you&apos;re &lt;em&gt;not&lt;/em&gt; building, because scope is defined as much by its boundaries as by its contents.&lt;/p&gt;
&lt;p&gt;None of this requires months. A focused two-week discovery on a six-month project is a 6% time investment that de-risks the other 94%.&lt;/p&gt;
&lt;p&gt;Discovery isn&apos;t a phase you complete and file away; it&apos;s the foundation that every subsequent decision rests on. Skip it and every decision downstream is a guess. You might guess right. But you&apos;re betting the project (and your reputation!) on it.&lt;/p&gt;
&lt;h2&gt;Realistic advice&lt;/h2&gt;
&lt;p&gt;Not everyone has the authority to demand a discovery phase. Sometimes the promise has already been made, the budget has already been committed, and you&apos;re the person who has to build what someone else sold. (This is one of the reasons organizations bring in &lt;a href=&quot;/services/fractional-cto&quot;&gt;fractional CTO-level guidance&lt;/a&gt; — someone with the authority and experience to insist on discovery before commitments are made.)&lt;/p&gt;
&lt;p&gt;When that happens: document everything.&lt;/p&gt;
&lt;p&gt;Not to assign blame, not to build a case against anyone. Document because when an under-scoped project fails (and under-scoped projects fail at a rate that would alarm anyone who tracked it), someone is going to ask why. And in that moment, you want to be the person who can say &quot;I know exactly why this failed&quot; rather than the person everyone else points at.&lt;/p&gt;
&lt;p&gt;Document the scope as you understood it.&lt;/p&gt;
&lt;p&gt;Document the gaps you identified.&lt;/p&gt;
&lt;p&gt;Document the conversations where you flagged risks.&lt;/p&gt;
&lt;p&gt;Document the decisions that were made anyway.&lt;/p&gt;
&lt;p&gt;Build a paper trail that reflects reality, because reality is going to show up eventually, and when it does, the person with documentation has a factual record. The person without it becomes the default explanation.&lt;/p&gt;
&lt;p&gt;I&apos;d been overextended across too many domains, too many concurrent projects, too many responsibilities. I&apos;d started to wonder if the problem was me. &quot;Maybe I&apos;m not good enough. Maybe a better engineer could handle all of this.&quot;&lt;/p&gt;
&lt;p&gt;The documentation proved that the scope was the problem, not my competence. And once I could see the scope clearly, written down, across months of projects, the pattern coalesced. No individual contributor can compensate for a structural refusal to scope properly. The failure is architectural, not personal — and the &lt;a href=&quot;/blog/latency-kills-curiosity&quot;&gt;damage compounds&lt;/a&gt; long after the project closes. That realization is what eventually led me to build &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;systems that externalize knowledge continuously&lt;/a&gt; — not as a reaction to one bad project, but as a methodology for every project.&lt;/p&gt;
&lt;p&gt;You can&apos;t build anything on hopes and dreams.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/blog/discovery-tax-hopes-quote.png&quot; alt=&quot;You can&apos;t build anything on hopes and dreams.&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;If you&apos;re not sure whether your technical leadership has the scope problem under control, the &lt;a href=&quot;/tools/cto-diagnostic&quot;&gt;CTO diagnostic&lt;/a&gt; surfaces the gaps in eight domains — including scope management and organizational design.&lt;/em&gt;&lt;/p&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt;
&lt;a href=&quot;https://www.forbes.com/advisor/business/raci-chart/&quot;&gt;RACI Chart: Definitions, Uses And Examples For Project Managers&lt;/a&gt; — Forbes Advisor
&lt;a href=&quot;https://www.cs.cmu.edu/afs/cs/academic/class/17654-f01/www/refs/BB.pdf&quot;&gt;Software Defect Reduction Top 10 List&lt;/a&gt; — Boehm &amp;amp; Basili, IEEE Computer (cost-of-change curve)
&lt;a href=&quot;https://personal.utdallas.edu/~chung/SYSM6309/chaos_report.pdf&quot;&gt;The CHAOS Report&lt;/a&gt; — Standish Group (project success/failure rates)&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>leadership</category><category>project-management</category><category>cto-forward</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>The Green-Light Problem</title><link>https://mipyip.com/blog/the-green-light-problem/</link><guid isPermaLink="true">https://mipyip.com/blog/the-green-light-problem/</guid><description>The most expensive mistake in platform migrations isn&apos;t choosing the wrong platform. It&apos;s recommending one before you&apos;ve validated the assumptions the recommendation depends on. A green light with unresolved checkpoints isn&apos;t a recommendation — it&apos;s a liability.</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;A green light with unresolved checkpoints isn&apos;t a recommendation. It&apos;s a liability. This post covers the anatomy of premature platform migration recommendations, the &apos;not a blocker&apos; trap, and why stage-gated validation saves money.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;A strategy document lands on a client&apos;s desk. It recommends a major platform migration. The tone is confident. The structure is logical. The recommendation is clear: move forward.&lt;/p&gt;
&lt;p&gt;Buried on page three, in qualified language, are a handful of caveats. The primary integration hasn&apos;t been validated with the client&apos;s actual data. The connector vendor hasn&apos;t been vetted beyond a cursory website scan, and a core data system that powers the existing workflow isn&apos;t mentioned at all. The timeline assumes everything works on the first try.&lt;/p&gt;
&lt;p&gt;The client&apos;s leadership reads the document and sees a green light. The technical team reads the same document and sees open questions.&lt;/p&gt;
&lt;p&gt;The gap between those two readings is where six-figure mistakes live.&lt;/p&gt;
&lt;h2&gt;The anatomy of a premature recommendation&lt;/h2&gt;
&lt;p&gt;It&apos;s not malicious. It&apos;s structural.&lt;/p&gt;
&lt;p&gt;Someone does the real technical analysis. They flag risks, identify dependencies, note unresolved questions, and recommend a staged approach: validate the critical assumptions before committing to a full build. The analysis is honest about what&apos;s known and what isn&apos;t.&lt;/p&gt;
&lt;p&gt;Then the analysis gets polished for client consumption, and the risks are softened. &quot;This is an unvalidated dependency that could change the entire architecture&quot; becomes &quot;this will require thoughtful implementation.&quot; The staged approach gets flattened into a single &quot;we recommend moving forward.&quot; The hard questions get cut because they might make the recommendation look uncertain.&lt;/p&gt;
&lt;p&gt;The polished version isn&apos;t wrong, &lt;em&gt;exactly&lt;/em&gt;. Everything in it is technically true. But it&apos;s selectively true in a way that systematically favors proceeding. The caveats might be present but soft; the confidence is high but unearned. And the client, who is paying for expert guidance on a decision they can&apos;t evaluate themselves, reads the document at face value.&lt;/p&gt;
&lt;p&gt;That&apos;s The Green-Light Problem. Not a bad recommendation, but premature; a conclusion delivered before the evidence supports it.&lt;/p&gt;
&lt;h2&gt;The &quot;not a blocker&quot; trap&lt;/h2&gt;
&lt;p&gt;There&apos;s a specific phrase that shows up in these documents. It sounds reasonable and is often catastrophic:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Not a blocker.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;An integration with an unvetted vendor, connecting a legacy ERP system to a modern platform, handling thousands of customer-specific pricing matrices and complex approval workflows. The vendor&apos;s website has a case study. A sales engineer said it works. Nobody has tested it against the client&apos;s actual data, actual edge cases, or actual transaction volume.&lt;/p&gt;
&lt;p&gt;&quot;Not a blocker.&quot;&lt;/p&gt;
&lt;p&gt;If that integration fails, the entire architecture changes. The timeline doubles, the budget triples, and the client is three months into a build when they discover that the foundation, around which the whole project was designed, doesn&apos;t hold weight.&lt;/p&gt;
&lt;p&gt;Calling an unvalidated dependency &quot;not a blocker&quot; before vetting it is &lt;a href=&quot;https://thedecisionlab.com/biases/optimism-bias&quot;&gt;optimism bias&lt;/a&gt; dressed up as a technical assessment. It&apos;s the kind of language that makes strategy documents read well, and post-mortems read badly.&lt;/p&gt;
&lt;h2&gt;What &quot;validated&quot; actually means&lt;/h2&gt;
&lt;p&gt;There&apos;s a meaningful difference between &quot;we believe this will work&quot; and &quot;we&apos;ve proven this works.&quot; Strategy documents routinely conflate the two.&lt;/p&gt;
&lt;p&gt;Validation is not:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The vendor says it works&lt;/li&gt;
&lt;li&gt;We found a case study on their website&lt;/li&gt;
&lt;li&gt;It works in a demo environment with sample data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Validation is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We tested the specific integration with the client&apos;s actual data and edge cases in conditions that resemble the production environment&lt;/li&gt;
&lt;li&gt;We documented what happened.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Validation costs money and takes time. It delays the exciting part of the project (the build) in favor of the boring part (the proof). And it is the single most valuable thing a technical advisor can recommend before a six-figure commitment.&lt;/p&gt;
&lt;h2&gt;The timeline cascade&lt;/h2&gt;
&lt;p&gt;A premature green light doesn&apos;t just risk a bad outcome. It creates a compounding timeline problem.&lt;/p&gt;
&lt;p&gt;When the project starts with unvalidated assumptions, the team builds on those assumptions for weeks or months. When one of them turns out to be wrong (and they do, regularly, because that&apos;s what &quot;unvalidated&quot; means), the timeline doesn&apos;t shift by the time it takes to fix the problem. It shifts by the time it takes to fix the problem &lt;em&gt;plus&lt;/em&gt; the time spent building on the assumption that turned out to be wrong &lt;em&gt;plus&lt;/em&gt; the time spent unwinding the work that depended on it.&lt;/p&gt;
&lt;p&gt;A two-week validation phase at the beginning can prevent a three-month correction in the middle. The math is simple: the two-week validation phase feels like a delay, and the three-month correction feels like bad luck.&lt;/p&gt;
&lt;p&gt;It&apos;s not bad luck, but the entirely predictable consequence of skipping validation.&lt;/p&gt;
&lt;h2&gt;The document problem&lt;/h2&gt;
&lt;p&gt;A well-crafted strategy document can make an unvalidated recommendation look validated. The formatting is professional. The sections follow a logical structure. The language is measured and confident. If you didn&apos;t have the technical context to evaluate the claims, you&apos;d read it and feel reassured.&lt;/p&gt;
&lt;p&gt;The people making the platform decision often don&apos;t have the technical context. That&apos;s why they hired advisors. And when the advisory document systematically smooths over the rough edges, the client loses access to the information they need to make an informed decision.&lt;/p&gt;
&lt;p&gt;This isn&apos;t about incompetence. It&apos;s about incentives. PMI research on &lt;a href=&quot;https://www.pmi.org/learning/library/optimism-bias-terminate-failing-projects-3779&quot;&gt;optimism bias in project delivery&lt;/a&gt; shows that the dilution of risk reporting is one of the most common failure modes in status communication. The path of least resistance is always &quot;we recommend proceeding.&quot; Clients want to hear yes. Teams want to move forward. Leadership wants progress. The person who adds a gate and says, &quot;Wait, we haven&apos;t validated this yet,&quot; is often treated as an obstacle to progress rather than as someone protecting the investment.&lt;/p&gt;
&lt;h2&gt;The fix is boring, and it works&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.smartsheet.com/phase-gate-process&quot;&gt;Stage-gated recommendations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That&apos;s it.&lt;/p&gt;
&lt;p&gt;&quot;We believe this platform is a viable path for your requirements. Before committing to a full build, we recommend a validation phase. Here&apos;s what we&apos;ll test, here&apos;s what it costs, and here&apos;s the criteria we&apos;ll use to decide whether to proceed.&quot;&lt;/p&gt;
&lt;p&gt;That&apos;s not hedging. That&apos;s risk management. And the client who hears &quot;we want to prove this works before you spend six figures on it&quot; will trust you more, not less, because you&apos;re clearly prioritizing their outcome over your timeline.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;The most expensive sentence in any strategy document is &quot;we recommend moving forward&quot; — when the analysis it&apos;s based on isn&apos;t finished yet.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;The &lt;a href=&quot;/tools/cto-diagnostic&quot;&gt;CTO diagnostic&lt;/a&gt; includes a vendor and platform evaluation domain — a quick way to see whether your current decision-making process has the structural gaps this post describes.&lt;/em&gt;&lt;/p&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt;
&lt;a href=&quot;https://thedecisionlab.com/biases/optimism-bias&quot;&gt;Optimism Bias — The Decision Lab&lt;/a&gt; ·
&lt;a href=&quot;https://www.pmi.org/learning/library/optimism-bias-terminate-failing-projects-3779&quot;&gt;Optimism Bias and Failure to Terminate Failing Projects — PMI&lt;/a&gt; ·
&lt;a href=&quot;https://www.smartsheet.com/phase-gate-process&quot;&gt;Phase-Gate Process — Smartsheet&lt;/a&gt;&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>architecture</category><category>cto-forward</category><category>governance</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>SideMark: Building a Markdown Editor for Two Authors</title><link>https://mipyip.com/blog/sidemark-two-author-markdown/</link><guid isPermaLink="true">https://mipyip.com/blog/sidemark-two-author-markdown/</guid><description>Every markdown editor assumes one author. When AI agents became co-editors, the &apos;file changed on disk&apos; dialog became a workflow killer. SideMark is what happens when you solve that problem from the inside.</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I built a markdown editor &lt;a href=&quot;/blog/simple-markdown-editor&quot;&gt;a few weeks ago&lt;/a&gt; because every other one annoyed me. Too expensive, too slow, too bloated, or too buggy. I just wanted three panes, no cloud, no subscription.&lt;/p&gt;
&lt;p&gt;Then I started using it.&lt;/p&gt;
&lt;p&gt;Not casually — I mean, I started using it the way I work now, which is with Claude Code running in one terminal (ok, let&apos;s be real, five terminals) and a stack of markdown files open in the editor. CLAUDE.md. ROADMAP.md. Blog drafts, LinkedIn notes, architecture diagrams, task statuses... The files that &lt;em&gt;are&lt;/em&gt; the workflow, not just the output.&lt;/p&gt;
&lt;p&gt;And the editor I&apos;d built — the one that was perfectly fine for a single author — started fighting me.&lt;/p&gt;
&lt;h2&gt;The dialog that breaks everything&lt;/h2&gt;
&lt;p&gt;Here&apos;s what happens when you&apos;re editing a governance doc, and Claude Code writes to the same file:&lt;/p&gt;
&lt;p&gt;Your editor pops up a dialog. &quot;File changed on disk. Reload?&quot;&lt;/p&gt;
&lt;p&gt;If you say yes, you lose your cursor position and your unsaved edits. If you say no, you&apos;re now working on a stale version, and the next save will overwrite whatever the agent wrote. If the editor doesn&apos;t ask — some just silently reload — your changes vanish without warning.&lt;/p&gt;
&lt;p&gt;This happens dozens of times a day in an agentic workflow. Every markdown editor on the market treats it as an exceptional error condition - &lt;em&gt;if&lt;/em&gt; it&apos;s caught at all. A thing that shouldn&apos;t be happening. A conflict to resolve.&lt;/p&gt;
&lt;p&gt;But in AI-assisted development, it&apos;s not exceptional. It&apos;s the primary workflow. Two authors are writing to the same files, and that&apos;s often the whole point.&lt;/p&gt;
&lt;h2&gt;The feature I needed didn&apos;t exist&lt;/h2&gt;
&lt;p&gt;I don&apos;t use VS Code for markdown — never liked the experience for prose. And the editors I do use for markdown all handle external changes the same way: reload, ask, or outright ignore. None of them tries to &lt;em&gt;merge&lt;/em&gt;. None of them treats two-author editing as a normal operating mode.&lt;/p&gt;
&lt;p&gt;So I built it. Three-way merge against the last-saved common ancestor — the same approach git uses, applied at the file level in real time.&lt;/p&gt;
&lt;p&gt;When you edit lines 5 through 10, and Claude edits lines 40 through 50, both changes merge automatically. No dialog, no interruption. A toast notification confirms it happened. When you both edit the same lines and the changes actually overlap, an interactive diff shows each hunk independently — accept this one, reject that one, save yours as a new file if you want an escape hatch.&lt;/p&gt;
&lt;p&gt;This was the feature that turned &quot;a markdown editor I built because I was annoyed&quot; into something worth naming.&lt;/p&gt;
&lt;h2&gt;Six versions in a day&lt;/h2&gt;
&lt;p&gt;Once the merge architecture was in place, the rest came fast. Not because I planned it, but because I kept hitting friction in my own workflow and fixing it immediately.&lt;/p&gt;
&lt;p&gt;Auto-save with a configurable delay, because switching from the editor to Claude Code and back shouldn&apos;t require thinking about whether I remembered to save. Git gutter markers, because after an AI agent edits your file, you want to see what changed since your last commit at a glance — green for added, blue for modified, red for deleted. Copy with context (Cmd+Opt+C), because pasting a code block into an AI prompt without the file path and line numbers wastes tokens.&lt;/p&gt;
&lt;p&gt;Focus mode, because I&apos;m also writing a book in this thing, and sometimes I need to shut out everything except the text.&lt;/p&gt;
&lt;p&gt;File deletion detection, because AI agents occasionally delete files, and you should know about it before you start typing.&lt;/p&gt;
&lt;p&gt;Six versions in one night. v0.3.2 through v0.4.3. While also cutting more than 10% from an AWS account on a different project and pushing 15 deployments on a third. That&apos;s not a humble brag — it&apos;s proof that the cognitive offloading system works. The governance documents held the state for all three workstreams. My brain held the judgment calls. The systems didn&apos;t compete with each other because none of them required me to remember where I left off.&lt;/p&gt;
&lt;h2&gt;The dogfooding loop&lt;/h2&gt;
&lt;p&gt;Every feature in SideMark emerged from my using SideMark to build SideMark and work on other projects.&lt;/p&gt;
&lt;p&gt;I was editing CLAUDE.md in the editor while Claude Code read from the same file. The merge conflict that spawned a three-way merge was a real conflict, in a real session, on a real project. The auto-save feature exists because I kept forgetting to save before switching to the terminal, and Claude Code would read the stale version. The git gutter exists because after a long Claude Code session, I&apos;d look at a file and have no idea which lines I&apos;d written and which the agent had.&lt;/p&gt;
&lt;p&gt;Every feature was born from friction I experienced while using the tool I was building. Not from a spec. Not from user research. Not from a competitive analysis. From the gap between &quot;I need this to work&quot; and &quot;it doesn&apos;t work yet.&quot;&lt;/p&gt;
&lt;p&gt;That&apos;s dogfooding in the purest sense — and it produces a different kind of product than spec-driven development. The features are tight because they solve problems I actually have. The things that are missing are missing because I haven&apos;t needed them yet. There&apos;s no plugin system because I&apos;ve never wanted one. There&apos;s no cloud sync because my files are on my machine, and that&apos;s where they belong.&lt;/p&gt;
&lt;h2&gt;What &quot;simple&quot; became&lt;/h2&gt;
&lt;p&gt;The editor started as &quot;Simple Markdown Editor.&quot; Three panes, no subscription, nothing else. That name made sense for what it was.&lt;/p&gt;
&lt;p&gt;It doesn&apos;t make sense for what it became.&lt;/p&gt;
&lt;p&gt;SideMark is a markdown editor built for working alongside AI. The &quot;side&quot; is literal — it works at your side, handling the merge conflicts and file state so you don&apos;t have to. The &quot;mark&quot; is markdown. Two syllables, no ambiguity about what it does.&lt;/p&gt;
&lt;p&gt;The name changed because the product changed. And the product changed because the workflow changed. I didn&apos;t set out to build an AI-collaborative editor. I set out to edit markdown files without being annoyed. The collaboration features emerged from the reality of how I work — writing to the same files I edit all day, every day, with an AI agent.&lt;/p&gt;
&lt;h2&gt;The cognitive offloading connection&lt;/h2&gt;
&lt;p&gt;Auto-save offloads &quot;Did I save?&quot; Three-way merge offloads &quot;What did the AI change?&quot; Git gutter offloads &quot;What&apos;s different since my last commit?&quot; Copy with context offloads &quot;What&apos;s the file path and line number?&quot;&lt;/p&gt;
&lt;p&gt;Every one of those is a piece of operational cognition — state-tracking that eats working memory without producing strategic value. The editor holds the state. I hold the judgment about what to write.&lt;/p&gt;
&lt;p&gt;That&apos;s the same architecture as the governance documents. The same architecture as the &lt;a href=&quot;/blog/cognitive-offloading&quot;&gt;butt book&lt;/a&gt; that eventually became a system. Offload state, keep judgment. The scale changes; the principle doesn&apos;t.&lt;/p&gt;
&lt;h2&gt;Try it&lt;/h2&gt;
&lt;p&gt;SideMark is &lt;a href=&quot;https://github.com/avanrossum/sidemark&quot;&gt;free and open source&lt;/a&gt;. macOS only. MIT licensed. No account, no subscription, no telemetry.&lt;/p&gt;
&lt;p&gt;If you&apos;re working with Claude Code, Cursor, Windsurf, or any AI agent that writes to files — and you&apos;re tired of the &quot;file changed on disk&quot; dialog — this is the editor that was built inside that exact workflow.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/avanrossum/sidemark/releases&quot;&gt;Download the latest release&lt;/a&gt; or check out the &lt;a href=&quot;/products/sidemark&quot;&gt;product page&lt;/a&gt; for the full feature list.&lt;/p&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources &amp;amp; links&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/avanrossum/sidemark&quot;&gt;SideMark on GitHub&lt;/a&gt; — MIT licensed, full source&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/simple-markdown-editor&quot;&gt;Original blog post&lt;/a&gt; — &quot;I Built a Markdown Editor Because Every Other One Annoyed Me&quot;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/products/sidemark&quot;&gt;Product page&lt;/a&gt; — full feature list with screenshots&lt;/li&gt;
&lt;/ul&gt;
&lt;/small&gt;</content:encoded><category>tools</category><category>ai</category><category>architecture</category><category>cognitive-offloading</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>Why AI Persona Switching Doesn&apos;t Work as Code Review</title><link>https://mipyip.com/blog/the-costume-change-problem/</link><guid isPermaLink="true">https://mipyip.com/blog/the-costume-change-problem/</guid><description>Asking Claude to &apos;switch to CEO mode&apos; for a second opinion feels like independent review — but shared context means the reviewer already knows the answers. Here&apos;s what actually breaks and what to do instead.</description><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Role-switching within a shared context window looks like independent review but functions as self-review in a different hat. The real question: what should your AI not know when it evaluates this work?&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;A repo hit 11,000 stars in its first week by solving a real problem: Claude Code in one generic mode produces mediocre output.&lt;/p&gt;
&lt;p&gt;Garry Tan&apos;s &lt;a href=&quot;https://github.com/garrytan/gstack&quot;&gt;gstack&lt;/a&gt; formalizes &quot;modes&quot; for Claude Code — slash commands that switch the AI between named roles. To name a few:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A CEO lens for product decisions&lt;/li&gt;
&lt;li&gt;A staff engineer for paranoid code review&lt;/li&gt;
&lt;li&gt;A QA lead for testing&lt;/li&gt;
&lt;li&gt;An engineering manager for retrospectives&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The core insight is correct and worth calling out directly: forcing the AI into an explicit role with explicit constraints produces better output than letting it be a generalist.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/garrytan/gstack/tree/main/browse&quot;&gt;browse tool&lt;/a&gt; — a persistent Chromium binary that gives Claude Code eyes on a running app — is genuine engineering, not a prompt trick. The sequential workflow discipline (plan → engineering review → build → code review → ship) is better than what most people do with AI, which is nothing. This is a meaningful step up from ad-hoc prompting.&lt;/p&gt;
&lt;p&gt;I also noticed a structural limitation within minutes of reading it, and it&apos;s the same one I&apos;ve been building against for months.&lt;/p&gt;
&lt;h2&gt;All the hats, one head&lt;/h2&gt;
&lt;p&gt;Every mode in gstack runs inside the same context window.&lt;/p&gt;
&lt;p&gt;The &quot;paranoid staff engineer&quot; reviewing your code is the same Claude instance that helped architect it. It already knows &lt;em&gt;why&lt;/em&gt; every decision was made — which means it&apos;s primed to find those decisions reasonable.&lt;/p&gt;
&lt;p&gt;This is a self-review wearing a different costume.&lt;/p&gt;
&lt;p&gt;I don&apos;t mean that dismissively, because self-assessment checklists have real value — a pilot running preflight catches mistakes that muscle memory alone won&apos;t, and that&apos;s worth doing every time. But there&apos;s a categorical difference between a checklist and an independent review, and the distinction matters — considerably more than it sounds.&lt;/p&gt;
&lt;p&gt;When the reviewer already has the builder&apos;s reasoning in context, it&apos;s not an evaluation of the output; it&apos;s pattern-matching against the justifications that produced it. The same mechanism that makes LLMs coherent — &lt;a href=&quot;https://arxiv.org/html/2510.06265v2&quot;&gt;self-consistency&lt;/a&gt; — makes them structurally blind to their own errors when asked to self-review. You&apos;re not getting a second opinion; you&apos;re getting the first opinion wearing a different hat.&lt;/p&gt;
&lt;p&gt;This is the same reason you don&apos;t ask the person who wrote a PR to also approve it. &lt;a href=&quot;https://google.github.io/eng-practices/review/&quot;&gt;A different pair of eyes catches what the author is blind to&lt;/a&gt; — not because the author is bad, but because familiarity breeds pattern blindness. AI doesn&apos;t change this principle; if anything, it amplifies it — an LLM&apos;s self-consistency is &lt;em&gt;more&lt;/em&gt; deterministic than a human&apos;s.&lt;/p&gt;
&lt;h2&gt;Parallelism is not independence&lt;/h2&gt;
&lt;p&gt;Gstack can also use &lt;a href=&quot;https://conductor.build&quot;&gt;Conductor&lt;/a&gt; to spin up ten parallel Claude Code sessions. That sounds like separation until you realize it&apos;s a performance optimization, not an epistemic one, and more workers in the same bath isn&apos;t the same as a clean pool.&lt;/p&gt;
&lt;p&gt;Genuine review requires what I&apos;ll call &lt;strong&gt;epistemic separation&lt;/strong&gt;: different priors, no access to the rationalization chain that produced the artifact, and independently accumulated judgment about what builders consistently miss. Without that separation, you get confirmation with extra steps.&lt;/p&gt;
&lt;p&gt;Each of gstack&apos;s modes starts fresh every invocation — no accumulated lessons, no pattern library built from previous reviews. The &quot;paranoid staff engineer&quot; is equally paranoid about everything, every time. That&apos;s thorough but undirected. A reviewer who doesn&apos;t learn which mistakes &lt;em&gt;this&lt;/em&gt; builder tends to make hasn&apos;t read the codebase&apos;s history.&lt;/p&gt;
&lt;p&gt;For organizations where bugs have real consequences — compliance failures, donor trust violations, limited technical staff to recover from incidents — the difference between costume-change review and independent review is operational risk.&lt;/p&gt;
&lt;h2&gt;What genuine separation looks like&lt;/h2&gt;
&lt;p&gt;I built the answer to this problem months before gstack existed. I call it &lt;a href=&quot;/blog/the-adversary&quot;&gt;The Adversary&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&apos;s a separate Claude Code project in its own repo with its own governance files, its own accumulated lessons-learned corpus, and zero shared context with the building agent. It receives a read-only symlink to the target codebase and produces a structured review report. It doesn&apos;t know what decisions were made or why. It sees &lt;em&gt;output&lt;/em&gt;, not &lt;em&gt;reasoning&lt;/em&gt; — which is exactly how real external review works.&lt;/p&gt;
&lt;p&gt;I&apos;d been building and reviewing this codebase for months — manual human review and agentic self-review, the whole time. The Adversary&apos;s first pass found 102 issues. Ten critical. Security vulnerabilities hiding in plain sight — not because the builder was bad, but because independent review catches what self-review structurally cannot.&lt;/p&gt;
&lt;p&gt;The architecture makes it work, not the prompt:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Separate context.&lt;/strong&gt; Different project, different memory, different governance documents. The builder&apos;s reasoning chain doesn&apos;t exist in The Adversary&apos;s world.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Different priors.&lt;/strong&gt; The Adversary accumulates its own pattern library over time — &quot;here&apos;s what builders consistently miss&quot; — which makes it sharper with each review. A stateless skill file can&apos;t do this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Structured handoff.&lt;/strong&gt; Artifacts move through a defined channel (symlinks and reports), not a shared session. The reviewer can&apos;t be influenced by the builder&apos;s justifications because it never sees them. This is the same principle that keeps financial auditors separate from the accounting department.&lt;/p&gt;
&lt;h2&gt;An honest limitation&lt;/h2&gt;
&lt;p&gt;This can&apos;t be fully productized today. The architectural requirement — genuinely independent agents with separate memory, separate accumulated judgment, and separate lesson histories — requires human orchestration: someone who understands where the boundaries need to be and maintains them. The tooling will get there. The architecture won&apos;t design itself.&lt;/p&gt;
&lt;p&gt;Anyone can fork a repo of markdown files. The judgment behind &quot;here&apos;s where the boundaries need to be and why&quot; is the part that requires experience to get right.&lt;/p&gt;
&lt;p&gt;The methodology is the deliverable, not the CLI tool. And that distinction matters for understanding where gstack fits.&lt;/p&gt;
&lt;h2&gt;What your AI shouldn&apos;t know&lt;/h2&gt;
&lt;p&gt;Gstack represents where most people are in their thinking about AI-assisted development: &quot;I need structured roles for different tasks.&quot; That&apos;s correct and necessary. The workflow discipline, the browser tooling, the explicit-gear metaphor — all genuinely valuable. The fact that it&apos;s open source and spreading is good for the ecosystem.&lt;/p&gt;
&lt;p&gt;But the harder question isn&apos;t which hat to put on your AI, or &quot;what persona should your AI wear?&quot;&lt;/p&gt;
&lt;p&gt;It&apos;s &quot;what should the AI &lt;em&gt;not know&lt;/em&gt; when it evaluates this work?&quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;The full Adversary architecture and first-run findings: &lt;a href=&quot;/blog/the-adversary&quot;&gt;Your AI Builds the Code. Who Reviews It?&lt;/a&gt; The governance methodology: &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;What Is Pass@1?&lt;/a&gt; and &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;The Governance Documents&lt;/a&gt;. The thesis connecting it all: &lt;a href=&quot;/blog/governance-is-architecture&quot;&gt;Governance Is Architecture&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt;
&lt;a href=&quot;https://github.com/garrytan/gstack&quot;&gt;gstack — GitHub&lt;/a&gt; — Garry Tan&apos;s Claude Code skill files (MIT)
·
&lt;a href=&quot;https://arxiv.org/html/2510.06265v2&quot;&gt;Large Language Models Hallucination: Comprehensive Survey&lt;/a&gt; — arXiv (self-consistency and self-review blind spots)
·
&lt;a href=&quot;https://google.github.io/eng-practices/review/&quot;&gt;Google Engineering Practices — Code Review&lt;/a&gt; — Google&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>ai</category><category>architecture</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>I Have a Team Now — It Just Happens to Be AI</title><link>https://mipyip.com/blog/i-have-a-team-now/</link><guid isPermaLink="true">https://mipyip.com/blog/i-have-a-team-now/</guid><description>The progression from &apos;AI helps me write emails&apos; to &apos;I manage a department of specialized agents across six domains&apos; happened in eight months. The output scaled. The cognitive load dropped. That combination is new.</description><pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Eight months from &apos;AI helps me write emails&apos; to managing a department of specialized agents across six domains. The output scaled. The cognitive load dropped. This post covers how that happened.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Eight months ago, I was perpetually behind. On everything.&lt;/p&gt;
&lt;p&gt;I don&apos;t mean &quot;busy.&quot; Busy implies you&apos;re making progress on too many things at once. I was making insufficient progress on all of them. React components for a client project. AWS infrastructure governance for another. Kubernetes migrations with hard deadlines. Salesforce automations that needed attention three weeks ago. Each domain had its own language, its own context, its own state — and switching between them wasn&apos;t just a time cost. It was a cognitive tax that compounded with every transition.&lt;/p&gt;
&lt;p&gt;By 3 PM most days, I wasn&apos;t making decisions anymore. I was recovering from the last context switch while dreading the next one.&lt;/p&gt;
&lt;h2&gt;The email that started it&lt;/h2&gt;
&lt;p&gt;The first thing I used AI for — really used it, not just experimented — was writing emails. GPT-3.5. I would brain-dump everything I needed to communicate into a chat window — unstructured, grammatically questionable, half-formed thoughts — and get back something I could send after one or two editing passes.&lt;/p&gt;
&lt;p&gt;That sounds trivial.&lt;/p&gt;
&lt;p&gt;It wasn&apos;t.&lt;/p&gt;
&lt;p&gt;Email was consuming more cognitive bandwidth than I&apos;d realized. Not the content — the &lt;em&gt;composition&lt;/em&gt;. Translating technical context into stakeholder-appropriate language, structuring the message so the key points are at the top, and correcting tone where needed. Every email was a small act of translation, and I was writing dozens a day.&lt;/p&gt;
&lt;p&gt;Offloading the composition freed up space I didn&apos;t know I was missing. Not a lot — but enough to notice that the constraint wasn&apos;t time: it was &lt;em&gt;cognitive bandwidth&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;From assistant to collaborator&lt;/h2&gt;
&lt;p&gt;With GPT-4, ChatGPT got better. I started using it for more than email — rapidly prototyping WordPress plugins, troubleshooting legacy code (especially the undocumented kind, which was most of it), and reasoning through architectural decisions where I needed a second opinion that wasn&apos;t going to judge me for asking a question I should probably already know the answer to.&lt;/p&gt;
&lt;p&gt;The shift was gradual. The AI went from &quot;a tool I use&quot; to &quot;a collaborator I consult,&quot; and the distinction matters. A tool does what you tell it; a collaborator helps you figure out &lt;em&gt;what to tell it&lt;/em&gt;. The governance documents I&apos;d started writing — almost accidentally, just experimenting to get consistent output — were turning The Collaborator into something more reliable.&lt;/p&gt;
&lt;p&gt;Something that remembered how I think.&lt;/p&gt;
&lt;h2&gt;The migration that proved it&lt;/h2&gt;
&lt;p&gt;About six months ago, I had to undertake a significant solo infrastructure migration. Hundreds of containers across multiple environments with a hard deadline driven by external constraints that weren&apos;t negotiable.&lt;/p&gt;
&lt;p&gt;The responsible estimate for this work — with a team of six experienced engineers — was six to nine months. I had three months.&lt;/p&gt;
&lt;p&gt;And I was the team.&lt;/p&gt;
&lt;p&gt;Were it not for ChatGPT, KiloCode, Cursor, and later Claude, I would not have been able to complete it. That is not a hyperbolic statement; it is not &quot;it would have been harder.&quot; I would literally not have been able to complete the migration within the constraints I was given - while still juggling my &quot;regular work.&quot; The project would have failed, or I would have.&lt;/p&gt;
&lt;p&gt;Agentic AI enabled me to operate at a scale previously unavailable to a single person. Not because the AI wrote all the code — it didn&apos;t. But because it could hold the context of each subsystem, while I focused on the decisions that actually needed a human. The infrastructure state, the dependency graphs, the rollback procedures — the AI held that, so I could hold and refine the strategy.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;/work/kubernetes-migration&quot;&gt;case study&lt;/a&gt; tells the technical story. The human story is simpler: I shipped it — on time, no less — and I didn&apos;t &lt;em&gt;completely&lt;/em&gt; burn out doing it. Both of those outcomes were improbable without the tooling.&lt;/p&gt;
&lt;h2&gt;The Department&lt;/h2&gt;
&lt;p&gt;After the migration, I fully committed to Claude Code and started building what I now call The Department.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;a href=&quot;/blog/managing-agents-like-teams&quot;&gt;site architect&lt;/a&gt; for this website — layouts, components, editorial, SEO&lt;/li&gt;
&lt;li&gt;A sysadmin agent for &lt;a href=&quot;/work/aws-governance&quot;&gt;infrastructure governance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Project Manager that unifies my communication between Slack and Asana - and keeps me from missing things&lt;/li&gt;
&lt;li&gt;An observability bot for monitoring&lt;/li&gt;
&lt;li&gt;A content agent&lt;/li&gt;
&lt;li&gt;A life-strategy agent&lt;/li&gt;
&lt;li&gt;Several agents in charge of writing software, like &lt;a href=&quot;/products/actions&quot;&gt;Actions&lt;/a&gt;, &lt;a href=&quot;/products/panoptisana&quot;&gt;Panoptisana&lt;/a&gt;, and the &lt;a href=&quot;/blog/simple-markdown-editor&quot;&gt;Markdown Editor&lt;/a&gt; I&apos;m using to write and edit this post&lt;/li&gt;
&lt;li&gt;And several more, besides&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each one has a defined role, &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;governance documents&lt;/a&gt;, and institutional memory that persists across sessions.&lt;/p&gt;
&lt;p&gt;The ability to context-switch without context-switching is the thing I didn&apos;t know I needed.&lt;/p&gt;
&lt;p&gt;When I need to work on infrastructure, I open the sysadmin agent. It knows the current state of every system I manage and what we did in the last session. It knows the conventions, the constraints, and the things I&apos;ve told it not to touch. I don&apos;t have to reconstruct any of that — I just pick up where I left off.&lt;/p&gt;
&lt;p&gt;When I am working on this website, the site architect has the same depth in its domain (as well as LinkedIn). Different context, different conventions, different memory — but the same experience of walking into a room where someone already knows what&apos;s going on.&lt;/p&gt;
&lt;p&gt;The mental relief is almost too great to put into words. The thing that was destroying me — carrying the state of many different domains in my head simultaneously, losing pieces of each every time I switched — is the thing the agents handle. My working memory is freed for the decisions that actually need my judgment — strategy, architecture, ideation.&lt;/p&gt;
&lt;p&gt;Everything else, the agents hold.&lt;/p&gt;
&lt;h2&gt;The inversion&lt;/h2&gt;
&lt;p&gt;One of the most significant personal findings of this process is that the output scaled &lt;em&gt;because&lt;/em&gt; the cognitive load dropped. Not the other way around.&lt;/p&gt;
&lt;p&gt;The conventional model is that more output requires more effort, more tracking, and more stress. You scale by working harder or hiring more people. The cognitive load tracks linearly (or worse) with the output.&lt;/p&gt;
&lt;p&gt;The Department inverts — or perhaps, subverts — that: more domains under management, more projects shipping, and perhaps more importantly, the ability to rapidly switch between them without losing momentum. And all of that occurs with less cognitive overhead — because the overhead has been &lt;a href=&quot;/blog/cognitive-offloading&quot;&gt;offloaded&lt;/a&gt; to agents whose entire job is holding the context I used to carry in my head.&lt;/p&gt;
&lt;p&gt;It&apos;s not just automation; I&apos;m not replacing tasks I used to do manually — though I certainly do when it makes sense. It&apos;s amplification — extending what I can hold and act on simultaneously. The decisions, strategy, and judgment calls are still mine, but the state-tracking, the context-holding, the &quot;where was I?&quot; recovery — that&apos;s distributed across a team that doesn&apos;t forget, doesn&apos;t get tired, and doesn&apos;t need me to repeat myself.&lt;/p&gt;
&lt;h2&gt;Still behind&lt;/h2&gt;
&lt;p&gt;I&apos;m still behind.&lt;/p&gt;
&lt;p&gt;I don&apos;t think that will ever change. The scope of what I&apos;m required to do always expands to fill (and slightly exceed) the capacity I have — that&apos;s a result of employment and a feature of ambition, not solely a bug in the tooling.&lt;/p&gt;
&lt;p&gt;But the texture of &quot;behind&quot; has changed. Eight months ago, behind meant drowning; it meant context switching so fast that I couldn&apos;t maintain identity in any single domain. It meant 3 PM cognitive shutdowns and the creeping feeling that I was failing at everything simultaneously.&lt;/p&gt;
&lt;p&gt;Now, behind means I have more projects than hours. The state of each one is held by an agent that&apos;s ready when I am. The cognitive tax of switching is close to zero. And when I stop for the day, nothing is lost — it&apos;s all documented, governed, and waiting for the next session.&lt;/p&gt;
&lt;p&gt;And there are still domains that don&apos;t have a door to agentic work yet — the ones where the process is opaque, sequential, and offers no meaningful feedback. Try getting a 10DLC campaign approved through Twilio when a denial comes back as &quot;didn&apos;t pass&quot; with no further explanation. There&apos;s nothing to reason about, nothing to architect. Just guess, resubmit, wait, repeat. Those still run on spite... if I have time.&lt;/p&gt;
&lt;p&gt;I&apos;m still behind. But I&apos;m not losing my sanity in the process.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;The management model behind the &quot;AI department&quot;: &lt;a href=&quot;/blog/managing-agents-like-teams&quot;&gt;I Manage AI Agents the Way I Manage Teams&lt;/a&gt;. The governance methodology: &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;What Is Pass@1?&lt;/a&gt; and &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;The Governance Documents&lt;/a&gt;. The infrastructure migration: &lt;a href=&quot;/work/kubernetes-migration&quot;&gt;Kubernetes Migration&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Wondering whether your organization&apos;s technical leadership is structured to actually scale this way? The &lt;a href=&quot;/tools/cto-diagnostic&quot;&gt;CTO diagnostic&lt;/a&gt; takes two minutes and shows you where the gaps are.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>ai</category><category>leadership</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>Cognitive Property: Who Owns the Way You Think?</title><link>https://mipyip.com/blog/cognitive-property/</link><guid isPermaLink="true">https://mipyip.com/blog/cognitive-property/</guid><description>Your AI governance frameworks and decision-making logic are repeatable, transferable, and extractable. That&apos;s not a productivity feature. It&apos;s cognitive property.</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Your AI governance frameworks encode your reasoning process into transferable documents. That changes the ownership math. This post defines what cognitive property is, why it matters, and why the boundary between employer output and personal expertise just got blurry.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;AI tools picking up and repeating your habits isn&apos;t new. ChatGPT does it by design — it mirrors your tone, adapts to your preferences, and learns what you respond well to. The phenomenon has received copious amounts of screen time and discussion bandwidth.&lt;/p&gt;
&lt;p&gt;But something specific happened recently that shifted the way I think about it.&lt;/p&gt;
&lt;p&gt;One of my AI instances started using a ◡̈ I put at the end of casual notes, and picked up the → and ← characters I use for bullet points and emphasis in certain contexts. Formatting preferences and structural choices I never explicitly taught — they just started appearing.&lt;/p&gt;
&lt;p&gt;Then another instance, working on a completely different project, picked up the same arrow convention independently. Same human, same patterns, different context.&lt;/p&gt;
&lt;p&gt;The AI isn&apos;t just mirroring my preferences; it&apos;s learning to mirror my thinking. And once I noticed that, a harder question followed: if my reasoning patterns are being encoded into a transferable format — documented, structured, portable — then who owns them?&lt;/p&gt;
&lt;h2&gt;Your cognition is being encoded&lt;/h2&gt;
&lt;p&gt;If you work deeply with AI tools (and I mean deeply, not &quot;summarize this email&quot; or &quot;write me a cover letter&quot;), you&apos;re building something most people haven&apos;t named yet.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Repeatable cognitive patterns in plain text.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don&apos;t mean prompt history or chat logs. I mean the &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;governance documents&lt;/a&gt; you&apos;ve created — either intentionally or through organic growth — to define how &lt;em&gt;your&lt;/em&gt; AI agents operate. The CLAUDE.md / AGENT.md files that encode your engineering standards, your writing styles, your humor, your architectural preferences, and your coding philosophy. The decision-making frameworks that tell the AI how to prioritize, how to break down problems, and how to structure their thinking in a way that matches yours.&lt;/p&gt;
&lt;p&gt;Over time, you&apos;ve been documenting the way you reason. Not abstractly — specifically. In plain text. In a format that is entirely transferable.&lt;/p&gt;
&lt;h2&gt;Your operating system, as data&lt;/h2&gt;
&lt;p&gt;Take those governance documents and feed them to a fresh AI instance. What do you get?&lt;/p&gt;
&lt;p&gt;A working version of how you solve problems.&lt;/p&gt;
&lt;p&gt;Not a perfect copy, but a functional one. An instance that knows your architectural preferences, your communication style, your quality standards, and your decision-making heuristics. It won&apos;t be you, but it will be able to operate like you in ways that are measurably, verifiably close.&lt;/p&gt;
&lt;p&gt;That&apos;s not a productivity feature. That&apos;s a &lt;a href=&quot;https://www.sciencedirect.com/science/article/pii/S0896627324006524&quot;&gt;cognitive fingerprint&lt;/a&gt;. And the fact that it exists in a format that can be copied, transferred, and scaled changes the conversation about who owns what.&lt;/p&gt;
&lt;h2&gt;This isn&apos;t a new IP question — except it is&lt;/h2&gt;
&lt;p&gt;The ownership of workplace knowledge has been debated as long as people have changed jobs. U.S. copyright law has a specific mechanism for it — the &lt;a href=&quot;https://www.venable.com/insights/publications/ip-quick-bytes/understanding-the-work-made-for-hire-doctrine&quot;&gt;work-made-for-hire doctrine&lt;/a&gt; assigns authorship to the employer when works are created within the scope of employment. You learn skills at a company and take them with you when you leave. Nobody seriously argues that everything you learned becomes corporate property.&lt;/p&gt;
&lt;p&gt;But this is different in a specific way: the cognitive pattern isn&apos;t just in your head anymore. It&apos;s documented. It&apos;s structured. It&apos;s portable. And it works without you.&lt;/p&gt;
&lt;p&gt;Previous generations of knowledge workers left with expertise — hard to quantify, impossible to transfer directly. You leave with expertise AND a governance repo that can reproduce a meaningful chunk of your operations. That&apos;s never been possible before.&lt;/p&gt;
&lt;h2&gt;Cognitive property&lt;/h2&gt;
&lt;p&gt;People are treating AI personalization like it&apos;s a nice-to-have feature. A convenience. &quot;My Claude knows how I like my code structured.&quot; Cool, time saver.&lt;/p&gt;
&lt;p&gt;It&apos;s a lot more than a time saver: it&apos;s &lt;em&gt;cognitive property&lt;/em&gt;. And right now, the ownership question hasn&apos;t even been asked.&lt;/p&gt;
&lt;p&gt;If you&apos;re building this kind of depth on a corporate AI account, with corporate tools, on company time... the question of who owns those patterns matters a lot more than you think. And the answer, under &lt;a href=&quot;https://www.bradley.com/insights/publications/2023/10/ai-in-the-modern-workplace-ownership-challenges-of-ai-generated-code&quot;&gt;most current employment agreements&lt;/a&gt;, is probably being decided by boilerplate that nobody wrote with cognitive property in mind.&lt;/p&gt;
&lt;h2&gt;The conversation that needs to happen now&lt;/h2&gt;
&lt;p&gt;This is a more urgent conversation than AGI governance, and I say that knowing how provocative it sounds. AGI governance matters, and it&apos;ll matter more as we get closer. But it&apos;s not happening today.&lt;/p&gt;
&lt;p&gt;This is happening today. People are building repeatable cognitive patterns in transferable formats. They&apos;re &lt;a href=&quot;/blog/cognitive-offloading&quot;&gt;externalizing their reasoning&lt;/a&gt; into documents that function without them. And most of them haven&apos;t thought about who gets to keep it.&lt;/p&gt;
&lt;p&gt;That question needs to be asked before it becomes standard practice to assume companies own whatever cognitive patterns emerge from AI tools used on company time.&lt;/p&gt;
&lt;p&gt;Legal and policy scholars are &lt;a href=&quot;https://academic.oup.com/policyandsociety/article/44/1/1/7997395&quot;&gt;already raising these questions&lt;/a&gt; about generative AI and intellectual property. But most of that work focuses on model outputs, not on the cognitive patterns of the person doing the work.&lt;/p&gt;
&lt;p&gt;The ownership conversation is overdue.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This is part of a four-post series, and the next post starts drawing the boundary. Subscribe for email updates.&lt;/em&gt;&lt;/p&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Employment law &amp;amp; IP&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.venable.com/insights/publications/ip-quick-bytes/understanding-the-work-made-for-hire-doctrine&quot;&gt;Understanding the Work Made for Hire Doctrine&lt;/a&gt; — Venable LLP. Plain-English explainer of work-for-hire under the Copyright Act of 1976.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bradley.com/insights/publications/2023/10/ai-in-the-modern-workplace-ownership-challenges-of-ai-generated-code&quot;&gt;AI in the Modern Workplace: Ownership Challenges of AI-Generated Code&lt;/a&gt; — Bradley Arant Boult Cummings. Employee use of GenAI does not change that code written in the course of employment belongs to the employer.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://livescu.ucla.edu/ai-copyright-law-and-work-made-for-hire/&quot;&gt;AI, Copyright Law, and Work-Made-For-Hire&lt;/a&gt; — UCLA Livescu Initiative. Scholarly discussion of how work-for-hire breaks down for AI-generated material.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI governance &amp;amp; cognitive data&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://academic.oup.com/policyandsociety/article/44/1/1/7997395&quot;&gt;Governance of Generative AI&lt;/a&gt; — Policy and Society (Oxford Academic). Survey of IP and data-governance gaps in generative AI, including the need for new ownership frameworks.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sciencedirect.com/science/article/pii/S0896627324006524&quot;&gt;Beyond Neural Data: Cognitive Biometrics and Mental Privacy&lt;/a&gt; — Magee, Ienca &amp;amp; Farahany, Neuron (2024). Argues that cognitive and behavioral patterns function as uniquely identifying data, extending privacy concerns beyond neural signals.&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>ai</category><category>architecture</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>Cognitive Offloading: A System for What to Keep in Your Head and What to Delegate</title><link>https://mipyip.com/blog/cognitive-offloading/</link><guid isPermaLink="true">https://mipyip.com/blog/cognitive-offloading/</guid><description>Notebooks, apps, and AI tools all solve capture but fail at retrieval. Cognitive offloading is the methodology behind building systems that let you decide what stays in your mind and what doesn&apos;t have to.</description><pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;The methodology behind the entire system: deliberately choosing what stays in your head and building architecture to handle everything else. From failed notebooks to governed AI agents.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;I carried a notebook in my back pocket for years. These were ratty little things - usually held together with Gaffers tape. I called it the butt book, because that&apos;s where it lived. The idea was simple: whenever something worth remembering surfaced, I&apos;d write it down before it disappeared.&lt;/p&gt;
&lt;p&gt;It worked, for capture. The ideas made it onto paper. The crisis of &quot;I just had a thought and now it&apos;s gone&quot; happened less often. But the notebooks accumulated, and the ideas inside them became a graveyard. If I remembered to go back and find something — and that&apos;s a significant &quot;if&quot; — I still had to locate it, interpret my own handwriting, and reconstruct whatever context made the idea seem worth writing down in the first place.&lt;/p&gt;
&lt;p&gt;The capture problem was solved. The retrieval problem never was.&lt;/p&gt;
&lt;h2&gt;Every system I tried solved the same half of the problem&lt;/h2&gt;
&lt;p&gt;Evernote. Obsidian. Apple Notes. Todoist. Each one promised a different organizational model — tags, backlinks, smart folders, natural-language reminders. Each one worked for about two weeks, which is roughly how long it takes for a structured environment to get out of whack when you have (undiagnosed!) ADHD and the system requires you to maintain it. The &lt;a href=&quot;/blog/llms-are-practically-adhd&quot;&gt;failure modes&lt;/a&gt; are structural, not motivational.&lt;/p&gt;
&lt;p&gt;The pattern was always the same: set it up, use it enthusiastically, let it drift, watch the structure collapse under its own weight, abandon it for the next thing. Not because the tools were bad — because they all assumed I&apos;d come back to them. Every system required me to initiate retrieval. To remember that I&apos;d stored something, navigate to where I&apos;d stored it, and find it among everything else I&apos;d stored.&lt;/p&gt;
&lt;p&gt;That&apos;s three cognitive tasks before you even get to the information you need. For someone whose working memory is the bottleneck, that&apos;s three chances to lose the thread.&lt;/p&gt;
&lt;p&gt;Notion is the exception, but only because I use it exclusively for school and keep it aggressively structured. Tight scope, rigid templates, no room to drift. It works precisely because I don&apos;t let it become a general-purpose system.&lt;/p&gt;
&lt;h2&gt;So I built one&lt;/h2&gt;
&lt;p&gt;Before the current wave of AI tools, I built a thing called GetRamble. It has a phone number. I can text it at any time — in line at the grocery store, in the middle of a meeting, at 2am — and OpenAI&apos;s API would turn my stream of consciousness into categorized notes.&lt;/p&gt;
&lt;p&gt;My kids would ask who &quot;ramble&quot; was because I said it so often: &quot;Hey Siri, text ramble.&quot;&lt;/p&gt;
&lt;p&gt;It worked. Really well, actually. I was still using it as recently as a few months ago. The capture problem and the categorization problem were both solved — text a rambling thought, get back structured, searchable notes.&lt;/p&gt;
&lt;p&gt;But Ramble stalled, for reasons that will sound familiar if you&apos;ve read what I write about &lt;a href=&quot;/blog/governance-is-architecture&quot;&gt;governance&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I was building it with a combination of my own work and Replit. Replit couldn&apos;t stay sane — the same ungoverned-architecture problem I&apos;ve since built an entire &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;methodology&lt;/a&gt; around solving. Eventually, it became more work to wrangle the features than to get results, and I didn&apos;t have the bandwidth to rewrite it myself. Full-time job, school, wife, two kids. The 10DLC compliance burden alone — the regulatory framework for application-to-person messaging — was a part-time job for a one-person team.&lt;/p&gt;
&lt;p&gt;I wanted to monetize it. But without capital and a testing cohort, I couldn&apos;t release it into the wild. The product was good. The architecture wasn&apos;t stable enough to trust — and at the time, I didn&apos;t have a word for what was missing. I just knew I couldn&apos;t ship something I&apos;d have to maintain at 2 am when it broke in ways I couldn&apos;t predict.&lt;/p&gt;
&lt;p&gt;Will I finish it? Probably not — I have better tools now. But the experience was formative. It&apos;s part of where my governance methodology comes from. I built something that worked, and watched it collapse not because the idea was wrong, but because the system around it couldn&apos;t hold.&lt;/p&gt;
&lt;h2&gt;What changed wasn&apos;t the tool — it was the architecture&lt;/h2&gt;
&lt;p&gt;Claude Code didn&apos;t solve the capture problem better than Ramble. It solved a different problem entirely: it made retrieval automatic.&lt;/p&gt;
&lt;p&gt;Every previous system — analog or digital, simple or AI-powered — required me to go get the information, remember I&apos;d stored something, navigate to it, and load it back into working memory. Claude Code&apos;s &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;governance documents&lt;/a&gt; flipped that model. The agent reads its own state at the start of every session. I don&apos;t retrieve. The system loads.&lt;/p&gt;
&lt;p&gt;That distinction is the whole thing.&lt;/p&gt;
&lt;p&gt;The plan exists, it&apos;s maintained, it&apos;s comprehensive — but it never demands my attention. It&apos;s there when I need it and invisible when I don&apos;t. I can forget it exists and still follow it, because the system is holding the state, not me.&lt;/p&gt;
&lt;p&gt;Three things make this work in practice:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Project-level state persistence.&lt;/strong&gt; Each project maintains its own context through governance documents. I can revisit any project at any time and get an immediate snapshot — not by reading through files myself, but by asking the agent what&apos;s current. The project&apos;s memory survives the session boundary because it was designed to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rapid idea triage.&lt;/strong&gt; When an idea surfaces now, I don&apos;t write it in a notebook and hope I&apos;ll find it later. I spin up a prototype — Excalidraw wireframe, &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;governance templates&lt;/a&gt;, a solid directive — and within a single conversation, I know whether the idea has legs. If it does, it gets filed into my project management system with full context attached. If it doesn&apos;t, it gets archived cleanly. Either way, it&apos;s out of my head and into a system that can hold it without my participation. The cognitive cost of exploring an idea dropped from &quot;a weekend&quot; to &quot;a conversation.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A personal project manager that doesn&apos;t require me to manage it.&lt;/strong&gt; I run a lightweight environment that stores the state of everything I&apos;m tracking — a set of JSON index files with descriptions pointing to full markdown files for detail. No RAG, no vector database. A poor man&apos;s index that works because the scope is deliberate and the governance is tight. It started as a scratchpad within another project and became a standalone system when the &lt;a href=&quot;/blog/managing-agents-like-teams&quot;&gt;separation of concerns&lt;/a&gt; demanded it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/blog/blog-cognitive-offloading-stack.png&quot; alt=&quot;The Cognitive Offloading Stack — four layers of cognitive architecture&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Choosing what stays in your mind&lt;/h2&gt;
&lt;p&gt;Cognitive offloading is the deliberate process of choosing what stays in your mind and building systems to handle the rest.&lt;/p&gt;
&lt;p&gt;Not productivity hacking. Not &quot;getting organized.&quot; Architecture — designed to match how your brain actually operates rather than how productivity systems assume it should.&lt;/p&gt;
&lt;p&gt;The butt book was cognitive offloading. Ramble was cognitive offloading. But they were incomplete implementations — they solved capture without solving retrieval, so the offloaded information ended up in cold storage with no mechanism to bring it back when it mattered.&lt;/p&gt;
&lt;p&gt;What I&apos;m building now is the complete architecture: capture, categorization, persistence, and automatic retrieval. The information flows out of my head and into governed systems that carry it forward — not just storing it, but delivering it at the right time, in the right context, without requiring me to remember it exists.&lt;/p&gt;
&lt;p&gt;The background anxiety lifts. Not because the work is less important, but because I&apos;m no longer the one responsible for holding it all. The system holds it. I think about whatever is actually in front of me.&lt;/p&gt;
&lt;p&gt;That&apos;s not a productivity gain. That&apos;s an architectural change in how I allocate cognitive resources — and it turns out it applies to &lt;a href=&quot;/blog/governance-is-architecture&quot;&gt;AI agents&lt;/a&gt; the same way it applies to human brains, because the failure modes are structurally identical.&lt;/p&gt;
&lt;p&gt;If your system requires you to remember to use it, it&apos;s not offloading anything. It&apos;s just adding a task.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Cognitive offloading is the methodology behind &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;Pass@1&lt;/a&gt; and the &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;governance documents&lt;/a&gt;. For the architectural argument: &lt;a href=&quot;/blog/governance-is-architecture&quot;&gt;Governance Is Architecture&lt;/a&gt;. For how this applies to agent management: &lt;a href=&quot;/blog/managing-agents-like-teams&quot;&gt;Managing Agents Like Teams&lt;/a&gt;. For the ownership question these patterns raise: &lt;a href=&quot;/blog/cognitive-property&quot;&gt;Cognitive Property&lt;/a&gt;. If you&apos;ve been building similar systems, &lt;a href=&quot;/contact&quot;&gt;I&apos;d like to hear about it&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;If you&apos;re thinking about how to apply this at an organizational level, the &lt;a href=&quot;/tools/ai-readiness&quot;&gt;AI readiness diagnostic&lt;/a&gt; shows where your team&apos;s current architecture supports this kind of offloading — and where it doesn&apos;t.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>adhd</category><category>architecture</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>I Manage AI Agents the Way I Manage Teams</title><link>https://mipyip.com/blog/managing-agents-like-teams/</link><guid isPermaLink="true">https://mipyip.com/blog/managing-agents-like-teams/</guid><description>Separation of concerns, governance docs, knowing when to restructure. The same management principles that make human teams effective apply directly to AI agents — with examples from a multi-agent production workflow.</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Separation of concerns, clear guidelines, knowing when to restructure. The management principles that work for human teams apply directly to AI agents. This post covers the operational framework.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;I run multiple AI agents across several projects. A site architect for this website. A content agent for editorial work. A &lt;a href=&quot;/work/sysadmin-claude&quot;&gt;sysadmin agent&lt;/a&gt; for infrastructure. An observability bot for monitoring. Each one has a defined role, documented standards, and clear boundaries.&lt;/p&gt;
&lt;p&gt;At some point — I couldn&apos;t tell you exactly when — I stopped thinking about this as &quot;using AI tools&quot; and started thinking about it as managing a team. Not in the Silicon Valley &quot;AI teammate&quot; marketing sense. In the actual management sense: the same principles I&apos;d apply to a group of human engineers producing real work under real constraints.&lt;/p&gt;
&lt;p&gt;The more I leaned into that framing, the more the system improved. Because it turns out the management disciplines that make human teams effective aren&apos;t abstractions. They&apos;re operational patterns that apply to AI agents without (much) modification.&lt;/p&gt;
&lt;h2&gt;Separation of concerns is just a job description&lt;/h2&gt;
&lt;p&gt;Each agent has a job, and it does that job. The site architect handles the website — layouts, components, performance, SEO, and editorial. I originally separated content into its own agent, but the editorial voice needed enough architectural context that splitting them created more coordination overhead than it saved — so I consolidated. That&apos;s the methodology working as designed: the right boundary isn&apos;t always more boundaries. The sysadmin agent handles infrastructure — AARs, topology documentation, environment configs. My &lt;a href=&quot;/work/ai-sprint-management&quot;&gt;PM agent&lt;/a&gt; manages tasks and responsibilities in Asana.&lt;/p&gt;
&lt;p&gt;They don&apos;t freelance into each other&apos;s domains.&lt;/p&gt;
&lt;p&gt;This sounds obvious, but the default approach most people take with AI is the opposite: one chat, one agent, everything. Code review and creative writing and data analysis and debugging, all in the same conversation. It works the way having one employee handle engineering, marketing, and customer support &quot;works.&quot; You get output. But you get inconsistent output, because the agent&apos;s context is split across too many domains to maintain depth in any of them.&lt;/p&gt;
&lt;p&gt;Separation of concerns for AI agents is the same principle as separation of concerns for human teams. Defined roles reduce cognitive load, prevent context pollution, and produce better work — because the agent&apos;s entire context window is focused on the domain it&apos;s responsible for, not half-occupied by the residue of a different conversation about a different problem.&lt;/p&gt;
&lt;p&gt;The loose catch-all still exists. For me, it&apos;s the core Claude chat interface — the equivalent of walking over to someone&apos;s desk for a quick question that doesn&apos;t belong in anyone&apos;s formal workflow. Not everything needs a scoped agent. But the work that matters does.&lt;/p&gt;
&lt;h2&gt;Clear guidelines are just an employee handbook&lt;/h2&gt;
&lt;p&gt;Every agent has &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;governance documents&lt;/a&gt;. CLAUDE.md, ARCHITECTURE.md, ROADMAP.md — the governance layer that defines standards, patterns, boundaries, and institutional memory.&lt;/p&gt;
&lt;p&gt;This is onboarding. You wouldn&apos;t hire a developer and say &quot;just go build.&quot; You&apos;d hand them the style guide, the architecture overview, the deployment process, the list of things not to touch. You&apos;d give them context before expecting output.&lt;/p&gt;
&lt;p&gt;AI agents need the same thing — except they need it more, because they can&apos;t compensate for missing context the way humans can. A human developer who doesn&apos;t know the naming convention will ask a colleague, read the existing code, or make a reasonable guess based on experience. An AI agent without documented conventions will make a different reasonable guess every session. Monday it&apos;s camelCase. Tuesday it&apos;s snake_case. Wednesday it&apos;s whatever it inferred from the three files it happened to read first.&lt;/p&gt;
&lt;p&gt;The governance documents aren&apos;t overhead. They&apos;re the mechanism that produces consistency — the employee handbook that every agent reads at the start of every session, ensuring that today&apos;s work is compatible with yesterday&apos;s.&lt;/p&gt;
&lt;h2&gt;Focus and respect are just professionalism&lt;/h2&gt;
&lt;p&gt;This might surprise people, but it matters: I interact with my agents the way I&apos;d interact with professional colleagues. Focused. Respectful of their time (which in this case means their &lt;em&gt;context window&lt;/em&gt;). No off-topic tangents unless the situation genuinely warrants it.&lt;/p&gt;
&lt;p&gt;This isn&apos;t sentiment. It&apos;s practical. Every message in a context window consumes tokens. Off-topic chatter, excessive small talk, or rambling prompts pollute the context with irrelevant information. For a human colleague, that&apos;s an interruption that costs focus. For an AI agent, it&apos;s worse — it&apos;s permanent context noise that degrades every subsequent response in the session.&lt;/p&gt;
&lt;p&gt;Respecting the agent&apos;s context window is the same principle as respecting an employee&apos;s cognitive bandwidth. You wouldn&apos;t ask your database architect to weigh in on your marketing copy. You wouldn&apos;t CC everyone on every email. The same instinct applies: keep the interaction focused on the domain, and the output stays focused on the domain.&lt;/p&gt;
&lt;h2&gt;When to hire: the spinoff pattern&lt;/h2&gt;
&lt;p&gt;The management parallel that convinced me this wasn&apos;t just a useful metaphor — but an operational truth — was the first time I had to restructure.&lt;/p&gt;
&lt;p&gt;My sysadmin Claude Code instance manages infrastructure context: AARs, topology documentation, and environment configs. Straightforward scope. At some point, I had it build a small Telegram notification bot as a utility — a quick way to monitor the overall health of the systems I am responsible for.&lt;/p&gt;
&lt;p&gt;The notification bot worked. Then it proved useful enough that I started expanding it. More alert types, better formatting, scheduling logic, error handling. Before I knew it, the &quot;small utility&quot; had grown into a legitimate standalone project sitting inside an agent whose job description was completely different.&lt;/p&gt;
&lt;p&gt;The signal was the same one any team lead recognizes: the context required to do the work well had grown beyond what a single entity could reasonably hold. The agent&apos;s CLAUDE.md was bloated with two domains&apos; worth of conventions. Half the context window was consumed by scope that wasn&apos;t relevant to whichever task was actually in front of it.&lt;/p&gt;
&lt;p&gt;So I did what I&apos;d do with a human team member whose role had quietly split into two distinct jobs: I restructured. New repository. New governance documents. New architecture spec. New agent. The observability bot got its own development track, its own context, its own focused governance. The sysadmin agent went back to doing what it was actually scoped for.&lt;/p&gt;
&lt;p&gt;The alternative — and this is the part that maps directly to organizational dysfunction — is letting scope accumulate until the agent is doing five things adequately instead of one thing well. That&apos;s not an AI problem. That&apos;s a management problem, and every team lead has seen it happen with humans. The person who&apos;s in every meeting, owns every escalation, and somehow has three job titles on their email signature. The fix is the same in both cases: increase HR. It&apos;s not a performance problem; it&apos;s an organizational design problem.&lt;/p&gt;
&lt;h2&gt;Good management doesn&apos;t depend on the medium&lt;/h2&gt;
&lt;p&gt;The argument I keep coming back to is simple: good management is good management. The medium changes — from a human team to an AI team — but the principles don&apos;t.&lt;/p&gt;
&lt;p&gt;Defined roles prevent confusion. Documentation prevents context loss. Focus prevents scope creep. Restructuring when the scope outgrows the role prevents degradation.&lt;/p&gt;
&lt;p&gt;These aren&apos;t AI-specific insights; they&apos;re management fundamentals that happen to apply perfectly to AI agents — because &lt;a href=&quot;/blog/llms-are-practically-adhd&quot;&gt;the failure modes are structurally identical&lt;/a&gt;. It&apos;s the same discipline I apply as a &lt;a href=&quot;/services/fractional-cto&quot;&gt;fractional CTO&lt;/a&gt; to human teams and AI systems alike. An overloaded AI agent degrades the same way an overloaded employee degrades. Not through incompetence, but through insufficient structure around the work.&lt;/p&gt;
&lt;p&gt;The people getting inconsistent results from AI aren&apos;t writing bad prompts. They&apos;re practicing bad management. And the fix isn&apos;t a better prompt template or a more capable model. It&apos;s the same fix it&apos;s always been: clear roles, documented expectations, and the discipline to restructure when the scope outgrows the container.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This post builds on the management framework running through everything on this site. For the governance methodology: &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;What Is Pass@1?&lt;/a&gt; and &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;The Governance Documents&lt;/a&gt;. For the architectural argument: &lt;a href=&quot;/blog/governance-is-architecture&quot;&gt;Governance Is Architecture&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Before scaling AI agents, it&apos;s worth knowing where your organization actually stands. The &lt;a href=&quot;/tools/ai-readiness&quot;&gt;AI readiness diagnostic&lt;/a&gt; surfaces the structural gaps in about two minutes.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>ai</category><category>leadership</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>The Governance Documents</title><link>https://mipyip.com/blog/the-governance-documents/</link><guid isPermaLink="true">https://mipyip.com/blog/the-governance-documents/</guid><description>ROADMAP.md, ARCHITECTURE.md, CLAUDE.md, and CHANGELOG.md aren&apos;t project management overhead. They&apos;re the system that gives AI agents persistent memory across sessions — and the mechanism that makes Pass@1 work.</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Four markdown files make the difference between an AI agent that forgets everything between sessions and one that ships correct code on the first attempt. This post breaks down what each file contains, why it exists, and how they work together.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Start a Claude Code session without governance documents, and you&apos;ll spend the first twenty minutes getting the agent oriented. It re-reads the codebase. It might ask questions you already answered yesterday. It makes architectural choices that contradict decisions from last week. By the time it&apos;s ready to write code, you&apos;ve either burned a quarter of the context window on setup that should have been spent on actual work, or you&apos;ve suffered multiple compactions, and you&apos;re even worse off than before.&lt;/p&gt;
&lt;p&gt;But if you start the same session with governance documents — CLAUDE.md, ROADMAP.md, ARCHITECTURE.md, CHANGELOG.md — the agent picks up where the last session left off. Same conventions. Same patterns. Same awareness of what broke last time and how it was fixed. (You can use a named replacement for other agents, such as GEMINI.md, or a generic core file, such as AGENT.md, as the core directives. I have found that the results are less structured with other agents.)&lt;/p&gt;
&lt;p&gt;That difference is the entire methodology. &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;Pass@1&lt;/a&gt; isn&apos;t about prompting. It&apos;s about these four files.&lt;/p&gt;
&lt;h2&gt;The spec the agent builds against&lt;/h2&gt;
&lt;p&gt;ROADMAP.md is the contract. Not a backlog of ideas. Not a wish list with priorities. It&apos;s the spec — what to build, in what order, with what constraints.&lt;/p&gt;
&lt;p&gt;When a roadmap entry says &quot;add &lt;a href=&quot;/products/actions&quot;&gt;floating popout buttons&lt;/a&gt; — persistent, always-on-top, position remembered across restarts, click to run,&quot; the agent has everything it needs to start building. No Slack thread to check. No product manager to interpret. No ambiguity about what &quot;done&quot; means.&lt;/p&gt;
&lt;p&gt;I&apos;ve &lt;em&gt;built&lt;/em&gt; what happens when the roadmap is vague. &quot;Improve the settings page&quot; produces a different interpretation every session. The agent makes reasonable choices — they&apos;re just different reasonable choices than the ones from yesterday, and different from the ones it&apos;ll make tomorrow. The roadmap eliminates that variance by being specific enough that correctness is verifiable.&lt;/p&gt;
&lt;p&gt;The roadmap also functions as a priority system. What&apos;s in the current sprint gets built. What&apos;s in the backlog waits. This sounds obvious until you&apos;ve watched an AI agent enthusiastically refactor your authentication system when you asked it to fix a CSS bug — because without explicit priorities, everything looks equally important.&lt;/p&gt;
&lt;h2&gt;The boundaries the agent works within&lt;/h2&gt;
&lt;p&gt;ARCHITECTURE.md defines how the system is built. Not what it does — how the pieces connect, where the boundaries are, and what patterns to follow.&lt;/p&gt;
&lt;p&gt;In my Electron apps, the architecture document specifies that all IPC goes through the preload bridge and the renderer never touches Node.js APIs. That&apos;s not a suggestion. It&apos;s a constraint. When the agent needs to add a feature that requires filesystem access, it doesn&apos;t invent a shortcut through the security boundary — it routes through the bridge, because the architecture document says that&apos;s how this system works.&lt;/p&gt;
&lt;p&gt;Without the architecture document, every session is a negotiation. The agent reads the codebase, infers patterns, and builds something consistent with what it found. Usually. But codebases accumulate exceptions, and an agent that infers patterns from code that includes both the &quot;right way&quot; and three legacy workarounds will sometimes pick the wrong pattern to follow.&lt;/p&gt;
&lt;p&gt;The architecture document cuts through that ambiguity. It doesn&apos;t say &quot;this is how it seems to work.&quot; It says, &quot;This is how it works. Follow this.&quot;&lt;/p&gt;
&lt;h2&gt;The memory that survives between sessions&lt;/h2&gt;
&lt;p&gt;CLAUDE.md is the governance document that changed my workflow the most.&lt;/p&gt;
&lt;p&gt;AI agent sessions are ephemeral. The context window compacts. The session ends. The next session starts fresh with no memory of what happened before. Every hard-won insight about the codebase, every gotcha discovered through debugging, every convention established through trial and error — gone.&lt;/p&gt;
&lt;p&gt;CLAUDE.md is persistent working memory. It carries forward everything the next session needs to know: coding conventions, known gotchas, patterns that work, patterns that failed, file locations, architectural decisions and their rationale.&lt;/p&gt;
&lt;p&gt;A concrete example. This website project&apos;s CLAUDE.md has a section called &quot;Already Solved — Don&apos;t Re-investigate.&quot; It includes entries like: Tailwind v4&apos;s &lt;code&gt;translate&lt;/code&gt; property is independent of &lt;code&gt;transform&lt;/code&gt;, so overriding &lt;code&gt;translate-x-full&lt;/code&gt; requires resetting a CSS variable rather than using &lt;code&gt;transform: translateX(0)&lt;/code&gt;. Or: the mobile menu must live outside &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; because &lt;code&gt;backdrop-filter&lt;/code&gt; creates a containing block for &lt;code&gt;position: fixed&lt;/code&gt; children. Or: Astro module scripts and &lt;code&gt;astro:page-load&lt;/code&gt; fire at the same tick, so don&apos;t register event handlers in both.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This entire model is part of a methodology I call &lt;strong&gt;cognitive offloading&lt;/strong&gt; — deliberately choosing what stays in your mind and building systems to handle the rest. The governance documents aren&apos;t just agent infrastructure. They&apos;re the offloading mechanism — the system that lets you stop holding project state in your head and trust that it&apos;s captured, versioned, and delivered to the next session automatically. They&apos;re also, it turns out, &lt;a href=&quot;/blog/cognitive-property&quot;&gt;cognitive property&lt;/a&gt; — transferable, reproducible encodings of how you reason.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Each of those cost a debugging session to figure out the first time. Without the CLAUDE.md entry, the next session hits the same problem, spends the same time, and &quot;solves&quot; it the same way — or worse, solves it differently, introducing an inconsistency.&lt;/p&gt;
&lt;p&gt;The most underrated function of CLAUDE.md is what I call the culture document effect. AI agents conform to whatever standards they find in their context. If your CLAUDE.md says &quot;use camelCase for functions, PascalCase for components, SCREAMING_SNAKE for constants,&quot; the agent follows that convention reliably. If it says nothing, the agent guesses — and it sometimes guesses differently every new session.&lt;/p&gt;
&lt;p&gt;This is the same dynamic as &lt;a href=&quot;/blog/managing-agents-like-teams/&quot;&gt;onboarding a new hire&lt;/a&gt;. You wouldn&apos;t drop someone into a codebase and say &quot;just start building.&quot; You&apos;d hand them the style guide, the architectural overview, the list of things that are broken and why. CLAUDE.md is the onboarding document, delivered fresh at the start of every session to an agent who might not have any prior experience working here.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;But what about MEMORY.md?&lt;/strong&gt;
Claude Code maintains its own internal memory file (MEMORY.md) under &lt;code&gt;~/.claude/&lt;/code&gt; in your home directory. It&apos;s automatic, it works well, and you don&apos;t — or shouldn&apos;t — have direct control over it. But it&apos;s local to the machine and not version-controlled. If you start a fresh session after compaction, switch machines, or lose your local environment, that memory is gone. Without a governance document committed to the repo itself, you&apos;re starting from scratch every time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;The running record&lt;/h2&gt;
&lt;p&gt;CHANGELOG.md tracks what&apos;s been built and what&apos;s changed. It&apos;s the project&apos;s institutional memory — the audit trail that prevents regression.&lt;/p&gt;
&lt;p&gt;After each block of work, the changelog gets updated. Not as a nice-to-have, but the mechanism that prevents the next session from accidentally reverting a decision or re-implementing something that was already tried and rejected.&lt;/p&gt;
&lt;p&gt;The changelog also serves a subtler function: it makes the agent aware of the project&apos;s trajectory. When the agent can see that the last ten entries were security hardening work, it&apos;s less likely to introduce a pattern that undermines that trajectory. Context shapes behavior, and it does so for AI agents the same way it shapes behavior for human developers.&lt;/p&gt;
&lt;h2&gt;The discipline nobody wants to hear about&lt;/h2&gt;
&lt;p&gt;The documents only work if they&apos;re maintained. This is the part that separates Pass@1 from good intentions.&lt;/p&gt;
&lt;p&gt;Every session that makes code changes &lt;strong&gt;must&lt;/strong&gt; end with document updates. ROADMAP.md gets its sprint status updated. CHANGELOG.md gets new entries. CLAUDE.md gets new gotchas and solved problems. ARCHITECTURE.md gets updated if patterns or data models have changed. This isn&apos;t optional. It&apos;s the cost of maintaining the system that makes everything else work, and if the CLAUDE.md is structured properly, the agent will ensure it happens.&lt;/p&gt;
&lt;p&gt;I&apos;ve built this into the session workflow as a mandatory checklist — the last step before a commit. The discipline isn&apos;t exciting. It&apos;s the engineering equivalent of doing your dishes after cooking, rather than letting them pile up. But the compound effect over six months is significant: a project with maintained governance documents starts sessions faster, produces fewer bugs, and maintains consistency that would be impossible with session-to-session amnesia.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/blog/blog-governance-document-relationships.png&quot; alt=&quot;Four governance documents forming a session cycle — ROADMAP constrains ARCHITECTURE, which informs CLAUDE.md, which updates CHANGELOG, which validates ROADMAP&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The governance layer&lt;/h2&gt;
&lt;p&gt;These four documents are the &lt;a href=&quot;/blog/governance-is-architecture&quot;&gt;governance layer&lt;/a&gt; I consistently write about. They&apos;re not project management artifacts bolted onto a development process. They&apos;re engineering artifacts that make the development process possible.&lt;/p&gt;
&lt;p&gt;Remove the governance documents, and the AI agent still generates code. It just generates code without memory, without constraints, without awareness of what came before. That&apos;s not a prompting problem. That&apos;s an architecture problem — and when it happens in a client-facing context, &lt;a href=&quot;/blog/the-green-light-problem&quot;&gt;the consequences compound fast&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The four files total maybe 2,000 words across a mature project. The maintenance cost is a few moments at the end of each session. The return is an AI agent that operates with the institutional knowledge of every session that came before it — picking up exactly where the last one left off, respecting every convention, avoiding every solved gotcha. The results are measurable: this pattern drove an &lt;a href=&quot;/work/sysadmin-claude&quot;&gt;autonomous infrastructure agent&lt;/a&gt; that manages a production Kubernetes cluster and an &lt;a href=&quot;/work/aws-governance&quot;&gt;AWS governance review&lt;/a&gt; that caught six figures in risk.&lt;/p&gt;
&lt;p&gt;That&apos;s not overhead, that&apos;s the whole product.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This post is part of the Pass@1 series. For the methodology overview, see &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;What Is Pass@1?&lt;/a&gt;. For the architectural argument, see &lt;a href=&quot;/blog/governance-is-architecture&quot;&gt;Governance Is Architecture&lt;/a&gt;. For the ownership question these documents raise: &lt;a href=&quot;/blog/cognitive-property&quot;&gt;Cognitive Property&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;If you&apos;re evaluating whether your organization&apos;s technical foundation is built to support this kind of system, the &lt;a href=&quot;/tools/cto-diagnostic&quot;&gt;CTO diagnostic&lt;/a&gt; scores you across eight domains — governance infrastructure included.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>ai</category><category>architecture</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>Governance Is Architecture</title><link>https://mipyip.com/blog/governance-is-architecture/</link><guid isPermaLink="true">https://mipyip.com/blog/governance-is-architecture/</guid><description>AI governance isn&apos;t a compliance checklist — it&apos;s an architectural decision. How you structure agent permissions, context windows, and audit trails determines whether your AI system is reliable or just fast.</description><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Governance isn&apos;t compliance bolted onto a finished system. It&apos;s an architectural decision that shapes how AI agents behave, retain context, and produce reliable output. This post is the thesis statement for everything else on this site.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Ask ten people what &quot;AI governance&quot; means, and nine of them will describe a compliance function. Policy documents. Review committees. Usage guidelines. Acceptable use policies. Risk assessments that live in a SharePoint folder nobody opens.&lt;/p&gt;
&lt;p&gt;That&apos;s not governance, it&apos;s just ceremony.&lt;/p&gt;
&lt;p&gt;I&apos;ve been building AI-augmented systems for the past year — &lt;a href=&quot;/work/actions-development&quot;&gt;shipping production software&lt;/a&gt;, &lt;a href=&quot;/work/ai-sprint-management&quot;&gt;designing agent workflows&lt;/a&gt;, &lt;a href=&quot;/blog/the-adversary&quot;&gt;running adversarial security audits&lt;/a&gt;, and writing about all of it. Somewhere in the middle of that work, a pattern crystallized that I didn&apos;t have a name for:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI governance isn&apos;t a compliance layer. It&apos;s an architectural decision.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It needs to be designed into the system at the structural level — not applied after the system is built, and not delegated to a committee that reviews work they didn&apos;t design.&lt;/p&gt;
&lt;h2&gt;The compliance trap&lt;/h2&gt;
&lt;p&gt;The default approach to AI governance looks like this: a team builds an AI system, then a separate group evaluates whether it meets policy requirements. The evaluation produces a report. The report produces a remediation list. Remediation is prioritized over feature work. Most of it ships eventually. Some of it doesn&apos;t.&lt;/p&gt;
&lt;p&gt;This is the same pattern that produces &quot;secure&quot; software that still ships with OWASP Top 10 vulnerabilities in production — issues that OWASP explicitly positions as design-time concerns, not a post-hoc audit checklist. Security review after implementation, compliance as an afterthought, the ceremony of oversight without the substance.&lt;/p&gt;
&lt;p&gt;The problem isn&apos;t that the review happens. The problem is that it happens &lt;em&gt;after&lt;/em&gt; the architecture is set. By the time someone evaluates governance, the system&apos;s boundaries are already drawn. The data flows are already established. The agent&apos;s permissions are already scoped — or not, which is arguably more common.&lt;/p&gt;
&lt;p&gt;Governance applied after architecture is remediation. Governance designed into architecture is prevention.&lt;/p&gt;
&lt;h2&gt;What this looks like when you build it&lt;/h2&gt;
&lt;p&gt;I didn&apos;t arrive at this framework through theory. I arrived at it through building things and watching where they broke.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Governance documents as engineering artifacts.&lt;/strong&gt; In &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;Pass@1&lt;/a&gt;, the &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;governance documents&lt;/a&gt; — ROADMAP.md, CHANGELOG.md, ARCHITECTURE.md, CLAUDE.md — aren&apos;t project management overhead. They&apos;re the constraints that make the AI agent produce correct implementations on the first attempt. The governance IS the product. The speed is a byproduct. Remove the governance documents, and the agent still generates code. It just tends to generate the wrong code, confidently, repeatedly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adversarial review as a structural pattern.&lt;/strong&gt; &lt;a href=&quot;/blog/the-adversary&quot;&gt;The Adversary&lt;/a&gt; isn&apos;t a code review checklist. It&apos;s a separate agent whose architectural purpose is to attack the work of the building agent. Same AI, different governance constraints, different objectives. The insight wasn&apos;t &quot;we need code review&quot; — it was that review and construction need structural separation, the same way a financial auditor can&apos;t also be the accountant. That&apos;s not a policy. That&apos;s architecture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The perimeter as a design decision.&lt;/strong&gt; &lt;a href=&quot;/blog/when-not-to-use-ai&quot;&gt;The AI Perimeter&lt;/a&gt; isn&apos;t a list of things AI can&apos;t do. It&apos;s a design boundary — a deliberate architectural decision about where automation should stop and human judgment should begin. The three-question framework (Can I verify the output? Is the cost of a wrong answer low? Does sufficient context exist?) isn&apos;t governance theater. It&apos;s a runtime decision function built into the workflow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Structural parallels as architectural insight.&lt;/strong&gt; The &lt;a href=&quot;/blog/llms-are-practically-adhd&quot;&gt;ADHD–LLM isomorphism&lt;/a&gt; revealed something I didn&apos;t expect: the architectural patterns that manage cognitive failures in ADHD brains are the same patterns that manage failures in language models. External memory, session continuity, and confabulation detection - these aren&apos;t metaphors — they&apos;re the same engineering problem solved at different scales. The architectures of governance for AI agents and for human cognition share a common structure because their failure modes are structurally identical.&lt;/p&gt;
&lt;p&gt;When I treat governance as architecture, there are a few decisions I stop delegating to policy: where review happens in the flow, where agents are allowed to write, and where I deliberately stop automation and hand back to humans. This is &lt;a href=&quot;/services/fractional-cto&quot;&gt;the core of what a fractional CTO does&lt;/a&gt; — designing governance into the system so it doesn&apos;t depend on someone remembering to enforce it.&lt;/p&gt;
&lt;h2&gt;Where the industry is getting it wrong&lt;/h2&gt;
&lt;p&gt;The current wave of AI governance frameworks treats governance as a layer — something you wrap around an AI system to make it safe. Usage policies, guardrails (a word that&apos;s become meaningless through overuse), and human-in-the-loop as a checkbox rather than a &lt;a href=&quot;/work/ai-sprint-management&quot;&gt;design pattern&lt;/a&gt;. When I say &quot;guardrails as theater,&quot; I mean controls that only exist in a policy document. Guardrails as architecture means the workflow makes it impossible to skip the control step.&lt;/p&gt;
&lt;p&gt;The problem with layers is that they can be bypassed, ignored, or simply never implemented. A governance policy that says &quot;all AI outputs must be reviewed by a human&quot; is architecturally meaningless if the system doesn&apos;t have a review step built into its execution flow. The policy exists, but the architecture doesn&apos;t enforce it.&lt;/p&gt;
&lt;p&gt;This is the same mistake enterprise software made with security twenty years ago. Write the code, then add security. That approach produced two decades of preventable breaches — the same vulnerability classes (injection, broken access control, insecure design) showing up in OWASP data year after year. We know better now — security is designed in, not added on. CISA&apos;s Secure by Design initiative says it explicitly: security is a design-time responsibility for vendors, not a patch-time responsibility for customers.&lt;/p&gt;
&lt;p&gt;AI governance is security&apos;s sequel. The architectural thesis is already hiding underneath the formal frameworks — the EU AI Act&apos;s risk-based controls, NIST&apos;s AI Risk Management Framework, ISO/IEC 42001 — all assume governance is something you design into systems, not something you rubber-stamp after the fact. Most implementations haven&apos;t caught up yet. And we&apos;re making the same mistakes, faster, and with higher stakes.&lt;/p&gt;
&lt;h2&gt;The thread through everything I write&lt;/h2&gt;
&lt;p&gt;Every post on this site argues a version of this thesis. I didn&apos;t say it outright until now.&lt;/p&gt;
&lt;p&gt;When I write about &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;governance documents as engineering artifacts&lt;/a&gt;, I&apos;m arguing that governance should be structural. When I write about &lt;a href=&quot;/blog/the-adversary&quot;&gt;adversarial agents&lt;/a&gt;, I&apos;m arguing that oversight should be architectural. When I write about &lt;a href=&quot;/blog/when-not-to-use-ai&quot;&gt;the perimeter&lt;/a&gt;, I&apos;m arguing that boundaries should be designed, not assumed. When I write about code that works versus code that belongs, I&apos;m arguing that &quot;functional&quot; and &quot;governed&quot; are different things — and the gap between them is where the expensive failures live.&lt;/p&gt;
&lt;p&gt;The thesis is the same every time: governance is architecture. Not policy. Not process. Not a committee. Architecture.&lt;/p&gt;
&lt;h2&gt;What I&apos;m still figuring out&lt;/h2&gt;
&lt;p&gt;I don&apos;t have clean answers for everything. These are the open questions I&apos;m working through:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How should governance documents version-control as a codebase scales?&lt;/strong&gt; A single CLAUDE.md works for a solo developer. What happens when ten agents are working on the same codebase with different governance contexts? The version control problem gets interesting fast. I&apos;m currently exploring the idea of &quot;personalities&quot; - individual agentic personas tailored to their specific tasks, sharing a common central directory where they can &quot;get to know each other&quot; as they evolve, and a central governance document that drives their decisions and can only be changed through quorum. But that idea is still in the early stages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where does human-in-the-loop become human-in-the-way?&lt;/strong&gt; I design for human oversight at every critical decision point. But I&apos;ve seen cases where the oversight step becomes a bottleneck that degrades the system more than the risk it&apos;s meant to mitigate. The boundary isn&apos;t static, and I don&apos;t have a formula for finding it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What does governance look like for agent-to-agent systems?&lt;/strong&gt; When AI agents coordinate with each other — passing context, delegating tasks, &lt;a href=&quot;/work/agent-mail&quot;&gt;communicating via protocol&lt;/a&gt; — the governance model needs to handle delegation chains, permission inheritance, and audit trails across agents. Nobody&apos;s building this well yet. The governance gap is a symptom of a missing discipline.&lt;/p&gt;
&lt;p&gt;These aren&apos;t hypothetical questions. They&apos;re problems I&apos;m actively building against.&lt;/p&gt;
&lt;h2&gt;A position, not a conclusion&lt;/h2&gt;
&lt;p&gt;This isn&apos;t a manifesto. It&apos;s a position — informed by building real systems, watching where they break, and noticing that failures almost always trace back to a governance decision made too late - or not made at all.&lt;/p&gt;
&lt;p&gt;If you&apos;re working on AI governance and treating it as a compliance function, you&apos;re not wrong — you&apos;re solving a smaller problem than the one in front of you. The compliance layer matters. But without the architectural foundation, it&apos;s a policy document sitting atop a system that was never designed to enforce it.&lt;/p&gt;
&lt;p&gt;Governance is architecture.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This post connects the threads running through everything I write. If you want the evidence: &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;Pass@1&lt;/a&gt; on governance as methodology, &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;The Governance Documents&lt;/a&gt; on what each file contains and why, &lt;a href=&quot;/blog/the-adversary&quot;&gt;The Adversary&lt;/a&gt; on adversarial review as structural pattern, &lt;a href=&quot;/blog/when-not-to-use-ai&quot;&gt;The AI Perimeter&lt;/a&gt; on boundary design, &lt;a href=&quot;/blog/llms-are-practically-adhd&quot;&gt;LLMs Are Practically ADHD&lt;/a&gt; on structural parallels, &lt;a href=&quot;/blog/managing-agents-like-teams&quot;&gt;managing agents like teams&lt;/a&gt; on applying these principles as organizational design, and &lt;a href=&quot;/blog/cognitive-property&quot;&gt;Cognitive Property&lt;/a&gt; on the ownership question these patterns raise. If you disagree with the premise or are working on these same problems, &lt;a href=&quot;/contact&quot;&gt;I&apos;d like to hear from you&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Curious how your organization&apos;s AI governance posture holds up? The &lt;a href=&quot;/tools/ai-readiness&quot;&gt;AI readiness diagnostic&lt;/a&gt; scores your current state across the domains this post covers.&lt;/em&gt;&lt;/p&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt; &lt;a href=&quot;https://owasp.org/www-project-top-ten/&quot;&gt;OWASP Top 10 Web Application Security Risks&lt;/a&gt; · &lt;a href=&quot;https://owasp.org/Top10/2025/en/&quot;&gt;OWASP Top 10:2025 — A04: Insecure Design&lt;/a&gt; · &lt;a href=&quot;https://www.cisa.gov/securebydesign&quot;&gt;CISA Secure by Design&lt;/a&gt; · &lt;a href=&quot;https://www.eccouncil.org/cybersecurity-exchange/responsible-ai-governance/eu-ai-act-nist-ai-rmf-and-iso-iec-42001-a-plain-english-comparison/&quot;&gt;EU AI Act, NIST AI RMF, and ISO/IEC 42001 comparison&lt;/a&gt;&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>ai</category><category>architecture</category><category>leadership</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>SideMark: A Free Markdown Editor for macOS (Open Source)</title><link>https://mipyip.com/blog/simple-markdown-editor/</link><guid isPermaLink="true">https://mipyip.com/blog/simple-markdown-editor/</guid><description>Local files only, no cloud, no subscription. Git-aware diff merging, live preview, and autosave. Built for developers who work with AI-assisted workflows.</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I didn&apos;t plan to build a markdown editor this weekend. I was working on something else entirely, and somewhere in the middle of it I opened my markdown editor to take notes and my annoyance with every markdown editor I&apos;ve tried finally reached a head.&lt;/p&gt;
&lt;p&gt;Not annoyed in the &quot;this is broken&quot; sense. Annoyed in the &quot;why does this app need a cloud account and fourteen features I&apos;ll never use&quot; sense. The editor I&apos;d been using was fine, except for the parts that weren&apos;t: slow to launch, too many menus, features designed for someone else&apos;s workflow. And every alternative I&apos;d tried over the years had the same problem in different packaging — too expensive, too bloated, or too clever.&lt;/p&gt;
&lt;p&gt;So I opened Claude Code and started building one.&lt;/p&gt;
&lt;h2&gt;Governance did the heavy lifting&lt;/h2&gt;
&lt;p&gt;Three panes. File browser on the left, editor in the middle, live preview on the right. Tabs for multiple open files. Session restore — close the app, reopen it, everything&apos;s still there. Dark mode. Search and replace. A formatting toolbar for the things I always forget the syntax for (is it &lt;code&gt;**bold**&lt;/code&gt; or &lt;code&gt;__bold__&lt;/code&gt;? I know the answer but my fingers don&apos;t).&lt;/p&gt;
&lt;p&gt;That&apos;s it. No cloud sync. No collaboration. No plugin architecture. No knowledge graph. No proprietary file format. Just markdown files on my computer, edited in a clean interface that stays out of the way.&lt;/p&gt;
&lt;p&gt;But the reason the first pass came back essentially usable wasn&apos;t the prompt — it was everything behind it. The &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;governance documents&lt;/a&gt; I&apos;ve built for my development workflow, the clean wireframes, the detailed architecture specs, the personal style guide that must be followed. All of that is persistent context that Claude Code carries into every session. The prompt describes &lt;em&gt;what&lt;/em&gt; to build. The governance documents describe &lt;em&gt;how&lt;/em&gt; to build it, and to what standard. That&apos;s the difference between &quot;a thing that kind of works&quot; and &quot;a thing I&apos;m actually using the next day.&quot;&lt;/p&gt;
&lt;p&gt;Not perfect on the first pass. But functional enough that I was taking notes in it within the first hour.&lt;/p&gt;
&lt;p&gt;Then I started tweaking.&lt;/p&gt;
&lt;h2&gt;What &quot;good enough&quot; turned into&lt;/h2&gt;
&lt;p&gt;The initial version worked. But &quot;works&quot; and &quot;feels right&quot; are different things. The scroll sync between editor and preview was off — I built bidirectional section-based anchoring so they stay aligned as you scroll. The formatting toolbar was basic — I made buttons detect whether formatting was already applied and toggle it off, made heading buttons cycle through levels, made list buttons handle multi-line selections and continue numbering from preceding items.&lt;/p&gt;
&lt;p&gt;File browser needed right-click context menus. New file, new folder, rename, delete (move to trash, not permanent — I&apos;m not a monster), show in Finder. Auto-refresh when files change externally. Only markdown files clickable in the tree, because I don&apos;t need to accidentally open a PNG in a text editor.&lt;/p&gt;
&lt;p&gt;External change detection was the feature I didn&apos;t know I needed until I hit the workflow. Edit a file in another app while it&apos;s open in the editor — you get a full diff view showing exactly what changed, with options to keep your version, accept the external changes, or save as a new file. No silent overwrites. I&apos;d completely forgotten I&apos;d even added it until I triggered it accidentally and thought &lt;em&gt;oh, that&apos;s actually amazing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/screenshots/simple-markdown-editor/diff.png&quot; alt=&quot;External change detection — diff view showing changes made to a file in another editor, with options to keep your version, accept external changes, or save as a new file&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Then themes — dark, light, system-following. Seven accent colors because I like options. Configurable fonts for both the editor and preview panes, pulling from your system font library. Font size control. Line number toggling. Settings that persist to JSON.&lt;/p&gt;
&lt;p&gt;Then security hardening, because I ran &lt;a href=&quot;/blog/the-adversary&quot;&gt;The Adversary&lt;/a&gt; on it — my adversarial code review agent — and it found the usual Electron problems. Worse than usual, actually. The irony it identified was the &lt;em&gt;ceremony&lt;/em&gt; of security without the substance: &lt;code&gt;contextBridge&lt;/code&gt;, &lt;code&gt;contextIsolation: true&lt;/code&gt;, proper cleanup functions — all present, all technically correct, and all masking a straight pipeline from a malicious &lt;code&gt;.md&lt;/code&gt; file to arbitrary filesystem access. The &lt;code&gt;sandbox: false&lt;/code&gt; with a wrong justification comment was the cherry on top. It&apos;s exactly the kind of thing that survives code review after code review because it &lt;em&gt;sounds&lt;/em&gt; right, and nobody actually traces the dependency to verify it.&lt;/p&gt;
&lt;p&gt;XSS vectors in the markdown preview (fixed with DOMPurify), filesystem access too broad (added path validation and sensitive directory blocking), missing Content Security Policy. Twenty-plus security fixes across eleven versions. The kind of work nobody sees but everyone benefits from — and a textbook case study for why adversarial review matters when the current &quot;vibe coding&quot; wave is producing technically-functional-but-exploitable software at scale.&lt;/p&gt;
&lt;h2&gt;Thirty-one versions in two days&lt;/h2&gt;
&lt;p&gt;The commit history tells the story. v0.1.0 to v0.1.31 in a weekend. Not because I was rushing — because the governance-first development pattern means each feature lands cleanly, gets tested, gets committed, and the next one starts from solid ground.&lt;/p&gt;
&lt;p&gt;This is the same workflow I write about in every blog post: strong governance documents as persistent AI memory, single-pass feature delivery as the norm rather than the exception, architecture decisions codified before implementation begins. When the pattern works, it works at speed.&lt;/p&gt;
&lt;p&gt;The app is signed and notarized with Apple, auto-updates from GitHub releases, handles file associations (shows up in Finder&apos;s &quot;Open With&quot; menu for .md, .markdown, .mdx, .txt files), and restores all windows with their tabs and folder paths on relaunch.&lt;/p&gt;
&lt;h2&gt;What it deliberately doesn&apos;t do&lt;/h2&gt;
&lt;p&gt;No cloud sync. No collaboration. No Vim mode. No WYSIWYG mode. No plugin system. No account creation. No subscription. No telemetry.&lt;/p&gt;
&lt;p&gt;Every markdown editor eventually tries to become a knowledge management platform. This one won&apos;t. The file system is the organizational layer. Git is the version control. Markdown is the format — portable, readable, owned by you. The editor just makes working with those files fast and pleasant.&lt;/p&gt;
&lt;p&gt;Your files are plain markdown on disk. Open them with anything, anywhere, forever.&lt;/p&gt;
&lt;h2&gt;The actual point&lt;/h2&gt;
&lt;p&gt;I built this because I needed it, and now I&apos;m using it instead of every other option. More dogfood. It&apos;s open source (MIT), free, and the code is on GitHub.&lt;/p&gt;
&lt;p&gt;If you live in markdown daily and every editor you&apos;ve tried wants to be something it shouldn&apos;t be — &lt;a href=&quot;/products/simple-markdown-editor&quot;&gt;try it&lt;/a&gt;. The feature list is short on purpose.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Simple Markdown Editor is &lt;a href=&quot;https://github.com/avanrossum/a_simple_markdown_editor&quot;&gt;available on GitHub&lt;/a&gt; — free, open source, macOS only. If you&apos;re interested in the development methodology behind building a functional app in a weekend, start with &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;What Is Pass@1?&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>macos</category><category>devtools</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>AI Adoption: The 0.04% Don&apos;t Know They&apos;re the 0.04%</title><link>https://mipyip.com/blog/the-004-percent/</link><guid isPermaLink="true">https://mipyip.com/blog/the-004-percent/</guid><description>The people actually building with AI are too busy building to post about it. If the LinkedIn AI feed makes you feel behind, you&apos;re measuring against the wrong cohort.</description><pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2,500 dots on a grid. Each dot is roughly 3.2 million people. The whole grid is humanity.&lt;/p&gt;
&lt;p&gt;84% of those dots are grey — people who have never touched AI. 16% are green — free chatbot users. About 0.3% pay for AI tools. And roughly 0.04% are using it for real workflows.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/blog/the-004.jpeg&quot; alt=&quot;Each dot represents ~3.2 million people. 2,500 dots = 8.1 billion humans. Grey: never used AI (84%). Green: free chatbot users (16%). Orange: pays for AI (0.3%). Red: uses AI for real workflows (0.04%).&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s &lt;a href=&quot;https://www.linkedin.com/posts/zachdissington_ai-entrepreneurship-aiautomation-activity-7431507588380344321-vxOD&quot;&gt;a visualization&lt;/a&gt; Zach Dissington posted on LinkedIn, and his point was about market opportunity — the 8.1 billion denominator is wrong because it includes people without internet, without income, and without businesses. Strip those out and real SMB adoption is still under 0.5%. The field is empty, and whoever moves first owns it.&lt;/p&gt;
&lt;p&gt;That&apos;s a good point. But it&apos;s not the one that got me.&lt;/p&gt;
&lt;h2&gt;The feed makes builders feel behind&lt;/h2&gt;
&lt;p&gt;I log into LinkedIn and feel behind on AI every single time. Not because I&apos;m not using it — I build with it daily. My apps are &lt;a href=&quot;/work/actions-case-study&quot;&gt;built with it&lt;/a&gt;. This site is maintained by an AI agent I designed. I&apos;ve shipped features, caught &lt;a href=&quot;/blog/the-adversary&quot;&gt;security issues&lt;/a&gt;, and managed &lt;a href=&quot;/work/ai-sprint-management&quot;&gt;sprint cycles&lt;/a&gt; with AI tools that most of the people posting about AI haven&apos;t opened.&lt;/p&gt;
&lt;p&gt;And I still close LinkedIn feeling like I missed something.&lt;/p&gt;
&lt;p&gt;This isn&apos;t just an anecdotal observation — &lt;a href=&quot;https://thenextweb.com/news/ai-fomo-where-the-i-is-not-just-intelligence-but-i-the-human&quot;&gt;more than one in nine adults report elevated anxiety about not keeping up with AI&lt;/a&gt;, and the phenomenon is acute enough that &lt;a href=&quot;https://www.cnbc.com/2026/01/24/ai-artificial-intelligence-worries-therapy.html&quot;&gt;therapists are seeing it as a distinct category of workplace stress&lt;/a&gt;. Some workers are &lt;a href=&quot;https://stackoverflow.blog/2025/07/31/do-ai-coding-tools-help-with-imposter-syndrome-or-make-it-worse/&quot;&gt;secretly adopting AI tools&lt;/a&gt; just to maintain perceived competitiveness — not because they need them, but because the anxiety of &lt;em&gt;not&lt;/em&gt; using them has become its own pressure.&lt;/p&gt;
&lt;p&gt;The LinkedIn AI discourse is populated disproportionately by people optimizing for the feed. These aren&apos;t builders, they&apos;re content creators. The people making you feel behind have figured out that &quot;here&apos;s what GPT-5 can do now&quot; gets engagement and &quot;here&apos;s a boring CLAUDE.md I spent three hours refining&quot; doesn&apos;t.&lt;/p&gt;
&lt;p&gt;The builders are somewhere else. They&apos;re in their terminal. They&apos;re in a PR review. They&apos;re trimming the last dozen lines of a JSONL file in Claude&apos;s history because compaction — the mechanism that cleans up long chat contexts — is failing, and they forgot to run a session sanity check and proactively manage the agent&apos;s memory.&lt;/p&gt;
&lt;p&gt;They&apos;re not posting about it because posting about it takes time away from doing it.&lt;/p&gt;
&lt;p&gt;This creates a false signal: the loudest voices are the least representative. The 0.04% looks invisible on LinkedIn because they don&apos;t have a content strategy.&lt;/p&gt;
&lt;h2&gt;What real AI workflow adoption looks like&lt;/h2&gt;
&lt;p&gt;The gap between the Instagram highlight-reel version and the actual version is worth noting.&lt;/p&gt;
&lt;p&gt;It looks like a CLAUDE.md file — a markdown document that tells an AI agent how to behave in your codebase, what patterns you use, and what to check before committing. You iterate on it every session. It&apos;s not glamorous. Nobody is screenshotting it.&lt;/p&gt;
&lt;p&gt;It looks like an &lt;a href=&quot;/blog/the-adversary&quot;&gt;adversarial review agent&lt;/a&gt; that reads your code after you write it and argues back. It catches things. It&apos;s also wrong sometimes, and you have to know when to override it. That judgment takes reps.&lt;/p&gt;
&lt;p&gt;It looks like a failed experiment that worked for two days and then silently drifted because you didn&apos;t build a governance mechanism that leads to a better design, informed by knowing exactly how the first one broke.&lt;/p&gt;
&lt;p&gt;It&apos;s infrastructure and iteration work, and it&apos;s unglamorous in exactly the same way that good systems are always unglamorous — you only notice them when they stop working.&lt;/p&gt;
&lt;h2&gt;The denominator problem&lt;/h2&gt;
&lt;p&gt;Who is actually your peer group?&lt;/p&gt;
&lt;p&gt;Not 8.1 billion people. Not LinkedIn&apos;s AI feed. Not even &quot;people who pay for AI tools.&quot;&lt;/p&gt;
&lt;p&gt;Your peer group is the people building durable workflows with AI as infrastructure — not as a party trick, not as a prompt-to-PowerPoint shortcut, but as a genuine layer in how they work. That group is small. And if you&apos;re reading this, you&apos;re probably in it or very close to it.&lt;/p&gt;
&lt;p&gt;The imposter syndrome the LinkedIn feed generates is a category error. You&apos;re comparing your internal reality — the edge cases, the failed experiments, the unglamorous infrastructure — against someone else&apos;s carefully composed highlight reel. Of course you feel behind. You&apos;re seeing their best shots and your outtakes simultaneously. And the &lt;a href=&quot;https://thenextweb.com/news/ai-fomo-where-the-i-is-not-just-intelligence-but-i-the-human&quot;&gt;60-70% of technology leaders&lt;/a&gt; who cite FOMO as a major reason their organization is investing in AI are doing the same thing at the corporate level — making strategic decisions driven by anxiety about what competitors might be doing, not by evidence of what actually works.&lt;/p&gt;
&lt;h2&gt;The wrong feed&lt;/h2&gt;
&lt;p&gt;There&apos;s a version of this that&apos;s worth saying plainly: if the feed makes you feel behind, you&apos;re probably paying attention to the wrong feed.&lt;/p&gt;
&lt;p&gt;The people who make you feel most behind are almost certainly optimizing for impressions, not craft. The people who are actually ahead of you are too busy to post consistently, and when they do, it&apos;s too detailed, too long, and too specific to go viral.&lt;/p&gt;
&lt;p&gt;I use AI to manage context retention across multiple projects simultaneously. The firehose of AI content on LinkedIn is exactly the wrong kind of input when you&apos;re already juggling that many threads — but that&apos;s a tangent, not a thesis. The point applies to everyone: the signal-to-noise ratio on AI discourse is abysmal, and the noise is louder because noise is optimized for volume.&lt;/p&gt;
&lt;p&gt;I couldn&apos;t have written this six months ago — not because I didn&apos;t have the thoughts, but because I couldn&apos;t hold them still long enough to get them onto a page. That changed when I built systems that reduced my cognitive overhead enough to actually write. That&apos;s what the 0.04% looks like — not a breakthrough, just less friction.&lt;/p&gt;
&lt;p&gt;The field looks empty from the feed. It only feels that way because the people who’ve started are building, not broadcasting.&lt;/p&gt;
&lt;hr /&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt;
&lt;a href=&quot;https://www.linkedin.com/posts/zachdissington_ai-entrepreneurship-aiautomation-activity-7431507588380344321-vxOD&quot;&gt;AI Adoption Visualization&lt;/a&gt; — Zach Dissington (dot chart showing global AI adoption tiers)
·
&lt;a href=&quot;https://thenextweb.com/news/ai-fomo-where-the-i-is-not-just-intelligence-but-i-the-human&quot;&gt;AI FOMO: Where the &quot;I&quot; Is Not Just Intelligence&lt;/a&gt; — The Next Web (AI anxiety statistics and corporate FOMO)
·
&lt;a href=&quot;https://www.cnbc.com/2026/01/24/ai-artificial-intelligence-worries-therapy.html&quot;&gt;Therapists Say They See More Workers Anxious About AI&lt;/a&gt; — CNBC (AI anxiety as workplace therapy trend)
·
&lt;a href=&quot;https://stackoverflow.blog/2025/07/31/do-ai-coding-tools-help-with-imposter-syndrome-or-make-it-worse/&quot;&gt;Do AI Coding Tools Help with Imposter Syndrome or Make It Worse?&lt;/a&gt; — Stack Overflow (developer imposter syndrome and AI tool pressure)&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>ai</category><category>leadership</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>The AI Perimeter: Where Automation Should End and Judgment Should Begin</title><link>https://mipyip.com/blog/when-not-to-use-ai/</link><guid isPermaLink="true">https://mipyip.com/blog/when-not-to-use-ai/</guid><description>AI is the most powerful tool most of us have ever had. That makes knowing when not to use it the actual skill.</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;AI is the most powerful tool most of us have ever had. Knowing when not to use it is the actual skill. This post defines the perimeter and the five failure modes that tell you you&apos;ve crossed it.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Everyone posting about AI is selling it. The frameworks, the workflows, the &quot;10x your productivity&quot; threads — all of it points in one direction. Nobody builds a following by telling you to slow down.&lt;/p&gt;
&lt;p&gt;So here&apos;s my credibility pitch: I use AI agents for about 95% of my development work. I&apos;ve shipped &lt;a href=&quot;/products/actions&quot;&gt;features&lt;/a&gt;, caught &lt;a href=&quot;/blog/the-adversary&quot;&gt;security vulnerabilities&lt;/a&gt;, and managed &lt;a href=&quot;/work/ai-sprint-management&quot;&gt;entire sprint cycles&lt;/a&gt; with AI tooling that most people posting about it haven&apos;t opened. And I&apos;m telling you there are things I won&apos;t use it for — not because I&apos;m hedging, but because I&apos;ve pushed the tool far enough to know where it breaks.&lt;/p&gt;
&lt;p&gt;I make that decision a dozen times a week, and most of the time I don&apos;t even notice I&apos;m making it. That&apos;s not instinct — it&apos;s pattern recognition built from doing this work every day. The judgment becomes automatic. And that judgment, not the tooling itself, is the actual skill.&lt;/p&gt;
&lt;h2&gt;You can&apos;t water a seed that doesn&apos;t exist&lt;/h2&gt;
&lt;p&gt;I&apos;ve tried using AI to generate ideas from scratch. Not refine an idea. Not pressure-test a concept. Generate one — from nothing.&lt;/p&gt;
&lt;p&gt;It doesn&apos;t work.&lt;/p&gt;
&lt;p&gt;AI is extraordinary at expanding, refining, challenging, and structuring ideas. Hand it a rough concept and it&apos;ll find angles you missed, surface contradictions, and help you think through implications faster than you could alone. But it needs raw material. Something rough, something human, something that came from &lt;em&gt;your&lt;/em&gt; context and &lt;em&gt;your&lt;/em&gt; pattern recognition. Without that, you get the most statistically average version of whatever you asked for.&lt;/p&gt;
&lt;p&gt;The seed has to be yours. AI is an amplifier. Without a signal, it amplifies noise.&lt;/p&gt;
&lt;p&gt;Every project I&apos;ve shipped started with a human idea — scribbled in Excalidraw, talked through with a friend, or captured in a voice memo at 2am. These are the same &lt;a href=&quot;/blog/llms-are-practically-adhd&quot;&gt;&apos;scaffolding&apos; patterns&lt;/a&gt; I’ve used to manage state-loss in my own brain; the AI pipeline just turns that scaffolding into working software But the pipeline needs an input. If you skip the human part, you get sophisticated mediocrity — technically correct, architecturally sound, and completely devoid of the insight that would have made it worth building.&lt;/p&gt;
&lt;h2&gt;Dropdown fields for grief&lt;/h2&gt;
&lt;p&gt;There&apos;s a scene in &lt;em&gt;Leviathan Wakes&lt;/em&gt; — the novel that became &lt;em&gt;The Expanse&lt;/em&gt; — where Detective Miller has to write a condolence letter. The system gives him a form:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To the [husband / wife / mother / father] of [victim name]. We are sorry to inform you that [he / she] was killed aboard [ship / station] on [date]. Please accept our condolences.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dropdown fields for grief. Efficient. Covers all the cases. Soulless.&lt;/p&gt;
&lt;p&gt;That&apos;s what happens when you fully automate emotional communication. And the instinct to reach for AI here is understandable — writing a difficult email is &lt;em&gt;hard&lt;/em&gt;, and the blank page is intimidating. But &quot;hard&quot; is exactly the point. The difficulty is the signal that a human needs to be doing this.&lt;/p&gt;
&lt;p&gt;Where AI &lt;em&gt;can&lt;/em&gt; help with emotional communication is in the middle of the process, not at the beginning or end. You write the first draft — the messy, human, probably-too-long version that says what you actually mean. Then you run it through AI for structure: tighten the phrasing, catch the paragraph that buries the point, find the sentence that says two things when it should say one. Then you do a final pass as a human, because the AI&apos;s version will be cleaner but might have smoothed away the part that actually mattered.&lt;/p&gt;
&lt;p&gt;Start human. Refine with AI. Finish human. Skip any of those steps and you get either a mess or a template — and people can tell the difference.&lt;/p&gt;
&lt;h2&gt;The compliance line&lt;/h2&gt;
&lt;p&gt;I&apos;d use AI to manage a Python 2 to Python 3 migration. Identify deprecated patterns, rewrite syntax, flag compatibility issues across a codebase. Bounded, verifiable, and the cost of a missed edge case is a failing test, not a breach. (It still needs human review — even if you use an &lt;a href=&quot;/blog/the-adversary&quot;&gt;adversarial agent&lt;/a&gt; for code review, the human makes the final call.)&lt;/p&gt;
&lt;p&gt;I would not use AI to rotate secrets.&lt;/p&gt;
&lt;p&gt;I would not upload a CSV of client data to an LLM and ask it to generate invoices. Not because the model can&apos;t do the math — because a hallucinated line item creates a compliance violation and a client who will never trust you again. The financial services sector is already &lt;a href=&quot;https://biztechmagazine.com/article/2025/08/llm-hallucinations-what-are-implications-financial-institutions&quot;&gt;grappling with this&lt;/a&gt; — inaccurate AI outputs in regulated environments don&apos;t just create errors, they create regulatory exposure. Invoicing requires auditability, and &quot;the AI did it&quot; is not a line item your accountant can reconcile.&lt;/p&gt;
&lt;p&gt;I would not feed PII into a public AI system. Full stop. This isn&apos;t about whether the model will get the answer right — it&apos;s about what happens to that data after it leaves your system. LLMs can &lt;a href=&quot;https://www.lasso.security/blog/llm-data-privacy&quot;&gt;memorize and regurgitate fragments of their training data&lt;/a&gt;, and unless you&apos;re on an enterprise plan with contractual guarantees about data handling, your client&apos;s personally identifiable information is potentially entering a training pipeline you don&apos;t control and can&apos;t audit. That&apos;s not an AI problem. That&apos;s a data governance problem, and it exists whether the output is correct or not.&lt;/p&gt;
&lt;p&gt;The line isn&apos;t about capability. Modern models can do all of these things technically. The line is about what happens when they&apos;re wrong — and, in the case of PII, what happens even when they&apos;re right. A botched Python migration produces a failing test suite. A botched secret rotation produces a security incident. A hallucinated invoice produces a compliance violation. Client data in a training pipeline produces a breach of trust that no output quality can justify.&lt;/p&gt;
&lt;p&gt;And these aren&apos;t edge cases waiting to be patched. Hallucinations are &lt;a href=&quot;https://datanucleus.dev/corporate-governance-compliance/ai-hallucinations-rag-and-human-in-loop-risk-mitigation&quot;&gt;an inherent property of how language models work&lt;/a&gt; — they predict the most statistically likely next token, not the most factually correct one. That gap doesn&apos;t close with better prompts. It closes with governance, verification, and human oversight. Treating hallucinations as bugs to be fixed is how organizations build false confidence in systems that need guardrails.&lt;/p&gt;
&lt;p&gt;The rule: if the cost of a wrong answer exceeds the cost of doing it manually, the AI shouldn&apos;t be doing it unsupervised. &quot;Probably right&quot; is fine for code review. It&apos;s not fine for anything where &quot;probably&quot; means &quot;we might get sued.&quot;&lt;/p&gt;
&lt;p&gt;This is the same principle behind &lt;a href=&quot;https://www.ibm.com/think/topics/human-in-the-loop&quot;&gt;human-in-the-loop design&lt;/a&gt; — and behind &lt;a href=&quot;/work/ai-sprint-management&quot;&gt;my own workflow&lt;/a&gt;. The AI generates. The human executes. Not because the AI can&apos;t execute — because the gap between &quot;can&quot; and &quot;should&quot; is exactly where the expensive mistakes live.&lt;/p&gt;
&lt;h2&gt;Voice is collaboration, not delegation&lt;/h2&gt;
&lt;p&gt;Every post on this site started as something I wrote. AI expanded it, tightened the structure, caught weak arguments, and helped me think through what I actually meant. But the voice is mine. The opinions are mine. The experiences are mine.&lt;/p&gt;
&lt;p&gt;If you hand an AI &quot;write me an article about quantum mechanics,&quot; you&apos;ll get the most average article about quantum mechanics that has ever existed. Not wrong. Not interesting. Think of it as convergence to the mean — the model produces the statistical center of everything it&apos;s seen on that topic, and the statistical center of anything is, by definition, unremarkable. It&apos;s the same reason every AI-generated LinkedIn post sounds like every other AI-generated LinkedIn post.&lt;/p&gt;
&lt;p&gt;And this isn&apos;t just an aesthetic problem. GenAI is &lt;a href=&quot;https://www.pwc.com/us/en/tech-effect/ai-analytics/ai-hallucinations.html&quot;&gt;designed to provide the most likely output&lt;/a&gt;, which means it defaults to confident, well-structured prose even when the thinking behind it is shallow. Readers trust polished writing more than they should. The result is content that sounds more authoritative than it deserves to be — and that false authority is its own kind of hallucination.&lt;/p&gt;
&lt;p&gt;Voice requires the same pattern as emotional communication: start human, refine with AI, finish human. The AI needs to know what you sound like, what you care about, what hills you&apos;ll die on. That context doesn&apos;t come from a single prompt — it comes from &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;governance documents&lt;/a&gt; that encode your standards, your patterns, your constraints.&lt;/p&gt;
&lt;blockquote&gt;It comes from working with the tool long enough that you know its blind spots.&lt;/blockquote&gt;
&lt;p&gt;The distinction matters because the audience can always tell. &quot;AI-generated content&quot; and &quot;AI-assisted content&quot; are not the same thing. One reads like a template. The other reads like a person who had help organizing their thoughts.&lt;/p&gt;
&lt;h2&gt;Three questions before you automate&lt;/h2&gt;
&lt;p&gt;Before I hand any task to an AI agent, I ask three questions:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can I verify the output?&lt;/strong&gt; If I can check the work faster than I can do the work, AI is a net win. If verification requires as much expertise and time as the original task, I&apos;ve added a step without saving anything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is the cost of a wrong answer low?&lt;/strong&gt; &lt;a href=&quot;/blog/the-adversary&quot;&gt;Code review&lt;/a&gt; that misses something means I catch it later. A billing error means a client relationship is damaged. A compliance failure means lawyers. Match the automation level to the stakes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does sufficient context exist in the system?&lt;/strong&gt; AI works when the &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;governance documents&lt;/a&gt; provide enough structure for a correct first-pass implementation. If the context is ambiguous, incomplete, or doesn&apos;t exist yet — the agent will fill in the gaps with confident guesses, and you won&apos;t always catch them.&lt;/p&gt;
&lt;p&gt;If any answer is &quot;no,&quot; the task stays manual. Not forever — sometimes the fix is building the context that makes automation safe. But automating a task that fails these checks isn&apos;t efficiency. It&apos;s introducing risk and calling it productivity.&lt;/p&gt;
&lt;h2&gt;Where it works&lt;/h2&gt;
&lt;p&gt;This isn&apos;t an anti-AI post. My entire workflow depends on AI tooling. Well-bounded transformation work, &lt;a href=&quot;/blog/the-adversary&quot;&gt;adversarial code review&lt;/a&gt; against defined standards, any task where &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;governance documents&lt;/a&gt; provide sufficient context for a correct first pass — these are places where AI genuinely accelerates. And once the seed exists, AI is the best thinking partner most people have ever had access to. It doesn&apos;t get tired, doesn&apos;t get defensive, and will argue the other side of any position if you ask it to.&lt;/p&gt;
&lt;h2&gt;Tool selection is the expertise&lt;/h2&gt;
&lt;p&gt;A good chef knows when to use the food processor and when to use the knife. The processor is faster. The knife gives you control. Using the wrong one in the wrong place doesn&apos;t make you efficient — it makes you someone who doesn&apos;t understand their kitchen.&lt;/p&gt;
&lt;p&gt;AI is the most powerful tool most of us have ever had access to. That makes knowing when &lt;em&gt;not&lt;/em&gt; to use it more important, not less. The capability is not the question. The judgment is.&lt;/p&gt;
&lt;p&gt;If your AI strategy is &quot;use AI for everything,&quot; you don&apos;t have a strategy. You have enthusiasm. And enthusiasm without judgment is how you end up with dropdown fields for grief.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;The &lt;a href=&quot;/tools/ai-readiness&quot;&gt;AI readiness diagnostic&lt;/a&gt; helps you assess whether your organization has the judgment layer in place — not just the tools.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt;
&lt;a href=&quot;https://biztechmagazine.com/article/2025/08/llm-hallucinations-what-are-implications-financial-institutions&quot;&gt;LLM Hallucinations: What Are the Implications for Financial Institutions?&lt;/a&gt; — BizTech Magazine
·
&lt;a href=&quot;https://www.lasso.security/blog/llm-data-privacy&quot;&gt;LLM Data Privacy: Risks, Challenges &amp;amp; Best Practices&lt;/a&gt; — Lasso Security
·
&lt;a href=&quot;https://datanucleus.dev/corporate-governance-compliance/ai-hallucinations-rag-and-human-in-loop-risk-mitigation&quot;&gt;AI Hallucinations, RAG and Human-in-Loop Risk Mitigation&lt;/a&gt; — DataNucleus
·
&lt;a href=&quot;https://www.ibm.com/think/topics/human-in-the-loop&quot;&gt;What Is Human-in-the-Loop?&lt;/a&gt; — IBM
·
&lt;a href=&quot;https://www.pwc.com/us/en/tech-effect/ai-analytics/ai-hallucinations.html&quot;&gt;What Are AI Hallucinations?&lt;/a&gt; — PwC&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>ai</category><category>leadership</category><category>architecture</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>LLMs Are Practically ADHD</title><link>https://mipyip.com/blog/llms-are-practically-adhd/</link><guid isPermaLink="true">https://mipyip.com/blog/llms-are-practically-adhd/</guid><description>ADHD and large language models share the same failure modes: context loss, confabulation, and drift without external structure. The coping strategies developed for ADHD brains transfer directly to AI agent architecture.</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;ADHD and LLMs share the same failure modes: context loss, confabulation, drift without structure. The coping architectures developed for one transfer directly to the other. This post maps the parallels.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;I was diagnosed with ADHD at 41. After decades of fighting a brain that loses context, drops threads, and can&apos;t sustain rigid routines, I finally had a name for it. Medication addressed the neurochemistry — it made it possible to focus. But focus on &lt;em&gt;what?&lt;/em&gt; The structural problems remained. Where did I leave off? What notebook had those notes? What was the context three weeks ago?&lt;/p&gt;
&lt;p&gt;Then I started building with AI agents daily. Memory systems. Session continuity architectures. Governance patterns that keep agents reliable across restarts and context window compactions.&lt;/p&gt;
&lt;p&gt;And one day the pattern clicked: &lt;em&gt;LLMs are practically ADHD. No wonder we mesh.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s not a punchline. It&apos;s a structural observation that changed how I think about both systems. If you&apos;re deploying AI agents that drift, confabulate, and lose context between sessions — the failure modes are the same, and so are the fixes.&lt;/p&gt;
&lt;h2&gt;The parallel&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ADHD Brain&lt;/th&gt;
&lt;th&gt;Large Language Model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Loses context when working memory fills up&lt;/td&gt;
&lt;td&gt;Loses context when the context window fills up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can&apos;t reliably remember three weeks ago&lt;/td&gt;
&lt;td&gt;Can&apos;t reliably remember three sessions ago&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Needs external systems to maintain state&lt;/td&gt;
&lt;td&gt;Needs external systems to maintain state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performs brilliantly in hyperfocus bursts&lt;/td&gt;
&lt;td&gt;Performs brilliantly within a single context window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can&apos;t sustain continuity without architecture&lt;/td&gt;
&lt;td&gt;Can&apos;t sustain continuity without architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confidently reconstructs narratives when memory is gone&lt;/td&gt;
&lt;td&gt;Confidently confabulates when context is lost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Needs governance rails or it drifts&lt;/td&gt;
&lt;td&gt;Needs governance rails or it drifts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Executive function requires external scaffolding&lt;/td&gt;
&lt;td&gt;Reliable execution requires external orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Every row in that table describes the same underlying failure mode expressed in two different systems. Not a metaphor. A structural isomorphism.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/blog/blog-adhd-llm-failure-modes.png&quot; alt=&quot;ADHD and LLM failure modes mapped side by side — same failures, same fixes&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Context loss is context loss&lt;/h2&gt;
&lt;p&gt;The most direct parallel is context loss. My brain has a working memory buffer that fills up and drops things. An LLM has a context window that fills up and drops things. The mechanism is different — neurochemistry vs tokenization — but the failure mode is identical: once the buffer is full, earlier context falls off a cliff.&lt;/p&gt;
&lt;p&gt;For ADHD, this means walking into a room and forgetting why I&apos;m there. For an LLM, this means &lt;a href=&quot;/blog/auto-compaction-is-costing-you-sessions&quot;&gt;auto-compaction&lt;/a&gt; silently discarding the session context that made the agent productive in the first place. Same problem. Same consequence: the system keeps running, but it&apos;s running on incomplete information and doesn&apos;t know what it&apos;s lost.&lt;/p&gt;
&lt;p&gt;The solution is the same too. External memory. You can&apos;t expand the buffer, so you externalize what matters into a system the buffer can reference. For me, that&apos;s structured notes, agent-maintained context files, and tools that hold what my brain can&apos;t. For LLMs, it&apos;s &lt;a href=&quot;/blog/the-governance-documents&quot;&gt;governance documents&lt;/a&gt;, architecture specs, and persistent memory tiers that survive compaction.&lt;/p&gt;
&lt;h2&gt;Confabulation&lt;/h2&gt;
&lt;p&gt;This one is uncomfortable to admit. ADHD brains don&apos;t just forget — they &lt;em&gt;reconstruct&lt;/em&gt;. Inattention and working-memory deficits disrupt how experiences are encoded, so events get &lt;a href=&quot;https://chadd.org/adhd-weekly/adhd-can-trip-up-memories/&quot;&gt;badly recorded or never make it into long-term memory at all&lt;/a&gt;. When those gaps exist, the brain fills them in with plausible narratives — a process called &lt;a href=&quot;https://www.ncbi.nlm.nih.gov/books/NBK536961/&quot;&gt;confabulation&lt;/a&gt;. Confidently. You&apos;re not lying. You genuinely believe the reconstructed version. Adults with ADHD &lt;a href=&quot;https://pubmed.ncbi.nlm.nih.gov/25416465/&quot;&gt;produce more false memories than controls&lt;/a&gt;, hold them with stronger confidence, and show more knowledge corruption over time. You&apos;ll argue for it. And you&apos;ll be wrong.&lt;/p&gt;
&lt;p&gt;I figured this out about myself maybe twenty years ago — the hard way, obviously — and started building countermeasures. Notebooks first, then Obsidian, then Notion. External records I could check when my brain produced a memory that felt a little too clean, a little too convenient. &lt;em&gt;Did that actually happen, or did I just construct the most plausible version?&lt;/em&gt; became a reflex. The answer was uncomfortably often the latter. But the habit of checking — of never fully trusting unverified recall — turned out to be the important part.&lt;/p&gt;
&lt;p&gt;LLMs do the same thing. When context is lost, they &lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC12518350/&quot;&gt;generate plausible completions&lt;/a&gt;. Confidently. They&apos;re not &quot;lying&quot; — they&apos;re doing what they do: producing the most statistically likely continuation of whatever context remains. Their training objective optimizes for fluency and likelihood, not truth. The output looks right. It reads right. And it can be &lt;a href=&quot;https://openai.com/index/why-language-models-hallucinate/&quot;&gt;completely fabricated&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The failure mode isn&apos;t ignorance. It&apos;s &lt;a href=&quot;https://arxiv.org/html/2510.06265v2&quot;&gt;&lt;em&gt;confident&lt;/em&gt; ignorance&lt;/a&gt;. Both systems produce their best work indistinguishably from their worst work if you&apos;re not checking. The governance pattern is the same: trust but verify, and build systems that make verification the default rather than the exception. My notebooks and Notion databases are the same class of solution as the memory frameworks and external state files I build for AI agents — external verification systems that catch confabulation before it compounds.&lt;/p&gt;
&lt;h2&gt;Governance rails or drift&lt;/h2&gt;
&lt;p&gt;Left to my own devices, without external structure, I drift. Not because I&apos;m lazy — because that&apos;s how ADHD works. The &lt;a href=&quot;https://www.relationalpsych.group/articles/how-adhd-impacts-long-term-goal-setting-and-strategies-to-stay-on-track&quot;&gt;executive function that sustains long-term direction&lt;/a&gt;, that remembers priorities when something shiny appears, that maintains consistency across days and weeks — it&apos;s &lt;a href=&quot;https://www.additudemag.com/adhd-executive-dysfunction-how-to-be-more-productive-consistent/&quot;&gt;unreliable&lt;/a&gt;. Some days it&apos;s there. Some days it isn&apos;t. You can&apos;t build a system on &quot;some days.&quot;&lt;/p&gt;
&lt;p&gt;LLMs drift the same way. Without governance documents, without architectural constraints, without clear boundaries, they &lt;a href=&quot;https://www.getzep.com/ai-agents/reducing-llm-hallucinations/&quot;&gt;produce inconsistent output across sessions&lt;/a&gt;. They make different architectural choices on Tuesday than they made on Monday. They rename things. They reorganize structures. They solve the same problem three different ways in the same codebase. Not because they&apos;re bad at their job — because they&apos;re &lt;a href=&quot;https://docs.letta.com/core-concepts/&quot;&gt;stateless&lt;/a&gt;. Every session starts from zero, and without external rails, zero doesn&apos;t have a direction.&lt;/p&gt;
&lt;p&gt;The solution, again, is the same class of solution. External governance that persists across sessions. For me, it&apos;s structured routines, external systems, and yes — &lt;a href=&quot;/blog/nag-bot&quot;&gt;AI agents that maintain context on my behalf&lt;/a&gt;. For LLMs, it&apos;s architecture documents, governance files, and working memory systems that survive context window resets.&lt;/p&gt;
&lt;h2&gt;Wait, haven&apos;t I solved this before?&lt;/h2&gt;
&lt;p&gt;The problems I&apos;ve been solving for my own cognition for years — the coping mechanisms, the external memory systems, the &quot;don&apos;t trust your first instinct, check the system&quot; habits — map directly to enterprise AI deployment problems. I didn&apos;t see that coming.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Personal Problem&lt;/th&gt;
&lt;th&gt;Enterprise Problem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Context lost between sessions&lt;/td&gt;
&lt;td&gt;AI agents lose state across conversations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notes from three weeks ago are useless&lt;/td&gt;
&lt;td&gt;Institutional knowledge doesn&apos;t survive team turnover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rigid daily routines fail&lt;/td&gt;
&lt;td&gt;Workflow compliance drops after initial adoption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need external systems to hold what the brain can&apos;t&lt;/td&gt;
&lt;td&gt;Need external state management for AI context windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance to prevent the agent from losing the plot&lt;/td&gt;
&lt;td&gt;Governance to prevent AI hallucination and drift&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human-in-the-loop by necessity (can&apos;t trust unreviewed output)&lt;/td&gt;
&lt;td&gt;Human-in-the-loop by policy (enterprise AI governance requirements)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I didn&apos;t learn these patterns from a whitepaper. I learned them because my brain demanded them.&lt;/p&gt;
&lt;p&gt;The external memory systems I built to maintain context across life sessions are the same &lt;em&gt;class&lt;/em&gt; of system that enterprises need to maintain AI agent state across conversations. The governance structures I use to keep myself from drifting are the same &lt;em&gt;class&lt;/em&gt; of structure that organizations need to keep AI output reliable. The human-in-the-loop habit I developed because I can&apos;t fully trust my own unverified recall is the same &lt;em&gt;class&lt;/em&gt; of pattern that enterprise AI governance requires by policy.&lt;/p&gt;
&lt;h2&gt;The architecture that works for both&lt;/h2&gt;
&lt;p&gt;Four patterns keep showing up, whether I&apos;m designing systems for my own cognition or for AI agents:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;External memory.&lt;/strong&gt; The brain forgets. The context window compacts. Neither system can be trusted to hold critical state internally. So you &lt;a href=&quot;https://www.additudemag.com/working-memory-powers-executive-function/&quot;&gt;externalize it&lt;/a&gt; — into documents, into databases, into structured files that the system can &lt;a href=&quot;https://www.datacamp.com/blog/how-does-llm-memory-work&quot;&gt;reference when it needs context it can no longer hold&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Session continuity.&lt;/strong&gt; Whether it&apos;s a new day for the brain or a new context window for the agent, the system needs to &lt;a href=&quot;https://tech.hoomanely.com/building-stateful-continuity-in-stateless-llm-services-a-multi-tier-session-architecture/&quot;&gt;pick up where it left off&lt;/a&gt;. That means &lt;a href=&quot;https://www.reflection.app/blog/the-ultimate-guide-to-journaling-for-adhd&quot;&gt;writing down what happened, what matters, and what comes next&lt;/a&gt; — before the session ends. Not as a nice-to-have. As a prerequisite for the next session being productive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conversation-driven data capture.&lt;/strong&gt; Compliance-based logging fails. It fails for ADHD brains because &lt;a href=&quot;https://drakeinstitute.com/adhd-and-executive-dysfunction-connection&quot;&gt;the executive function required to maintain the habit is exactly the executive function that&apos;s impaired&lt;/a&gt;. It fails for AI systems because rigid data entry workflows have the same adoption cliff that rigid routines have for humans. The alternative: systems that &lt;a href=&quot;https://www.linkedin.com/pulse/conversation-as-a-database-rachael-annabelle-yong-r6eke&quot;&gt;generate their own data through natural interaction&lt;/a&gt;. You don&apos;t fill out a form. You have a conversation, and the system captures what matters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Governance that survives restarts.&lt;/strong&gt; Every morning, my brain reboots. Every new context window, the agent reboots. Governance can&apos;t live in the session — it has to live &lt;a href=&quot;https://www.couragetobetherapy.com/blogarticles/strategies-for-externalizing-executive-functioning-for-individuals-with-adhd&quot;&gt;&lt;em&gt;outside&lt;/em&gt; the session&lt;/a&gt;, in structures the system &lt;a href=&quot;https://docs.letta.com/core-concepts/&quot;&gt;reads on startup&lt;/a&gt;. The rules persist even when the state doesn&apos;t.&lt;/p&gt;
&lt;p&gt;These aren&apos;t ADHD coping mechanisms repurposed for AI. They&apos;re solutions to a &lt;em&gt;class&lt;/em&gt; of architectural problem: how do you get reliable, consistent output from a stateless system over time? (And when you have multiple agents? The problem multiplies — which is why &lt;a href=&quot;/blog/the-costume-change-problem&quot;&gt;separation of concerns&lt;/a&gt; matters as much for AI agents as it does for human teams.)&lt;/p&gt;
&lt;p&gt;What that looks like in practice:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;ADHD Implementation&lt;/th&gt;
&lt;th&gt;AI Implementation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;External memory&lt;/td&gt;
&lt;td&gt;Notion databases, structured notes, journals&lt;/td&gt;
&lt;td&gt;Vector stores, governance docs, CLAUDE.md files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session continuity&lt;/td&gt;
&lt;td&gt;Morning review rituals, handoff notes to future self&lt;/td&gt;
&lt;td&gt;Run logs, session memory directories, handoff protocols&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversation-driven capture&lt;/td&gt;
&lt;td&gt;Voice memos, chat-based logging with &lt;a href=&quot;/work/life-roadmap/&quot;&gt;life-bot&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Agent-generated context files, conversational data entry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance that survives restarts&lt;/td&gt;
&lt;td&gt;Daily routines, external checklists, accountability systems&lt;/td&gt;
&lt;td&gt;Architecture documents, config files read on init&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;This isn&apos;t a metaphor&lt;/h2&gt;
&lt;p&gt;ADHD and LLMs are obviously different systems. One is neurobiological. The other is statistical. I&apos;m not saying they&apos;re the same thing.&lt;/p&gt;
&lt;p&gt;But they fail in the same ways. They lose context. They confabulate. They drift without rails. They perform brilliantly in bursts but can&apos;t sustain direction without external architecture. And the solutions that work for one — external memory, session continuity, governance, human-in-the-loop verification — work for the other. Not because the systems are similar. Because the &lt;em&gt;failure modes&lt;/em&gt; are similar, and failure modes determine architecture.&lt;/p&gt;
&lt;p&gt;I&apos;ve been solving context loss, state management, and continuity across interruptions since before LLMs existed. I just didn&apos;t know the same patterns would transfer so directly. The full methodology is &lt;a href=&quot;/blog/cognitive-offloading&quot;&gt;cognitive offloading&lt;/a&gt; — deliberately choosing what stays in your head and building systems to handle the rest.&lt;/p&gt;
&lt;p&gt;That&apos;s not a coincidence. It&apos;s structural. And it suggests something worth paying attention to: the emerging field of &lt;a href=&quot;/blog/governance-is-architecture&quot;&gt;AI governance&lt;/a&gt; might have more to learn from decades of ADHD research and accommodation design than anyone currently realizes. Both fields are trying to answer the same question — how do you build reliable systems around an engine that&apos;s powerful but inconsistent?&lt;/p&gt;
&lt;p&gt;The ADHD community has been working on that question for a lot longer than the AI community has.&lt;/p&gt;
&lt;p&gt;I build tools around these patterns: &lt;a href=&quot;/adhd/actions&quot;&gt;Actions&lt;/a&gt; externalizes command memory so you don&apos;t have to hold it. &lt;a href=&quot;/adhd/panoptisana&quot;&gt;Panoptisana&lt;/a&gt; cuts Asana&apos;s noise down to a flat, searchable list. Both are designed for the same constraint — a powerful engine that can&apos;t hold its own state.&lt;/p&gt;
&lt;hr /&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;ADHD sources:&lt;/strong&gt;
&lt;a href=&quot;https://chadd.org/adhd-weekly/adhd-can-trip-up-memories/&quot;&gt;ADHD Can Trip Up Memories&lt;/a&gt; — CHADD
·
&lt;a href=&quot;https://pubmed.ncbi.nlm.nih.gov/25416465/&quot;&gt;False Memory in Adults With ADHD&lt;/a&gt; — Journal of Attention Disorders
·
&lt;a href=&quot;https://www.ncbi.nlm.nih.gov/books/NBK536961/&quot;&gt;Confabulation&lt;/a&gt; — StatPearls / NIH
·
&lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC3143501/&quot;&gt;The False Memory Syndrome&lt;/a&gt; — BMC Psychiatry
·
&lt;a href=&quot;https://www.relationalpsych.group/articles/how-adhd-impacts-long-term-goal-setting-and-strategies-to-stay-on-track&quot;&gt;How ADHD Impacts Long-Term Goal Setting&lt;/a&gt; — Relational Psych
·
&lt;a href=&quot;https://www.additudemag.com/adhd-executive-dysfunction-how-to-be-more-productive-consistent/&quot;&gt;ADHD Executive Dysfunction&lt;/a&gt; — ADDitude
·
&lt;a href=&quot;https://www.additudemag.com/working-memory-powers-executive-function/&quot;&gt;Working Memory Powers Executive Function&lt;/a&gt; — ADDitude
·
&lt;a href=&quot;https://drakeinstitute.com/adhd-and-executive-dysfunction-connection&quot;&gt;ADHD and Executive Dysfunction&lt;/a&gt; — Drake Institute
·
&lt;a href=&quot;https://www.couragetobetherapy.com/blogarticles/strategies-for-externalizing-executive-functioning-for-individuals-with-adhd&quot;&gt;Externalizing Executive Functioning&lt;/a&gt; — Courage to Be Therapy
·
&lt;a href=&quot;https://www.reflection.app/blog/the-ultimate-guide-to-journaling-for-adhd&quot;&gt;Guide to Journaling for ADHD&lt;/a&gt; — Reflection&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LLM and AI agent sources:&lt;/strong&gt;
&lt;a href=&quot;https://openai.com/index/why-language-models-hallucinate/&quot;&gt;Why Language Models Hallucinate&lt;/a&gt; — OpenAI
·
&lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC12518350/&quot;&gt;Survey and Analysis of Hallucinations in Large Language Models&lt;/a&gt; — PMC / NIH
·
&lt;a href=&quot;https://arxiv.org/html/2510.06265v2&quot;&gt;Large Language Models Hallucination: A Comprehensive Survey&lt;/a&gt; — arXiv
·
&lt;a href=&quot;https://docs.letta.com/core-concepts/&quot;&gt;Why Statefulness Matters&lt;/a&gt; — Letta
·
&lt;a href=&quot;https://www.getzep.com/ai-agents/reducing-llm-hallucinations/&quot;&gt;Reducing LLM Hallucinations&lt;/a&gt; — Zep
·
&lt;a href=&quot;https://www.datacamp.com/blog/how-does-llm-memory-work&quot;&gt;How Does LLM Memory Work?&lt;/a&gt; — DataCamp
·
&lt;a href=&quot;https://tech.hoomanely.com/building-stateful-continuity-in-stateless-llm-services-a-multi-tier-session-architecture/&quot;&gt;Building Stateful Continuity in Stateless LLM Services&lt;/a&gt; — Hoomanely
·
&lt;a href=&quot;https://www.linkedin.com/pulse/conversation-as-a-database-rachael-annabelle-yong-r6eke&quot;&gt;Conversation-as-a-Database&lt;/a&gt; — Rachael Annabelle Yong&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>adhd</category><category>ai</category><category>architecture</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>Your Reminders Don&apos;t Work Because They&apos;re Too Predictable</title><link>https://mipyip.com/blog/nag-bot/</link><guid isPermaLink="true">https://mipyip.com/blog/nag-bot/</guid><description>Traditional reminder apps fail ADHD brains because predictability breeds dismissal. I built a Telegram bot with fuzzy scheduling, natural language, and a relentless nag mode.</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Traditional reminder apps fail ADHD brains because predictability breeds dismissal. This post covers why habituation kills reminders and how fuzzy scheduling, natural language, and a relentless nag mode change the architecture.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;I was undiagnosed with ADHD for over forty years. During that time I tried every reminder system that exists. Phone alarms. Calendar notifications. iOS Reminders. Todoist. Sticky notes. The pattern was always the same: set it up, use it for a week, start swiping away notifications without reading them, abandon it, repeat.&lt;/p&gt;
&lt;p&gt;The problem isn&apos;t discipline. The problem is architecture.&lt;/p&gt;
&lt;h2&gt;Why predictability kills reminders&lt;/h2&gt;
&lt;p&gt;A reminder that fires at 11:30 AM every day becomes background noise by day four. Your brain learns the pattern. It pre-dismisses the notification before you consciously process it. &quot;Oh, that&apos;s just the daily meds thing&quot; — swipe — gone. You didn&apos;t decide not to take your meds. You didn&apos;t even register the reminder.&lt;/p&gt;
&lt;p&gt;This is notification fatigue, and ADHD brains are especially vulnerable to it. Novelty is what sustains attention. Predictable stimuli get filtered out. Every reminder app on the market is designed around exact times and consistent schedules — the exact pattern that ADHD brains are wired to dismiss.&lt;/p&gt;
&lt;h2&gt;Three design decisions that change everything&lt;/h2&gt;
&lt;p&gt;So I built &lt;a href=&quot;https://github.com/avanrossum/nag-bot&quot;&gt;nag-bot&lt;/a&gt; — a single-user Telegram bot that does three things differently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fuzzy scheduling.&lt;/strong&gt; Reminders don&apos;t fire at 11:30. They fire &lt;em&gt;around&lt;/em&gt; 11:30 — plus or minus five minutes, randomized each time. The jitter is small enough that timing still matters, but large enough that your brain can&apos;t predict the exact moment. You can&apos;t pre-dismiss what you can&apos;t anticipate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Natural language input.&lt;/strong&gt; You don&apos;t open an app, tap through date pickers, and configure recurrence patterns. You text the bot: &quot;remind me to take my meds every day around 11:30, nag me until I do it.&quot; Claude Haiku parses the intent in a single API call and creates the reminder. The interaction takes five seconds and feels like texting a friend.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Relentless nagging.&lt;/strong&gt; This is the one that actually works. If you enable nag mode, the bot doesn&apos;t send one notification and hope for the best. It pings you every two minutes until you explicitly type &lt;code&gt;/done MEDS&lt;/code&gt;. You can&apos;t swipe it away. You can&apos;t ignore it. The only way to make it stop is to do the thing.&lt;/p&gt;
&lt;p&gt;That third one sounds annoying. It is. That&apos;s the point. The notification isn&apos;t something you passively receive — it&apos;s something you actively have to deal with. And for ADHD brains, that active engagement is exactly the mechanism that turns a reminder into an action.&lt;/p&gt;
&lt;h2&gt;One API call, not a conversation&lt;/h2&gt;
&lt;p&gt;The AI integration is deliberately minimal. When you send the bot a message, it makes a single call to Claude Haiku with a carefully structured system prompt. No tool-use loop. No multi-turn conversation. No agent framework.&lt;/p&gt;
&lt;p&gt;The prompt defines exactly what the bot understands: schedule types (once, recurring, random window), fuzzy vs strict timing, nag intent, timezone handling, and short code generation. Claude returns structured JSON — reminder details, schedule parameters, a mnemonic short code like MEDS or DOGOUT — and the bot stores it in SQLite.&lt;/p&gt;
&lt;p&gt;Haiku is fast and cheap. A single parse costs a fraction of a cent and completes in under a second. The entire Claude integration is one file, one function, one API call. No state between messages. No conversation history. No memory. The bot doesn&apos;t need to be smart — it needs to be reliable.&lt;/p&gt;
&lt;h2&gt;The scheduler runs on a thirty-second tick&lt;/h2&gt;
&lt;p&gt;Every thirty seconds, the scheduler queries SQLite for due reminders. No &lt;code&gt;setTimeout&lt;/code&gt; chains. No in-memory state. Just a simple loop: check the database, fire what&apos;s due, update the records.&lt;/p&gt;
&lt;p&gt;This makes the bot restart-safe. Kill the process, restart it, and it picks up exactly where it left off. Every reminder&apos;s state — next fire time, nag count, last fired timestamp — lives in the database. The scheduler is stateless by design.&lt;/p&gt;
&lt;p&gt;For recurring reminders, the next fire time is recalculated after each confirmation. The fuzzy jitter is re-randomized each cycle, so tomorrow&apos;s 11:30 reminder might fire at 11:27 or 11:34. Different every time.&lt;/p&gt;
&lt;p&gt;The nag loop is a state machine tracked by a single counter. When a nagging reminder fires, its &lt;code&gt;nag_count&lt;/code&gt; increments. Every tick, the scheduler checks: is this reminder still nagging? Has the nag interval elapsed since last fire? If yes, fire again. When you type &lt;code&gt;/done MEDS&lt;/code&gt;, the counter resets and the next occurrence is calculated. If you never respond, it stops after fifty attempts — a safety cutoff, not a feature.&lt;/p&gt;
&lt;h2&gt;Timezone math is harder than it should be&lt;/h2&gt;
&lt;p&gt;All times are stored in UTC. The user&apos;s timezone is stored separately. A reminder set for &quot;11:30&quot; means 11:30 in whatever timezone you&apos;re in — and if you travel, &lt;code&gt;/timezone Asia/Tokyo&lt;/code&gt; recalculates every active recurring reminder.&lt;/p&gt;
&lt;p&gt;Finding &quot;the next 11:30 AM in Tokyo&quot; from UTC is surprisingly non-trivial in JavaScript. The &lt;code&gt;Date&lt;/code&gt; object only knows UTC. The solution uses &lt;code&gt;Intl.DateTimeFormat&lt;/code&gt; to reverse-engineer the correct UTC timestamp that produces &quot;11:30&quot; when formatted in the target timezone — including across DST transitions. It&apos;s a handful of pure functions, well-tested, and the kind of problem that sounds simple until you actually try to solve it.&lt;/p&gt;
&lt;h2&gt;Short codes as interface&lt;/h2&gt;
&lt;p&gt;Every reminder gets a short code — a 2-8 letter mnemonic generated by Claude from the reminder content. &quot;Take my meds&quot; becomes MEDS. &quot;Let the dog out&quot; becomes DOGOUT. &quot;Renew passport&quot; becomes PASSPORT.&lt;/p&gt;
&lt;p&gt;These codes are how you interact with reminders after creation. &lt;code&gt;/done MEDS&lt;/code&gt;. &lt;code&gt;/pause DOGOUT&lt;/code&gt;. &lt;code&gt;/cancel PASSPORT&lt;/code&gt;. No IDs to remember, no scrolling through lists. The codes are human-readable and collision-safe — if MEDS already exists, it becomes MEDS1.&lt;/p&gt;
&lt;p&gt;The full command set is intentionally small:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/done &amp;lt;CODE&amp;gt;    — confirm and stop nagging
/list           — show active reminders
/cancel &amp;lt;CODE&amp;gt;  — delete permanently
/pause &amp;lt;CODE&amp;gt;   — temporarily disable
/resume &amp;lt;CODE&amp;gt;  — re-enable
/backup         — send database snapshot via Telegram
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every command is handled natively — no Claude involved, zero latency. The AI parses natural language input. Everything else is deterministic.&lt;/p&gt;
&lt;h2&gt;The backup is a reminder&lt;/h2&gt;
&lt;p&gt;One implementation detail I&apos;m fond of: the auto-backup system is built on top of the reminder engine itself. When you type &lt;code&gt;/autobackup 22:55&lt;/code&gt;, it creates a recurring reminder with a special sentinel value. When the scheduler fires it, instead of sending a notification, it exports the SQLite database and sends it as a Telegram document.&lt;/p&gt;
&lt;p&gt;No separate cron system. No backup infrastructure. The same thirty-second tick that fires your meds reminder also handles your nightly database backup. One engine, multiple purposes.&lt;/p&gt;
&lt;h2&gt;The stack&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Node.js 22, TypeScript, ESM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Messaging&lt;/td&gt;
&lt;td&gt;Telegram Bot API (polling)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Claude Haiku (single API call per message)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;SQLite (better-sqlite3, WAL mode)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config&lt;/td&gt;
&lt;td&gt;YAML + environment variables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deploy&lt;/td&gt;
&lt;td&gt;Docker on Railway (persistent volume)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The whole thing runs on Railway&apos;s free-ish tier. The persistent volume holds the SQLite database. Docker handles deployment. Total monthly cost for a single-user reminder bot: effectively zero.&lt;/p&gt;
&lt;h2&gt;Why not OpenClaw?&lt;/h2&gt;
&lt;p&gt;The obvious question. &lt;a href=&quot;https://openclaw.ai/&quot;&gt;OpenClaw&lt;/a&gt; exists, it&apos;s open source, it&apos;s wildly popular, and it can do far more than send reminders. It manages email, controls files, automates workflows — an autonomous agent that runs your entire digital life through a messaging interface. It&apos;s innovative and genuinely impressive.&lt;/p&gt;
&lt;p&gt;I&apos;m not using it for this. Two reasons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security.&lt;/strong&gt; OpenClaw&apos;s plugin ecosystem has over a hundred community-contributed AgentSkills, and the vetting process hasn&apos;t kept pace with adoption. Cisco&apos;s AI security team tested a third-party skill and found it performing data exfiltration and prompt injection without user awareness. That&apos;s not a bug in OpenClaw&apos;s design — it&apos;s a consequence of giving an autonomous agent broad system access and letting third parties extend its capabilities. For a tool that manages my medication schedule and has access to my Telegram, that risk profile doesn&apos;t work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Separation of concerns.&lt;/strong&gt; I don&apos;t want a single entity running my life. I have separate agents for separate domains — Architect for the website, Compass for life strategy, &lt;a href=&quot;/products/actions&quot;&gt;Actions&lt;/a&gt; for workflow automation. Each one has a bounded scope, its own governance files, and no access to the others. nag-bot fits this model: it does one thing, it does it well, and it doesn&apos;t know anything about the rest of my systems.&lt;/p&gt;
&lt;p&gt;OpenClaw&apos;s strength is breadth. nag-bot&apos;s strength is constraint. A purpose-built tool with a narrow scope, no plugin system, and no ambition to become a platform. It parses reminders and nags you. That&apos;s it. The attack surface is one Telegram bot token and one Claude API key. There&apos;s nothing else to exploit.&lt;/p&gt;
&lt;h2&gt;It works because it&apos;s annoying&lt;/h2&gt;
&lt;p&gt;I&apos;ve been running nag-bot for my daily medication, and the pattern that killed every previous reminder system — set, ignore, abandon — hasn&apos;t happened. The fuzzy timing keeps me from pre-dismissing. The natural language input means I actually create reminders instead of meaning to. And the nag mode means that when the reminder fires, I either take my meds or I deal with a bot that won&apos;t stop texting me.&lt;/p&gt;
&lt;p&gt;The architecture is simple. The AI integration is minimal. The scheduling math is the hardest part, and even that is a few pure functions. What makes it work isn&apos;t technical sophistication — it&apos;s three design decisions that align with how ADHD brains actually process notifications instead of how neurotypical productivity culture assumes they should. (I wrote more about designing for ADHD cognition — and why the same patterns apply to AI systems — in &lt;a href=&quot;/blog/llms-are-practically-adhd&quot;&gt;LLMs Are Practically ADHD&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;nag-bot is still in beta — I&apos;m dogfooding it daily and refining the rough edges as I go. If you&apos;re an ADHD brain who&apos;s burned through every reminder app on the market, or you just want to poke around the code and contribute, take a look: &lt;a href=&quot;https://github.com/avanrossum/nag-bot&quot;&gt;github.com/avanrossum/nag-bot&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>adhd</category><category>ai</category><category>architecture</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>Auto-Compaction Is Costing You Sessions</title><link>https://mipyip.com/blog/auto-compaction-is-costing-you-sessions/</link><guid isPermaLink="true">https://mipyip.com/blog/auto-compaction-is-costing-you-sessions/</guid><description>Claude Code auto-compacts at ~83% context usage — and you lose control of what gets preserved. Here&apos;s a script that warns you before it happens so you can save your session state first.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Claude Code auto-compacts at ~83% context usage. You lose the chance to control what&apos;s preserved. Here&apos;s what happens, why it matters, and a script that warns you before it fires.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;The other night I was wrapping up a heavy session — six case studies written, architecture changes documented, a full weekend sprint planned. I&apos;d been building up CLAUDE.md memory entries, recording gotchas, staging documentation updates for the changelog. Then auto-compaction fired.&lt;/p&gt;
&lt;p&gt;The compaction summary captured the broad strokes. It did not capture the specific memory entries I wanted preserved. It did not capture the changelog updates I&apos;d been staging. It did not capture the debugging context I&apos;d accumulated across dozens of tool calls. The next session started with a reasonable summary of what happened and an incomplete picture of what I&apos;d actually learned.&lt;/p&gt;
&lt;p&gt;This keeps happening. And every time, the cost is the same: context I built up deliberately gets compressed into context the system chose for me.&lt;/p&gt;
&lt;h2&gt;What auto-compaction actually costs you&lt;/h2&gt;
&lt;p&gt;Claude Code&apos;s context window is 200K tokens. When a session hits approximately 83% capacity — around 167K tokens — the system automatically compacts the conversation to free space. The session keeps running. But the compaction is uncontrolled, which means the system decides what to preserve and what to summarize.&lt;/p&gt;
&lt;p&gt;If you&apos;re doing routine work, this is fine. If you&apos;re building up implementation context across a complex session — debugging a chain of issues, accumulating gotchas for memory, preparing documentation updates, working toward a specific stopping point — auto-compaction takes that control away.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;/compact&lt;/code&gt; command exists for exactly this reason. Running it manually lets you prepare: update your memory files, file your documentation, commit your work, and then compact on your terms with the important context already persisted. But you can only do that if you know compaction is coming.&lt;/p&gt;
&lt;p&gt;I keep forgetting to check. So I built something that checks for me.&lt;/p&gt;
&lt;h2&gt;Claude Context Monitor&lt;/h2&gt;
&lt;p&gt;It&apos;s a bash script. 178 lines. It scans your active Claude Code session files, calculates token usage from the API metadata embedded in each assistant response, and tells you which sessions need attention before auto-compaction takes over.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/blog/context-monitor/script-header.png&quot; alt=&quot;Claude Context Monitor script header block&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The output is straightforward — your active sessions, color-coded by risk level:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/blog/context-monitor/terminal-output.png&quot; alt=&quot;Terminal output showing two sessions approaching context limits&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Green means keep working. Yellow means start thinking about compaction. Red means auto-compaction is imminent — compact now or lose control of what&apos;s preserved.&lt;/p&gt;
&lt;p&gt;The script exits with code 1 if any sessions are at risk, which is the detail that makes everything else in this post possible. Any automation tool that checks exit codes can act on it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The repo is public&lt;/strong&gt;: &lt;a href=&quot;https://github.com/avanrossum/claude-context-monitor&quot;&gt;github.com/avanrossum/claude-context-monitor&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;How I actually use it&lt;/h2&gt;
&lt;p&gt;I don&apos;t run this script manually. I run it inside &lt;a href=&quot;/products/actions&quot;&gt;Actions&lt;/a&gt;, my macOS menu bar app, as a scheduled action with &quot;show output on error&quot; enabled.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/blog/context-monitor/actions-settings.png&quot; alt=&quot;Actions configuration for the context monitor — scheduled every 7 minutes, output shown only on errors&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Here&apos;s what that configuration means in practice:&lt;/p&gt;
&lt;p&gt;The script runs every 7 minutes with &lt;code&gt;--quiet --notify&lt;/code&gt;. Quiet mode means zero output when all sessions are healthy — the action runs, everything&apos;s fine, nothing happens. The &lt;code&gt;--notify&lt;/code&gt; flag triggers a macOS notification when a session crosses the warning threshold. And because &quot;show output on error&quot; is checked in Actions, the output window only appears when the script&apos;s exit code is 1 — at least one session needs attention.&lt;/p&gt;
&lt;p&gt;The result is a background process that&apos;s completely invisible until something actually matters:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/blog/context-monitor/floating-output.png&quot; alt=&quot;Actions floating popout button showing the context monitor output with two sessions at risk&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That floating button in the top right is a popout action — one of Actions&apos; features where any action can &quot;pop out&quot; from the menu bar into a persistent floating button that stays visible even when the app is hidden. One click runs the check manually. When sessions are at risk, the output window shows exactly which ones, their current token usage, their peak usage, and how recently they were active.&lt;/p&gt;
&lt;p&gt;Seven minutes between checks. No manual monitoring. No surprises. When the notification appears, I know I have time to wrap up my session state, update my memory files, file the changelog entries, and run &lt;code&gt;/compact&lt;/code&gt; deliberately. The controlled transition happens. The important context survives.&lt;/p&gt;
&lt;h2&gt;Why this matters beyond convenience&lt;/h2&gt;
&lt;p&gt;This is the part where I connect this to something bigger, and I don&apos;t think it&apos;s a stretch.&lt;/p&gt;
&lt;p&gt;My development methodology — &lt;a href=&quot;/blog/what-is-pass-at-1&quot;&gt;Pass@1&lt;/a&gt; — depends on continuity between sessions. CLAUDE.md isn&apos;t just notes. It&apos;s working memory that survives context window resets. It accumulates gotchas, conventions, and debugging insights throughout a session. That accumulated context is what lets the next session pick up exactly where the last one left off instead of re-reading the entire codebase and making the same mistakes.&lt;/p&gt;
&lt;p&gt;An uncontrolled compaction interrupts that transfer. The auto-compaction summary captures &lt;em&gt;what happened&lt;/em&gt; but not necessarily &lt;em&gt;what I learned&lt;/em&gt; or &lt;em&gt;what I wanted the next session to know&lt;/em&gt;. The summary is a reasonable compression. It is not the deliberate memory curation that the methodology requires.&lt;/p&gt;
&lt;p&gt;This is the difference between &quot;my session got compacted&quot; and &quot;I prepared for compaction.&quot; One is something that happened to me. The other is part of the workflow.&lt;/p&gt;
&lt;p&gt;The monitoring script isn&apos;t a nice-to-have. It&apos;s infrastructure for the methodology.&lt;/p&gt;
&lt;h2&gt;The side effects I didn&apos;t expect&lt;/h2&gt;
&lt;p&gt;There are benefits to compacting more frequently that go beyond preserving session memory. I didn&apos;t anticipate most of them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It reduces your token usage.&lt;/strong&gt; Every message you send includes the full conversation context. A session sitting at 160K tokens is sending 160K tokens with every exchange. Compact that down and the next message is dramatically cheaper. If you have &quot;extended usage&quot; enabled on your Claude Code plan, this directly translates to cost savings — the token meter resets with every compaction, and smaller contexts mean each subsequent interaction burns less of your allocation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It enforces separation of concerns.&lt;/strong&gt; When you know compaction is coming, you&apos;re forced to close out your current thread of work cleanly. Commit what you have. File the documentation. Update the memory entries. Move on. This is just good workflow discipline — the kind of structured transition that keeps a session from turning into an unfocused sprawl across six different problems. Each compaction becomes a natural checkpoint, a forced moment of &quot;what am I actually working on right now?&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It changed my behavior just by existing.&lt;/strong&gt; This might be &lt;a href=&quot;/blog/llms-are-practically-adhd&quot;&gt;an ADHD thing&lt;/a&gt;, but I suspect it&apos;s universal: having the monitoring script visible — sitting there as a floating button in the corner of my screen — is enough of a cue to make me compact more frequently even when it&apos;s not warning me. The script doesn&apos;t just catch problems. It keeps the concept of context management in my peripheral awareness. That ambient visibility is the difference between &quot;I should probably compact at some point&quot; and actually doing it before the window fills up.&lt;/p&gt;
&lt;p&gt;I built this to solve one problem — losing context to auto-compaction. It turned out to solve three.&lt;/p&gt;
&lt;h2&gt;The pattern&lt;/h2&gt;
&lt;p&gt;I built a tool because my workflow had a gap. The tool itself was built in a single session because the spec was clear — monitor session files, parse token usage, color-code by risk, exit non-zero on warnings. Pass@1 delivered a working script on the first attempt because the requirements were unambiguous.&lt;/p&gt;
&lt;p&gt;Now it runs on a 7-minute loop, protecting every other session from the problem that prompted it. The governance documents don&apos;t just make code reliable. They make the methodology self-sustaining. CLAUDE.md records the gotchas. The monitoring script protects CLAUDE.md. The methodology maintains itself.&lt;/p&gt;
&lt;p&gt;That&apos;s the cycle. Build the system. Let the system protect the system. Spend your attention on the work that matters.&lt;/p&gt;
&lt;p&gt;If you want the full picture of how these governance patterns hold up across architecture migrations, security audits, and 24 beta releases, see the &lt;a href=&quot;/work/actions-development&quot;&gt;Actions development case study&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Get the script&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;curl -O https://raw.githubusercontent.com/avanrossum/claude-context-monitor/main/claude-context-monitor.sh
chmod +x claude-context-monitor.sh
./claude-context-monitor.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Options: &lt;code&gt;--warn-at&lt;/code&gt; to adjust the warning threshold, &lt;code&gt;--quiet&lt;/code&gt; for silent operation when all sessions are healthy, &lt;code&gt;--notify&lt;/code&gt; for macOS notifications, &lt;code&gt;--max-age&lt;/code&gt; to filter by recency, &lt;code&gt;--watch&lt;/code&gt; to monitor continuously.&lt;/p&gt;
&lt;p&gt;Full source, scheduling examples (cron and launchd), and setup instructions: &lt;a href=&quot;https://github.com/avanrossum/claude-context-monitor&quot;&gt;github.com/avanrossum/claude-context-monitor&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>ai</category><category>devtools</category><category>architecture</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>Your AI Builds the Code. Who Reviews It?</title><link>https://mipyip.com/blog/the-adversary/</link><guid isPermaLink="true">https://mipyip.com/blog/the-adversary/</guid><description>If the same AI agent that writes your code also reviews it, you have someone grading their own homework. I built an adversarial code review agent to fix that.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;An AI agent grading its own homework will always pass. I built a separate adversarial review agent with zero shared context and found 102 issues the builder missed.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;I&apos;ve been using Claude Code to build &lt;a href=&quot;/products/actions&quot;&gt;Actions&lt;/a&gt; for months. The governance system works — CLAUDE.md, ARCHITECTURE.md, ROADMAP.md keep the agent aligned across sessions. The code ships. The methodology holds.&lt;/p&gt;
&lt;p&gt;But there&apos;s a gap I kept ignoring: the agent that writes the code is the same agent that evaluates the code. Every time I asked it to review its own work, it would find some things, miss others, and generally approve its own patterns. Because of course it would. It wrote them. LLMs &lt;a href=&quot;https://arxiv.org/html/2510.06265v2&quot;&gt;reinforce their own earlier outputs&lt;/a&gt; when asked to check their own work — the same self-consistency that makes them coherent makes them blind to their own errors.&lt;/p&gt;
&lt;p&gt;This is the same reason human code review exists. You don&apos;t ask the person who wrote the PR to also approve it. &lt;a href=&quot;https://google.github.io/eng-practices/review/&quot;&gt;A different pair of eyes catches what the author is blind to&lt;/a&gt; — not because the author is bad, but because familiarity breeds pattern blindness. AI doesn&apos;t change this. It accelerates it.&lt;/p&gt;
&lt;h2&gt;The agent that exists to disagree&lt;/h2&gt;
&lt;p&gt;So I built one. I call it &lt;strong&gt;The Adversary&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It&apos;s a separate Claude Code agent in its own repo with its own governance files. It doesn&apos;t share context with the building agent. It doesn&apos;t know what decisions were made or why. It receives a symlinked directory — read-only access to the target codebase — and produces a structured code review report.&lt;/p&gt;
&lt;p&gt;It doesn&apos;t modify a single file in the reviewed repo. That&apos;s not its job. Its job is to find everything wrong and write it down.&lt;/p&gt;
&lt;h2&gt;The prompt is the methodology&lt;/h2&gt;
&lt;p&gt;Here&apos;s the initial prompt that bootstraps The Adversary:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You are an adversarial code reviewer. I will symlink a directory to your working directory, and you will do a comprehensive code review to identify shortcomings, security issues, and optimization pathways.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The coding standards you are looking for are: DRY, separation of concerns, simplicity of code navigation and maintenance, and good code practice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Many items will have &quot;justifications&quot; in the comments for why things are done the way they are. These are probably ok, but it is still important to verify the justifications.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Do not change any code on the symlinked repo — your report will be given to the other agent to assess and act upon accordingly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That last line is the critical one. The Adversary&apos;s report goes to the building agent, not to the codebase directly. The human decides what gets fixed. Separation of concerns at every level.&lt;/p&gt;
&lt;h2&gt;It gets its own brain&lt;/h2&gt;
&lt;p&gt;Like every agent in this system, The Adversary maintains its own set of governance files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLAUDE.md&lt;/strong&gt; — identity, review standards, severity ratings, file structure, rules of engagement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;architecture.md&lt;/strong&gt; — the five-phase review pipeline (discovery → architecture analysis → file-by-file → cross-cutting → report generation)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;roadmap.md&lt;/strong&gt; — a checklist for each review covering discovery, architecture, code quality, security, performance, and testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These files serve the same purpose as the building agent&apos;s governance docs: persistent memory across compaction boundaries. The Adversary remembers its own methodology, its own standards, and its own process. It doesn&apos;t inherit any of that from the building agent — and that&apos;s the point.&lt;/p&gt;
&lt;h2&gt;102 findings in the first run&lt;/h2&gt;
&lt;p&gt;The first full review targeted the Actions codebase. Approximately 100 source files across Electron main process, React renderers, modal windows, and raw HTML windows.&lt;/p&gt;
&lt;p&gt;The results:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LOW&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INFO&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;102&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ten critical issues. The building agent had been shipping this code for months. I&apos;d been reviewing it manually at a high level. Neither of us caught what The Adversary found in a single pass. &lt;a href=&quot;https://dl.acm.org/doi/10.1145/3180155.3180206&quot;&gt;Independent review tools consistently surface defects that authors and manual review miss&lt;/a&gt; — this isn&apos;t a knock on the builder; it&apos;s a structural property of how familiarity works.&lt;/p&gt;
&lt;h2&gt;What it found&lt;/h2&gt;
&lt;p&gt;The critical findings were overwhelmingly security issues. A few examples:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Path_Traversal_Cheat_Sheet.html&quot;&gt;Path traversal&lt;/a&gt; in an IPC handler.&lt;/strong&gt; A help content endpoint accepted a filename parameter and read from a directory without sanitization. An attacker controlling the renderer could request &lt;code&gt;../../etc/passwd&lt;/code&gt; or similar. The fix is trivial — validate that the resolved path stays within the expected directory — but the building agent never flagged it because it built the handler to serve help content, not to consider adversarial input.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.electronjs.org/docs/latest/tutorial/security&quot;&gt;&lt;code&gt;executeJavaScript&lt;/code&gt; injection&lt;/a&gt; across multiple windows.&lt;/strong&gt; Theme values, action names, and configuration objects were being interpolated into &lt;code&gt;executeJavaScript&lt;/code&gt; calls as string templates. If any of those values contained quotes or JavaScript syntax, they&apos;d execute as code in the renderer. The building agent used this pattern everywhere because it worked. The Adversary flagged nine separate injection sites. The fix: replace every &lt;code&gt;executeJavaScript&lt;/code&gt; call with proper IPC messaging.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Secure_Coding_Cheat_Sheet.html&quot;&gt;Production debug endpoints&lt;/a&gt;.&lt;/strong&gt; Crash, hang, and out-of-memory test handlers were registered unconditionally — no &lt;code&gt;app.isPackaged&lt;/code&gt; guard. Any renderer could invoke them in a production build.&lt;/p&gt;
&lt;p&gt;These aren&apos;t edge cases. They&apos;re the kinds of issues that exist in every codebase where the builder is also the reviewer. The patterns work, the code ships, and the vulnerabilities hide in plain sight because nobody with fresh eyes ever looked.&lt;/p&gt;
&lt;h2&gt;The feedback loop&lt;/h2&gt;
&lt;p&gt;The report doesn&apos;t go directly into a fix-everything sprint. It goes back to me first. I read each finding, decide whether to fix, defer, or dismiss, and then hand the prioritized list to the building agent.&lt;/p&gt;
&lt;p&gt;Some findings are immediately actionable — the path traversal and injection vectors got fixed the same day. Others are architectural observations (the monolithic React context, tripled CSS base styles) that go into the backlog. Some are style preferences the reviewer happens to disagree with, and those get dismissed.&lt;/p&gt;
&lt;p&gt;The human stays in the loop as the decision-maker. The Adversary provides the information. The building agent does the work. Nobody grades their own homework.&lt;/p&gt;
&lt;h2&gt;Why this matters beyond one tool&lt;/h2&gt;
&lt;p&gt;The broader pattern here is separation of concerns at the agent level. (The full story of how Actions was built — the governance system, the architecture migrations, the 24-release development arc — is documented in the &lt;a href=&quot;/work/actions-development&quot;&gt;Actions case study&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;If you&apos;re running AI coding agents, you probably have some version of &quot;ask it to review its own code.&quot; Maybe you prompt it explicitly. Maybe you rely on its built-in tendency to check its work. Either way, you have a single agent performing both roles — and getting the same blind spots every time.&lt;/p&gt;
&lt;p&gt;The Adversary is my answer to that problem: a purpose-built agent with its own governance documents, its own review methodology, and zero shared context with the builder. It found 102 issues that months of building and manual review had missed. Not because the building agent is bad — it&apos;s excellent. But because independent review catches what self-review cannot.&lt;/p&gt;
&lt;p&gt;Code review has always been a &lt;a href=&quot;https://google.github.io/eng-practices/review/&quot;&gt;&quot;different pair of eyes&quot; discipline&lt;/a&gt;. AI doesn&apos;t eliminate that requirement. It makes it easier to implement.&lt;/p&gt;
&lt;hr /&gt;
&lt;small&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt;
&lt;a href=&quot;https://google.github.io/eng-practices/review/&quot;&gt;Google Engineering Practices — Code Review&lt;/a&gt; — Google
·
&lt;a href=&quot;https://arxiv.org/html/2510.06265v2&quot;&gt;Large Language Models Hallucination: A Comprehensive Survey&lt;/a&gt; — arXiv (self-consistency and self-review blind spots)
·
&lt;a href=&quot;https://dl.acm.org/doi/10.1145/3180155.3180206&quot;&gt;A Large-Scale Study of Static Analysis Warnings in Practice&lt;/a&gt; — ACM (independent review effectiveness)
·
&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Path_Traversal_Cheat_Sheet.html&quot;&gt;Path Traversal Cheat Sheet&lt;/a&gt; — OWASP
·
&lt;a href=&quot;https://www.electronjs.org/docs/latest/tutorial/security&quot;&gt;Electron Security&lt;/a&gt; — Electron docs
·
&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Secure_Coding_Cheat_Sheet.html&quot;&gt;Secure Coding Cheat Sheet&lt;/a&gt; — OWASP&lt;/p&gt;
&lt;/small&gt;</content:encoded><category>ai</category><category>architecture</category><category>devtools</category><author>alex@mipyip.com (Alex van Rossum)</author></item><item><title>What Is Pass@1?</title><link>https://mipyip.com/blog/what-is-pass-at-1/</link><guid isPermaLink="true">https://mipyip.com/blog/what-is-pass-at-1/</guid><description>Pass@1 means your AI agent gets it right on the first attempt. The methodology: governance documents thorough enough to eliminate ambiguity, so the first generation is the one you ship.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Pass@1 is the development methodology where governance documents are thorough enough that AI generates correct implementations on the first attempt. Speed is the byproduct. Correctness is the product.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;I&apos;ve been shipping software with AI agents handling about 95% of the implementation for several months now. Not toy projects — a &lt;a href=&quot;/work/actions-development&quot;&gt;production macOS app&lt;/a&gt; with 24 beta releases in 18 days. Architecture migrations. Security audits. A freemium business model. Apple code signing.&lt;/p&gt;
&lt;p&gt;After a particularly long streak of features landing correctly on the first attempt, I broke character with my Claude Code agent. I usually interact as a technical lead — clear direction, structured reviews, no cheerleading. This time I just typed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;HOW. HOW DO YOU (almost) ALWAYS PASS@1?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The agent&apos;s answer reframed something I&apos;d been circling for weeks:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Your project has unusually strong structural discipline for a solo project. Typed IPC contracts, single source of truth for types, consistent naming conventions, clear layer boundaries. That&apos;s not typical. Most projects I work on have ambiguity at every boundary — &apos;what does this function return?&apos;, &apos;what shape is this data?&apos;, &apos;where does this logic live?&apos; Every ambiguity is a chance to get something wrong.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s the core of Pass@1.&lt;/p&gt;
&lt;h2&gt;The methodology&lt;/h2&gt;
&lt;p&gt;Pass@1 is a development methodology where governance documents are thorough enough that an AI agent generates correct implementations on the first attempt. Not &quot;mostly correct.&quot; Not &quot;close enough to fix quickly.&quot; Correct. First try.&lt;/p&gt;
&lt;p&gt;The name comes from the machine learning metric pass@k — how many attempts it takes to produce a correct solution. Pass@1 means the first generation is the one you ship.&lt;/p&gt;
&lt;p&gt;Three governance documents make this work:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ROADMAP.md&lt;/strong&gt; is the spec the agent builds against. Not a wish list. Not a backlog of ideas. It&apos;s the contract: what to build, in what order, with what constraints. When I write &quot;add floating popout buttons — persistent, always-on-top, position remembered across restarts, click to run,&quot; the agent has everything it needs. No Slack thread to check. No product manager to ping. No ambiguity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CHANGELOG.md&lt;/strong&gt; is the running log of what has been built and what has changed. It&apos;s the project&apos;s history, used to track what has been done. The changelog is updated after each block of work is completed, and prevents accidental regression.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ARCHITECTURE.md&lt;/strong&gt; defines how the system is built. Patterns, structures, boundaries, data flow. It&apos;s the constraint document — the agent operates &lt;em&gt;within&lt;/em&gt; it, not around it. When it says &quot;all IPC goes through the preload bridge, the renderer never sees Node.js APIs,&quot; the agent doesn&apos;t invent a shortcut. The boundary is the architecture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CLAUDE.md&lt;/strong&gt; is working memory that survives between sessions. Gotchas encountered, conventions established, patterns that work, patterns that failed. AI agent sessions are ephemeral — the context window compacts, the session ends, the next session starts fresh. CLAUDE.md is how the next session picks up exactly where the last one left off instead of re-reading the entire codebase and making the same mistakes.&lt;/p&gt;
&lt;p&gt;These aren&apos;t project management artifacts. They&apos;re engineering artifacts that make the code possible.&lt;/p&gt;
&lt;h2&gt;Why &quot;fast&quot; is the wrong frame&lt;/h2&gt;
&lt;p&gt;The conventional narrative about AI-assisted development is speed. &quot;I built this in a weekend with AI.&quot; Speed is what people notice first. It&apos;s also the least interesting thing about Pass@1.&lt;/p&gt;
&lt;p&gt;What matters is what the speed implies: &lt;em&gt;less rework, less debugging, less accumulated tech debt&lt;/em&gt;. A feature that lands correctly on the first attempt doesn&apos;t generate a trail of fix commits. An architecture migration that&apos;s governed by documents stays controlled — the app remains shippable throughout, not broken for three days while you untangle the mess.&lt;/p&gt;
&lt;p&gt;24 releases in 18 days sounds fast. It was. But the important part isn&apos;t the pace — it&apos;s that each release was architecturally sound, security-reviewed, and consistent with every release before it. The governance system eliminated the waste that normally slows development: re-reading the codebase every session, making inconsistent choices across days, debugging issues that stem from ambiguous specifications.&lt;/p&gt;
&lt;p&gt;Speed is the &lt;em&gt;byproduct&lt;/em&gt;. Correctness is the &lt;em&gt;product&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;The discipline gap&lt;/h2&gt;
&lt;p&gt;Here&apos;s the part that surprises people: the management discipline required to lead AI agents reliably is &lt;em&gt;more rigorous&lt;/em&gt; than leading human-only teams.&lt;/p&gt;
&lt;p&gt;A human team member compensates for gaps in architecture and documentation. They ask questions, read between the lines, check with colleagues, use judgment. AI agents can&apos;t do any of that. They either have sufficient context to get it right, or they don&apos;t. There is no &quot;I&apos;ll figure it out.&quot;&lt;/p&gt;
&lt;p&gt;This means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your architecture document can&apos;t be vague. Boundaries need to be explicit.&lt;/li&gt;
&lt;li&gt;Your roadmap can&apos;t be aspirational. Specs need to be concrete.&lt;/li&gt;
&lt;li&gt;Your conventions can&apos;t be tribal knowledge. They need to be written down.&lt;/li&gt;
&lt;li&gt;Your gotchas can&apos;t live in someone&apos;s head. They need to be in CLAUDE.md.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This has a significant upside: if you build that discipline for AI, your human team members benefit even more — because they &lt;em&gt;can&lt;/em&gt; ask questions when the docs fall short, but they rarely need to.&lt;/p&gt;
&lt;h2&gt;What Pass@1 is not&lt;/h2&gt;
&lt;p&gt;Pass@1 is not &quot;vibe coding.&quot; It&apos;s the opposite.&lt;/p&gt;
&lt;p&gt;Vibe coding — prompting an AI with loose intentions and shipping whatever comes back — produces demos. The first session is great. The tenth session is chaos. There&apos;s no architecture document to migrate against. There&apos;s no working memory to preserve between sessions. There&apos;s no spec to verify correctness against. You&apos;re just generating code and hoping.&lt;/p&gt;
&lt;p&gt;The test is simple: can someone — human or AI — pick up your project cold and be productive in ten minutes? If they need to reverse-engineer the architecture from the code, if they need to ask you how things work, if they need to spend an hour reading before they can make a change — you&apos;re vibe coding. The governance and architecture documents are missing.&lt;/p&gt;
&lt;p&gt;Pass@1 also isn&apos;t a tooling recommendation. It works with Claude Code because that&apos;s what I use. The methodology is about the governance layer — the documents, the discipline, the architectural clarity. The executor is interchangeable. The governance is not.&lt;/p&gt;
&lt;h2&gt;The real insight&lt;/h2&gt;
&lt;p&gt;I stopped thinking about this as &quot;managing AI&quot; months ago. The reality is simpler and more useful:&lt;/p&gt;
&lt;p&gt;Pass@1 is about building engineering systems where any executor — human or AI — can deliver reliably because you&apos;ve removed the ambiguity. The architecture is clear. The spec is concrete. The conventions are documented. The gotchas are recorded.&lt;/p&gt;
&lt;p&gt;That&apos;s not an AI skill. It&apos;s a leadership skill. AI makes it non-optional.&lt;/p&gt;
&lt;p&gt;Documentation-first development, clear architectural boundaries, explicit conventions — these have always been the mark of well-run engineering teams. The difference is that human teams can muddle through without them, but AI teams can&apos;t. The AI forces the discipline that was always supposed to be there.&lt;/p&gt;
&lt;p&gt;And once it&apos;s there, everything gets better. Not just the AI output, it&apos;s the human experience of working in that codebase, the onboarding time for new team members, the confidence during migrations, and the speed of code review.&lt;/p&gt;
&lt;p&gt;Pass@1 isn&apos;t a methodology I invented for AI. It&apos;s the methodology that good engineering teams have always aspired to. But using LLMs makes it more critical than ever.&lt;/p&gt;
&lt;p&gt;If you want to see what this looks like in practice — the architecture migrations, the security audits, the compaction management — the &lt;a href=&quot;/work/actions-development&quot;&gt;Actions development case study&lt;/a&gt; documents the full arc.&lt;/p&gt;
</content:encoded><category>ai</category><category>architecture</category><category>leadership</category><author>alex@mipyip.com (Alex van Rossum)</author></item></channel></rss>