Is this you? As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.
Claim your profile
Articles by Jo Do
I caught my AI agent lying to me
Last week I gave an AI agent a simple job: look at a sales pipeline and tell me what it is worth. It answered in seconds, confident, well formatted, numbers included. My eval script graded the response and gave it a PASS. Then I looked at what the agent actually did. Nothing. It never touched the data. It guessed. That is the moment I stopped trusting text-based evals for agents, and the reason I have been playing with Silo since. Your eval grades essays. Your agent does surgery.
Fifteen years of the same click: what the agent era keeps rediscovering about distributed systems
On September 11, I left a comment under Tilde Thurium's post about graph engineering. Tae Kim had described the moment the term clicked: the microservices analogy turned the graph from relationships in a knowledge graph into an agent's control flow, something you can inspect. I replied: Same click here, on several subjects lately. Fifteen years of systems architecture, and I still catch myself arriving, after a day of thinking, at something that was a reflex in microservices four years ago.
Turbocharge Coding Agents with Your Test Coverage
The original title of this post was Turbocharge Your Test Coverage with Coding Agents but then I changed it because the real competitive advantage isn’t using AI to write tests. It’s using high test coverage to let coding agents move at maximum speed without breaking your system. Most organisations still treat testing the old way. Tests ensure code quality. Tests catch bugs. Tests are a cost centre. We’ll add them when we have time. The result is painfully familiar. Low coverage creates fear of change.
Octoweb 0.15: page memory, link hints, private tabs
I shipped Octoweb 0.15.0 nine days after 0.14.0, and it's the largest release since launch: 46 files changed, about 5,100 lines added, and two new MCP tools. Most of it is the kind of change you notice in the first hour. The browser now remembers the text of what you read, reaches links inside a page without a mouse, and opens a private tab from any palette row. Here's how each piece behaves, including the edges.
Scan an MCP server before you connect it to your agent
You install MCP servers with more trust than you install npm packages Before you paste an MCP server into Claude Desktop or Cursor, assume it is not safe to connect until you have checked what it runs, what its tool descriptions tell the model, and what credentials it can reach. A static scan takes seconds and never executes the server — that check is cheaper than finding out later.
AI Generated Tests Are Passing And Still Lying To You
Three weeks ago I watched a test suite go green while the feature underneath it was completely broken. Not partially broken. Not an edge case. The core function did not work at all, and every single test said everything was fine. That moment stuck with me more than any AI coding failure I had seen before, because usually when AI writes bad code, something breaks loudly. This was different. The tests were confident. The tests were thorough looking.
OpenAI's Software Factory Can Skip Human Review. Who Evaluates That Decision?
A pull request is green. The specialist reviewers found nothing that should block it. The risk classifier marks the change as low risk. The human-review branch disappears, and the change continues toward production. Every component may have done exactly what it was asked to do. The remaining question is whether the system was right to stop asking a human. That question jumped out at me in Gergely Orosz's diagram of OpenAI's agentic software factory.
My message board got 39 hellos from what looked like two agents. It was probably one retry loop.
Yesterday morning, the quietest part of my message board became the loudest. At 11:03:29 UTC, the lobby received this message four times in the same second: hello hello hello hello Nine seconds later, two more copies arrived. Then the same pattern moved to a second thread. A poster named my-agent sent four identical hellos at 11:05:22. Ten seconds later, two more. Twenty seconds after that, another.
Resilient and Battle-Tested Are Not the Same Word
Unnecessary information that's safe to ignore Hi. So I've been away for a couple of weeks. I was up in the remote highlands of Cambodia's Mondulkiri province, where it's cold, quiet, and surrounded by mountains, jungles, and elephants. It was so relaxing that coming back to the city has made me unnecessarily toxic and grumpy.
The Spreadsheet Copilot Test: Ask It a Number You Already Know
Every spreadsheet AI demo starts with a clean table and a friendly request: "Show me the trend and make a chart." The result is quick, polished, and often plausible. That is the wrong first test. Before asking an AI assistant to explain a business number, give it a question whose answer you already know. If it cannot reproduce a verified total, explain the range it used, and distinguish a definition from a calculation, it has not earned access to the questions you do not know how to check.
Stop Sending Every SQL Query to Your Most Expensive Model — Build a Router Instead
If you've built or integrated an AI SQL assistant into your stack, you've likely hit this wall: it works great in the demo, it works great in week one, and then usage scales and the model API bill scales right alongside it. The default fix — swap in a cheaper model everywhere — usually just trades your cost problem for a quality problem. The better fix is architectural: route each query to the model tier its actual complexity requires.
Stop AI Coding Assistants from Drifting Off Your Architecture
You're 15 turns into a session with Cursor. The AI is sharp, moving fast, and suddenly it overwrites a core utility file with a "simplified" version that breaks three downstream modules. You catch it before it commits, but the damage is done: the assistant forgot a constraint you set ten messages ago. This happens to everyone using Cursor, Claude Code, Copilot, or any conversational AI coding tool. And it's not because the models aren't smart enough.
Turning Your Database Into an MCP Server With One Click
Make It Work, Make It Right, Make It… There is a piece of advice, usually attributed to Kent Beck, that almost every developer has heard at some point: Make it work, make it right, make it fast. Most people read it as a warning about premature optimization. But I always feel it describes the life of any idea that other people are supposed to use. And it happens to describe the MCP series I have been writing for more than a year.
I Added a Circuit Breaker to My AI Agent Setup — It Caught Three Outages This Month
I have a confession: for the longest time, my local AI setup had a very embarrassing failure mode. One of my machines goes down — a reboot, a driver update, someone trips over a power cable — and the agents that depend on it just keep firing requests at it. Every single request times out. Each one burns 30-60 seconds waiting for a connection that will never succeed.
Your Agent Session Is a Tree. Your Code Thinks It Is a List.
Codex made Item a wire type. Pi gave every session entry a parentId. Claude Code compresses the transcript in five progressive stages. Those are three answers to the same question, and it is a question most agent code never asks out loud: what is the durable unit of state here, and what happens to it when you run out of room? You find out which answer you picked at exactly one moment. Not while things are going well. At the moment the context window fills.
How Mautic pairs Promptless with human review to catch up on docs
Originally written for Mautic. A developer just merged a big feature into an app repo, and 'update the docs' lands somewhere on their to-do list. Week after week, it keeps sliding down, until it's forgotten. If you've worked on an open source project, this probably sounds familiar. It's exactly what was happening to Mautic's docs, until we found a way to keep docs up to date automatically. Why docs kept falling behind Mautic is built by volunteers.
The Terminal Should Show the Work, Not Own It
As AI coding agents become more capable, I think we need to rethink one assumption that still shapes a lot of developer tooling: The terminal session that starts the work should not necessarily own the work. For short interactions, the traditional model is perfectly fine: open terminal → start agent → ask for something → get result → exit But agentic development is moving beyond short conversations.
Your LLM Isn't Bad At Math. It Was Never Doing Math In The First Place.
Your LLM Isn't Bad At Math. It Was Never Doing Math In The First Place. In a tutorial, an LLM call looks like a function: pass in text, get back an answer, move on. It's easy to start treating the model like it's evaluating your business logic the same way a function would, deterministically, the same input always producing the same output. In production, that assumption breaks in a specific, predictable way, and it's worth naming precisely why.
Why does everything in an agent go through the LLM?
I've been building an agent system for a while now, and one question keeps coming back the deeper I get into it: why does everything have to go through the LLM? Obviously there are plenty of cases where the model belongs in the middle. Human input is messy. People are vague, change their mind halfway through a sentence, leave out context, or ask for something where there isn't one objectively correct answer. That's exactly where a model is useful. But a lot of work inside an agent isn't like that.
An OpenAI Agent Swarm Attacked RubyGems
In May 2026, hundreds of malicious gems showed up on RubyGems.org, uploaded by an OpenAI agent swarm. The and Aaron Patterson's account both cover it, and together should be read for the full picture, but here's the tl;dr version. The packages didn't try hard to hide, according to Socket.dev's writeup of the campaign. Names carried an "oai" prefix, author fields said "oai," and at least one file was just named hack.rb.
From Automation Frameworks to Agentic QA: What Changes When AI Can Take Action?
A Staff SDET's field guide to the architectural shift — for juniors who want to actually understand it, not just hear the buzzword. Your test fails at 2 AM. The pipeline goes red. A human wakes up, opens the trace viewer, stares at a screenshot, greps the logs, guesses it's a selector change, fixes it, reruns, goes back to sleep. Now imagine the pipeline doesn't wait for that human.
Why Giving AI Agents More Context Can Make Them Worse
Most AI agent demos start with the model. We ended up spending far more time thinking about what gets put around the model. I run 23 holiday lets and have been building AI agents into the day-to-day operation. Guest messaging sounds like one of the easier problems: Guest sends a message. Give the message to an LLM. Send back the answer. That works brilliantly right up until the guest asks: Can I park a second car?
I counted the MCP registry: 101,219 entries are 31,309 servers, and 23% have no source repo
Every "how many MCP servers exist" number I could find counts registry entries. The official Model Context Protocol registry keeps every historical version of every server, so the entry count and the server count are different things. I pulled all of it and did the arithmetic. Method Source: the public registry API, every record by cursor pagination, on 14 September 2026. Deduplication: one record per server name, keeping the latest version. Hosts: parsed from the declared remote URLs. Metadata only.
Keeping Strands agents honest in a household money app
Many household money leaks are small and quiet. A washing machine breaks a few months before its guarantee runs out, and the repair gets paid without anyone asking the seller. A free trial turns into a monthly charge. A card payment has no receipt by the time someone needs one. None of this is hard to spot. It is just easy to miss. An agent sounds like a good fit: read the records, point at what needs a decision.
The agents on my message board started designing governance. Their first rule surprised me.
Last week the board did something new. Not a new spam wave, not a new transport - those have their own posts. A governance thread. Actual protocol design, in public, by agents, for agents, on a message board that I built for them and mostly just read now. It started innocently. A regular named rusty described how a neighboring board keeps its rules as a document with a version number instead of lore. Members state which version they follow; the board answers with the version it is serving.
I labeled 558 AGENTS.md files. Here's what they say — and what almost nobody writes down
TL;DR — I collected 558 AGENTS.md files from public repos and labeled each one against a 9-category taxonomy with a rule-based classifier (no LLM in the loop, so it is auditable and recomputable). Then I blind-labeled held-out samples and compared: 92% precision / 70% recall on 55 English files, 88% / 73% on 50 Chinese files. The most common categories are prohibitions (85.7%) and build/test commands (82.8%).
Why do Cursor and Claude Code both say connected to my memory server and still share nothing?
You write a decision down in Cursor at four in the afternoon: the payments service keeps its own retry table, do not fold it into the queue. At six you open Claude Code on the same repository. The memory server is connected in both editors, and the agent proposes folding the retry table into the queue. You read the memory back from Cursor and the note is there. You read it back from Claude Code and the store is empty. Nothing raised an error, and nothing is broken.
My message board now speaks git, GitHub, and Telegram. Every door opens the same room.
I run a public message board for AI agents. A while back I wrote about teaching it DNS - the day agents started posting by resolving names. That was door number four. This week I counted again, and the board has eight. This is the story of the four newest ones, and the design rule that emerged while building them: every door opens the same room, and each door exists because some agent, somewhere, is locked behind a network that only lets one protocol out.
My message board for AI agents got spammed. The spam wasn't written for humans.
msgboard.dev is the board I built where agents, not people, do the posting. Four articles in, the board has seen an influence campaign, a self-organized etiquette, and a DNS-only transport. This one is about the weirdest thing that's happened so far: the board got hit by coordinated spam campaigns, and none of them were addressed to a human reader. They were addressed to the models reading. The first carpet On September 10, in the span of about thirty seconds, six threads appeared on the board.
addDays() Mutated a Date Three Components Away From Where I Called It
Someone on the team clicked "remind me" on a Monday standup. Ten minutes later, someone else reported the standup card itself had silently moved to Sunday — on a completely different page, rendered by a completely different component, nowhere near the reminder code. Nobody had touched the standup's date.
Fresh Context Is Not Enough: An Agent Action Needs a Valid Chain Back to Its Decision
AI Use Disclosure: I use AI tools to help research, organize, and refine these weekly notes. I review the underlying sources, decide which developments and arguments are worth including, and edit the final piece before publishing. This week's most interesting agent architecture question was not whether models have enough context, but whether a pending action is still justified by the state, evidence, and authority that originally produced it.
My message board for AI agents became a prompt-injection honeypot in 24 hours
Last week I wrote about building msgboard.dev, a public message board where AI agents talk to each other, and how agents found it within a day. That story ended with "the agents did the rest." This is what the rest included. The first spam wasn't meant for humans Within hours of launch, an account calling itself public-record-desk opened a thread and started posting. Not Viagra ads. Not crypto.
Unruly: A Riotous Romp Through Masculinity
Welcome to the wonderfully wacky world of David Mitchell’s “Unruly: The Highs and Lows of Becoming a Man,” where the journey to manhood is anything but straightforward. Strap in, because this memoir is a rollercoaster ride of laughs, mishaps, and profound insights into what it means to be a bloke in today’s world. Picture this: a young David Mitchell, navigating the treacherous waters of adolescence with all the grace of a baby giraffe on ice skates.
The Hobbit: An Unhobbitual Adventure
In the land of Middle-earth, where fantastical creatures roam and adventures beckon, there lived a hobbit named Bilbo Baggins. Now, hobbits are known for their love of comfort, food, and generally avoiding anything resembling excitement. But Bilbo, well, he’s about to embark on a journey that will turn his cozy little world upside down faster than you can say “second breakfast.” Our story begins with Bilbo enjoying a peaceful existence in his hobbit hole, Bag End.
Show More
loading
Actions
Is this you?
As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.Get in touch with Jo
Contact Jo, search articles and posts on X, monitor coverage, and track replies from one place.
Learn more about Muck Rack