Why a minor unit is not always a hundredth
Money in minor units is a correct decision. Dividing by 100 in five places is not: a yen has no minor unit and a dinar has three, so a JPY figure displayed a hundred times too small.
Holding money in minor units — pence, cents — rather than decimals is a settled decision here and a correct one. Floating point cannot represent a tenth, and a payment certificate that is out by a rounding error is a payment certificate somebody disputes.
What was missing is that a minor unit is not always a hundredth. The Japanese yen has no minor unit at all. The Kuwaiti, Bahraini and Jordanian dinars have three. The platform divided by 100 in five separate places.
A JPY figure would therefore have displayed a hundred times too small. That is an order of magnitude, not a rounding difference — and it would have reached a client before anybody in the building noticed, because a number that looks plausible is the hardest kind of wrong to spot. For a platform aimed at governments, development finance institutions and global contractors, that is a defect rather than a limitation.
The fix was to stop having five answers. backend/src/domain/locale.ts is now the single place the platform knows how to count money, and an unknown currency is refused rather than quietly defaulted to two digits — the silent default being exactly the mechanism that produced the bug.
Formatting uses the runtime's own Intl data, so a French reader gets a comma decimal point and a space thousands separator without a dependency and without anybody maintaining a symbol table. There were four copies of that logic before; there is one now.