The challenge
Agency work runs on a promise: the scope in the statement of work. Keeping that promise across several squads and several clients at once is hard. The requirements live in a document. The work lives in pull requests. Nobody sees the gap between them until a client walks through the demo and asks where the bulk export went.
The team was mixed, too. Permanent engineers, contractors, and client-side developers who needed access to some projects but not others. Review quality varied by squad, and a junior engineer’s pull request could sit for a day waiting on a senior who was busy with another client.
The approach
For each engagement, the delivery lead uploads the agreed spec as Markdown. CodeReviewer splits it into must, should and may requirements and checks every pull request against them. The project page keeps score: what’s shipped, what’s half done, and what nobody’s started. Each requirement links to the pull requests that delivered it.
Access is set per project. Contractors and client developers only join the projects they work on. Admins decide what members can do (merge pull requests, apply AI fixes, manage test suites), so a client developer can read findings without being able to merge.
Every pull request, for every client, gets the same whole-codebase review. Routine fixes are applied and checked to compile before they reach the branch. Senior engineers review design, not formatting.
The results
“Are we done?” is now a link instead of a meeting. Before each milestone review, the delivery lead opens the scorecard, sees what’s still open and schedules it. That happens before the client ever sees the gap. And review quality is the same across squads, because every pull request goes through the same first pass.