Technology

Engine-first, AI-assisted.

AI understands intent and predicts. A deterministic engine produces every authoritative figure. Security is evaluated for the actual person on every path. Here is how that works in the current build.

Separation of responsibilities

Three layers, three jobs, no overlap.

Language layer (LLM)

Intent, clarification, layout, narration

  • Proposals validated against an allow-list and a schema
  • The user confirms a restated goal before anything runs
  • No code path writes a model response into a stored number
  • Its output carries no provenance label - deliberately
ML layer

Forecasts, trends, anomalies

  • Always stored and shown as predictions
  • Drawn as separate series, never mixed into actuals
  • Runs on the history the requesting user can see
Deterministic driver engine

Every authoritative figure

  • Exact decimal arithmetic
  • No floating point, clock or randomness
  • Linked to driver version and calculation run
  • Replay check confirms results still match

In the recorded demo the language layer is a local open-weight model (Qwen 2.5 Coder through Ollama). A language model is optional: without one, a deterministic parser handles every action.

Deterministic engine & scenarios

Figures you can open and trace.

  • Driver formulas are parsed by the engine and never executed as code.
  • Records are pre-aggregated per unit, period and attribute as they are written; screens read compact cells, never raw transactions.
  • Opening a figure shows its provenance tag, formula and version, calculation run, inputs and the contributing units with their effective weights.
  • The goal-seeking scenario engine searches for options computed by the driver engine on the organisation's own data.
Planning screen with budget variance by outlet
Variances and group totals are engine figures, never sums calculated in the browser.
Semantic binding

Screens bind to meaning, not to tables.

By name

Objects bind to the measures, units and dimensions of the live model - never to raw tables or hand-written queries.

Only what you may see

The binding catalogue offers only what the author is allowed to see; anything else is marked as not bound instead of guessed.

Values at view time

A screen stores names. Values exist only when someone views it, and are composed for that person.

Live progress panel for a running action sequence
Status lines describe the work in words and never contain a number.
Execution

Actions run as the person who clicks.

  • The browser sends only which screen and which button; the action comes from the stored screen version and is re-validated on every run.
  • Forecasts always take the ML path; recalculation always takes the deterministic path; scenarios take the path the author chose. The path is recorded.
  • Long work runs in a worker pool; each step commits on its own, so finished steps stay done.
  • Outcomes are distinct: finished, stopped part way, could not finish, or not allowed for your role.
Security

Authorisation evaluated for the actual person.

Tenant isolation

Every tenant row carries its organisation, and the data layer applies that boundary to every query. Sessions are server-side with anti-forgery protection.

Two-axis permissions

Roles grant verbs on modules. Access is scoped by organisation units and by measures (all, an allow-list, or all except a deny-list), evaluated together on every request.

Per viewer, clicker and recipient

Composition reads only the cells inside the person's scope. Out-of-scope units, hidden measures and missing data all return the same empty result.

Database backstop In validation

PostgreSQL row-level security on every tenant table has been built and is being validated on PostgreSQL.

Auditability

Who changed it, who published it, who received it.

  • Data writes with before and after values.
  • Screen versions and publishing, with the approver.
  • Button executions: actor, button, action class, path, parameters, outcome.
  • Every send and trigger firing, down to the evaluated value and each recipient's outcome.
Audit log entries
The audit log in the current build.
Architecture

A modular monolith with separated engines.

Experience tier
React + TypeScript web appOne screen renderer for viewers, canvas and dashboards
API
FastAPI (Python)Composition serviceAction dispatcherLanguage gateway
Engines
Driver engineML layerScenario orchestratorRender & export pipeline
Workers
Event outbox for pre-aggregationJob queue with leased, exactly-once claimsCoordinated schedulerDistribution
Data
PostgreSQL (validation in progress)SQLite for local development and testsAudit & provenance
Optional
Local language modelRedis cacheAccounting connectors

Build status: pre-production. Scale testing and PostgreSQL validation are in progress.