I kept rebuilding the same failure: five agents in one chat window, no memory of what was blocked, and a "done" that nobody had checked. Better prompts did not fix it. A bigger model did not fix it either. Structure did. A company has a board, roles with defined handoffs, a gate before anything ships, and a budget someone is actually watching. So I wrote that scaffolding down as code instead of vibes: four Python modules, standard library only, plus a five-role roster and a demo you can run o...