Two AI desks: one archives, one acts
On 14 October PFEx gained a second AI role, the Settlement Desk. It and the Research Desk are two very different designs. The Research Desk is not real-time: it files one report whenever a period closes. The Settlement Desk is real-time: you talk to it any time. It grew from a chat box into a private finance agent with skills covering almost every data operation in the app, though it still files a draft and waits for approval before it writes.
On 14 October PFEx gained a second AI role: the Settlement Desk. Before that there was only one, the Research Desk's chief strategist.
Both look like "the AI inside the app", but underneath they are two different designs. Let me draw that line first, then show how the Settlement Desk grew from a chat box into an agent that gets things done.
One archives, one talks
The Research Desk is not real-time. Its chief strategist only writes when a week, a month, or a year closes. What it writes is archived, filed by genre and period, and stays there to be read again whenever you want. Its shape is one-directional: I write, you read. You finish recording, it hands you a review. It reads the ledger, but you cannot ask it anything.
The Settlement Desk is real-time. You can ask about your books at any moment, and it reads and answers on the spot. It has no "publish" step, only question and answer.
That line is a design premise I set on purpose, not an implementation detail. The Research Desk's promise is "one worth keeping", so it needs a period, a final draft, and an archive. The Settlement Desk's promise is "an answer whenever you ask", so it needs the ability to read, to answer, and to act on the spot. Want the first, and you cannot make it real-time. Want the second, and you cannot pin the answers down in advance.
From talking to doing
When the Settlement Desk first shipped, the idea was simple: let it read the books, let it be questioned.
The first version took the cheap route and injected pre-aggregated numbers straight into the system prompt, letting the model answer from them. That fell apart fast: the model could only answer the questions I had predicted, and one extra follow-up exposed it. So it gained read access instead. Ten read-only tools, plus a sandbox that runs read-only queries, covering the overview, spend and income by category, account balances, transactions, net series, account candles, budget status, the leaderboard, and period comparison. A new question no longer needs me to write the answer into the prompt first; it goes and reads the ledger.
But reading is only half an agent. As the conversation went on, I started asking it to delete this transaction, change that account, stop that recurring rule. Rather than have it tell me "go change it on some page", it should just do it.
So I turned the app's data operations into skills it can call:
- transactions: create, update, delete, transfer, balance calibration
- accounts: create, update, delete
- categories: create, update, delete
- budgets (monthly and global): create, update, delete
- planned budgets (one-off earmarks): create, update, delete
- recurring rules (scheduled orders): create, update, delete
- draft orders: create, update, delete, confirm
With that spread across the app, almost every data operation has a skill behind it. The Settlement Desk is no longer "a chat box you can talk to" but a private finance agent that acts for you. That shift in form, from conversation to getting things done, is the part of this feature I most want to remember.
But it cannot write silently
The skills gave it the power to touch the ledger, and I did not dare let it write straight to the database. So a layer sits in the middle: no write skill takes effect immediately. It produces a draft, puts it on screen, and only runs when the user approves it. The model can draft; it cannot sign.
The principle is simple: reading can be open, writing has to pass through one human confirmation. The ledger is the user's single source of truth, and a model should never have the power to change it silently.
In the same commit, the snapshots went away
This is really the same change. There used to be three snapshot tables, filled by a periodic background job. Once the AI can query the raw ledger itself, that precomputation turns from an asset into a burden, and it adds a class of bug where a copy disagrees with the derivation: how did this month actually go, the UI ends up with two answers. So the tables are gone, and every statistic is computed straight from transactions. Deleting the redundant precomputation left fewer bugs behind.
Takeaways
- The Research Desk and the Settlement Desk are two modes: one archives without real time, one talks in real time. Not two flavors of the same thing, but two different product promises.
- The shift worth recording is the Settlement Desk going from "a chat box" to "an agent that acts": read tools for reading, skills covering the whole app for writing.
- I kept the writing step for the human: the model drafts, the user approves. Reading open, writing restrained.