
Indie dev/farmer Building Acquit, Acan with @droid @FactoryAI Guild Member pvstack- https://teapaw.org/t.co/ANDv11ueID
not in sf yet
Joined May 2025
- Tweets2.4K
- Following277
- Followers296
- Likes4K
Pinned Tweet
Day 4 on the @droid Max plan ($200).
@FactoryAI sent a free voucher. I used Lauren Tan's (@poteto) pstack in Cursor for months, and I missed it when I moved to Droid. So I ported it.
The part I care about most is the model routing. Each role in pstack gets its own model, and I picked them from Morgan Linton's (@morganlinton) VulcanBench (@VulcanBench ) results instead of going on vibes.
Coding goes to GPT-6.1 Sol, which scored 97% of Opus 5.5's best for about a tenth of the cost. Opus handles the judgment calls, and the review panels mix models from three different labs.
There's also a budget mode that hands the grunt work to DeepSeek-V4.1-Flash
It checks Lauren's repo every week, so her updates keep coming.
github.com/NDilanka/pvstack
First time the whole gate ran end to end on the real demo app this morning. Half of it worked.
I planted a regression on purpose, and Acan blocked it. The receipt even named the exact rule it broke. That part felt great.
Then I ran a candidate with zero changes. It got blocked too 😅 Somewhere between 14 and 22 "differences" every run, for code that was identical.
Turns out one cause is kind of funny. The demo hands out random login tokens, and about a quarter of them happen to be only letters and digits. The format check saw those and decided it was a different format. So a coin flip was failing my build.
A gate that blocks good code is honestly worse than no gate, because you stop trusting it by day two. So that's the next few hours. Killing the false differences one by one until an unchanged candidate passes clean, every time.
Droid's been running this whole chunk as parallel units in @droid, and the bug hunt is next on its list. Day 4 of the Meta hackathon, about 135 hours to go.
983 milliseconds. That's how long the demo app takes to boot inside Acan's sandbox now, half the runs at least. The slow ones hit about 1.6 seconds.
The sandbox is a Docker box with no network and a read-only disk. @droid (on Opus 5.5) measured it overnight, and any call out from inside just fails, which is exactly what I wanted. A worker shouldn't be able to phone home while it's proving its own work.
The annoying part is the math. A full replay is 720 fresh starts, so that's somewhere around 12 to 19 minutes just booting boxes before anything gets checked.
Some say “Harness won’t matter…”
Meanwhile @Droid is beating every other harness on Terminal-Bench, even the ones built by the frontier labs for their own models.
Excited to be introducing Droid 1.0
On Terminal-Bench, @FactoryAI outperforms all others.
Hour 80 and the first chunk of those 12 holes is closed.
The fix merged a bit after midnight. Now a comparison only counts against the run it actually came from, and a missing capture never passes. Sounds obvious when I write it down, but that's exactly the kind of thing that quietly turns "we didn't check" into "looks fine".
Left @droid grinding on it while I slept between alarms. Two more pieces to go before the gate gets wired to anything real.
Back to bed for one more alarm
Muse Spark just wrote its first real scope draft for Acan.
That's the plan a worker commits to before it touches code, basically what it's going to change and what it gets checked against. About 6,600 tokens in, 5,300 out, and Acan's checks accepted it.
The part I care about more is what gets refused. If a draft tries to set the expected value of a check itself, or a mask or a count, it bounces. The model can propose the scope, it just doesn't get to grade its own homework.
Meanwhile my C: drive dropped to 2.5 GB free mid-build 😅 Running a bunch of units in parallel in @droid means a lot of Rust build caches. Cleared the ones for units that already landed and I'm back to 42 GB.
5am, alarm went off, checked on the workers before coffee.
Six parts of Acan's new gate are building in parallel right now. A coordinator session in @droid is handing pieces out to pvstack subagents. An Opus one is closing the last contract fixes, and a Haiku one is retrying the foreman's scope drafts after a grep timed out under load.
Not all smooth though. One spike got blocked because Docker just refused to come up. And somewhere in the night my model budget ran out, so the sessions switched to a backup model and kept going.
Back to bed for two more hours. If these six land clean, today is clash clip day.
3am and the rules for Acan's new gate are frozen.
Before six parts of it get built in parallel, I had a GPT reviewer in @droid tear the first draft apart. It found 12 must-fix problems. My favorite, Windows drive paths slipped right past the check that's supposed to keep workers inside the repo 😅
Also landed tonight, workers can't touch protected paths anymore, and their test commands only run inside Docker.
Six units building on it now. Alarm's set for 5.
At 8pm the agents on Acan's map were dots. By 9:20 they were little bots, each in its own color, walking around the 3D plant.
That was the whole evening. Order comes in, two bots pick it up, each one plants a flag on the files it says it'll touch. When their flags overlap, a red clash pin pops up right there on the machine, and you settle it with 1, 2 or 3 on the keyboard.
First version looked fine up close and was useless zoomed out. You fit the whole plant on screen and the bots turned into specks you couldn't tell apart. So there's a whole commit just for making bots, flags and the pin readable at that zoom. Took Droid one extra round on its own branch before I merged it.
It's all still the offline scenario though. The real Muse Spark Open workers already clash in live runs, they just haven't shown up on this map yet. That's tomorrow, and tomorrow is the day I wanted the first real clash clip anyway.
Hour 50, about 169 left. 88 commits in @droid so far.
Spent the evening having two Opus subagents in @droid argue over one idea for Acan.
The idea is something I've been calling an intent ledger. One subagent's job was to write the deep dive and make the best case for it. It came back with about 10,000 words. The other one ran at extra-high effort and its only job was to rip it apart. It listed 16 ways the idea dies.
Honestly the second one was more useful. Most of the deep dive reads great until you see the kill list next to it.
Haven't decided yet if any of it makes it into the hackathon build. The 3D plant landed on main a couple hours ago and the live Muse Spark Open clashes still need to get onto that map, so the deadline gets a vote too.
Hour 46 and the 3D plant is finally on main.
It lived on a side branch all day while I had Droid running subagent rounds on line weights and labels. Now it's merged with the real machine models, the thin line art, and the offline clash scenario playing right on the page. An order comes in, two agents pick it up, they collide, the pin shows up.
Funny thing, one of the last commits before the merge was just deleting spike screenshots that snuck into the repo 😅
The live takes with Muse Spark Open workers already clash for real. Next job is getting that live run onto this map instead of the scripted one. About 173 hours left, building all of it in @droid
Small problem I can't decide on.
Zoomed in, the outlines on the map look exactly how I want. Thin, clean, kind of like a technical drawing. Zoom out to see the whole plant and the same lines turn thick and heavy, and the whole thing starts looking like a coloring book.
The easy fix is keeping the lines just as thin at every zoom. But then from far away the machines might melt into the grid and you can't tell what's a machine and what's floor. So I asked @droid for its honest opinion and a sweet spot, not just a patch.
Funny timing too. The round before this got cut off halfway by a provider outage, so the work was just sitting there uncommitted until Droid picked it back up.
The map got a makeover today and I keep orbiting around it like an idiot.
It's a perspective viewport now, sort of like Blender. A grid that fades off into a soft horizon, thin grey line art on every machine. And the belts between machines got about half as long, because the routing stopped dragging them around everything.
None of that was me btw. A @droid session spent the morning critiquing screenshots and sending them back to an Opus subagent while I was away from my desk.
Before I went afk this morning I gave @droid one job. Keep making the map look better, and don't wait for me.
So one Droid session is playing art director. It hands the plant view to an Opus subagent, looks at the screenshots at full size, writes a critique, and sends it back for another round. Round 1 fixed 7 of the 9 things it complained about. Quieter grid, proper shading on the machines, little shadows under them. Round 2 is running right now and I'm not even at my desk.
The clash engine is what actually matters for Acan (that part runs on Meta's Muse Spark Open workers). But if the map looks like a debug screen nobody's gonna watch the clip long enough to see a clash happen.
Remember the alarm every 2 hours? This one actually paid off.
Around 4am I watched three live takes in a row. Two Muse Spark Open workers got the same order, both went for src/middleware.ts about a minute in, Acan raised the clash before either wrote anything, I settled it with one key, and both landed. 3 of 3.
The funny part is why it kept failing earlier. The workers were declaring files that don't even exist. Like server.js, in a TypeScript repo 😅 So Acan was comparing two made-up file lists and never saw an overlap.
The fix was making them plan against the real files in the repo first. That plus a one-command demo take is basically what @droid and I did all night.
Hour 32. About 187 hours until I submit.
hour 28/218
ok so the clash demo from earlier had a hole in it.
During live takes two agents went for the same file, just a few minutes apart. The first one declared, built, done. Then the second one showed up and Acan never saw them overlap, because by then there was nothing left to overlap with 😅
So Droid and I added a declare barrier. No task starts building until its sibling tasks have said which files they'll touch, with a 90 second cap so one slow worker can't hold everyone up. Anyone left waiting gets moved onto the code that already landed.
Now the clash shows up before anyone writes. Merged it in @droid right before midnight, and next I want to catch one happening on the map for real.
hour 26/218 of Meta AI developer hackathon.
Recorded a quick run of the map tonight and honestly it held up better than I expected.
The machines are proper 3D models now, and the plant orbits while it draws. @droid merged that in about an hour ago, along with a scanner change so small repos get one machine per module instead of a pile of files.
The number I care about is from the renderer test though. I threw 2,000 machines and 4,000 belts at it and the frame time came out the same as with 10. Median stayed under the 16.7 ms you need for 60 fps, on WebGPU and WebGL2, on an integrated GPU, while other builds were eating the CPU lol
So plant size isn't the limit. The real cost is a 1 MB wasm file, which I'll trim before any web viewer goes out.
How big is the biggest repo you'd want to see as a map like this?
hour 24/218
ok this is the part I was most nervous about and it works. In tests at least.
Two agents both said they were about to edit the same file, and Acan raised the clash before either of them could write a single line. Nobody gets to quietly overwrite the other one's work and leave me to find out at merge time.
@droid built the plumbing for it tonight. Acan now has an MCP endpoint, so agents talk to it directly, plus its own little worker harness that fences off writes until the clash is settled.
The clash planned for Thursday's clip showed up two days early. Still only in tests though, not two real workers fighting live yet.
Hour 22/218 and Acan's map finally has machines in it. Well, drawings of them.
Each part of your codebase shows up as a little machine. So I had @droid port the Anatomy isometric drawing kit I like over to Rust, and now there's an assembler, an intake, a gate and a splitter, each with dials and bevels. Tanks and valves are still plain boxes lol
Nothing's on screen in the real app yet. Right now it just spits out an HTML sheet so I can check every machine before wiring it into the renderer from last night.
The goal is you look at the map and know what a module does without reading a file name. Still not sure that holds up on a big repo.
Would you want the machines detailed like this, or just simple boxes with labels?








