There is no model in this one
Eight of the ten demos on my site use one somewhere. This one deliberately does not. What a customer owes on a given day has exactly one right answer, it is arithmetic, and arithmetic that is occasionally creative is not a feature. Knowing which problems are not language problems is most of the job.
deterministic · auditable · boring on purpose
Proration is two lines, never one
The unused part of the old configuration is credited and the new one is charged for the days remaining. The net is identical to a single “difference” line — but this is the only version a customer can check against their own calendar, and the only one that still makes sense when it has to be refunded.
credit + charge · days, not guesses
Integer minor units, end to end
No float touches a total anywhere in the engine. Tax is computed on the amount after discounts and after credit is applied, not before — charging tax on money that was never taken is a real liability rather than a rounding quibble.
rappen · not 0.1 + 0.2
The same file runs in both places
The Worker imports the engine from the folder it serves to your browser, so there is one copy of the rules and no build step in between. Your browser runs the scenario, the server runs it, and the page prints both fingerprints. If they ever disagreed you would see it above.
one engine · two runtimes · same digest