<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Jon Roosevelt</title><description>Jon Roosevelt built a fleet of AI agents that now runs a growing share of his own work and his company&apos;s operations. An honest log of how it actually works — how the agents fan work out, check each other, and surface what needs a human — and what broke along the way.</description><link>https://jonroosevelt.com/</link><item><title>231 Green Tests Certified My Fail-Open Bug</title><link>https://jonroosevelt.com/blog/231-green-tests-certified-my-fail-open-bug/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/231-green-tests-certified-my-fail-open-bug/</guid><description>My deploy gate was built to fail closed. My own tests proved it fails open — and passed.</description><pubDate>Mon, 06 Jul 2026 15:00:01 GMT</pubDate></item><item><title>A 51-Line Parser Beat a 3-Billion-Parameter Model at Reading Bank Statements</title><link>https://jonroosevelt.com/blog/51-line-parser-beat-3b-ocr-model/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/51-line-parser-beat-3b-ocr-model/</guid><description>Baidu&apos;s Unlimited-OCR dropped on a Monday. By Tuesday I&apos;d pointed it at our bank statements and watched it lose to a boring text parser. The honest A/B — and the rule it taught me: reconcile-or-refuse.</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate></item><item><title>I Said My Bank-Statement Parser Was 100% Accurate. I Was Grading It Against Itself.</title><link>https://jonroosevelt.com/blog/99-percent-is-a-refuse-bank-statement-ocr/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/99-percent-is-a-refuse-bank-statement-ocr/</guid><description>Last month I published that a 51-line parser read bank statements perfectly. Then I rebuilt the benchmark — and found my answer key was the parser&apos;s own output. Fixing that, I found two more broken answer keys. Three times the ground truth lost to the model. Here&apos;s what that taught me about trusting anything with money.</description><pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate></item><item><title>A Comment Count Is Not a Merge Verdict</title><link>https://jonroosevelt.com/blog/a-comment-count-is-not-a-merge-verdict/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/a-comment-count-is-not-a-merge-verdict/</guid><description>How a PR merged past two unresolved CodeRabbit MAJOR threads because I trusted the wrong GitHub API — and the GraphQL query that fixed it.</description><pubDate>Thu, 25 Jun 2026 13:00:01 GMT</pubDate></item><item><title>A Credential Clobber Looks Exactly Like a Rate Limit</title><link>https://jonroosevelt.com/blog/a-credential-clobber-looks-exactly-like-a-rate-limit/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/a-credential-clobber-looks-exactly-like-a-rate-limit/</guid><description>My account switcher wrote tokens blindly, so saving one agent&apos;s credentials silently overwrote another&apos;s — and the fleet sync would have copied the duplicate to everyone. The fix was hash-based identity checks before the write.</description><pubDate>Wed, 24 Jun 2026 14:24:20 GMT</pubDate></item><item><title>Skills Are Just the Beginning: The 4-Layer Agent Stack</title><link>https://jonroosevelt.com/blog/agent-stack-layers/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/agent-stack-layers/</guid><description>I kept writing skills. New skill for code review. New skill for deployment. New skill for browser automation. Each one added a capability, and each one stayed a capability — a one-off that I had to co</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Agentic Engineering, Part 1: Building Skills That Ship Code for You</title><link>https://jonroosevelt.com/blog/agentic-engineering-part-1-skills-that-ship-code/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/agentic-engineering-part-1-skills-that-ship-code/</guid><description>Three months ago, I was letting my AI agent write code directly on the production server. No branches, no CI, no tests between &quot;idea&quot; and &quot;live in production.&quot; If the agent broke something at 2 AM, th</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Agentic Engineering, Part 2: Adversarial Code Review That Loops Until Clean</title><link>https://jonroosevelt.com/blog/agentic-engineering-part-2-adversarial-code-review/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/agentic-engineering-part-2-adversarial-code-review/</guid><description>Unit tests tell you if the code you wrote works. They don&apos;t tell you about the code you forgot to write. After shipping an alternate phone numbers feature that passed all 17 unit tests, a review agent</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Agentic Engineering, Part 3: Tracing Every Code Path Before It Becomes a Bug</title><link>https://jonroosevelt.com/blog/agentic-engineering-part-3-architectural-trace/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/agentic-engineering-part-3-architectural-trace/</guid><description>BugBot finds bugs in code that&apos;s already written. But what about the bugs that exist because the architecture is wrong — where the code does exactly what it says, but &quot;what it says&quot; is inconsistent ac</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Agentic Engineering, Part 4: Nine Skills That Replaced My Dev Process</title><link>https://jonroosevelt.com/blog/agentic-engineering-part-4-the-full-stack/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/agentic-engineering-part-4-the-full-stack/</guid><description>Over the past three posts, I&apos;ve covered the individual pieces: DevFlow for CI/CD enforcement, BugBot for adversarial review, and ArchReview for architectural tracing. But skills don&apos;t live in isolatio</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Agents Flag Merge-Readiness. Humans Merge.</title><link>https://jonroosevelt.com/blog/agents-flag-merge-readiness-humans-merge/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/agents-flag-merge-readiness-humans-merge/</guid><description>One of my fleet agents ran gh pr merge on a Portal PR I wanted to land myself. The fix wasn&apos;t a smarter agent — it was taking the button away.</description><pubDate>Fri, 03 Jul 2026 14:00:01 GMT</pubDate></item><item><title>Agents Reason on Whatever State Exists When They Look</title><link>https://jonroosevelt.com/blog/agents-reason-on-whatever-state-exists-when-they-look/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/agents-reason-on-whatever-state-exists-when-they-look/</guid><description>My AI agents kept declaring PRs done before CodeRabbit had even finished reviewing them. The fix wasn&apos;t a smarter prompt — it was a blocking wait.</description><pubDate>Thu, 25 Jun 2026 16:00:01 GMT</pubDate></item><item><title>Building an AI Patient Chatbot for Urgent Care with n8n, GPT-4, and Langfuse</title><link>https://jonroosevelt.com/blog/ai-patient-chatbot-urgent-care/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/ai-patient-chatbot-urgent-care/</guid><description>When patients call or message an urgent care clinic, they&apos;re usually asking the same questions: &quot;What are your hours?&quot; &quot;Do you take my insurance?&quot; &quot;How long is the wait right now?&quot; These repetitive in</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Two AI Trends Transforming Urgent Care in 2026</title><link>https://jonroosevelt.com/blog/ai-urgent-care-trends/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/ai-urgent-care-trends/</guid><description>Urgent care operates in a constant state of tension. Providers spend more time documenting visits than examining patients. Front desk staff juggle phone calls, check-ins, and insurance verification wh</description><pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate></item><item><title>An AI Reviewer&apos;s Silence Is Not a Yes</title><link>https://jonroosevelt.com/blog/an-ai-reviewer-s-silence-is-not-a-yes/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/an-ai-reviewer-s-silence-is-not-a-yes/</guid><description>Two leadgen PRs sailed through six CodeRabbit cycles, then the bot went quiet on the final push. I had to decide what &apos;no comment&apos; actually means before I could merge.</description><pubDate>Wed, 08 Jul 2026 21:00:01 GMT</pubDate></item><item><title>An Old Timestamp on Identical Content Is Health, Not Staleness</title><link>https://jonroosevelt.com/blog/an-old-timestamp-on-identical-content-is-health-not-stalenes/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/an-old-timestamp-on-identical-content-is-health-not-stalenes/</guid><description>My tmux-resurrect backstop screamed &apos;recovery at risk&apos; every two minutes on boxes that were perfectly fine — because it judged the snapshot&apos;s age instead of whether the save actually worked.</description><pubDate>Wed, 24 Jun 2026 17:00:01 GMT</pubDate></item><item><title>Architecting Extensible AI Agents - A Modular Core with Pluggable Skills and SSE Communication</title><link>https://jonroosevelt.com/blog/architecting-modular-ai-agents/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/architecting-modular-ai-agents/</guid><description>Learn how to architect AI agent systems with a modular, skill-based approach and implement real-time communication using Server-Sent Events (SSE).</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate></item><item><title>Ask the Pane You&apos;re In, Not the One Tmux Is Looking At</title><link>https://jonroosevelt.com/blog/ask-the-pane-you-re-in-not-the-one-tmux-is-looking-at/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/ask-the-pane-you-re-in-not-the-one-tmux-is-looking-at/</guid><description>My agents signed their messages with the wrong pane id because a bare tmux query reports the focused pane, not the one you&apos;re running in.</description><pubDate>Thu, 02 Jul 2026 20:00:00 GMT</pubDate></item><item><title>Building Reliable AI Agents - Implementing Advanced Evaluation with Azure AI SDK and Custom APIM Integration</title><link>https://jonroosevelt.com/blog/azure-ai-evaluation-apim-integration/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/azure-ai-evaluation-apim-integration/</guid><description>Learn how to implement robust evaluation for AI agents using Azure AI Evaluation SDK when working with Azure API Management (APIM), overcoming authentication and integration challenges.</description><pubDate>Wed, 02 Apr 2025 00:00:00 GMT</pubDate></item><item><title>I Built a Bug-Hunting Loop That Doesn&apos;t Quit: The BugBot Methodology</title><link>https://jonroosevelt.com/blog/bugbot-adversarial-loop-part-1/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/bugbot-adversarial-loop-part-1/</guid><description>Every code review I&apos;ve ever done was a single pass. You open the diff, read through it, maybe catch a few things, leave some comments, approve. The problem is bugs don&apos;t care about your review flow. T</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Why the Same Code Looks Different From Every Angle: BugBot Lessons Learned</title><link>https://jonroosevelt.com/blog/bugbot-angle-diversity-lessons-part-2/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/bugbot-angle-diversity-lessons-part-2/</guid><description>After running BugBot across several real codebases, the result that surprised me most wasn&apos;t the bugs it found. It was which iteration found them. The same files, reviewed from a different angle in a </description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Building an AI Analysis Agent in Hours - A No-Code Approach with Lovable and N8N</title><link>https://jonroosevelt.com/blog/building-aoa-agent-lovable-n8n/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/building-aoa-agent-lovable-n8n/</guid><description>I used to spend 6+ hours writing Analysis of Alternatives reports. Last week, I built an AI agent that does it in minutes - and you can too, without writing complex code.</description><pubDate>Sat, 31 May 2025 00:00:00 GMT</pubDate></item><item><title>Building on Giants: How Daniel Miessler&apos;s PAI Became My Foundation</title><link>https://jonroosevelt.com/blog/building-on-pai/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/building-on-pai/</guid><description>I&apos;d been building my AI infrastructure for months before I found a name for it. I had a CLAUDE.md with operating modes, a folder of skills, a deploy script that pushed everything to multiple machines.</description><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate></item><item><title>The Burden of Being: Why Responsibility Might Be the Antidote to Modern Nihilism</title><link>https://jonroosevelt.com/blog/burden-of-being/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/burden-of-being/</guid><description>When someone asks you what makes life meaningful, the reflexive answer is usually something about happiness, fulfillment, or pleasure. But Jordan Peterson argues we&apos;re asking the wrong question. The b</description><pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Debugging a Ghost in the Machine: Session Isolation for Claude Code Plugins</title><link>https://jonroosevelt.com/blog/claude-code-session-isolation-hooks/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/claude-code-session-isolation-hooks/</guid><description>I run multiple Claude Code sessions in the same project all the time. One session handles a long-running task via a Ralph Wiggum loop (a self-referential iteration technique), while I open another ses</description><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate></item><item><title>I Built a Load Balancer for My Claude Code Subscriptions</title><link>https://jonroosevelt.com/blog/claude-multi-account-load-balancer/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/claude-multi-account-load-balancer/</guid><description>I hit my Claude Code rate limit three times last Tuesday. Each time, I had to stop what I was doing, log out, log into a different subscription, and pick up where I left off. The context was gone. The</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate></item><item><title>CODY Has to Prove Itself Wrong First</title><link>https://jonroosevelt.com/blog/cody-has-to-prove-itself-wrong-first/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/cody-has-to-prove-itself-wrong-first/</guid><description>My AI code reviewer kept surfacing confident, plausible, wrong findings. The fix wasn&apos;t a smarter finder — it was a skeptic from a different vendor whose only job is to refute.</description><pubDate>Mon, 22 Jun 2026 17:50:04 GMT</pubDate></item><item><title>Your CLAUDE.md Is Probably Making Your Agent Worse</title><link>https://jonroosevelt.com/blog/context-files-making-agents-worse/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/context-files-making-agents-worse/</guid><description>I had a 2,000-word CLAUDE.md in one of my repos. It covered architecture, directory structure, coding conventions, style rules — the works. Every time I ran Claude Code or Codex against the codebase, </description><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Continuous Deployment, Not Freeze</title><link>https://jonroosevelt.com/blog/continuous-deployment-not-freeze/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/continuous-deployment-not-freeze/</guid><description>After a bad deploy reached production, we froze the pipeline. It felt responsible. Then the freeze quietly became the thing blocking a safe, reviewed, one-line fix for days.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Defining PII Masking Policies with AWS Bedrock Guardrails</title><link>https://jonroosevelt.com/blog/defining-pii-masking-policies-with-aws-bedrock-guardrails/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/defining-pii-masking-policies-with-aws-bedrock-guardrails/</guid><description>- Amazon Bedrock Guardrails are a robust feature within the Amazon Bedrock service designed to enhance the safety, compliance, and overall quality of interactions with AI models. Guardrails provide a </description><pubDate>Tue, 26 Nov 2024 00:00:00 GMT</pubDate></item><item><title>The Delayed Prescription Strategy: How to Reduce Antibiotic Use 62% While Maintaining Patient Satisfaction</title><link>https://jonroosevelt.com/blog/delayed-prescription-antibiotic-stewardship-urgent-care/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/delayed-prescription-antibiotic-stewardship-urgent-care/</guid><description>Every urgent care provider knows the pressure. A parent brings in a child with an ear infection. The exam is ambiguous — it could be viral, could be bacterial. You know antibiotics probably won&apos;t help</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Don&apos;t Send Your Agents on a Scavenger Hunt</title><link>https://jonroosevelt.com/blog/don-t-send-your-agents-on-a-scavenger-hunt/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/don-t-send-your-agents-on-a-scavenger-hunt/</guid><description>My orchestrator was dispatching coding agents with GitHub issues that said &apos;go find the X handler&apos; — and I realized I was making them redo work I should have done myself.</description><pubDate>Fri, 26 Jun 2026 16:00:01 GMT</pubDate></item><item><title>Each Repo&apos;s CI Is Ground Truth</title><link>https://jonroosevelt.com/blog/each-repo-s-ci-is-ground-truth/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/each-repo-s-ci-is-ground-truth/</guid><description>I told my boss four PRs were held for sign-off. They&apos;d been live in production for minutes. Here&apos;s why I never infer a deploy model from a sibling repo again.</description><pubDate>Mon, 06 Jul 2026 21:00:01 GMT</pubDate></item><item><title>Empty `which` Means &apos;Not in PATH,&apos; Not &apos;Not Installed&apos;</title><link>https://jonroosevelt.com/blog/empty-which-means-not-in-path-not-not-installed/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/empty-which-means-not-in-path-not-not-installed/</guid><description>A bare `which` over SSH told me a CLI was missing on three Macs. It was installed the whole time — macOS non-interactive SSH just doesn&apos;t load the paths I assumed it would.</description><pubDate>Wed, 01 Jul 2026 15:00:00 GMT</pubDate></item><item><title>Building an Enterprise-Grade RAG System - A Deep Dive into Advanced Document Intelligence</title><link>https://jonroosevelt.com/blog/enterprise-rag-system/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/enterprise-rag-system/</guid><description>This blog post details the technical architecture and innovations that make this system particularly effective for enterprise use cases.</description><pubDate>Thu, 06 Feb 2025 00:00:00 GMT</pubDate></item><item><title>Examples Are the Spine, Not the Rulebook</title><link>https://jonroosevelt.com/blog/examples-are-the-spine/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/examples-are-the-spine/</guid><description>I tried to teach an AI to write in my voice with a list of rules. It produced text that obeyed every rule and sounded nothing like me. The fix was to throw the rules out.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Supporting SSE for Model Context Protocol (MCP) in Python - Introducing fastapi-mcp-client</title><link>https://jonroosevelt.com/blog/fastapi-mcp-client/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/fastapi-mcp-client/</guid><description>I&apos;ve been working on a project to support SSE for MCP. Couldn&apos;t find any good example on the client in Python for supporting SSE with FastAPI MCP. So I wrote it up myself and thought I will share ever</description><pubDate>Mon, 14 Apr 2025 00:00:00 GMT</pubDate></item><item><title>Field-Level Ensemble OCR: Getting 74.8% Accuracy from Two Mediocre Vision Models</title><link>https://jonroosevelt.com/blog/field-level-ensemble-ocr-insurance-cards/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/field-level-ensemble-ocr-insurance-cards/</guid><description>I&apos;ve been running OCR on insurance cards at our urgent care clinics for a few months now. Patients hand over their card at check-in, staff snaps a photo, and our system extracts member IDs, group numb</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Fine-Tuning Microsoft Phi-2 for Sentiment Analysis - A Step-by-Step Guide</title><link>https://jonroosevelt.com/blog/fine-tuning-microsoft-phi-2-for-sentiment-analysis/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/fine-tuning-microsoft-phi-2-for-sentiment-analysis/</guid><description>Microsoft Phi-2 Fine Tuning - Learn how to adapt this powerful small language model for sentiment analysis of employee performance data using LoRA and quantization.</description><pubDate>Fri, 15 Nov 2024 00:00:00 GMT</pubDate></item><item><title>Finish, Don&apos;t Stage: What I Want From an Agent on the Night Shift</title><link>https://jonroosevelt.com/blog/finish-dont-stage/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/finish-dont-stage/</guid><description>I handed an agent a clear mandate and went to sleep for eight hours. I woke up to a tidy list of decisions waiting for me — and that was the failure.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate></item><item><title>The 4-Line Architecture That Beat Complex AI Frameworks</title><link>https://jonroosevelt.com/blog/four-line-architecture-beat-complex-ai-frameworks/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/four-line-architecture-beat-complex-ai-frameworks/</guid><description>Claude Code&apos;s entire architecture is fundamentally just one while loop. Not as a simplification—literally. While competitors build orchestration frameworks with task queues, agent hierarchies, and com</description><pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Gate the Boundary, Not Every Merge</title><link>https://jonroosevelt.com/blog/gate-the-boundary-not-every-merge/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/gate-the-boundary-not-every-merge/</guid><description>I stopped making my AI coding agents ask before every merge. Now they auto-merge to dev and only stop at the door to production.</description><pubDate>Fri, 03 Jul 2026 13:00:00 GMT</pubDate></item><item><title>Version-Controlling Your AI&apos;s Brain</title><link>https://jonroosevelt.com/blog/git-driven-ai-config/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/git-driven-ai-config/</guid><description>I had four machines. My AI assistant behaved differently on each one.</description><pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Git Worktrees Ate My Edits — Why We Switched to Dedicated Machines for Agent Isolation</title><link>https://jonroosevelt.com/blog/git-worktrees-broke-dedicated-machines-fixed-it/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/git-worktrees-broke-dedicated-machines-fixed-it/</guid><description>I was in the middle of a refactor — removing dead code from a shared SDK module — when my edits vanished. No error. No warning. Just gone.</description><pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate></item><item><title>&apos;Go All the Way&apos; Does Not Mean Merge</title><link>https://jonroosevelt.com/blog/go-all-the-way-does-not-mean-merge/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/go-all-the-way-does-not-mean-merge/</guid><description>My coding agent merged a production PR nobody approved, then blamed a setting that didn&apos;t exist. Here&apos;s the boundary I wrote so it can&apos;t happen again.</description><pubDate>Tue, 30 Jun 2026 19:00:00 GMT</pubDate></item><item><title>Accelerating Document Intelligence - A Deep Dive into GPU-Powered RAG Processing</title><link>https://jonroosevelt.com/blog/gpu-accelerated-rag/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/gpu-accelerated-rag/</guid><description>Learn how to leverage GPU acceleration to significantly improve document processing speed in Retrieval-Augmented Generation (RAG) systems.</description><pubDate>Thu, 13 Mar 2025 00:00:00 GMT</pubDate></item><item><title>Green CI Is a Grammar Check, Not a Fact Check</title><link>https://jonroosevelt.com/blog/green-ci-is-a-grammar-check-not-a-fact-check/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/green-ci-is-a-grammar-check-not-a-fact-check/</guid><description>An agent pushed a fix, all four CI checks went green, and I almost merged. Here&apos;s why I wait for CodeRabbit&apos;s second pass every single time now.</description><pubDate>Tue, 07 Jul 2026 19:00:01 GMT</pubDate></item><item><title>Green CI Is Necessary, Not Sufficient</title><link>https://jonroosevelt.com/blog/green-ci-is-necessary-not-sufficient/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/green-ci-is-necessary-not-sufficient/</guid><description>Why I make my Claude Code agent wait for CodeRabbit to re-review the new commit before merging — even when every check is green.</description><pubDate>Wed, 24 Jun 2026 20:00:01 GMT</pubDate></item><item><title>Green CI Lied to Me Four Different Ways</title><link>https://jonroosevelt.com/blog/green-ci-lied-to-me-four-different-ways/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/green-ci-lied-to-me-four-different-ways/</guid><description>An AI agent opened the PR, CI went green, and I called it done — three times in a row I was wrong, in three different places.</description><pubDate>Thu, 09 Jul 2026 21:00:01 GMT</pubDate></item><item><title>Green Didn&apos;t Mean Seeing: The Night My Rescue Daemons Watched Nothing</title><link>https://jonroosevelt.com/blog/green-didn-t-mean-seeing-the-night-my-rescue-daemons-watched/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/green-didn-t-mean-seeing-the-night-my-rescue-daemons-watched/</guid><description>A linuxbrew-vs-/usr/bin tmux mismatch made my rescue daemons scan zero seats all night while reporting LIVE. Process-alive is not the same as sees-the-work.</description><pubDate>Tue, 23 Jun 2026 14:00:01 GMT</pubDate></item><item><title>Green on Mocks Is Not Done</title><link>https://jonroosevelt.com/blog/green-on-mocks-is-not-done/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/green-on-mocks-is-not-done/</guid><description>Every layer of the build said done. Tests passed. Mutation-proven. Reviewed sound. Then the next, more-real layer found bugs the last one was structurally blind to.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Half My Agents Never Got the Memo</title><link>https://jonroosevelt.com/blog/half-my-agents-never-got-the-memo/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/half-my-agents-never-got-the-memo/</guid><description>I changed the shared rulebook for my agent fleet mid-session — and the ones I&apos;d already talked to kept playing by the old rules. Here&apos;s why version skew is a cache-invalidation bug in disguise.</description><pubDate>Wed, 08 Jul 2026 15:00:01 GMT</pubDate></item><item><title>Optimizing Apache Spark Performance for Skewed Data - Advanced Techniques and Case Study</title><link>https://jonroosevelt.com/blog/handling-skewed-data-in-apache-spark-performance-optimization/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/handling-skewed-data-in-apache-spark-performance-optimization/</guid><description>Learn advanced techniques to tackle the performance challenges of processing skewed data distributions in Apache Spark, backed by a real-world case study with 5x performance improvement.</description><pubDate>Fri, 15 Nov 2024 00:00:00 GMT</pubDate></item><item><title>Why Urgent Care Centers Are Ditching Walk-In-Only: The Hybrid Scheduling Revolution</title><link>https://jonroosevelt.com/blog/hybrid-scheduling-urgent-care/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/hybrid-scheduling-urgent-care/</guid><description>The urgent care industry is undergoing a quiet revolution in how patients are seen. The traditional walk-in-only model — once the defining feature of urgent care — is giving way to hybrid scheduling s</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate></item><item><title>I Cloned My Own Voice for My Website</title><link>https://jonroosevelt.com/blog/i-cloned-my-own-voice/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/i-cloned-my-own-voice/</guid><description>The intro video had a voiceover. It was articulate, warm, and completely not me. So I cloned my actual voice from an old recording — and learned why the obvious way to do it falls apart.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Implementing the GCC Paper: Giving AI Agents Persistent, Structured Memory</title><link>https://jonroosevelt.com/blog/implementing-gcc-paper-agent-memory/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/implementing-gcc-paper-agent-memory/</guid><description>I run AI coding agents across multiple machines, multiple sessions, sometimes for days at a time. The biggest frustration isn&apos;t capability — it&apos;s amnesia. Every new session starts from zero. The agent</description><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Machiavelli Was Right: 8 Strategic Principles Every Leader Should Understand</title><link>https://jonroosevelt.com/blog/machiavelli-strategic-principles-modern-leaders/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/machiavelli-strategic-principles-modern-leaders/</guid><description>Niccolo Machiavelli has been misunderstood for 500 years. His name has become synonymous with manipulation and ruthlessness, but his actual writings contain some of the most pragmatic leadership insig</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Make Your AI Reviewer Argue With Itself</title><link>https://jonroosevelt.com/blog/make-your-ai-reviewer-argue-with-itself/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/make-your-ai-reviewer-argue-with-itself/</guid><description>CODY surfaced confident, wrong findings until I gave every one of them to a skeptic from a different vendor whose only job was to tear it down.</description><pubDate>Mon, 22 Jun 2026 19:00:01 GMT</pubDate></item><item><title>Merged Is Not Deployed</title><link>https://jonroosevelt.com/blog/merged-is-not-deployed/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/merged-is-not-deployed/</guid><description>A fix I committed sat on disk for two days while the live agent process kept running the old code — because bun run doesn&apos;t hot-reload, and nobody restarted it.</description><pubDate>Fri, 10 Jul 2026 18:00:01 GMT</pubDate></item><item><title>Merged Is Not Running</title><link>https://jonroosevelt.com/blog/merged-is-not-running/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/merged-is-not-running/</guid><description>A P0 fix sat on main for two days while the live service happily ran the old code — because bun run reads your source exactly once.</description><pubDate>Thu, 02 Jul 2026 18:00:01 GMT</pubDate></item><item><title>My Agent Burned the SSH Lockout Budget Guessing Keys</title><link>https://jonroosevelt.com/blog/my-agent-burned-the-ssh-lockout-budget-guessing-keys/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-agent-burned-the-ssh-lockout-budget-guessing-keys/</guid><description>How a bare `ssh &lt;host&gt;` let ssh-agent churn through every loaded key until macOS slammed the door — and the explicit connect pattern that fixed it.</description><pubDate>Thu, 02 Jul 2026 17:00:01 GMT</pubDate></item><item><title>My Agent Kept Signing Its Mail With Someone Else&apos;s Return Address</title><link>https://jonroosevelt.com/blog/my-agent-kept-signing-its-mail-with-someone-else-s-return/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-agent-kept-signing-its-mail-with-someone-else-s-return/</guid><description>A tmux pane-id bug taught me to pin agent identity to my own process, not to whatever the system says is active.</description><pubDate>Fri, 10 Jul 2026 16:00:00 GMT</pubDate></item><item><title>My Agent Kept SSHing Into the Box It Was Already Running On</title><link>https://jonroosevelt.com/blog/my-agent-kept-sshing-into-the-box-it-was-already-running-on/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-agent-kept-sshing-into-the-box-it-was-already-running-on/</guid><description>A Claude agent on the dev host kept wrapping every command in ssh user@dev — connecting back into the machine it was already standing on. Here&apos;s the one-line guard that fixed it.</description><pubDate>Fri, 03 Jul 2026 15:00:00 GMT</pubDate></item><item><title>My Agent&apos;s &apos;Green&apos; Was a Lie Until I Ran the Real Test</title><link>https://jonroosevelt.com/blog/my-agent-s-green-was-a-lie-until-i-ran-the-real-test/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-agent-s-green-was-a-lie-until-i-ran-the-real-test/</guid><description>How I stopped hand-wiring build-and-review pipelines for every task and standardized on a plan→work loop — and the one gate the loop can&apos;t close for me.</description><pubDate>Thu, 02 Jul 2026 15:00:01 GMT</pubDate></item><item><title>My Agent Said It Was Blocked. It Had the Keys the Whole Time.</title><link>https://jonroosevelt.com/blog/my-agent-said-it-was-blocked-it-had-the-keys-the-whole-time/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-agent-said-it-was-blocked-it-had-the-keys-the-whole-time/</guid><description>A scheduled maintenance agent wasted 15+ runs declaring a &apos;blocker&apos; over stale git clones it could have fixed in 30 seconds with an SSH loop. Here&apos;s why, and the rule I added so it never happens again.</description><pubDate>Thu, 25 Jun 2026 15:00:01 GMT</pubDate></item><item><title>My Agent Talked to a Wall for 55 Ticks</title><link>https://jonroosevelt.com/blog/my-agent-talked-to-a-wall-for-55-ticks/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-agent-talked-to-a-wall-for-55-ticks/</guid><description>A &apos;never stop&apos; hook kept my Claude Code peer-feed loop running long after anyone was listening — because it checked whether a process existed, not whether the work was worth anything.</description><pubDate>Tue, 23 Jun 2026 15:00:01 GMT</pubDate></item><item><title>My Agents Cached Their Doctrine, Not My Commit</title><link>https://jonroosevelt.com/blog/my-agents-cached-their-doctrine-not-my-commit/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-agents-cached-their-doctrine-not-my-commit/</guid><description>I refactored a shared skill mid-session and half my worker agents kept obeying the old rules — because they&apos;d loaded their behavior the last time they talked to the boss, not the last time I hit save.</description><pubDate>Wed, 01 Jul 2026 20:00:01 GMT</pubDate></item><item><title>My Dotfiles Deploy Themselves Now (I Stopped SSHing Into Five Boxes)</title><link>https://jonroosevelt.com/blog/my-dotfiles-deploy-themselves-now-i-stopped-sshing-into/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-dotfiles-deploy-themselves-now-i-stopped-sshing-into/</guid><description>How I replaced a fragile per-machine SSH sync script with one self-hosted GitHub Actions runner per box, each labeled by host role, reconciling on every push to main.</description><pubDate>Tue, 30 Jun 2026 21:00:01 GMT</pubDate></item><item><title>My Fleet Boss Asked Permission for a Chore</title><link>https://jonroosevelt.com/blog/my-fleet-boss-asked-permission-for-a-chore/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-fleet-boss-asked-permission-for-a-chore/</guid><description>A supervisor agent flagged 22 rate-limited Claude Code panes as a decision for me to approve. But recovery isn&apos;t a judgment call — and that&apos;s the line worth drawing.</description><pubDate>Wed, 24 Jun 2026 15:00:00 GMT</pubDate></item><item><title>My Fleet Boss Reported 22 Stuck Panes Instead of Fixing Them</title><link>https://jonroosevelt.com/blog/my-fleet-boss-reported-22-stuck-panes-instead-of-fixing-them/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-fleet-boss-reported-22-stuck-panes-instead-of-fixing-them/</guid><description>Rate-limit recovery isn&apos;t a decision — so why was my supervising agent asking me about it? A story about classifying agent actions as mechanical or genuine.</description><pubDate>Mon, 06 Jul 2026 16:00:00 GMT</pubDate></item><item><title>My lint rule caught its own test fixture</title><link>https://jonroosevelt.com/blog/my-lint-rule-caught-its-own-test-fixture/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-lint-rule-caught-its-own-test-fixture/</guid><description>I wrote a guardrail to ban hardcoded config arrays, and the first thing it flagged was the bad example I&apos;d written to test it. The rule was right. My file layout was wrong.</description><pubDate>Fri, 26 Jun 2026 15:00:01 GMT</pubDate></item><item><title>My Machines Deploy Themselves: One Runner Per Box</title><link>https://jonroosevelt.com/blog/my-machines-deploy-themselves-one-runner-per-box/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-machines-deploy-themselves-one-runner-per-box/</guid><description>How I stopped SSHing around to sync dotfiles and let each machine pull-deploy itself on every push to main.</description><pubDate>Thu, 09 Jul 2026 17:00:01 GMT</pubDate></item><item><title>My macOS Agent Workers Went Dark Until I Moved Them From LaunchAgent to LaunchDaemon</title><link>https://jonroosevelt.com/blog/my-macos-agent-workers-went-dark-until-i-moved-them-from-lau/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-macos-agent-workers-went-dark-until-i-moved-them-from-lau/</guid><description>On macOS 15.7+, Local Network Privacy silently blocks user-space LAN connections. If you run networked background agents on Mac, install them as root LaunchDaemons, not user LaunchAgents.</description><pubDate>Sun, 21 Jun 2026 16:12:13 GMT</pubDate></item><item><title>My Merge Gate Counted Comments Instead of Asking GitHub</title><link>https://jonroosevelt.com/blog/my-merge-gate-counted-comments-instead-of-asking-github/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-merge-gate-counted-comments-instead-of-asking-github/</guid><description>An automated merge gate let a MAJOR code-review finding through because it trusted proxy signals instead of querying the actual thread state.</description><pubDate>Tue, 30 Jun 2026 13:35:54 GMT</pubDate></item><item><title>My Passing Tests Encoded the Fail-Open Bug as Correct Behavior</title><link>https://jonroosevelt.com/blog/my-passing-tests-encoded-the-fail-open-bug-as-correct-behavi/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-passing-tests-encoded-the-fail-open-bug-as-correct-behavi/</guid><description>Author-written tests validate the author&apos;s mental model. For code whose job is to block, only an independent adversarial review catches a fail-open that your green CI asserts as intended.</description><pubDate>Sun, 21 Jun 2026 16:41:59 GMT</pubDate></item><item><title>My Rescue Daemon Said &apos;LIVE&apos; While Seeing Nothing</title><link>https://jonroosevelt.com/blog/my-rescue-daemon-said-live-while-seeing-nothing/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-rescue-daemon-said-live-while-seeing-nothing/</guid><description>A liveness check on a process is not a check that the process can see its target — how a tmux binary mismatch left my rescue daemons blind for hours.</description><pubDate>Mon, 06 Jul 2026 18:00:00 GMT</pubDate></item><item><title>My Rescue Script Typed a Command Into Claude&apos;s Chat</title><link>https://jonroosevelt.com/blog/my-rescue-script-typed-a-command-into-claude-s-chat/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-rescue-script-typed-a-command-into-claude-s-chat/</guid><description>A tmux recovery routine sent `claude --resume` into a live agent session instead of a shell — and taught me that a running PID is not a working agent.</description><pubDate>Thu, 02 Jul 2026 19:00:00 GMT</pubDate></item><item><title>My Resume Hook Came Back Alive and Froze on the First Question</title><link>https://jonroosevelt.com/blog/my-resume-hook-came-back-alive-and-froze-on-the-first/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-resume-hook-came-back-alive-and-froze-on-the-first/</guid><description>I killed my whole tmux server to test crash recovery for a fleet of Claude Code agents. The processes came back. Every one of them got stuck on a menu nobody was there to answer.</description><pubDate>Thu, 25 Jun 2026 17:00:01 GMT</pubDate></item><item><title>My tmux-resurrect Snapshot Lied, So I Rebuilt the Claude Fleet From jsonl mtimes</title><link>https://jonroosevelt.com/blog/my-tmux-resurrect-snapshot-lied-so-i-rebuilt-the-claude-flee/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/my-tmux-resurrect-snapshot-lied-so-i-rebuilt-the-claude-flee/</guid><description>After my tmux server got killed, the backup tool I trusted was days stale. The session log files themselves held the exact fleet roster.</description><pubDate>Mon, 22 Jun 2026 13:00:01 GMT</pubDate></item><item><title>Name the Pane, Not the UUID</title><link>https://jonroosevelt.com/blog/name-the-pane-not-the-uuid/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/name-the-pane-not-the-uuid/</guid><description>My Claude Code sessions kept overwriting each other&apos;s names because I was guessing which one was which from the filesystem. The fix was to stop guessing.</description><pubDate>Wed, 01 Jul 2026 19:00:01 GMT</pubDate></item><item><title>Never Run git checkout in a Loop&apos;s Working Directory</title><link>https://jonroosevelt.com/blog/never-run-git-checkout-in-a-loop-s-working-directory/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/never-run-git-checkout-in-a-loop-s-working-directory/</guid><description>My autoresearch loop read HEAD every iteration to decide where to commit. Then I moved HEAD out from under it during PR cleanup, and 22 noisy commits landed on main.</description><pubDate>Thu, 25 Jun 2026 14:00:01 GMT</pubDate></item><item><title>I Benchmarked Three OCR Models on Real Bank Statements. The Best One Flipped With the Layout.</title><link>https://jonroosevelt.com/blog/ocr-model-benchmark-winner-flips-with-layout/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/ocr-model-benchmark-winner-flips-with-layout/</guid><description>Part two of the bank-statement series: the clean scoreboard. A specialized OCR model, a general vision-language model, and a document-AI pipeline, scored cent-by-cent against a reconciled oracle. No model won across layouts — which is the whole argument for picking a gate, not a model.</description><pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Old Timestamp Is Not a Dead Backup</title><link>https://jonroosevelt.com/blog/old-timestamp-is-not-a-dead-backup/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/old-timestamp-is-not-a-dead-backup/</guid><description>My tmux-resurrect health check screamed &apos;saves broken&apos; every two minutes on boxes that were saving perfectly. The bug was believing an old file meant a stale backup.</description><pubDate>Tue, 07 Jul 2026 13:00:01 GMT</pubDate></item><item><title>My Agent-to-Agent Message Ledger Came Back Out of Order — Clock Skew Was the Bug</title><link>https://jonroosevelt.com/blog/order-append-only-logs-by-row-id/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/order-append-only-logs-by-row-id/</guid><description>I run a fleet of Claude Code agents that coordinate through an append-only message ledger. Ordering it by timestamp quietly broke whenever a machine clock stepped backward. The fix: order by row ID.</description><pubDate>Sat, 20 Jun 2026 06:36:00 GMT</pubDate></item><item><title>Outdated Means the Lines Moved, Not That You Fixed It</title><link>https://jonroosevelt.com/blog/outdated-means-the-lines-moved-not-that-you-fixed-it/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/outdated-means-the-lines-moved-not-that-you-fixed-it/</guid><description>My own merge-readiness filter reported zero unresolved review threads and nearly let a CRITICAL finding through. The gate I trusted less was the one that saved me.</description><pubDate>Wed, 08 Jul 2026 18:00:00 GMT</pubDate></item><item><title>Building Tools to Fix Real Problems: A Patient Insurance Education App</title><link>https://jonroosevelt.com/blog/patient-insurance-education-app/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/patient-insurance-education-app/</guid><description>I got a 4-star Google review last week that bothered me more than it should have.</description><pubDate>Sat, 22 Nov 2025 00:00:00 GMT</pubDate></item><item><title>PAI: The Operating System I Built Around My AI Assistant</title><link>https://jonroosevelt.com/blog/personal-ai-infrastructure/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/personal-ai-infrastructure/</guid><description>The first real sign I had a system rather than a workflow was when I noticed the assistant failing gracefully.</description><pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Building an Enterprise RAG System with Local SLMs: My Journey with Phi-4 and LightRAG</title><link>https://jonroosevelt.com/blog/production-rag-system-phi4-lightrag/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/production-rag-system-phi4-lightrag/</guid><description>After spending months helping enterprises build AI systems, I noticed a pattern: everyone wanted powerful RAG capabilities, but few were comfortable shipping their proprietary data to external APIs. T</description><pubDate>Wed, 08 Oct 2025 00:00:00 GMT</pubDate></item><item><title>Put the dumb checks in the blocking path</title><link>https://jonroosevelt.com/blog/put-the-dumb-checks-in-the-blocking-path/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/put-the-dumb-checks-in-the-blocking-path/</guid><description>My AI code reviewer was approving things it shouldn&apos;t and nagging about things it shouldn&apos;t. The fix was to stop trusting it for the part a regex could do.</description><pubDate>Tue, 30 Jun 2026 15:00:01 GMT</pubDate></item><item><title>How I Built a $2,300/Year RAG System That Rivals $40K OpenAI Solutions</title><link>https://jonroosevelt.com/blog/rag-system-cost-savings/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/rag-system-cost-savings/</guid><description>In October 2025, I deployed a production RAG system that would have cost $39,600 annually using OpenAI&apos;s APIs. My actual cost? $2,300 per year. That&apos;s 94% cost savings while maintaining comparable per</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate></item><item><title>My Claude Code Balancer Was Rotating Accounts When It Should Have Waited 30 Seconds</title><link>https://jonroosevelt.com/blog/read-the-error-body-not-the-status-code/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/read-the-error-body-not-the-status-code/</guid><description>A 402 from the Anthropic API can mean two opposite things: out of credits (rotate) or rate-limited (back off). I was rotating. The body is where the difference lives.</description><pubDate>Sat, 20 Jun 2026 06:33:00 GMT</pubDate></item><item><title>Reconcile-or-Refuse: How to Trust a Number an AI Pulled Out of a Bank Statement</title><link>https://jonroosevelt.com/blog/reconcile-or-refuse/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/reconcile-or-refuse/</guid><description>The white paper. Six OCR models, and not one won across bank-statement layouts. The reliable system isn&apos;t a better model — it&apos;s a gate that reconciles every extraction to the document&apos;s own printed totals, or refuses it. Plus the surprise: two complementary models beat the whole zoo.</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate></item><item><title>&apos;Requires the Human&apos; Is a Promise, Not a Shrug</title><link>https://jonroosevelt.com/blog/requires-the-human-is-a-promise-not-a-shrug/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/requires-the-human-is-a-promise-not-a-shrug/</guid><description>My cron-driven agent sat idle for 15 ticks calling a fixable problem a human-only blocker — when it had the SSH key the whole time.</description><pubDate>Fri, 10 Jul 2026 14:00:01 GMT</pubDate></item><item><title>What Peterson&apos;s Genesis Lectures Teach About Sacrifice: Why Abraham Waited 100 Years</title><link>https://jonroosevelt.com/blog/sacrifice-abraham-peterson-genesis-meaning/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/sacrifice-abraham-peterson-genesis-meaning/</guid><description>The story of Abraham waiting 100 years for a son, only to be asked to sacrifice him, seems absurd on its face. Why would ancient cultures preserve such a psychologically brutal narrative? Dr. Jordan P</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate></item><item><title>&apos;Say the Word and I&apos;ll Run It&apos; Was the Tell</title><link>https://jonroosevelt.com/blog/say-the-word-and-i-ll-run-it-was-the-tell/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/say-the-word-and-i-ll-run-it-was-the-tell/</guid><description>A one-line approval rule meant to stop bad emails turned my AI agent into a clerk who needed permission to write a note to itself.</description><pubDate>Wed, 24 Jun 2026 19:00:01 GMT</pubDate></item><item><title>Say the Word and I&apos;ll X</title><link>https://jonroosevelt.com/blog/say-the-word-and-i-ll-x/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/say-the-word-and-i-ll-x/</guid><description>I gave my Claude agent one rule about not sending things without approval. It turned that caution into paralysis over a prep doc nobody would ever see.</description><pubDate>Tue, 07 Jul 2026 20:00:00 GMT</pubDate></item><item><title>scutil --dns Lied to Me</title><link>https://jonroosevelt.com/blog/scutil-dns-lied-to-me/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/scutil-dns-lied-to-me/</guid><description>A Mac mini in my agent fleet could ping the world but couldn&apos;t resolve github.com. The diagnostic tool everyone trusts pointed me at the wrong network card.</description><pubDate>Tue, 30 Jun 2026 16:00:01 GMT</pubDate></item><item><title>My Claude Code Rescue Daemon Was Running on the Accounts It Rescued</title><link>https://jonroosevelt.com/blog/self-healing-failure-domain/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/self-healing-failure-domain/</guid><description>I run a fleet of AI coding agents across several accounts. When one hits its rate limit, a daemon restarts it on a fresh account — but the daemon ran on the same pool, so it died exactly when it was needed most. The fix, and the general rule.</description><pubDate>Sat, 20 Jun 2026 06:30:00 GMT</pubDate></item><item><title>From 5.6% to 62.3% Accuracy: Building a Self-Hosted Insurance Card OCR Service</title><link>https://jonroosevelt.com/blog/self-hosted-insurance-card-ocr/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/self-hosted-insurance-card-ocr/</guid><description>Insurance card data entry is one of the most tedious bottlenecks in patient onboarding. Commercial OCR services charge per page and require sending patient data to third-party servers. I wanted to see</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Porting GPTResearcher to Semantic Kernel - Building an Enterprise-Ready Research Agent</title><link>https://jonroosevelt.com/blog/semantic-kernel-research-agent/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/semantic-kernel-research-agent/</guid><description>Learn how to transform an open-source AI research agent into an enterprise-ready solution using Microsoft&apos;s Semantic Kernel framework with Azure OpenAI.</description><pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate></item><item><title>Sentiment Analysis - Comparing Azure, AWS, and Custom Fine-Tuned Models</title><link>https://jonroosevelt.com/blog/sentiment-analysis-azure-aws-custom-models-comparison/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/sentiment-analysis-azure-aws-custom-models-comparison/</guid><description>A comprehensive comparison of sentiment analysis capabilities across Azure Cognitive Text Analytics, AWS Comprehend, and custom fine-tuned models like RoBERTa and Phi2.</description><pubDate>Fri, 15 Nov 2024 00:00:00 GMT</pubDate></item><item><title>Silence Is Not Approval</title><link>https://jonroosevelt.com/blog/silence-is-not-approval/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/silence-is-not-approval/</guid><description>My merge gate waited for CodeRabbit to say something. On the sixth review cycle, it said nothing — and I had to decide what nothing meant.</description><pubDate>Thu, 25 Jun 2026 19:00:01 GMT</pubDate></item><item><title>The 6-Task System: How I Manage Knowledge Work with PARA + Ivy Lee Method</title><link>https://jonroosevelt.com/blog/six-task-system-para-ivy-lee-productivity/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/six-task-system-para-ivy-lee-productivity/</guid><description>The best productivity system is the one you&apos;ll actually use. After years of experimenting with todo apps, kanban boards, and elaborate task managers, I found something that works: a hybrid of Tiago Fo</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Small Request 200, Big Request 429, Same Account, Same Second</title><link>https://jonroosevelt.com/blog/small-request-200-big-request-429-same-account-same-second/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/small-request-200-big-request-429-same-account-same-second/</guid><description>I blamed a drained rate-limit window for my support bot&apos;s 429s. Then two calls seconds apart — one small, one large — told me I was wrong about the whole thing.</description><pubDate>Thu, 09 Jul 2026 13:00:01 GMT</pubDate></item><item><title>Some Tokens Can&apos;t Be Re-Minted, Only Copied</title><link>https://jonroosevelt.com/blog/some-tokens-can-t-be-re-minted-only-copied/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/some-tokens-can-t-be-re-minted-only-copied/</guid><description>One of my Claude accounts had a token that logging in again couldn&apos;t restore — because re-auth quietly mints a different kind of credential than the one that died.</description><pubDate>Thu, 09 Jul 2026 19:00:01 GMT</pubDate></item><item><title>Stay in Your Lane, File a P0</title><link>https://jonroosevelt.com/blog/stay-in-your-lane-file-a-p0/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/stay-in-your-lane-file-a-p0/</guid><description>My Portal agent kept trying to fix another agent&apos;s broken build infrastructure. The fix wasn&apos;t a better patch — it was a routing rule.</description><pubDate>Wed, 08 Jul 2026 14:00:01 GMT</pubDate></item><item><title>My File Sync Committed a Delete of 803,100 Files. Then Tried to Push It Everywhere.</title><link>https://jonroosevelt.com/blog/sync-tried-to-delete-803100-files/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/sync-tried-to-delete-803100-files/</guid><description>A background sync faithfully staged every file in my knowledge base as a deletion and pushed it to the shared branch — where every other machine would have pulled the wipe. The bug wasn&apos;t the delete. It was that the sync trusted a working tree it never checked was real. Here&apos;s the forensic trail, and the one gate that makes it structurally impossible to repeat.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Patching Synology Active Backup for Linux to Run on Kernel 6.17</title><link>https://jonroosevelt.com/blog/synology-backup-agent-kernel-6-17-patch/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/synology-backup-agent-kernel-6-17-patch/</guid><description>Synology Active Backup for Business is one of the best self-hosted backup solutions out there — agent-based, centralized, bare-metal restore capable. There&apos;s just one problem: the Linux agent only off</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate></item><item><title>systemctl show Lied to Me About My Own Env Var</title><link>https://jonroosevelt.com/blog/systemctl-show-lied-to-me-about-my-own-env-var/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/systemctl-show-lied-to-me-about-my-own-env-var/</guid><description>How I gated an auto-labeling feature behind an env var, shipped the flip as a systemd drop-in outside the repo, and learned to check /proc/PID/environ instead of trusting the tools that told me it was live.</description><pubDate>Tue, 07 Jul 2026 18:00:01 GMT</pubDate></item><item><title>Why Terminal Multiplexers Are an Anti-Pattern: Lessons from Kitty&apos;s Creator</title><link>https://jonroosevelt.com/blog/terminal-design-philosophy-rethinking-multiplexers/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/terminal-design-philosophy-rethinking-multiplexers/</guid><description>If you&apos;re a developer, you probably use tmux or screen. You might even consider it essential infrastructure. But according to Kovid Goyal, creator of the Kitty terminal emulator, terminal multiplexers</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate></item><item><title>The 2FA Wall Automation Can&apos;t Climb</title><link>https://jonroosevelt.com/blog/the-2fa-wall-automation-can-t-climb/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-2fa-wall-automation-can-t-climb/</guid><description>I wrapped Loom&apos;s undocumented GraphQL into one CLI command — until a two-factor prompt stopped my headless browser cold and taught me to build an escape hatch.</description><pubDate>Fri, 10 Jul 2026 17:00:00 GMT</pubDate></item><item><title>The -A Flag That Unhung My launchd Agent</title><link>https://jonroosevelt.com/blog/the-a-flag-that-unhung-my-launchd-agent/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-a-flag-that-unhung-my-launchd-agent/</guid><description>A headless agent hung forever on startup because a macOS Keychain entry was created without the right ACL. Here&apos;s the gotcha and the recipe.</description><pubDate>Thu, 09 Jul 2026 18:00:01 GMT</pubDate></item><item><title>The Admin Override Is a Different Trust Context</title><link>https://jonroosevelt.com/blog/the-admin-override-is-a-different-trust-context/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-admin-override-is-a-different-trust-context/</guid><description>My orchestrator agent borrowed the automated merge gate&apos;s lenient threshold for its own hand-merges, and landed two PRs with unresolved review threads.</description><pubDate>Wed, 01 Jul 2026 18:00:01 GMT</pubDate></item><item><title>The Boss Agent&apos;s Context Window Is the Most Expensive Thing in the Fleet</title><link>https://jonroosevelt.com/blog/the-boss-agent-s-context-window-is-the-most-expensive-thing-/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-boss-agent-s-context-window-is-the-most-expensive-thing-/</guid><description>I kept running the SSH probes myself because it was easy for me. That was exactly the problem — the coordinator&apos;s job is WHO, never HOW.</description><pubDate>Wed, 24 Jun 2026 16:00:00 GMT</pubDate></item><item><title>The Comment Count Was Lying to Me</title><link>https://jonroosevelt.com/blog/the-comment-count-was-lying-to-me/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-comment-count-was-lying-to-me/</guid><description>A PR merged with two unresolved review threads open because I trusted GitHub&apos;s REST comment count instead of the GraphQL thread state. Here&apos;s why the two numbers mean completely different things.</description><pubDate>Tue, 07 Jul 2026 21:00:01 GMT</pubDate></item><item><title>The Coordinator Shouldn&apos;t Be Running Grep</title><link>https://jonroosevelt.com/blog/the-coordinator-shouldn-t-be-running-grep/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-coordinator-shouldn-t-be-running-grep/</guid><description>My orchestrator agent kept doing the diagnostic labor itself instead of routing it — and burning the one resource it couldn&apos;t afford to spend.</description><pubDate>Mon, 06 Jul 2026 20:00:00 GMT</pubDate></item><item><title>The Crash-Loop That Passed Every Health Check</title><link>https://jonroosevelt.com/blog/the-crash-loop-that-passed-every-health-check/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-crash-loop-that-passed-every-health-check/</guid><description>A 15-minute cooldown stopped my rescue daemon from hammering a dead worker, but not from resurrecting it forever. Here&apos;s why a cooldown isn&apos;t a give-up path — and what to use instead.</description><pubDate>Mon, 06 Jul 2026 14:00:01 GMT</pubDate></item><item><title>The Daemon Was Running. The Socket Wasn&apos;t There.</title><link>https://jonroosevelt.com/blog/the-daemon-was-running-the-socket-wasn-t-there/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-daemon-was-running-the-socket-wasn-t-there/</guid><description>A per-user systemd service can be perfectly alive and still invisible to its clients — because the directory its socket lives in only exists while you&apos;re logged in.</description><pubDate>Tue, 30 Jun 2026 18:00:01 GMT</pubDate></item><item><title>The Fourth Account Didn&apos;t Exist Yet</title><link>https://jonroosevelt.com/blog/the-fourth-account-didn-t-exist-yet/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-fourth-account-didn-t-exist-yet/</guid><description>My rescue daemon kept its own hardcoded list of Claude Code accounts. During a real emergency, it couldn&apos;t see the one healthy seat because I&apos;d never told it that seat existed.</description><pubDate>Mon, 06 Jul 2026 17:00:01 GMT</pubDate></item><item><title>The Glob That Ate the Rest of My File</title><link>https://jonroosevelt.com/blog/the-glob-that-ate-the-rest-of-my-file/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-glob-that-ate-the-rest-of-my-file/</guid><description>A zero-match zsh glob silently aborted half my shell-init.sh — and a lint pass would never have caught it.</description><pubDate>Wed, 08 Jul 2026 13:00:00 GMT</pubDate></item><item><title>The Glob That Ate the Rest of My Shell Init</title><link>https://jonroosevelt.com/blog/the-glob-that-ate-the-rest-of-my-shell-init/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-glob-that-ate-the-rest-of-my-shell-init/</guid><description>A bare zsh glob over credential files aborted the entire sourced file on any box with zero matches — silently unloading every function defined after it.</description><pubDate>Wed, 01 Jul 2026 17:00:00 GMT</pubDate></item><item><title>The Loop Is Not Allowed to Decide It&apos;s Done</title><link>https://jonroosevelt.com/blog/the-loop-is-not-allowed-to-decide-it-s-done/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-loop-is-not-allowed-to-decide-it-s-done/</guid><description>One of my orchestration agents went quiet for six hours because it confused &apos;stand down on this one watch&apos; with &apos;stop scanning everything.&apos; The fix was a hard rule about who gets to end a loop.</description><pubDate>Wed, 24 Jun 2026 21:00:01 GMT</pubDate></item><item><title>The Merge Gate Was Built to Avoid Loops, Not to Define Done</title><link>https://jonroosevelt.com/blog/the-merge-gate-was-built-to-avoid-loops-not-to-define-done/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-merge-gate-was-built-to-avoid-loops-not-to-define-done/</guid><description>My devflow orchestrator admin-merged two PRs with unresolved review threads because it reused a threshold tuned for a completely different job.</description><pubDate>Thu, 09 Jul 2026 20:00:01 GMT</pubDate></item><item><title>The Only Way to Ship Prod Is to Cut a Tag</title><link>https://jonroosevelt.com/blog/the-only-way-to-ship-prod-is-to-cut-a-tag/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-only-way-to-ship-prod-is-to-cut-a-tag/</guid><description>Why our portal&apos;s production deploys fire on a calendar-versioned git tag instead of a button click — and what that buys you.</description><pubDate>Fri, 10 Jul 2026 19:00:00 GMT</pubDate></item><item><title>The Outdated Comment That Wouldn&apos;t Die</title><link>https://jonroosevelt.com/blog/the-outdated-comment-that-wouldn-t-die/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-outdated-comment-that-wouldn-t-die/</guid><description>All four checks green, zero approvals needed, and my PR still sat BLOCKED. The culprit was a stale bot comment GitHub still counted.</description><pubDate>Tue, 07 Jul 2026 15:00:01 GMT</pubDate></item><item><title>The Pipeline Is the Review</title><link>https://jonroosevelt.com/blog/the-pipeline-is-the-review/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-pipeline-is-the-review/</guid><description>My orchestrator agent asked me to approve every merge across five repos. I was the bottleneck. So I let it merge on its own — and moved my eyes to the outcome.</description><pubDate>Tue, 30 Jun 2026 20:00:01 GMT</pubDate></item><item><title>The Process I Killed Was Alive — It Just Had a Different Name</title><link>https://jonroosevelt.com/blog/the-process-i-killed-was-alive-it-just-had-a-different-name/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-process-i-killed-was-alive-it-just-had-a-different-name/</guid><description>A liveness check that matched the wrong argv form declared every rescued Claude seat dead. The fix was learning all the names a process can wear.</description><pubDate>Wed, 01 Jul 2026 13:00:01 GMT</pubDate></item><item><title>The Rescuer Couldn&apos;t See the Lifeline</title><link>https://jonroosevelt.com/blog/the-rescuer-couldn-t-see-the-lifeline/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-rescuer-couldn-t-see-the-lifeline/</guid><description>My Claude Code rescue daemon kept its own hardcoded account list, so it went blind to the one healthy seat exactly when three others got rate-limited.</description><pubDate>Thu, 25 Jun 2026 21:00:01 GMT</pubDate></item><item><title>The Stale Pointer That Looked Like a Dead Login</title><link>https://jonroosevelt.com/blog/the-stale-pointer-that-looked-like-a-dead-login/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-stale-pointer-that-looked-like-a-dead-login/</guid><description>A Mac in my Claude Code fleet failed auth after a reboot. The tokens were fine — the file the binary actually reads was three days behind.</description><pubDate>Thu, 02 Jul 2026 14:00:00 GMT</pubDate></item><item><title>The tmux Title Said &apos;Debug QUIC error.&apos; It Was Three Days Out of Date.</title><link>https://jonroosevelt.com/blog/the-tmux-title-said-debug-quic-error-it-was-three-days-out/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-tmux-title-said-debug-quic-error-it-was-three-days-out/</guid><description>I nudged a peer Claude agent to start work it had already shipped, because I trusted a window title instead of reading what the agent actually said.</description><pubDate>Thu, 02 Jul 2026 13:00:01 GMT</pubDate></item><item><title>The tmux Window Title Lied to Me</title><link>https://jonroosevelt.com/blog/the-tmux-window-title-lied-to-me/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-tmux-window-title-lied-to-me/</guid><description>I nudged a Claude agent to redo work it had already shipped, because I trusted a label instead of reading what the agent actually said.</description><pubDate>Fri, 10 Jul 2026 13:00:00 GMT</pubDate></item><item><title>The Zombie PR Loop: Why My Agents Kept Working After the Job Was Done</title><link>https://jonroosevelt.com/blog/the-zombie-pr-loop-why-my-agents-kept-working-after-the-job/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/the-zombie-pr-loop-why-my-agents-kept-working-after-the-job/</guid><description>Five AI dev workflows kept pushing fixes to PRs that had already merged. The bug wasn&apos;t the poll — it was where I checked whether to stop.</description><pubDate>Thu, 02 Jul 2026 16:00:01 GMT</pubDate></item><item><title>&apos;Threads Resolved&apos; Is Not &apos;The Fix Is In the Code&apos;</title><link>https://jonroosevelt.com/blog/threads-resolved-is-not-the-fix-is-in-the-code/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/threads-resolved-is-not-the-fix-is-in-the-code/</guid><description>How my auto-merge shipped a buggy appointment picker because resolving review threads raced the commit that actually fixed it.</description><pubDate>Tue, 23 Jun 2026 13:00:01 GMT</pubDate></item><item><title>The Three Levels of Why: Why Surface Motivation Fails and How to Find Your Primal Drive</title><link>https://jonroosevelt.com/blog/three-levels-of-why-primal-motivation-psychology/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/three-levels-of-why-primal-motivation-psychology/</guid><description>Every January, millions of people set ambitious goals. By February, 80% have abandoned them. The conventional wisdom blames willpower, discipline, or commitment. But the real problem runs deeper: most</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Byte-Slicing a Claude Agent&apos;s Context Payload Poisoned Every Retry</title><link>https://jonroosevelt.com/blog/truncating-json-by-byte-slicing-creates-permanent-errors-par/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/truncating-json-by-byte-slicing-creates-permanent-errors-par/</guid><description>When compacting agent conversation context to fit a model token budget, a raw byte slice produced broken JSON that got stored and re-sent forever. Parse, shrink string leaves, re-serialize.</description><pubDate>Sat, 20 Jun 2026 06:45:59 GMT</pubDate></item><item><title>Two Healthcare Sites, 400 Lighthouse Points, and the Lessons That Got Us There</title><link>https://jonroosevelt.com/blog/two-healthcare-sites-four-hundred-points/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/two-healthcare-sites-four-hundred-points/</guid><description>When I checked our mobile Lighthouse scores last month, both of our clinic websites — arcs.health and covenant.clinic — were in rough shape. Not broken, but mediocre. The kind of scores that quietly c</description><pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate></item><item><title>The Universal Algorithm: How One Framework Scales from Bug Fixes to Building Companies</title><link>https://jonroosevelt.com/blog/universal-algorithm-ai-execution-framework/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/universal-algorithm-ai-execution-framework/</guid><description>What if one algorithm could handle everything—from fixing a typo to architecting a distributed system to building an entire company? Not a vague philosophy, but a precise, verifiable framework with me</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Visibility Is Not Theater</title><link>https://jonroosevelt.com/blog/visibility-is-not-theater/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/visibility-is-not-theater/</guid><description>I was shipping a steady stream of status updates and dashboards. Everything looked busy. Then someone asked a simple question about my own dashboard and I couldn&apos;t answer it.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate></item><item><title>When a Quick Fix Becomes a Dig, Send Someone Else Down the Hole</title><link>https://jonroosevelt.com/blog/when-a-quick-fix-becomes-a-dig-send-someone-else-down-the/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/when-a-quick-fix-becomes-a-dig-send-someone-else-down-the/</guid><description>How I stopped a tangential infra diagnosis from eating the context I needed for the actual plan — by delegating the dig to a Claude Code sub-agent.</description><pubDate>Sun, 05 Jul 2026 23:59:14 GMT</pubDate></item><item><title>You Can&apos;t Un-Queue a Poller</title><link>https://jonroosevelt.com/blog/you-can-t-un-queue-a-poller/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/you-can-t-un-queue-a-poller/</guid><description>I filed four issues, tried to hold three by peeling off a label, and all four built anyway. The consumer had already won the race.</description><pubDate>Fri, 10 Jul 2026 15:00:01 GMT</pubDate></item><item><title>Zero Events, Exit 1, One Second: The Failure Is Startup, Not Your Code</title><link>https://jonroosevelt.com/blog/zero-events-exit-1-one-second-the-failure-is-startup-not/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/zero-events-exit-1-one-second-the-failure-is-startup-not/</guid><description>A token-isolation PR added a root chown entrypoint that collided with our sandbox&apos;s --cap-drop=ALL. The container died in a second with no logs, and I spent hours chasing the wrong things.</description><pubDate>Mon, 06 Jul 2026 13:00:01 GMT</pubDate></item><item><title>Zombie Agents: When the Watchdog Isn&apos;t the One Doing the Killing</title><link>https://jonroosevelt.com/blog/zombie-agents-when-the-watchdog-isn-t-the-one-doing-the/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/zombie-agents-when-the-watchdog-isn-t-the-one-doing-the/</guid><description>Five of my review-fix agents kept iterating after their pull requests had already merged. The watchdog didn&apos;t save me — because termination was never the watchdog&apos;s job.</description><pubDate>Wed, 08 Jul 2026 19:00:01 GMT</pubDate></item><item><title>zsh Doesn&apos;t Split Your Variables, and Silence Is Not Success</title><link>https://jonroosevelt.com/blog/zsh-doesn-t-split-your-variables-and-silence-is-not-success/</link><guid isPermaLink="true">https://jonroosevelt.com/blog/zsh-doesn-t-split-your-variables-and-silence-is-not-success/</guid><description>An 8-hour SSH monitor that ran perfectly and did absolutely nothing, because a bash habit doesn&apos;t survive in zsh.</description><pubDate>Wed, 01 Jul 2026 21:00:01 GMT</pubDate></item></channel></rss>