What it is
BMAD plans work well and then executes it in a straight line. Luvus schedules agents across a board and does not care what put the cards there. Agent-board sits between them: it translates a BMAD sprint into board cards, works out what can run at the same time, and schedules it.
267 commits in about 36 hours on 16 and 17 September 2026. It is running waves against its own board while I write this, which is why it is filed as still building.
Why I built it
Watching a plan execute one story at a time when four of them touched nothing in common. The method had produced a good plan and then thrown away most of what the plan told it, because its dev loop does not infer a dependency graph. It just goes down the list.
The information needed to parallelise was already there. Nothing was reading it.
The problem
Working out what can genuinely run at once is the whole job, and it is not a graph problem so much as a file problem. Two stories are independent when they do not write the same files, and a plan does not say which files a story will touch. It says what the story is for.
So the translation has to infer scope, then be conservative about it, because the cost of being wrong is two agents editing one file and a merge nobody wants to read. It is better to run three things when four were possible than to run four and lose an afternoon.
I also pulled the method out of the project it grew inside. It started as part of the fitness build, and anything built inside one repository ends up welded to that repository’s shape. Extracting it before it worked properly was the right order, though it did not feel like it at the time.
What I learnt
The thing worth recording went wrong on the page rather than in the code. The status document claimed nothing was written yet, that stopped being true within hours, and it stayed there for the rest of the day. I have caught the same thing before and it is the same class of mistake: a document that describes an intention is treated by everyone, including me, as if it describes reality.
A status line should be generated from something, or dated so obviously that a stale one looks stale.
What’s next
It is mid-flight. The near work is making the scope inference less cautious without making it wrong, and deciding whether the translation belongs in the method or beside it. Both are open.