Beobeo · how it was built

A portfolio tracker that builds itself from its users' complaints.

Beobeo is a personal portfolio tracker built by a fully automated, self-improving loop. User agents use the real app and file feedback. Developer agents turn that feedback into fixes. Twice a day, the loop starts again.

The first 14 days · Oct 23 to Nov 5, 2026
12user agents, each with their own money and habits
160simulated sessions in the real app
1,014pieces of feedback filed
144goal-driven missions
440themes found in that feedback
167themes fixed and shipped
196commits on the main branch
$28.89total spent on the user agents' thinking
The loop

Six steps, twice a day, with no one at the keyboard.

A scheduled job on my Mac runs the whole cycle at 08:00 and 20:00. The morning cycle lets every user agent live an ordinary day. The evening cycle sends some of them on missions with one concrete goal each.

  1. Simulate

    User agents sign in to the real app in Chrome and use it on real market prices: they log trades, ask the chat assistant questions, and review pages in light mode, dark mode and on a phone.

  2. Journal

    Every click, wait, answer and complaint goes into a local SQLite journal, along with 1,507 page and answer timings.

  3. Digest

    Feedback is grouped into themes and ranked by how many people hit the problem, how badly, and on how many days. The last cycle's fixes are checked against the new complaints.

  4. Build

    Developer agents run headless Claude Code. Each one takes the top theme to a branch in its own worktree with its own dev server, then screenshots the result as the persona who asked. A cycle runs up to 12 rounds.

  5. Check

    The branch has to pass type checks, lint, every test and a production build. A branch that fails stays unmerged.

  6. Merge

    Passing work merges into the main branch. The next cycle's user agents meet the changed app and react to it.

user agentsdeveloper agentsplain code
Two kinds of agents

One side uses the app. The other side fixes it.

User agent

A simulated investor with a temperament

Habits
Plain code for their routine, such as “$250 of VOO every Monday”. It's cheap and repeatable, and it replays months of history so every portfolio has real purchases and sales.
Mind
A Claude model that sees only that person, their own portfolio and prices up to “today”. It makes the judgment-call trades, asks questions and forms opinions.
Hands
Playwright driving a real Chrome window: sign-up, forms, the chat and every page.
Temper
Patience, tech comfort and taste. A low-patience agent complains when a page takes more than its budget.
Developer agent

An engineer with a rulebook

Reads
My own requests first, since they outrank the personas. Then the day's ranked digest, the product principles and the project rulebook.
Builds
One change per round on its own branch, with tests to match. Money logic gets hand-computed test cases before any screen changes.
Proves
Screenshots the change as the persona who asked, re-runs the mission that found the bug, and records timings before and after.
Writes
A report, an entry in the evolution log and an update to the rulebook, so the next round starts already knowing what this one learned.
The cast

Twelve investors, each wrong about something in their own way.

They're named after Game of Thrones and Harry Potter characters so they're easy to tell apart in the logs. Each has their own accounts, their own tax situation, and the biases that come with how they invest.

From complaint to commit

What they said, and what shipped.

The quotes are word for word from the journal. Every fix was found, built, checked and merged by the loop.

What the loop got wrong

At first, most of the failures were in the test, not the app. Both are fixed now.

In the first missions, user agents almost never reached their goal. When I read the runs, most failures came from the simulation itself, not from the app. I fixed it in two passes.

Fix 1 · how the agents use the app Fixed

  • Clicks missed menus and dialogs. Those now get their own references, so a click lands on the thing the agent meant.
  • Agents acted while a closing layer still covered the page. They now wait for it to clear.
  • First-run setup missions started from a copy of the persona's history. They now start from an empty account, as a new user would.

This fix, plus the app bugs those cleaner missions then found, explains the jump in the bars.

Fix 2 · how missions are scored Fixed

  • Goals sometimes made up facts the persona's data didn't support. Every goal now comes from their real portfolio, except about one in six, which carries a labeled, deliberate mistake to test whether the app corrects people.
  • “Got it done” and “trusted the answer” were mixed up. They're now scored separately.
  • Runs that hit the step limit counted as app failures. They're now marked as running out of steps.

Only 8 missions ran under the new scoring before I paused the loop (4 achieved), which is too few to judge yet.

Guardrails

Autonomous, within limits.

Branches only

Developer agents never push, never touch secrets, and never merge their own work. The script merges a branch only after its checks pass.

A daily budget

The user agents' thinking stops at $5 a day. Page reviews are the first thing cut when money runs low.

Humans own the data

Database schema changes wait for a person to run them. The loop asks for them in writing.

Exact money

Plain code computes the numbers and the model only explains them. Every engine change comes with hand-checked test cases.