Ledger
A document pipeline that extracts structured records from inconsistent supplier invoices, validates them in code, and routes only its own uncertainty to a person.
Prism is a concept demonstration built to test a specific claim we were sceptical of: that natural language is a good interface to a data warehouse. Our conclusion is that it can be, but only when the system refuses to interpret the business meaning of a question on its own.
Technologies
“Text to SQL” demos work because the question is simple and the schema is small. Real warehouses have hundreds of tables, several plausible definitions of revenue, and columns nobody should be able to read.
The failure mode that matters is not a syntax error — those are caught immediately. It is a query that runs cleanly, returns a number, and quietly answers a different question from the one that was asked.
A question is resolved in two stages. First the system matches the words in the question against a metric layer — a small set of certified definitions with owners and review dates. Then it plans a query using only those definitions, the permitted schema subset, and an explicit grain.
The plan is produced and displayed before any SQL is generated. A visible plan turns a wrong answer into a debuggable one: you can see that the system chose weekly rather than monthly grain, or the uncertified metric rather than the certified one.
When a question cannot be mapped to a certified definition, Prism says so and offers the nearest definitions rather than guessing. Refusing to answer is a feature of an analytics tool, not a shortcoming.
Every answer arrives as four things at once: a chart, the definition used, the SQL that ran, and any caveat the guards raised. All four are visible without a click, because the caveat is the part people skip when it is hidden.
The concentration warning turned out to be the most valuable element. “Refunds rose 2.4 points” is a different fact from “one store accounts for 71% of that rise,” and a chart alone will not tell you which you are looking at.
We wrote an evaluation set of question–plan pairs rather than question–answer pairs. Asserting on the plan catches the dangerous class of failure: the right-looking number computed from the wrong definition or grain.
A second set contains questions the system should refuse — requests for masked columns, questions resting on uncertified metrics, and questions whose grain is genuinely ambiguous. Correct refusal is scored as a pass.
Permission behaviour is covered by conventional integration tests per role, asserting that forbidden tables are absent from the generated plan rather than merely absent from the result.
A document pipeline that extracts structured records from inconsistent supplier invoices, validates them in code, and routes only its own uncertainty to a person.
An operations workflow that triages inbound requests, acts on the routine ones within written policy, and escalates everything else with its context already assembled.
We like ambitious problems — the ones with awkward constraints, messy data and a real cost attached to getting them wrong. Tell us what you are building and what makes it hard.