Systems In Practice

Specifications

Formal specifications for lending and collections systems, stated as rules rather than guidance.

26+ topics 4 featured insights 67 tags See the Knowledge Map →
Showing 26 topics
Title Category
Technical
Sep 7, 2026

Working Out What Someone Paid When All You See Is a Balance

The money is collected by a platform we do not run. We never see the payments. What arrives is a single figure, now and then: what is currently owed. Last month it was 2,400 and today it is 2,150, so something has moved it by 250, and we have to decide what that means before we can say whether any instalment has been paid. Then the balance goes up, and that is where most approaches quietly go wrong. A rise is not a payment, but it is also not nothing. It might be interest, a fee, a correction, or a payment that has been reversed, and each of those needs handling differently. Treat them all the same and a customer who paid on time can have their paid instalments silently undone by an interest charge. This paper sets out how to decide what a balance movement actually was before doing anything with it. The rule is that the system checks for a record explaining the movement, and where there is no record it says so and stops rather than guessing. It then defines how to spread a genuine payment across instalments, how to unwind one properly when a payment is reversed, and what must always remain true throughout so that nobody ends up over-credited or wrongly un-credited. It also says plainly where this stops working. The approach depends on being told about interest, fees, and reversals. Where that information is missing it does not quietly approximate. It raises its hand and asks for help, which is the intended behaviour rather than a shortcoming.

9/7/2026 Working Out What Someone Paid When All You See Is a Balance The money is collected by a platform we do not run. We never see the payments. What arrives is a single figure, now and then: what is currently owed. Last month it was 2,400 and today it is 2,150, so something has moved it by 250, and we have to decide what that means before we can say whether any instalment has been paid. Then the balance goes up, and that is where most approaches quietly go wrong. A rise is not a payment, but it is also not nothing. It might be interest, a fee, a correction, or a payment that has been reversed, and each of those needs handling differently. Treat them all the same and a customer who paid on time can have their paid instalments silently undone by an interest charge. This paper sets out how to decide what a balance movement actually was before doing anything with it. The rule is that the system checks for a record explaining the movement, and where there is no record it says so and stops rather than guessing. It then defines how to spread a genuine payment across instalments, how to unwind one properly when a payment is reversed, and what must always remain true throughout so that nobody ends up over-credited or wrongly un-credited. It also says plainly where this stops working. The approach depends on being told about interest, fees, and reversals. Where that information is missing it does not quietly approximate. It raises its hand and asks for help, which is the intended behaviour rather than a shortcoming. reconciliation, incomplete information, data quality public
Sep 1, 2026

Deriving the Convergence Deadline: Closing the determinism gap in convergence-aware pre-collections

A customer’s payment fails on Friday night. Your system does not find out until Monday morning. Somewhere in between, it has to stop waiting and do something. How long should it wait? Most systems answer that with a number someone picked. Thirty minutes, four hours, a day. Nobody can say why, and the number decides real outcomes: wait too long and you miss the window where a quick nudge would have fixed things; act too soon and you chase customers whose payments were fine all along. This paper shows how to work the number out instead of choosing it. Two things bound it. One is what your platform actually does, measured from how long payments really take to resolve. The other is what you owe the customer, from the grace period you promised them. The deadline is whichever of those is tighter. The finding worth reading for is what happens when they conflict. Sometimes your platform is slower than the grace period allows, and no waiting time works: any number you pick breaks one promise or the other. The arithmetic hides this, because it still hands you a plausible-looking answer. So the model refuses to start instead, and tells you the only three ways out. Accept that you will chase more people. Give customers longer. Or fix the platform. Most organisations in that position are already living with the first option. They just have not noticed, and cannot say how often it happens. There is also one implementation detail that will bite you. Once you calculate a waiting time, you have to freeze it against each payment as it starts. Recalculate later and change the deadline for work already underway, and your system quietly loses the ability to explain its own past decisions. Everything still passes its tests. Read this if something in your system waits, then acts, and nobody can tell you where the waiting time came from.

9/1/2026 Deriving the Convergence Deadline: Closing the determinism gap in convergence-aware pre-collections A customer’s payment fails on Friday night. Your system does not find out until Monday morning. Somewhere in between, it has to stop waiting and do something. How long should it wait? Most systems answer that with a number someone picked. Thirty minutes, four hours, a day. Nobody can say why, and the number decides real outcomes: wait too long and you miss the window where a quick nudge would have fixed things; act too soon and you chase customers whose payments were fine all along. This paper shows how to work the number out instead of choosing it. Two things bound it. One is what your platform actually does, measured from how long payments really take to resolve. The other is what you owe the customer, from the grace period you promised them. The deadline is whichever of those is tighter. The finding worth reading for is what happens when they conflict. Sometimes your platform is slower than the grace period allows, and no waiting time works: any number you pick breaks one promise or the other. The arithmetic hides this, because it still hands you a plausible-looking answer. So the model refuses to start instead, and tells you the only three ways out. Accept that you will chase more people. Give customers longer. Or fix the platform. Most organisations in that position are already living with the first option. They just have not noticed, and cannot say how often it happens. There is also one implementation detail that will bite you. Once you calculate a waiting time, you have to freeze it against each payment as it starts. Recalculate later and change the deadline for work already underway, and your system quietly loses the ability to explain its own past decisions. Everything still passes its tests. Read this if something in your system waits, then acts, and nobody can tell you where the waiting time came from. - public

Complex systems, made legible.