Financial company · case study

Fourteen years of data made safe for AI to use without rewriting the system: personal data stripped before any model sees it, every figure checked against the source, and every AI query on the record.

A financial company ran its whole operation on mobile since 2012, yet every new number was a request to one developer. We built a separate, read-only layer beside the system: dashboards on the full data set, an AI assistant with the company’s context, and periodic reports written in plain language.

names reach the model · personal data stripped on the way in
0
names or identifiers in what the model reads
A nightly copy of the database strips personal data on the way in, so the model never sees a name. Only allowed columns are copied, a test fails if a forbidden one is added, and the import stops if an identifier slips through.
Enforced on every import by a column allowlist, a forbidden-column test and a check that fails closed, leaving the previous copy in place.
every figure computed · matched to the source
every figure checked against the source
Every figure on the dashboards, in the reports and in the assistant’s answers was computed twice, once by the product and once by hand against the source database, until the two matched exactly. The model reuses those checked formulas; it doesn’t do the math.
Checked against the source data by us; the business definitions behind each figure are reviewed with the owner.
AI query logged · with its sources
Every
assistant query on the record, with its sources
Every answer lists the queries behind its figures, and every call the assistant makes is logged with its parameters, the rows it returned and its cost, under a monthly spend cap.
Assistant runs are logged call by call; every request to the system also writes a trace record.

A financial company had run its whole operation on mobile since 2012, with plenty of it automated and structured, yet every new number was a request to one developer. We built a separate layer beside the system, without rewriting any of it: dashboards on the full data set, an AI assistant with the company’s context, and periodic reports written in plain language. Personal data is stripped before any model sees it, and every AI query is on the record. We name the practice, not the client.

The Situation

The company has hundreds of reps in the field, and its operation has run on mobile since 2012: fourteen years of real, structured data. Yet the system around that data is a legacy one, with little insight beyond a simple summary view. Every additional data point was a request to the developer who started the project fourteen years ago and has maintained it since. Reports were the same story: a one-time pull, or the cost of automating them properly.

The owner wanted to ask the business questions and trust the numbers that came back. The obstacle was not the model. The data holds personal and financial details about the company’s customers, so pointing an AI tool straight at the database was never an option, and a number nobody can trace back is worse than no number.

What We Did

Nothing in the existing system was rewritten. We built a separate, read-only layer beside it.

Every night, a copy of the database is taken with personal data stripped on the way: names, identity numbers, contact details, addresses and free text never make it across, and customers become tokens that can’t be reversed. Only allowed columns are copied, and the import fails closed: if an identifier slips through, the previous copy stays in place.

Numbers are made one way only. A catalogue of typed, hand-written queries is the only thing that reads the copy, through a database role that can read and nothing else, so read-only is enforced by the database, not by a prompt. The dashboards, the API and the assistant all use the same queries, so a figure is the same whether it comes from a chart, a report or a chat.

The assistant carries the company’s context and answers through those queries. The figures it shows are re-run by the system, never copied from the model’s text, and every answer lists the queries behind it. Periodic reports are prompts written in plain language, run on a schedule or on demand, with every version kept, and they can be expanded from a phone by asking for more.

Before any of it was shown, every figure was computed twice, once by the product and once by hand against the source, until the two matched exactly. Checking rather than assuming also surfaced what an audit would: dates stored in more than one encoding, status codes with no legend, and two sources in the system that disagree. Those became questions for the owner, not assumptions baked into the numbers.

What Moved

The owner now asks the business questions on a phone: dashboards with depth into collections, arrears, field visits and cost per rep, an assistant that works from the company’s own rules and shows where each figure came from, and monthly reporting that grows by asking the right questions. The model reads a copy with no names in it. Every AI query is logged with its parameters, the rows it returned and its cost, under a spend cap.

Where It Went

It isn’t modernized software yet. It’s a window into the current system: the owner can talk to AI about the company, based on real data and the business’s actual rules. The next step is going through the definitions with the owner, so the numbers mean exactly what the business means, and what the checks exposed underneath is where a modernization would start, if the business wants one.

your system next

If This Sounds Like Your Codebase, start with a call.

A free 30-minute call scopes the next step, for a system like this one, usually the audit: a diagnosis of the code you actually have, free for now, report in hand before you commit to anything further.

newsletter

Notes on Building High-Quality Software

A short founder’s note and a digest of what we’ve published, sent only when there’s something worth the inbox.

No sequence · Unsubscribe in one click