deanphillips.dev

Building with AI · October 2026

From a one-line idea to the right AI agent

Most of my ideas show up as one-liners typed at the gym. Here's how they become specs an agent can build, and how each one ends up with the right model.

SeriesPart 1 of 4
  1. Overview The AI team that ships my app
  2. Part 1 From a one-line idea to the right agent
  3. Part 2 Tests instead of code review
  4. Part 3 Agents that ask me from my phone
  5. Part 4 My AI team audits its own process

This is part 1 of a series about the AI agents that build RepBunny, a strength training app I work on around a full-time job. The overview covers the whole setup in a few minutes. This part covers the front of the pipeline: what goes into the backlog, and who works on it.

Ideas go in rough, specs come out ready

Most of my ideas show up at the gym or in a meeting, so I file them from the GitHub app as one-liners. “Rest timer should buzz on the watch.” That’s not something an agent can build reliably.

A refine-backlog skill fixes that. It finds issues that haven’t been scored yet, reads the code they’d touch, checks for duplicates, and rewrites each one with a clear problem, acceptance criteria, and the files involved. Then it labels it with an effort score and a value score, each on a Fibonacci scale (1, 2, 3, 5, 8, 13). Value divided by effort is the ROI, and ROI decides what gets built next. If it hits a question only I can answer, it asks me from my phone instead of guessing.

Reviewers fill the backlog too

Not everything waits for me to think of it. Four review agents run once a month, each playing a different role:

1Security audit
2
3
4
5
6
7
8UX review
9
10
11
12
13
14
15Product review
16
17
18
19
20
21
22Process review
23
24
25
26
27
28
Reviews are spread a week apart so the findings don't all land at once. The small dots are the weekly email digest of tasks waiting on me.

Everything a reviewer files comes in with a status:needs-review label. The builders can’t see it until I remove that label. Reviewers are good at spotting problems and only fair at deciding which ones matter, so I keep that call.

Lanes, so cheap work goes to cheap models

Early on I ran one agent in a loop on my laptop. It worked, but it meant the laptop had to be on, and every task got the most expensive model whether it needed it or not. Now the backlog is split into lanes, and each lane has its own cloud routine.

UX

Anything labeled UX-heavy. Taste matters here.

Opusalways

Features

New behavior users will see.

Sonneteffort 1 to 3
Opuseffort 5+

Bugs

Something is wrong and someone noticed.

Sonneteffort 1 to 3
Opuseffort 5+

Tech

Tooling, tests, docs, and everything else.

Sonneteffort 1 to 3
Opuseffort 5+

Dispatcher: a GitHub Actions workflow with no AI in it. When an issue opens or closes, it checks each of the 7 lane and model pairs. Work waiting and nobody busy? It fires that pair’s routine. Otherwise it does nothing.

Seven routines in four lanes. A label like model:opus overrides the default when I know a small issue is tricky.

The dispatcher is the part I’m proudest of, mostly because it’s boring. It’s a short Node script. It costs about one free Actions minute per run and zero AI usage. An empty backlog costs nothing, and a lane starts its next issue as soon as the last one ships.

Lanes run in parallel, so two agents can be running the test suite at the same moment. Each lane gets its own isolated test data, so they don’t trip over each other.

The cutoff between models moved once already. Effort 5 used to go to Sonnet. Then I started asking every build run to also decide whether its change needs a manual check on a real phone, and a mid-sized change plus that judgment call felt like too much for the cheaper model. Effort 5 and up now goes to Opus. It was a one-line change in the picker script.

What broke