Technology
How we build Norman: AI agents that do real bookkeeping and tax work, and the systems that keep them correct. Notes straight from the team.
Half our background jobs had a deadline nobody chose
A command-line default in our container image was quietly capping every background task at 120 seconds, including batches that make dozens of model calls. Fixing the number was the easy half. The hard half was teaching the jobs how to die.
We do not write test cases for our AI. Production does.
Hand-written golden datasets rot the week you write them. Our regression suite for AI categorization is generated from real user corrections, gated by a rule that a miss has to happen three times before it earns a test. Here is the pipeline, the numbers behind it, and the hinge that was quietly broken.
Our agent has 102 tools. The engineering is in what it never sees
Every instinct in agent design right now is additive: more tools, more instructions, more memory. Norman exposes 102 tools and 19 workflow playbooks, and almost every architectural decision we made was a subtraction. Here is what we take away from the model, and why the agent is better at its job for never knowing what step it is on.
Our batch scheduler is really a load balancer
Every night Norman balances two very different tenants on the same workers: patient, network-bound bank syncs, and hungry, compute-bound AI jobs that read receipts and categorize a constant stream of transactions. This is how we treat the scheduler as a load balancer, sense queue pressure per workload, and where we are taking it next: placing the heavy AI work by live load instead of a hand-picked cron minute.
How we trace every AI agent run without storing your data
Every model call inside Norman leaves an audit trail: which workflow, which model, what it cost, how long it took. What it does not leave is your receipts and bank data. We store hashes, not payloads. Here is the observability layer behind our agents.
How our categorizer learns from a single correction
Every transaction on Norman gets a category, and most of them never touch the model. The interesting engineering is not the LLM: it is turning one manual correction into a per-company memory that never leaks, has to earn trust, and can be proven to stick. Here is the design.
How we built an agent that files your VAT return
Autofiling prepares and submits your German UStVA end to end. The hard part was never the model — it was making a stochastic agent safe enough to perform a legal filing. Here is the design.