The bottleneck in multi-agent coding is the human, not the agents A developer managing roughly 100 concurrent Claude Code conversations across four tmux sessions and 30-plus Go services concluded that the bottleneck in multi-agent coding is human tracking, not agent capability, after an archiving project for vehicle tracking data spun one task into 10 to 15 parallel chats. The developer rejected Claude's initial recommendation to rely on GitHub sub-issues, progress fields and linked PRs, arguing that in-flight state such as chat IDs, session URLs and pending decisions should live in a local shadow rather than in GitHub issues that colleagues and product teams read as a public contract. I Lost Track of What My Agents Were Doing, So I Gave Them a Shared Notebook I live in tmux. On a normal day I have four tmux sessions open, roughly one per area of work, and each of them holds somewhere between twenty and thirty windows with a Claude Code chat in it. That’s close to a hundred conversations, spread over a platform of 30-plus Go services, a mobile app, infrastructure repos and a data pipeline. At any moment a handful are actively working: one implementing, one reviewing PRs, one babysitting a deploy, one halfway through an investigation I’ll get back to after lunch. The rest are parked, each holding context I don’t want to lose. The agents are fine with this. The part that broke was me. Here’s what I wrote to Claude one afternoon, typos and all: I struggle keeping track of all the work you and your fellow instances are doing. We work across so many repos, and so many paralelle tasks at once… often we start on a large task which branches out into multiple prs and sub issues, but i/we loose track of it all… Someone surely must have built something, because the cognitive drain for me is huge when working like this. The number of chats isn’t really the problem, though. It’s how they come about. I rarely get to start something and finish it in one go. Day-to-day operations pull me sideways: an alert fires, a colleague needs a hand, a deploy misbehaves. Ideas pop into my head halfway through something else and get their own chat so I don’t lose them. And some implementations turn out to be a hornet’s nest. You start on one issue, find three things it depends on, each of those turns up something broken, and before lunch one task has spun off into ten or fifteen parallel chats. Each one makes sense on its own. Together, nobody holds the whole picture, and that includes me. The concrete case was an archiving effort for our vehicle tracking data that had been running for months. It’s the kind of work where there’s always something that blocks something else that needs fixing first. Plan it, implement it, babysit it into deployment, discover the next blocker, repeat. The individual steps were never hard. Knowing where we were was. This also capped how autonomous the agents could be. Claude can already pick up a GitHub issue, implement it, run the gates and open a PR. It works well for self-contained issues. But the issue only tells half the story. It doesn’t know that another chat is halfway through a change to the same service, that the migration it depends on is sitting in dev waiting for a soak, or that I decided last Tuesday to hold off until a customer confirms something. None of that lived in GitHub. It lived in other chats and in my head. So an agent working from GitHub alone would happily do the right thing in the wrong order, and I had to stay in the loop as the only one who knew about the cross-cutting, in-flight state. When I pulled it apart, “losing track” was actually three different problems wearing one coat: Any tool I picked had to be judged against all three. Claude’s first answer was the sensible, boring one: don’t build a framework. GitHub already has sub-issues, progress fields and linked PRs. A small status view on top would cover “how far along are we.” Its diagnosis was “a reporting gap, not an orchestration gap.” I pushed back, because GitHub is the wrong place for most of this: one thing is the issues in github, but often i want info that isnt or shouldnt necessarily be tracked there. Like chat ids, summaries etc. … Im not sure all the in-flight/development information should be put on github. I think maybe i want something which utilizes github issues and projects, but has some sort of local shadow for in-flight things GitHub issues are a public contract. Colleagues read them. Product reads them. A six-month issue that gets a new bot comment every time an agent session touches it turns into a wall of noise nobody reads, including me. Session URLs, “blocked until I decide X,” “the deploy is sitting in dev waiting for a soak”: that’s scratch state. It’s valuable to me and my agents, and it’s clutter for everyone else. So GitHub stays the source of truth for what we’re doing. It just can’t be the place where how it’s going lives. The other direction was knowledge tools. I asked how this related to things like Garry Tan’s gbrain or Karpathy’s LLM wiki idea. The answer reframed the whole thing for me: They solve a different layer. Both gbrain and Karpathy’s LLM wiki are knowledge stores. Beads is a work graph. I already had a knowledge store. Claude Code’s auto-memory directory had grown to a couple of hundred small files about our systems, basically a small Karpathy-style wiki. It answers question 3 well. But no amount of better wiki fixes question 1, because a wiki page has no notion of ready versus blocked . My vehicle tracking effort was documented across six separate memory files. Everything was written down. There was just no spine connecting it. gbrain specifically also brings Postgres, embeddings and cron enrichment, which is a lot of machinery for a few hundred files. It’s designed around one resident agent, not many short-lived Claude Code sessions that come and go all day. The obvious engineer’s move was to build a dashboard: pull issues, PRs and deploy status into one page, and look at it every morning. It could have worked. I just don’t think it would have lasted. For one, it would be brittle. A custom dashboard is one more piece of software to maintain, with its own data model, its own integrations and its own ways of breaking. The first time an API changes or I restructure how efforts are tracked, it goes stale, and a stale status page is worse than none because you trust it. It’s also more UI than I need. I don’t want charts and swimlanes. I want to know what’s blocked, what’s ready and where I left off, and a list in a terminal answers that fine. The biggest problem is who keeps it current. If the dashboard owns its own state, every one of those hundred chats has to know about it and remember to update it, in the right format, at the right moment. That’s a lot of ceremony to push into every session, and agents are exactly as reliable at optional bookkeeping as people are. If it only reads from GitHub instead, it can’t show the things I deliberately keep off GitHub: the blocker that isn’t an issue, the chat that made a decision. And it does nothing for the agents themselves. A new session starting cold still has no idea what the last one left half-done. What I needed was the data layer, not the UI: something agents write to naturally as part of their work, with any view on top being optional and cheap. What fit was Beads https://github.com/steveyegge/beads bd , Steve Yegge’s issue tracker built for coding agents. It’s a local database of work items with dependencies, bd ready and bd blocked queries, external references to GitHub issues and PRs, and free-form notes. It’s the “local shadow” I’d asked for, almost word for word. If you want the reasoning from the source, read Steve’s introduction to Beads https://steve-yegge.medium.com/introducing-beads-a-coding-agent-memory-system-637d7d92514a . A lot of what frustrated me about keeping agents on track across long, messy work is in there, put better than I managed in my typo-riddled message to Claude. Claude also floated an even lazier option: one markdown file per effort. It rejected that itself, and I agreed. You’d rebuild dependency resolution by hand within a month. That gave me three layers, each with one job: | Question | Layer | |---|---| | What are we doing? public | GitHub issues and projects | | What’s blocked, what’s ready, which session did what? private, in-flight | Beads | | What do we know? | Memory / wiki | Or in Claude’s words: GitHub issues are for the world. Beads is your private notebook of what is blocked on what. A few decisions made this work in practice: BEADS DIR environment variable in the Claude Code settings points every session, subagent and worktree at the same database. Local only, no sync. repo: