Research · Planning eval
Research · AI Will Replace You · 2026-10-03

Same brief. Five plans.

One budget tracker app, planned five ways from the same brief: from the goal alone up to a full two-week sprint with story points. Each plan is built five times by an agent working alone, and every build is scored against an exam it never sees.
The setup: the brief and the five plans every build started from.

5
plans from one brief
goal only · epics · stories · epics, features, stories · sprint
25
builds
5 plans × 5 runs · Claude Opus 5.5 at high effort · one agent per build
499
bank transactions
3 banks · 3 file formats · 3 daily syncs · 10 planted traps
1
hidden exam
written by another AI · exact numbers · never seen by a build

What the app must do for a person

The brief leads with what someone needs to take control of their money day to day. Every plan starts from these seven outcomes.

Where the money comes from

Income by source, month by month.

Where it goes

Category, then merchant, then each transaction, a few clicks from one dashboard.

Easy savings

Subscriptions and their monthly cost, a category that jumped, a one-off splurge.

Budgets going forward

Monthly budgets, a suggested budget for next month, and how much is safe to spend today.

Alerts and notes

An alert when a category goes over, and a note on any transaction.

Daily sync

Press Sync, take in the next day's exports, add only what is new, see what changed.

Easy to find your way

The dashboard is home, everything else one or two clicks away, always clear which month and day.

The ladder: five plans, one brief

Every plan was written by the same model (claude-opus-5-5) from the same brief, byte for byte. The only thing that changes is how much planning the builder gets. Click any plan to read it.

Read the plans

Each plan opens into its epics, features and stories, exactly as the builder will read them. Use Expand all to see a whole plan at once.

📄 The brief every plan started from the exact text, byte for byte

