Reading a production lender's interest engine — and a latent defect caught in the read
A South African consumer-lending platform runs its entire debt-consolidation business on a large, mature Mendix™ application. The financial heart of it — the interest-accrual engine — was understood by only a handful of people. mxto read the whole application offline in under two minutes, handed back an auditable specification of that engine, and in the course of simply reading the model, caught a dormant correctness defect that years of production had not.
The situation
The platform's application is 77 modules, ~990 entities, ~3,500 microflows, 745 pages, evolved over years. Every month, for every active loan, the interest engine re-derives interest from the account's transaction history and an effective-dated rate schedule. Logic of that importance, buried in thousands of microflows, is exactly the kind of thing that becomes institutional risk: only a few people understand it, and no one can easily prove it still does what the business thinks it does.
The goal was concrete — understand the interest engine well enough to maintain it safely, and produce a durable, auditable specification of it, without a lengthy manual code-reading exercise.
What mxto did
Pointed at the application's model file, mxto extracted the entire application in 112 seconds — fully offline, with no access to Mendix's own SDK. It then re-extracted and compared: a 100% round-trip with zero differences, establishing a trustworthy “before” picture you can build on.
From there it produced a human-readable rendering of the interest logic and an auditable domain-rule specification of the accrual engine: the five governing entities, the full trigger-to-posting cascade (daily scheduled event → per-account interest posting → recompute → instalment generation), the effective-dated rate-segment logic, and the interest formula — including the day-count convention and how accrued interest compounds.
It also surfaced a first-order design fact a casual read would miss: interest is computed by one of three configurable strategies, selected by a global settings record. So “the interest calculation” is not one algorithm but three — and any change has to account for that.
The standout moment
While transcribing the leap-year day-count, mxto's rendering made the logic legible enough to notice that the century-year rule was inverted: years divisible by 400 were being treated as 365-day years (they are leap years, 366), and years divisible by 100 but not 400 as 366-day years (they are not). The finding was then verified against the raw model expression — confirmed real, not a reading artifact.
The defect is dormant: no live loan's interest-year basis lands on a century year before 2100, so it has never mispriced a single account. But it is a genuine latent correctness bug that had sat in production, unseen, for years — found in the course of simply reading the model, and triaged with a “log it for the next time this engine is touched” note rather than raised as a false alarm.
Outcome & value
- Comprehension risk retired. A money-critical engine that lived in a few people's heads is now a written, reviewable specification — the durable asset every future interest-logic change is validated against.
- A latent defect caught early, proportionately. Found, verified, and correctly triaged as non-urgent — the kind of quiet correctness issue that audits and manual reviews routinely miss.
- Speed and reach. Whole-application understanding in minutes, offline, with no SDK licensing and no runtime — turning “we'd need weeks to safely touch this” into a same-day exercise.
- A reusable method. The same read-and-specify pass applies to any module of the app, and to any Mendix™ application.
Evidence
| Fact | Measure |
|---|---|
| Application scale | 77 modules · 992 entities · 1,209 associations · 264 enumerations · 3,444 microflows · 745 pages |
| Full extraction | 112 seconds — mpr-direct, fully offline, no Mendix™ SDK |
| Fidelity of the read | re-extracted with zero differences (verified round-trip) |
| Interest engine specified | 5 governing entities, ~11-flow cascade, 3 configurable strategies |
| Finding | 1 verified latent defect (leap-year century inversion), dormant until 2100 |
Extraction, fidelity, and the defect finding are final and verified. Some domain-intent specifics raised by the spec (e.g. which of the three strategies is live in production) are under confirmation with the platform's domain experts and are deliberately not stated here.
How much of your most important business logic exists only in someone's head?
mxto turns it into a spec — offline, in minutes, on any Mendix™ application, with the read proven by a zero-difference round-trip. Bring your own AI agent; mxto is the toolchain it drives.