The agent pipeline

A model drafts and tests; a person decides to merge. Both our own products are what it built.

Who
Two products of our own, built through it
When
Since 2025, on every merge
What we did
  • Specified
  • Drafted
  • Tested
  • Merged
Result

~10weeks

to a global store release

Kickgeist, first commit to 2026-03-01

PROBLEM Drafting was never the bottleneck.

You have the plan and nobody to build it. A search runs for months. A notice period adds three more, and the date you committed to does not move while you wait.

A model will draft most of that plan in an afternoon. That part everybody already has. What nobody gets from it is a way to decide, change by change, whether the draft is fit to ship.

Model output arrives fast, and a fast defect ships broken, only sooner. So the number worth watching is not how quickly a change was written. It is what refused it before a person ever read it.

APPROACH A person decides to merge.

Work moves through five stages: specification, draft, review, checks, merge. A written document and a human ruling decide what is right. A check decides only whether it may ship. Judgment and mechanism stay separate. The checks are the one point on the line that can send a change back.

Work starts as a document.

Nothing is drafted before it is written down: what is being built, what it may not do, and which decisions are already closed. The planning matrix had a doctrine before it had a feature. Months are columns and days are rows. There is no month view, no week view and no day view. That was settled in the document rather than argued out in review.

Drafts land in the codebase that exists.

A draft is written into the repository already there, in the shapes it already uses. That is what keeps a fast draft from becoming a second system to maintain. Kickgeist is one Flutter codebase serving iOS, Android and web. A third platform did not become a third codebase, and 29 languages across 35 locale files did not become a second string table.

Tests run before a person does.

A change is tested before it reaches anybody's queue, so review is spent on judgement instead of on catching what a machine catches faster. The planning matrix holds approximately 6,550 Flutter tests and 930 Deno tests green on every commit. The release path on the shipped one is Fastlane: 15 lanes on iOS and 17 on Android.

Every merge carries a name.

A check can refuse a change and no check can approve one. The last step is a person reading the diff and deciding, and that has been true of every merge in both products. An agent permitted to merge its own work is an agent reviewing itself, which is the one arrangement this pipeline exists to avoid.

The product carries no model.

A pipeline built with models does not have to produce a product that depends on one. The planning matrix has no in-app AI surface and no AI provider dependency. Its seven planning tools are exposed over MCP instead, so the model sits outside the product and a user brings their own.

RESULT Two products came through it.

Kickgeist is the one you can open. One Flutter codebase serves iOS, Android and web. The stores went global on 1 March 2026, about ten weeks after the first commit.

Two products, counted.

What the pipeline produced, and what each number counts.

32,252players in one tournament
registered usersKickgeist, 11 June to 19 July 2026
863,000predictions submitted
entries written by those playersKickgeist, 11 June to 19 July 2026
29languages, one codebase
the locale files shipped in the app bundleKickgeist, 35 files for 29 languageskickgeist.com
~6,550tests green on every commit
the Flutter suite; about 930 Deno tests run beside itThe planning matrix, pre-launch

There is no API tier in front of the database. The app addresses Postgres directly and row-level security is the authorisation boundary: 25 tables, 51 database functions, 48 policies. Every one of those policies took the route above, and a person read it before it merged.

People used it the way it was built to be used. 52.9% of players were in a group with somebody else in it.

The first database was the wrong one, and nothing automated caught it. Cloudflare D1 takes one writer. A two-minute fixture sync held the lock for two to five seconds, and signups failed inside that window. We moved to Postgres in January 2026, before the global launch, and the migration deleted more code than it added.

None of this separates the pipeline's contribution from the review around it. Both products were built by the two together, and nothing here tells you which did what. What can be said is what came out and who ruled on it.

You would get the same arrangement: a document you can read, a draft you can reject, and a merge that carries a name. Nothing reaches your repositories that a person did not approve first.

Tell us what is in the way.

Say what you're building and where it stopped.

hello@beevelop.com

Copy it into your mail client if that is easier.

The draft opens with

  1. What you are building
  2. What is in the way
  3. The stack
  4. When you want to start

The contact page says who answers, and what the reply contains.

Read the Docker images since 2015 debrief next.