Community feedback is key to building a great open-source product
Eight upgrades are landing in xNAUT's build stage in v1.13. Almost none of them started as our idea. They came out of reading widely, testing what other people had already learned the hard way, and letting better approaches win. That is the part of open source we think matters most.
The problem I was chasing
xNAUT runs several coding agents at once. Each gets its own git worktree and its own terminal session, so they cannot collide and they survive a restart. That part has worked for a while.
The flaw in our solution was that the manager watching them was blind. It reported things that were technically true and told you nothing useful: a gate that answered yes or no, a timer that interrupted every agent every five minutes regardless of what they were doing, agents that could not see each other's findings, and a build slice that could never actually fail, so a dead build looked exactly like a slow one.
Rather than invent our way out, we went looking for how these problems had already been solved: in research codebases, in other tools, and in what people told us was not working for them. Most of what follows started as someone else's better answer.
Landing in v1.13
All of these are built and merged. They arrive in the next release. If you are on v1.12.0 today, you do not have them yet.
Your build gate now has a score, not a verdict
The acceptance gate was always running real checks; it just collapsed them to pass or fail at the last step. "Four checks failing" and "forty checks failing" were the same answer, so nothing watching could tell steady progress from going in circles.
It now reports how many checks pass out of how many. Same checks, same output. We just stopped throwing away the part with direction in it.
Scores describe a commit, not a moment
The detail we would have got wrong unaided: the gate runs against a throwaway checkout of one specific commit, not the live folder. Score the folder your agent is actively saving into and the number drifts for reasons that have nothing to do with progress.
Small distinction. It is the difference between a measurement and a rumour.
Agents are interrupted when they stall, not on a timer
The old behaviour nudged every agent every five minutes. That is wrong twice over: it breaks the concentration of one that is making progress, and it leaves one that has been stuck since the first minute alone for four more.
Now the score is tracked over time, and an agent is only interrupted when it stops improving. When it is, the message quotes the exact checks that are failing. The gate already knows, so there is no reason to make the agent go looking.
Agents can read each other's notes
Three agents working in parallel used to be completely blind to one another, so each could independently discover the same broken assumption and each pay for it. They now share a notes directory.
Here we deliberately did not copy what we found. The original scopes those notes to a single run and deletes them afterwards, which suits a research tool. Ours are scoped to the project and kept, because the second person to read them is you, weeks later, and they belong in your vault where you can search them on your phone.
And four more, same release
Work can depend on other work
Today our planner is told to split a build only into pieces that are genuinely independent, because there was no way to express "the API needs the database schema first". That caps how much can run in parallel, and it forces genuinely sequential work into one long slice.
A piece can now declare what it depends on. Independent work still runs at full width; dependent work waits instead of guessing; and if a foundation fails, everything built on it is marked unreachable and never starts, instead of producing an hour of confidently wrong code.
A waiting slice holds no worktree at all, so a slice that turns out unreachable leaves nothing behind to clean up.
Bad plans are rejected before anything runs
We had designed this to detect an impossible plan while the build was running. Then we read someone else's, which checks the plan the moment it is written: every dependency must exist, loops are refused, depth is capped.
Strictly better, and it changed our design before we shipped it. A plan is already wrong the second it is written; that is when you should be told, not forty minutes later.
A build slice that can honestly fail
A failed agent used to be restarted forever, which meant a broken build was indistinguishable from a slow one and never finished; it sat there looking healthy. It now gives up after two attempts and says which slice died and why. Consolidation refuses to merge a build with a dead slice in it, rather than shipping whatever the survivors managed on top of a foundation that never landed.
Codex spend, tracked like Claude spend
We already read how much of your Codex plan you have consumed, but not what an individual session cost, which is the question once you can pick your provider per session. Codex writes its own transcripts, so now we read them: tokens in, cached, out, and an estimate per session.
One detail worth stating: cached input is billed at a fraction of fresh input, and on long sessions it dominates. One real transcript here was 179M cached of 189M input. Ignoring that distinction would overstate a session roughly tenfold. And the figure is a list-price estimate, not a bill: on a subscription the marginal cost is zero, so it means “what this would have cost on the API”.
Why research beats invention
It would be easy to ship these as "new in xNAUT" and leave it there. We would rather be straight about the method: reading widely is the method, not an embarrassing shortcut on the way to a real one.
Three of these changes exist because three separate teams had solved the same problem in three different ways, and seeing the differences side by side was what made the right answer obvious. One of them corrected a design we were a day away from building. We would never have found that by thinking harder about our own code.
Those three projects, with thanks. Each one is worth your time on its own, and every mechanism we borrowed names its source in the file header:
- Human-Agent-Society/CORAL Apache 2.0
- lamalab-org/corral BSD 3-Clause
- cdknorow/coral Apache 2.0
Three unrelated teams, three codebases that happen to share a name, and no connection between them beyond having each thought hard about the same problem. That coincidence is how we found all three.
The best feedback rarely arrives as a feature request. It arrives as someone else's working solution to a problem you had convinced yourself was hard.
The same is true of the feedback that comes directly. Several of the sharpest corrections this cycle came from people simply describing what did not work for them: a build that looked healthy while it was stuck, a number that told them nothing, an agent interrupted while it was doing fine. None of that arrived as a bug report. It arrived as a complaint, which is usually the more honest form.
So we are making it a habit rather than an accident: read good code regularly, listen to what people are actually frustrated by, and let the better approach win even when it is not ours. You will see more posts like this one.
I firmly believe we are in the era of agentic learning. Many developers arrive at the same ideas but take different approaches. Inspecting those approaches can help any developer, no matter how senior, gain a new perspective on both the flow and the final solution.
That is part of xNAUT: a tool I build from the flows of many developers looking at similar problems and solving them differently. That is how I create a better product than I had yesterday.