We rewrote the whole product in Rust over one weekend. Here's what actually went wrong.
Tendril's own repo is built by Tendril.
So every rough edge is one we hit at fifty-agent concurrency, at 3am, with nobody there to work around it.
That's why all three problems in this talk have the same shape.
The goal was never "Rust is fast". It was one repo an agent can hold in one context — because a change that spans two repos and a package publish is a change no agent can finish.
A shipping product with real users. C# on .NET 10. We gave it three days — last Saturday, Sunday and Monday — and did not freeze v1 while we did it.
It started on a Saturday morning with an empty repository. By Monday night: 1,444 commits — 645 of them on the Monday alone, which is 45% of the entire repo in a single day.
50 concurrent slots, dialled up from a default of 20. A couple of agents being wrong is fine.
Parallel agents don't fail by writing bad code. They fail by each inventing a slightly different version of the same interface.
All green — and the agent wrote those tests too. Green means nothing here.
Nobody ships this. We had to build it.
It paid for itself on row one — PUT /api/config was silently dropping 15+ unknown keys. Config loss on save, in a build that compiled clean with every test green.
Our brand colour was missing from our own design system. Everything compiled. Every test passed. The product just looked subtly wrong depending on which door you came in through.
Correct the hex values — holds for a week
Delete 618 duplicate lines, generate the palette, and make re-declaring a token fail the build — holds forever
235 lines, amended six times in six commits. Write the contract, fan out, read the reports, amend, fan out again — three numbered passes in 23 hours.
Eight agents, one per area — Inbox, onboarding, Review, Plans, Settings, Jobs, Chat, Dashboard — 9,851 insertions in 11 minutes 27 seconds, and not one file touched by two of them.
Clone, then vp i and vp run dev:desktop. That second one heals four failure modes before it launches — stale dev port, unbuilt component library, a daemon already running, a stale CLI on your PATH. Nothing to read first.
A UI change used to be: edit the framework repo, publish a package, bump the dependency, rebuild the app. Now it's one commit in one tree. No second repo to clone, no registry in the loop, nothing to keep in sync.
The test suite grew, not shrank — 5,368 → 5,583. Five unsafe blocks in 173,158 lines. The compiler is the cheapest reviewer we ever hired, and that matters more when most of your contributors are agents.
A software factory is still just software. If using it doesn't feel good, people quietly stop — and a factory nobody uses produces nothing.
You want to do something obvious and there's no path to it.
Not your error. Someone else's, from three layers down.
It works on the machine of whoever wrote it. Not out of the box.
Any one of these costs twenty minutes and some swearing. That's not the damage.
The damage is that you go back to what you already know — and a new tool doesn't get a second first impression.
Worse here than in most software, because the whole promise is leverage. The moment the factory costs more attention than it saves, the deal is off — and nobody files a bug, they just stop opening it.
"It wasn't set up for you" is the failure mode. So it comes set up.
Running agents is a team activity, and every tool for it assumes you're alone in the room.
Behind localhost. On my machine. Invisible to everybody else on the team.
The obvious fixes are all bad: hand over your credentials, screen-share, or paste diffs into Slack.
Collaboration is a scope, not a login.
A share visitor gets no PUT, no PATCH, no DELETE — at all. They replace nothing and delete nothing, including their own comment. That's the whole permission model, and it's 3 lines of match.
Agents don't disagree about code, they disagree about interfaces. Settle those in one conversation, commit them, then go wide.
Nobody rage-quits a tool, they drift away from it. Run the checks where the work happens so failure arrives while you still have the context — and ship it already set up, because "it wasn't set up for you" is how you lose people.
A factory that only its owner can see makes the owner the bottleneck. Let people in at the granularity of one plan, with comments as the only write — a reviewer who structurally can't break anything is a reviewer you'll actually invite.
Not one of these was about how good the agents are. Every one was about the system we put around them.
Docs and downloads: tendril.ivy.app
parallel worktrees
review + gates
steer remotely
Also in assets/: annotation, voice, github ingest.
On GitHub, nobody — 1 of 134 has a review, median merge latency 24 seconds. Review happened upstream of the PR: gates, 155 screenshot verifications, and a human pressing Execute. The PR was bookkeeping.
Yes — 28% of v1's commits carry a plan id, and its first one is numbered [03375], so the factory was 3,375 plans deep before v1's repo existed. This wasn't a weekend from nothing. It's five months of factory practice, spent in a weekend.
No public release — zero tags, and the four release workflows have never been triggered. Daily internal use, and v1 has 62 releases through v1.2.4. Capability to ship; no evidence of shipping yet.