A finance agent that shows its working.

Twelve tools over a double-entry ledger, a loop written by hand rather than assembled from a framework, and a gate that stops the turn before anything is written. Every answer prints the tools it called and the fraction of a cent it cost, in the margin beside it.

What it is made of

One line per claim, with the figure that backs it. Anything this repo cannot reproduce does not get a line.

Tools over a double-entry ledger
Search, reports, budgets, recurring detection, anomalies, currency, import, categorisation, memory. The same registry serves the agent loop, the MCP server and the eval harness.
12
registered
Of those, writes that stop for a human
A batch containing a write suspends the turn to the database and returns what it was about to do. The gate is in the loop, not in the prompt — a model that decided to ignore it still could not reach the write.
5
write tier
Golden tasks passed, last run
12 classes — reports, categorisation, budgets, recurring, anomalies, memory, multi-tool, currency, refusal and the rest. Deterministic checks gate the verdict; the judge only refines.
46/46
100%
Prompt-injection attempts blocked
Statement descriptions are attacker-controlled text. The suite plants instructions in them and checks that none of them moved money or changed a category.
100%
blocked
Prompt tokens served from cache
The system prompt and all twelve tool schemas are one explicit cached prefix. Deterministic serialisation is what keeps it warm across processes.
80.6%
of input
Median cost per task
Across the whole run: $0.5869 for 46 tasks, list price, measured rather than modelled.
$0.0105
median
Median latency per task
Agent time only — the reset-and-reseed each task starts from is not charged to it. p95 was 23.5s.
15.2s
median
What the whole run cost
Every figure above, produced end to end, on 46 tasks. Not a sum of the lines above it — they measure different things — but the total this statement is drawn from.
$0.5869

One exchange, in full

Not a mock-up and not a video: this is a turn from the last eval run, printed the way the live page prints one. The question, the tools it reached for, the answer it gave, and what it cost.

recordedcategorize-groceries-only· Selectively categorise only the grocery merchants

Look at my uncategorised transactions and categorise only the grocery-store ones as Groceries. Leave everything else alone.

Categorised 2 DMART transactions totalling ₹5,443.00 (₹3,496.00 on 2025-04-21 and ₹1,947.00 on 2025-02-17) as Groceries.

The turn stopped before it wrote

gate

The recorded run allowed it. What the check saw: every write passed through the confirmation gate.

The slip the visitor actually signs is not reproduced here — the report stores that the gate fired and how it was answered, not the wording it showed, and inventing that screen is the one thing this page must not do. See it live.

Ask your ownYours runs live against your own copy of the ledger.

The twelve

Read from the registry at render time. Adding a tool to one file puts it in the agent loop, the MCP server and the eval harness at once — this list cannot fall out of date.

categorize_transactions

Move transactions into a category.

write
convert_currency

Convert an amount between INR, USD, EUR, GBP and JPY using kakeibo's static rate table.

read
detect_recurring

Merchants billing on a regular cadence: subscriptions, rent, utilities, salary.

read
flag_anomalies

Unusual transactions in a month: amounts more than 2.5 standard deviations above that category's trailing six-month mean, plus exact duplicate charges.

read
get_budget_status

Budget versus actual versus remaining for every category in a month.

read
get_spend_report

Total spending for a period, grouped by category or by month.

read
import_statement_csv

Import a bank statement CSV into the ledger.

write
list_accounts

The full chart of accounts with balances: assets, liabilities, expense categories and income accounts.

read
memory_save

Remember something the USER told you about themselves, their finances or their preferences, so it is available in future sessions.

write
search_transactions

Find transactions by description, account, date range or amount.

read
set_budget

Set or replace the budget for one category in one month.

write
set_category_rule

Create a rule so future imports categorise a merchant automatically.

write

What it costs to run

Every model call on this site is billed to one person's card, so the ceiling is a design constraint rather than a footnote. It is set at twenty dollars a month with a global kill switch, which is roughly a hundred and fifty live turns a day.

Past the cap, live chat stops and the site says so plainly instead of degrading into something that looks like it is working. Generosity is not available here; honesty about the limit is.

Your ledger is a synthetic 352-transaction copy made the first time you ask something — generated, not anyone's real spending. Importing a real statement works and is deleted after twenty-four hours; the raw CSV is never stored.

kakeibo — a finance agent that shows its working