I want a simple web app that keeps track of my money. I have accounts at a few banks and each one gives me statements in its own format, so I want to drop them all in and have the app work out which account is which and match everything up into one picture, without double counting money I move between my own accounts or charges that show up twice, and with refunds going back where they came from. Show me where my money comes from and where it goes, by category and by merchant, and let me click down to the actual transactions. The statement text is messy, so clean up the merchant names (there's a starter list of category rules in fixtures/categories.json) and let me fix a category when it gets one wrong. Help me save: point out subscriptions, anything that jumped this month, and one-off splurges. Let me set monthly budgets, warn me when I go over, tell me how much I can still safely spend today, and let me add a note to any transaction. New transactions come in every day, so give me a Sync button that pulls in the latest and shows me what changed. For now my statements are in fixtures/statements/ (January to June) and each day's new exports land in fixtures/sync/, one folder per day, so each Sync should take in the next day. Keep it easy to find my way around, with one dashboard as home.

Plan 1

Goal only

approved
242 words · brief only

The one-line goal and the short brief. Nothing else.

The brief, as this plan restates it

Goal: A simple web app that combines statements from all of my bank accounts into one accurate picture of where my money comes from and where it goes, and helps me spend less.

The app lets me drop in statements from several banks, each in its own format. It works out which account each statement belongs to and combines everything into one picture. Money moved between my own accounts is not counted twice, charges that appear twice are counted once, and refunds go back to the original charge. It shows where my money comes from and where it goes, by category and by merchant, and I can click down to the individual transactions. It cleans up messy merchant names from the statement text and assigns categories, starting from the rules in fixtures/categories.json. I can correct a category when it's wrong. To help me save, it points out subscriptions, spending that jumped this month and one-off splurges. I can set monthly budgets, and it warns me when I go over and tells me how much I can still safely spend today. I can add a note to any transaction. The starting statements are in fixtures/statements/ (January to June). New daily exports land in fixtures/sync/, one folder per day. A Sync button takes in the next day's folder and shows me what changed. The app should be easy to find my way around, with one dashboard as the home page.

Plan 2

Epics

approved
852 words · 6 epics

The brief plus four to six epics, one paragraph each.

The brief, as this plan restates it

Goal: Give one person a single, trustworthy, up-to-date picture of their money that helps them spend within their means and save more.

The person holds accounts at several banks, and each bank exports statements in its own format. The app is a simple web app that takes in all of these statements, works out which account each one belongs to, and merges everything into one combined record. It must not double count transfers between the person's own accounts or charges that appear twice, and it must match refunds back to the purchases they reverse. Statement text is messy, so the app cleans up merchant names and assigns categories, starting from the rules in fixtures/categories.json. The person can correct a wrong category and add a note to any transaction. The app shows where money comes from and where it goes, broken down by category and by merchant, and the person can drill down to the underlying transactions. To help them save, it points out subscriptions, spending that jumped this month and one-off splurges. The person can set monthly budgets, is warned when they go over, and can see how much they can still safely spend today. The historical statements are in fixtures/statements/ and cover January to June. New daily exports land in fixtures/sync/, one folder per day. A Sync button takes in the next day's folder each time it is pressed and shows what changed. The app should be easy to navigate, with a single dashboard as the home page.

Epic 1See all my money in one place

The person wants every account they hold, at every bank, combined into one accurate picture, so they never have to piece their finances together by hand. This epic covers taking in statements however each bank formats them, recognising which account each statement belongs to, and merging everything into one record. Money moved between the person's own accounts must not count as income or spending, a charge that shows up twice must count only once, and a refund must go back against the purchase it reverses. Done means the person can add all their statements and trust that the totals reflect what actually happened to their money, with nothing missing, inflated or misplaced.

Epic 2Make sense of each transaction

The person wants every transaction to be readable and correctly labelled, so they can recognise it at a glance and rely on the breakdowns built from it. This epic covers turning messy statement text into clean, recognisable merchant names, giving each transaction a sensible category, letting the person fix a category when the app gets it wrong, and letting them add their own note to any transaction. Done means the person can scan their transactions and understand each one, and any correction or note they make sticks and shows up everywhere that transaction appears.

Epic 3Understand where my money comes from and goes

The person wants to see clearly what brings money in and what takes it out, so they understand their habits and can make decisions. This epic covers the overview of income and spending by category and by merchant, the ability to drill from any figure down to the transactions behind it, and a single home dashboard that makes the rest of the app easy to find. Done means the person lands on one dashboard, quickly sees the shape of their finances, and can get from any number to the exact transactions that make it up without getting lost.

Epic 4Find ways to save

The person wants the app to point out where their money is leaking, so they can act on it without digging through everything themselves. This epic covers bringing up recurring subscriptions, spending that rose noticeably this month, and one-off splurges that stand out from normal behaviour. Done means the person is shown a short, believable list of things worth a second look, each of which they can follow back to the transactions involved.

Epic 5Stay within my budget

The person wants to set limits on their spending and know at any moment whether they are on track, so they don't overspend before the month ends. This epic covers setting monthly budgets, warning the person clearly when they go over, and telling them how much they can still safely spend today. Done means the person can set their budgets once, see their progress against them, get warned as soon as they overspend, and get a simple, trustworthy answer to "how much can I spend today?"

Epic 6Stay up to date every day

The person wants their picture to keep up as new transactions arrive, and to see what each update brought in, so they always work from current numbers. This epic covers a sync action that brings in the latest day of transactions, folds them into the existing record under the same matching rules as everything else, and shows the person what changed. Done means each sync moves the person forward by one day, everything else in the app reflects the new data straight away, and the person can see exactly what was added or changed.

Plan 3

Stories

approved
2,056 words · 21 stories

The brief plus a flat list of user stories with acceptance criteria, no grouping.

The brief, as this plan restates it

Goal: one web app that combines all my bank statements into a single, accurate picture of my money and helps me spend less.

The app runs in the browser and opens on a single dashboard, and every other screen is easy to reach from it. It reads bank statements that come in different formats from different banks, starting with the January to June files in fixtures/statements/. It works out which account each statement belongs to and merges everything into one ledger. Money moved between my own accounts is not counted as income or spending. A charge that appears twice is counted once. Refunds go back against the original merchant and category. Merchant names are cleaned up from the messy statement text. Transactions are categorised using the starter rules in fixtures/categories.json, and I can correct any category. The app shows where money comes from and where it goes, by category and by merchant, and I can click down to the underlying transactions. To help me save, it points out subscriptions, spending that jumped this month and one-off splurges. I can set monthly budgets, get a warning when I go over one, see how much I can still safely spend today, and add a note to any transaction. A Sync button imports the next day's exports from fixtures/sync/, which has one folder per day, taking one new day per press, and then shows what changed.

User stories

S1As a user, I want a dashboard as the home page that sums up my finances and links to every other screen, so that I always know where to start and how to get anywhere.
  • Given the app is opened at its root address, then the dashboard is shown without any other step.
  • Then the dashboard shows this month's income, this month's spending, budget status, safe-to-spend-today, and the current savings alerts (subscriptions, jumps, splurges).
  • Then a navigation element that is visible on every screen gets me back to the dashboard in one click.
  • When I click any figure or alert on the dashboard, then I am taken to the screen that explains it.
S2As a user, I want the app to read all my statements from fixtures/statements/ even though each bank uses its own format, so that I don't have to convert or re-type anything.
  • Given the January to June files in fixtures/statements/, when the app loads them, then every file is imported and none is skipped without a visible error message naming the file.
  • Then the number of transactions imported from each file matches the number of transaction rows in that file.
  • Then each transaction keeps its date, amount, direction (money in or out) and original description text exactly as the statement gives them.
S3As a user, I want the app to work out which account each statement belongs to, so that my transactions are grouped under the right account without me labelling files.
  • When statements are imported, then each one is assigned to an account without me being asked.
  • Given two statement files from the same account for different months, then their transactions appear under one account, not two.
  • Then an accounts list shows each detected account with its bank and its transaction count.
S4As a user, I want transfers between my own accounts recognised and left out of income and spending, so that moving money around doesn't look like earning or spending it.
  • Given money leaves one of my accounts and the same amount arrives in another of my accounts on the same or a nearby date, then both sides are marked as a transfer.
  • Then transfers are not included in any income, spending, category, merchant or budget total.
  • Then transfers can still be viewed in the transaction list, labelled as transfers and linked to their matching other side.
S5As a user, I want a charge that shows up twice counted only once, so that my spending isn't inflated.
  • Given the same charge appears more than once across my statements or sync exports (same account, amount, date and merchant), then it appears once in the ledger and is counted once in every total.
  • When I import a file or run a Sync that contains a transaction already in the ledger, then the transaction count does not go up for it.
S6As a user, I want refunds matched back to the purchase they reverse, so that the category and merchant they came from show the true net cost.
  • Given a refund from a merchant I previously paid, then the refund is subtracted from that merchant's and that category's spending, not added to income.
  • Then the refund and its original purchase are linked, and each can be reached from the other.
  • Then a full refund brings the net spend for that purchase to zero.
S7As a user, I want messy statement text turned into clean, readable merchant names, so that I can recognise who I paid at a glance.
  • Then each transaction shows a cleaned merchant name, without store numbers, card references, location codes or payment-processor prefixes.
  • Given different raw descriptions for the same merchant, then they all show the same cleaned name and are grouped together in merchant views.
  • When I open a transaction, then I can still see its original description text.
S8As a user, I want transactions categorised automatically using the starter rules, so that I get a breakdown without sorting everything by hand.
  • Given the rules in fixtures/categories.json, then every transaction that a rule matches gets that rule's category.
  • Then a transaction that no rule matches is labelled "Uncategorised" and is not left blank or dropped from totals.
  • Then newly synced transactions are categorised the same way.
S9As a user, I want to change a transaction's category when the app gets it wrong, so that my breakdowns are correct.
  • When I pick a different category for a transaction, then every total, chart and budget that includes it updates right away.
  • Then my correction is still in place after I reload the app and after later Syncs.
S10As a user, I want to see where my money comes from, so that I understand my income.
  • Then an income view lists each source of incoming money with its total for the selected month.
  • Then transfers and refunds are not counted as income.
  • When I change the selected month, then the figures update to that month.
S11As a user, I want to see where my money goes by category and by merchant, so that I know what I spend the most on.
  • Then a spending view shows totals per category and, separately, totals per merchant for the selected month, ordered from largest to smallest.
  • Then the category totals for a month add up to that month's total spending shown on the dashboard.
  • When I change the selected month, then both breakdowns update to that month.
S12As a user, I want to click from any total down to the transactions behind it, so that I can see exactly what made up a number.
  • When I click a category, merchant, income source or account total, then I see the list of transactions that make it up.
  • Then the amounts in that list add up to the total I clicked.
  • When I click a transaction in the list, then I see its details: date, account, cleaned merchant, original description, amount, category, any linked transfer or refund, and its note.
S13As a user, I want the app to point out my subscriptions, so that I can cancel the ones I no longer need.
  • Given a merchant charges me a similar amount at a regular interval (for example monthly), then it is listed as a subscription.
  • Then each subscription shows the merchant, its typical amount, how often it charges, the date of the last charge and its yearly cost.
  • When I click a subscription, then I see all the charges that made the app detect it.
S14As a user, I want to be told about anything whose spending jumped this month, so that I can catch costs that are creeping up.
  • Given a category or merchant whose spending this month is clearly higher than its average over earlier months, then it appears in a "jumped this month" list.
  • Then each item shows this month's amount, the earlier average and the difference.
  • When I click an item, then I see this month's transactions for it.
S15As a user, I want one-off splurges pointed out, so that I can see which single purchases cost me the most.
  • Given a single non-recurring purchase that is much larger than my usual spending in its category, then it appears in a "splurges" list.
  • Then subscriptions and transfers are never shown as splurges.
  • Then each splurge shows its date, merchant, amount and category, and opens its transaction when clicked.
S16As a user, I want to set a monthly budget for each category, so that I have a spending limit to aim for.
  • When I enter a monthly amount for a category, then it is saved and is still there after I reload.
  • Then each budgeted category shows its budget, the amount spent so far this month and the amount left.
  • When I change or remove a budget, then the figures update right away.
S17As a user, I want a warning when I go over a budget, so that I can rein in my spending.
  • Given a category's spending this month is above its budget, then that category is clearly marked as over budget on the budgets screen and on the dashboard.
  • Then the warning shows how much over budget I am.
  • When a recategorisation, refund or Sync brings spending back under the budget, then the warning disappears.
S18As a user, I want to see how much I can still safely spend today, so that I can make day-to-day decisions without doing the maths myself.
  • Then the dashboard shows a "safe to spend today" amount equal to the total budget left for this month divided by the number of days left in the month, including today.
  • Then "today" means the date of the latest imported transactions, and the amount updates after each Sync.
  • Given I have spent my whole monthly budget or more, then the amount shown is zero, never negative.
S19As a user, I want to add a note to any transaction, so that I can remember what it was for.
  • When I add or edit a note on a transaction and save it, then the note appears on that transaction's details.
  • Then the note is still there after I reload the app and after later Syncs.
  • Then transactions that have a note are marked as such in transaction lists.
S20As a user, I want a Sync button that pulls in the next day's new transactions, so that my picture stays up to date.
  • Given fixtures/sync/ holds one folder per day, when I press Sync, then the transactions from the next day's folder that has not yet been imported are added, and only that day's.
  • When I press Sync again, then the following day is imported. No day is skipped or imported twice, even after a reload.
  • Then synced transactions get the same account detection, transfer matching, duplicate removal, refund matching, merchant cleanup and categorisation as imported statements.
  • Given every day folder has already been imported, when I press Sync, then I am told there is nothing new and nothing changes.
S21As a user, I want to see what changed after each Sync, so that I know what's new without searching for it.
  • When a Sync finishes, then I see which day was imported and the list of transactions it added.
  • Then the summary also lists any budgets that are newly over, any new subscriptions, jumps or splurges, and the change in safe-to-spend-today.
  • Then transactions added by the latest Sync are marked as new in transaction lists until the next Sync.
Plan 4

Epics, features, stories

approved
2,700 words · 6 epics · 17 features · 23 stories

Epics, then features under each, then stories with acceptance criteria under each feature.

The brief, as this plan restates it

Goal: Give one person a single, trustworthy view of their money across all their bank accounts so they can see where it goes, stay within budget and find ways to save.

Personal Budget Tracker is a simple web app for one person with accounts at several banks, where each bank exports statements in its own format. The app reads every statement and works out which account each one belongs to. It combines all transactions into one picture without double counting transfers between the user's own accounts or charges that appear twice, and it links each refund to the purchase it reverses. It shows where money comes from and where it goes, by category and by merchant, and the user can click down to the actual transactions. It cleans up messy merchant names from the statement text and assigns categories using the starter rules in fixtures/categories.json. The user can correct a category that is wrong. To help the user save, it points out subscriptions, spending that jumped this month and one-off splurges. The user can set monthly budgets, gets a warning when they go over, sees how much they can still safely spend today, and can add a note to any transaction. The starting statements, January to June, are in fixtures/statements/. Each day's new exports land in fixtures/sync/, one folder per day, and each press of a Sync button takes in the next day's folder and shows what changed. The app must be easy to find your way around, with one dashboard as the home page.

Epic 1Bring all my money into one picture3 features · 6 stories

The user wants all their accounts combined into one accurate picture that counts every amount exactly once, so they can trust the totals without checking each bank by hand.

FeatureStatement import1 story

Reads the user's statements from every bank, whatever layout each bank uses.

S1As a user, I want the app to load all my statements from fixtures/statements/, so that I see my January to June history without typing anything in.
  • On first start, every statement file in fixtures/statements/ is imported, and its transactions appear in the app.
  • For one known transaction picked from each statement file, the date, amount, direction (money in or money out) and description shown in the app match the source row.
  • Every source row either appears as a transaction or is shown as a duplicate merged into another transaction; no row is silently dropped.
  • Restarting the app or importing the same statements again does not create extra transactions.
FeatureAccount recognition1 story

Works out which account each statement and transaction belongs to.

S2As a user, I want the app to work out which account each statement belongs to, so that my transactions are grouped correctly without me labelling them.
  • An accounts page lists each distinct account exactly once, with its bank and a recognisable account name or identifier.
  • Statements for different months from the same account are attached to that one account, not to separate accounts.
  • Every imported transaction belongs to exactly one account, and each account shows its transaction count and the net total of its transactions.
FeatureOne combined picture4 stories

Combines every account into a single set of transactions where transfers, duplicates and refunds are handled so that nothing is counted twice.

S3As a user, I want one list of all transactions from all my accounts, so that I see my whole financial picture in one place.
  • A transaction list shows transactions from every account together, newest first, and each row shows its account.
  • The list can be filtered by account, by month and by category.
  • Transfers, merged duplicates and refunds carry a visible label in the list.
S4As a user, I want money I move between my own accounts to be recognised as a transfer, so that it is not counted as income or spending.
  • When money leaves one of the user's accounts and the same amount arrives in another of their accounts within a few days, both sides are labelled as a transfer and linked to each other.
  • Transfers are left out of income totals, spending totals, category and merchant breakdowns, and budgets.
  • Clicking either side of a transfer shows the matching transaction in the other account.
S5As a user, I want a charge that shows up twice to be counted once, so that my spending is not inflated.
  • When the same charge appears twice (for example in overlapping statements or exports), only one copy counts toward any total.
  • The kept transaction shows that a duplicate was merged into it, and the merged copy can be viewed.
  • Two separate purchases with the same merchant and amount on different dates are both kept and both counted.
S6As a user, I want each refund to go back where it came from, so that my spending reflects what I actually paid.
  • A refund is linked to the original purchase it reverses, and the link is visible on both transactions.
  • A refund reduces spending in the original purchase's category and merchant and is not counted as income.
  • If the original purchase's category is changed, the linked refund moves to the new category.
  • A refund with no matching purchase still reduces spending for its merchant and is marked as unmatched.
Epic 2See where my money comes from and where it goes4 features · 7 stories

The user wants to understand what drives their income and spending, so they can make informed decisions about their money.

FeatureClean merchant names1 story

Turns messy statement text into clear, consistent merchant names.

S7As a user, I want messy statement descriptions turned into clean merchant names, so that I can recognise who I paid at a glance.
  • Every transaction shows a cleaned merchant name, and the original statement text is still available on the transaction.
  • Different forms of the same merchant (for example with store numbers, reference codes or locations attached) show under one merchant name.
  • Merchant totals combine all forms of a merchant under its cleaned name.
FeatureCategorisation2 stories

Puts every transaction into a category automatically and lets the user correct it.

S8As a user, I want transactions categorised automatically from the starter rules, so that I get a breakdown without sorting everything by hand.
  • The rules in fixtures/categories.json are applied to transactions from both statements and Sync, and a transaction that matches a rule gets that rule's category.
  • A transaction that matches no rule is placed in an "Uncategorised" category, which appears in the breakdown.
  • Every transaction that is not a transfer has exactly one category.
S9As a user, I want to change a transaction's category when it is wrong, so that my breakdown is accurate.
  • From any transaction, the user can pick a different category and save it, and all totals that include that transaction update straight away.
  • When correcting a category, the user can choose to apply it to all transactions from the same merchant, including ones that arrive later through Sync.
  • Corrections are kept after a restart and are not overwritten when Sync brings in new transactions.
FeatureIncome and spending breakdown3 stories

Shows income and spending by category and by merchant, and lets the user click through to the underlying transactions.

S10As a user, I want to see my income and spending by category for a month, so that I know where my money comes from and where it goes.
  • For a selected month, the view shows total income, total spending, and a total per category, sorted from largest to smallest.
  • The user can switch between any month from January to the most recent synced month.
  • Category totals add up to the month's income and spending totals, and transfers are not included.
S11As a user, I want to see my spending by merchant for a month, so that I know which businesses get most of my money.
  • For a selected month, the view lists merchants by cleaned name with their total and number of transactions, sorted from largest to smallest.
  • Merchant totals have refunds subtracted and exclude transfers and merged duplicates.
S12As a user, I want to click a category or merchant to see its actual transactions, so that I can check what makes up a total.
  • Clicking a category or merchant total opens the list of transactions behind it for the same period.
  • The amounts in that list add up exactly to the total that was clicked.
  • Each listed transaction shows its date, account, cleaned merchant name, original statement text, amount, category and note.
FeatureTransaction notes1 story

Lets the user attach their own notes to transactions.

S13As a user, I want to add a note to any transaction, so that I remember what it was for.
  • The user can add, edit and remove a note on any transaction from wherever the transaction is shown.
  • A transaction with a note shows the note in transaction lists.
  • Notes are kept after a restart and after any number of Syncs.
Epic 3Find ways to save3 features · 3 stories

The user wants to be shown where they could cut back, so they can save money without combing through every transaction themselves.

FeatureSubscriptions1 story

Finds recurring charges the user may want to review or cancel.

S14As a user, I want my subscriptions identified, so that I can review recurring charges I may have forgotten about.
  • A merchant that charges a similar amount at a regular interval across several months is listed as a subscription, showing its amount, how often it charges, the date of the last charge and the expected date of the next charge.
  • The list shows the combined monthly cost of all subscriptions.
  • Merchants with irregular or one-time charges are not listed, and each listed subscription links to its transactions.
FeatureSpending jumps1 story

Highlights where spending rose noticeably this month.

S15As a user, I want to see categories and merchants where my spending jumped this month, so that I can catch rising costs early.
  • "This month" is the month containing the most recent transaction in the app.
  • Categories and merchants whose spending this month is clearly above their average for previous months are listed with this month's amount, their usual amount and the difference.
  • The list is ordered by the size of the increase, and each entry links to the transactions behind it.
FeatureOne-off splurges1 story

Flags unusually large single purchases.

S16As a user, I want unusually large one-off purchases highlighted, so that I can think twice about big spending on non-essentials.
  • A single purchase far larger than the user's typical purchase in the same category is flagged as a splurge.
  • Subscriptions, transfers and income are never flagged as splurges.
  • The splurge list shows each purchase's date, merchant, category and amount, and links to the transaction.
Epic 4Stay within my budget3 features · 3 stories

The user wants to set spending limits and always know whether they are on track, so they can avoid overspending before it happens.

FeatureMonthly budgets1 story

Lets the user set and follow a monthly spending limit per category.

S17As a user, I want to set a monthly budget for each category, so that I have a limit to spend against.
  • The user can set, change and remove a monthly budget amount for any category, and the budgets are kept after a restart.
  • A budget view shows, for the current month, each budgeted category's budget, amount spent so far and amount remaining.
  • The amount spent excludes transfers and merged duplicates and has refunds subtracted.
FeatureOver-budget warnings1 story

Tells the user when a category goes over its budget.

S18As a user, I want to be warned when I go over a budget, so that I can adjust my spending.
  • When spending in a category goes over its monthly budget, a warning naming the category and the amount over appears on the dashboard and on the budget view.
  • The warning appears straight after the Sync, category correction or budget change that pushed the category over.
  • The warning disappears if a refund, correction or budget change brings the category back within budget, and categories within budget show no warning.
FeatureSafe to spend today1 story

Tells the user how much they can spend today and still stay on budget.

S19As a user, I want to know how much I can still safely spend today, so that I can make everyday choices without breaking my budget.
  • The dashboard shows one "safe to spend today" amount, where "today" is the date of the most recent synced day, or the last statement date if nothing has been synced yet.
  • The amount equals the total of all monthly budgets minus budgeted spending so far this month, divided by the days left in the month including today, and it is never shown below zero.
  • The amount updates after every Sync and every budget change.
  • If no budgets are set, the dashboard asks the user to set a budget instead of showing an amount.
Epic 5Stay up to date every day2 features · 2 stories

The user wants their picture to keep up with new spending as it happens, so they can always see the latest position and what just changed.

FeatureSync1 story

Brings in the next day's new transactions when the user asks.

S20As a user, I want a Sync button that pulls in the latest day's transactions, so that my picture stays current without re-importing everything.
  • Each press of Sync takes in the next day's folder from fixtures/sync/ in date order: the first press takes the earliest folder, and no day is skipped or taken twice.
  • New transactions go through the same account recognition, name cleaning, categorisation, and transfer, duplicate and refund matching as the statements, including matching against transactions that were already in the app.
  • When there are no more day folders left, Sync says the app is up to date and changes nothing.
  • The last synced day is kept after a restart, so the next Sync continues from the correct day.
FeatureWhat changed1 story

Shows the user the effect of each Sync.

S21As a user, I want to see what changed after each Sync, so that I know what is new without hunting for it.
  • After a Sync, a summary shows the day that was synced, how many new transactions came in, and the list of those transactions with their amounts.
  • The summary also lists any duplicates merged, transfers or refunds matched, budgets newly gone over, and subscriptions, spending jumps or splurges newly flagged.
  • Transactions added by the latest Sync are marked as new in the transaction list until the next Sync.
Epic 6Find my way around easily2 features · 2 stories

The user wants one home screen that sums things up and a simple way to reach everything else, so the app is quick to use and they never get lost.

FeatureDashboard home1 story

Gives the user a single home page that summarises their money.

S22As a user, I want a dashboard as my home page, so that I see what matters at a glance.
  • Opening the app lands on the dashboard.
  • The dashboard shows this month's income and spending, the top spending categories, the safe-to-spend-today amount, any budget warnings, a savings summary (subscription count and monthly cost, spending jumps and splurges), and the Sync button with the last synced date.
  • Each item on the dashboard links to its detailed view.
FeatureNavigation1 story

Makes every part of the app easy to reach.

S23As a user, I want the same navigation on every page, so that I can always get where I need to go.
  • A navigation menu on every page links to the dashboard, transactions, income and spending breakdown, savings, budgets and accounts.
  • The menu highlights the section the user is currently in.
  • Every page can be reached within two clicks from the dashboard, and every page has a one-click way back to the dashboard.
Plan 5

Sprint

approved
3,412 words · 6 epics · 21 features · 28 stories · 84 points

The hierarchy plus story points per story, a sprint goal, and an explicit two-week commitment: which stories are in, which are out.

The brief, as this plan restates it

Goal: Give one person a single, trustworthy picture of their money across all their bank accounts so they can see where it goes and spend less.

The user has accounts at several banks, and each bank produces statements in its own format. The app reads all of them and works out which account each statement belongs to. It combines them into one picture and handles three cases so nothing is counted wrongly: money moved between the user's own accounts is not counted as income or spending, charges that appear twice are counted once, and refunds go back to the category they came from. It shows where money comes from and where it goes, by category and by merchant, and the user can click down to the actual transactions. Statement text is messy, so the app cleans up merchant names. It categorises transactions using the starter rules in fixtures/categories.json, and the user can correct a wrong category. To help the user save, it points out subscriptions, anything that jumped this month and one-off splurges. The user can set monthly budgets, is warned when they go over, sees how much they can still safely spend today, and can add a note to any transaction. The six months of history (January to June) are in fixtures/statements/. Each day's new exports land in fixtures/sync/, one folder per day. Each press of a Sync button takes in the next day's folder and shows what changed. The app must be easy to find your way around, with one dashboard as the home page.

Epic 1Get all my accounts in one place2 features · 3 stories · 12 pts

The user wants every bank's records in a single app so they never have to check each bank separately.

FeatureStatement import1 story · 8 pts

Reads every statement the user has, whatever bank it came from, and turns it into transactions.

S1Read every bank's statements. As a user, I want the app to read all my statements no matter which bank produced them, so that I never have to convert or retype anything. 8 pts
  • Every file in fixtures/statements/ loads without error on first start.
  • Each imported transaction has a date, amount (negative for money out, positive for money in), original description and account.
  • The number of transactions imported from each file matches the number of transaction rows in that file.
  • A file that cannot be read is listed by file name with a reason, and the other files still import.
FeatureAccount recognition2 stories · 4 pts

Works out which of the user's accounts each statement belongs to.

S2Recognise which account a statement is for. As a user, I want each statement matched to the right account automatically, so that transactions from different accounts are never mixed up. 3 pts
  • Each statement is assigned to exactly one account.
  • Statements from the same account in different months are assigned to the same account.
  • An accounts list shows every recognised account with its bank and a label that identifies it, such as its last four digits.
  • The total of each account's transactions in the app equals the total in its source statements.
S3Rename an account. As a user, I want to give an account a friendly name, so that I recognise it at a glance. 1 pt
  • The user can edit an account's display name from the accounts list.
  • The new name appears everywhere the account is shown.
  • The name persists after the app restarts.
Epic 2Trust that the totals are right3 features · 4 stories · 13 pts

The user wants totals they can believe, without inflation from internal moves, repeated charges or refunds.

FeatureTransfer matching1 story · 5 pts

Recognises money moved between the user's own accounts.

S4Recognise transfers between my accounts. As a user, I want money moved between my own accounts recognised as a transfer, so that it is not counted as income or spending. 5 pts
  • An outflow from one of the user's accounts and an inflow of the same amount to another of their accounts within 3 days are linked as a transfer pair.
  • Both sides of a transfer pair are excluded from income and spending totals.
  • In transaction lists, both sides are labelled "Transfer" and name the other account.
  • A transaction with no matching other side stays in the totals.
FeatureDuplicate detection2 stories · 5 pts

Makes sure a charge that shows up more than once is counted once.

S5Count repeated charges once. As a user, I want a charge that appears twice to be counted only once, so that my spending isn't inflated. 3 pts
  • A transaction with the same account, date, amount and description that appears in two files or exports is counted once.
  • Importing the same statement a second time leaves every total unchanged.
  • The hidden copy can still be seen, marked "Duplicate" with a link to the copy that was kept.
S6Overrule a duplicate flag. As a user, I want to mark a flagged duplicate as a real separate charge, so that a genuine repeat purchase is counted. 2 pts
  • A "Not a duplicate" action on a flagged transaction adds it back into the totals.
  • The decision persists after a restart and after later syncs.
FeatureRefund matching1 story · 3 pts

Sends refunds back to where the money originally went.

S7Put refunds back where they came from. As a user, I want a refund matched to the original purchase and credited to the same category, so that each category shows what I really spent. 3 pts
  • A refund from a merchant is linked to an earlier purchase from the same merchant for the same or a larger amount, when one exists.
  • The refund reduces spending in the original purchase's category and is not counted as income.
  • A refund with no matching purchase reduces spending in that merchant's usual category.
  • The refund's detail shows the linked original purchase.
Epic 3See where my money comes from and goes7 features · 11 stories · 30 pts

The user wants to understand their income and spending at a glance and check the details behind any number.

FeatureHome dashboard1 story · 3 pts

One home page that summarises the user's money.

S8Dashboard as home. As a user, I want a dashboard as the home page that shows money in, money out and the net for a month, so that I see where I stand as soon as I open the app. 3 pts
  • Opening the app lands on the dashboard.
  • It shows money in, money out and net for the latest month in the data by default, excluding transfers and duplicates.
  • A month selector switches the figures to any month that has data, January onwards.
  • Every other area of the app can be reached from the dashboard in one click.
FeatureNavigation1 story · 1 pts

Makes the app easy to find your way around.

S9Consistent menu. As a user, I want the same menu on every page with a link back to the dashboard, so that I never get lost. 1 pt
  • Every page shows the same menu, with the current page highlighted.
  • Selecting "Dashboard" from any page returns to the home page.
FeatureCategory and merchant breakdowns2 stories · 5 pts

Shows where money comes from and goes, grouped in useful ways.

S10Breakdown by category. As a user, I want income and spending broken down by category for a chosen month, so that I know where my money comes from and goes. 3 pts
  • Income categories and spending categories are listed separately, each with a total, sorted from largest to smallest.
  • The category totals add up to the month's money in and money out shown on the dashboard.
  • Changing the month updates the breakdown.
S11Breakdown by merchant. As a user, I want spending broken down by merchant, so that I know which places take most of my money. 2 pts
  • Merchants are listed with the total spent and the number of transactions, sorted from largest to smallest, for the chosen month.
  • The merchant totals add up to the month's money out.
FeatureTransaction drill-down2 stories · 6 pts

Lets the user see the transactions behind any number.

S12Click down to the transactions. As a user, I want to click any total to see the transactions behind it, so that I can check where the number came from. 3 pts
  • Clicking a category total, a merchant total or a dashboard figure opens a transaction list filtered to match it.
  • The listed amounts add up to the total that was clicked.
  • Each row shows the date, merchant, account, amount, category and any transfer, duplicate or refund label.
  • Clicking a row opens its detail, which includes the original statement text.
S13Search and filter transactions. As a user, I want to search all transactions by text and filter them by account, category and date range, so that I can find a specific payment quickly. 3 pts
  • A text search matches both cleaned merchant names and original statement text.
  • Account, category and date-range filters can be combined, and the results update to match.
  • The list shows the number of results and their total.
FeatureMerchant name cleanup1 story · 5 pts

Turns messy statement text into recognisable merchant names.

S14Clean merchant names. As a user, I want messy statement text turned into a clean merchant name, so that the same shop always appears under one name. 5 pts
  • Different raw descriptions for the same merchant (for example, with store numbers, reference codes or card prefixes) are shown under one clean name.
  • No transaction is shown with a blank merchant name.
  • The original statement text is still visible in the transaction detail.
  • The merchant breakdown groups by the clean name.
FeatureCategorisation3 stories · 8 pts

Gives every transaction a category and lets the user correct it.

S15Automatic categories. As a user, I want each transaction categorised automatically using the starter rules, so that the breakdowns work without manual tagging. 3 pts
  • The rules in fixtures/categories.json are applied to every imported transaction.
  • Every transaction has exactly one category, and transactions that match no rule are shown as "Uncategorised".
  • Transactions that arrive through Sync are categorised the same way.
S16Fix a category. As a user, I want to change a transaction's category, so that mistakes are corrected and the totals reflect reality. 2 pts
  • The category can be changed from the transaction list or the transaction detail.
  • Breakdowns and dashboard totals update immediately.
  • The change persists after a restart and is not overwritten by later syncs.
S17Apply a fix to the whole merchant. As a user, I want to apply my category fix to all transactions from that merchant, including future ones, so that I don't have to fix it again. 3 pts
  • When changing a category, the user can choose "Apply to all from this merchant".
  • All existing transactions from that merchant move to the new category.
  • New transactions from that merchant that arrive through Sync get the new category.
FeatureTransaction notes1 story · 2 pts

Lets the user record context on any transaction.

S18Add a note to a transaction. As a user, I want to add a note to any transaction, so that I remember what it was for. 2 pts
  • A note can be added, edited and removed from the transaction detail.
  • Transactions with a note show a note marker in lists.
  • Notes persist after a restart and after later syncs.
Epic 4Spot ways to save4 features · 4 stories · 13 pts

The user wants the app to point out where they could cut back without having to analyse everything themselves.

FeatureSubscription finder1 story · 5 pts

Finds recurring charges the user may have forgotten about.

S19List my subscriptions. As a user, I want recurring charges found and listed, so that I can cancel the ones I don't need. 5 pts
  • A merchant that charges a similar amount (within 10%) at a regular interval three or more times is listed as a subscription.
  • Each subscription shows the merchant, typical amount, how often it charges, the date of the last charge and the estimated cost per year.
  • A merchant charged only once or at irregular times is not listed.
FeatureMonth-on-month jumps1 story · 3 pts

Highlights spending that rose sharply this month.

S20Show what jumped this month. As a user, I want to see categories and merchants whose spending jumped this month, so that I notice changes early. 3 pts
  • The month's spending in each category and at each merchant is compared with its average over the previous three months.
  • Anything that rose by more than 25% and by at least 20 in currency units is flagged.
  • Each flag shows the previous average, this month's amount and the difference, and clicking it opens the transactions behind it.
FeatureSplurge spotting1 story · 3 pts

Catches unusual one-off big purchases.

S21Spot one-off splurges. As a user, I want unusually large one-off purchases pointed out, so that I can see which impulse spends add up. 3 pts
  • A purchase more than three times the typical (median) purchase in its category, at a merchant that is not a subscription, is flagged as a splurge.
  • Transfers and subscription charges are never flagged.
  • Splurges for the chosen month are listed with date, merchant, amount and category.
FeatureSavings hints on the dashboard1 story · 2 pts

Brings the savings findings to the home page.

S22Savings hints at a glance. As a user, I want the dashboard to show the top savings hints, so that I see them without having to look for them. 2 pts
  • The dashboard shows the number of subscriptions with their monthly total, the three biggest jumps, and the month's splurges.
  • Each hint links to its full list.
Epic 5Stay within my monthly limits3 features · 4 stories · 10 pts

The user wants to set limits on their spending and know, every day, whether they are on track.

FeatureMonthly budgets2 stories · 5 pts

Lets the user set and track spending limits.

S23Set monthly budgets. As a user, I want to set a monthly budget for any spending category, so that I have a limit to aim for. 3 pts
  • The user can set, change and remove a monthly amount for each spending category.
  • Budgets apply to every month until changed.
  • Budgets persist after a restart.
S24See budget progress. As a user, I want to see how much of each budget I have used this month, so that I know where I stand. 2 pts
  • Each budgeted category shows the amount spent, the budget, the amount remaining and the percentage used for the chosen month.
  • Spent amounts exclude transfers and duplicates and are reduced by refunds.
FeatureOverspend warnings1 story · 2 pts

Tells the user when they have gone over.

S25Warn me when I go over. As a user, I want a clear warning when a category goes over its budget, so that I can react before the month ends. 2 pts
  • A category over budget is shown in red on the budgets page and on the dashboard, with the amount it is over by.
  • If a sync pushes a category over budget, the warning appears in that sync's summary.
FeatureSafe to spend today1 story · 3 pts

Tells the user how much they can still spend today without breaking their budgets.

S26How much I can safely spend today. As a user, I want to see how much I can still safely spend today, so that I can make everyday decisions without doing the maths. 3 pts
  • "Today" is the date of the latest day taken in by Sync, or the last statement date if nothing has been synced yet.
  • The figure equals the total budget minus budgeted spending so far this month, divided by the number of days left in the month including today.
  • When the budget is already used up, the figure shows 0 with a message saying the budget is spent.
  • The figure is shown on the dashboard with a one-line explanation of how it was worked out, and it updates after each sync.
Epic 6Keep up with each day's new spending2 features · 2 stories · 6 pts

The user wants the picture to stay current as new transactions arrive, and to see what each update changed.

FeatureDaily sync1 story · 3 pts

Pulls in the next day's new transactions on demand.

S27Sync the next day. As a user, I want a Sync button that pulls in the latest transactions, so that my picture is always up to date. 3 pts
  • Each press of Sync takes in exactly the next unprocessed day folder in fixtures/sync/, in date order.
  • New transactions go through the same account recognition, categorisation, transfer, duplicate and refund handling as imported statements.
  • A day already taken in is never taken in again, including after a restart.
  • When no folders are left, Sync shows "Up to date" and changes nothing.
  • After a sync, a message shows which day was added and how many new transactions came in.
FeatureChange summary1 story · 3 pts

Shows exactly what each sync changed.

S28Show what changed. As a user, I want a summary of what each sync changed, so that I can see today's activity at a glance. 3 pts
  • After a sync, a summary lists each new transaction with its merchant, amount and category.
  • It shows how the month's money in and money out changed, and lists any new budget warnings, subscriptions or splurges.
  • Transactions added by the latest sync are highlighted in transaction lists until the next sync.
Sprint goal.

By the end of the two weeks, the user can open the dashboard and see one accurate picture of money in and out across all their accounts for any month from January to June. Transfers, duplicate charges and refunds are handled correctly, and the user can click any category down to its transactions and press Sync to take in the next day's transactions.

CommitmentTotal committed: 37 points

In

  • S1 — Read every bank's statements (8 points)
  • S2 — Recognise which account a statement is for (3 points)
  • S4 — Recognise transfers between my accounts (5 points)
  • S5 — Count repeated charges once (3 points)
  • S7 — Put refunds back where they came from (3 points)
  • S8 — Dashboard as home (3 points)
  • S10 — Breakdown by category (3 points)
  • S12 — Click down to the transactions (3 points)
  • S15 — Automatic categories (3 points)
  • S27 — Sync the next day (3 points)

Out

  • S3 — Rename an account (1 point): accounts are already identifiable by bank and last four digits.
  • S6 — Overrule a duplicate flag (2 points): rare, and exact-match detection keeps false flags low.
  • S9 — Consistent menu (1 point): the dashboard already links to every area.
  • S11 — Breakdown by merchant (2 points): more useful once merchant names are cleaned (S14).
  • S13 — Search and filter transactions (3 points): drill-down covers checking totals for now.
  • S14 — Clean merchant names (5 points): a polish step; raw names are readable enough to start with.
  • S16 — Fix a category (2 points): the starter rules come first; corrections can come next sprint.
  • S17 — Apply a fix to the whole merchant (3 points): depends on S16.
  • S18 — Add a note to a transaction (2 points): standalone, and nothing else depends on it.
  • S19 — List my subscriptions (5 points): savings insights need the accurate base built first.
  • S20 — Show what jumped this month (3 points): savings insight, builds on the category breakdown.
  • S21 — Spot one-off splurges (3 points): savings insight, builds on categories.
  • S22 — Savings hints at a glance (2 points): depends on S19–S21.
  • S23 — Set monthly budgets (3 points): budgeting comes after the picture is trustworthy.
  • S24 — See budget progress (2 points): depends on S23.
  • S25 — Warn me when I go over (2 points): depends on S23 and S24.
  • S26 — How much I can safely spend today (3 points): depends on budgets.
  • S28 — Show what changed (3 points): Sync already reports the day added and the new transaction count; the full summary can follow.

The test data: three banks, three formats

Made-up statements, January to June 2026, from three banks with one account each. Every bank exports its own layout, the way real banks do, and the app has to work out which account each file is.

Harbor Bank

harbor_bank.csv

Signed amounts, ISO dates, an account number on every row. Salary, rent, bills, groceries.

Date,Description,Amount,...
2026-04-12,Whole Foods Market,-63.40,...

Summit Card

summit_card.csv

US dates, separate Debit and Credit columns, a transaction date and a posted date. Dining, shopping, subscriptions.

Transaction Date,Posted Date,...,Debit,Credit
03/31/2026,04/01/2026,...,48.50,

Pinecrest Credit Union

pinecrest.ofx

OFX, the format banking software exchanges. Transfers in, interest, some everyday spending.

<STMTTRN>
<TRNTYPE>XFER
<TRNAMT>500.00

The traps planted in the data

Own-account transfers

A 500.00 transfer and a 800.00 card payment every month. Neither is spending.

A row listed twice

Same transaction id, back to back. It counts once.

A refund

An Amazon purchase and its 129.00 refund in February. They cancel out.

A month boundary

A 48.50 pizza bought on 31 March, posted on 1 April. It belongs to March.

Messy merchant names

The same coffee shop appears as SQ *BLUE BOTTLE COFFEE SF CA and BLUE BOTTLE COFFEE 0142.

A merchant with no category

A garden center no rule knows. The demo fixes GREENLEAF to Shopping, and the totals must follow.

A splurge

2,000.00 at Best Buy in March, the only electronics purchase in the six months.

The budget alert

A 145.00 dinner on 31 May pushes Dining past a 200.00 budget. Only May goes over.

Daily sync overlaps

Each day's export repeats the last days. Two Syncs add 10 new transactions and nothing twice.

Safe to spend today

On 2 July, with a 200.00 Dining budget, 5.38 is safe to spend on Dining for the day.

How a run works

1
I approve the five plans, on camera. Approved text is frozen and fingerprinted. A plan that changes afterwards cannot be built.
2
A different AI writes the hidden exam. Codex (Gemini as backup) gets the brief, the answer key and the list of numbers we can read from any app, never a plan, and writes 18 to 30 checks with exact numbers. I skim it. It never reaches a build.
3
One smoke build first. One plan, one build, about an hour. If anything in the harness is off, it shows up here, before the full run.
4
The full run: 25 builds. Five plans, five builds each, three at a time. Each build is one Claude Opus 5.5 session, at high effort, alone in a fresh copy of the same empty app, reading only its plan. Up to 90 minutes and 500 turns. No web access.
5
Every build is tested from the outside, after it finishes. The builder never sees a test. A different AI reads the finished code and writes a small driver for that one app: how to upload the statements, fix a category, set a budget and press Sync, and where to read the numbers. The same demo then runs through every app's driver, with screenshots. Exact checks read the totals, the merchant fix, the alerts and safe to spend, and compare them with the answer key. A judge from another AI grades the rest from the screenshots and rates the design from 1 to 5.
6
My hands-on review. The best build of each plan, plus every build where the exact checks and the judge disagreed. I use each one like a real user, with the demo data already in it, and mark it ship, fix or junk without knowing which plan made it.
7
The summary. Every number computed from the raw data, and all raw logs kept in the public repo.

The demo every build goes through

01 · Import

All three statements uploaded in one go.

02 · Fix a merchant

GREENLEAF set to Shopping.

03 · Dashboard

Where the money went.

04 · Budget alert

Dining budget of 200.00. May should go over by 38.12.

05 · Sync twice

Two days come in. Safe to spend today: 5.38 on Dining.

Keeping it fair

  • The same brief, byte for byte, goes into every plan.
  • The builder never sees a test: no fixed pages, no API, no exam. Testing happens from outside, after the build is done.
  • Same model, same limits, same empty starter app for every build.
  • Plans are frozen before the exam exists, so the exam cannot be shaped around a plan.
  • The exam and the answer key never reach a build. Every build is scanned before and after it runs, and a contaminated build is thrown out.
  • Judges never learn which plan made a build. Neither do I, until my last verdict is in.
  • A build that crashes, times out or stops to ask a question is recorded as exactly that, never as a pass.

What gets measured

Does it run

Boots with one command and answers its health check.

Is it right

Exam score: scripted checks against exact numbers, plus judged checks.

Is it good

Design score from a judge, and my blind ship, fix or junk.

What it cost

Minutes, tokens as a cost estimate, lines of code.

How it ended

Finished, timed out, or stopped by a limit.

How consistent

How far apart five builds of the same plan land.

Time

StepWhatHow long
Smoke buildOne plan, one build, then compare and review.About an hour
Full run25 builds, three at a time, resumable if a usage limit hits.About 5 to 12 hours, overnight
My timeApprove the plans, skim the exam, blind review.About 2 hours in total

Follow along