ccb97818d7ba44e7678c4099c4405250e62b0ec0
Every mutation is a pure function over a draft dataset, so the write surface is unit-tested without React. Money amounts (income, purchase totals, split values, schedule slices, fixed/percent rule amounts) are rounded to their currency's minor unit before they land in the draft, per CLAUDE.md's round-before-persisting rule -- actions.ts is the single boundary every UI mutation passes through. FxRate.baseUnitsPerOne is deliberately exempt: it is stored at six decimal places, not money. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
budget2.0
New version of budget page, vibecoded.
Languages
TypeScript
98.3%
CSS
1.4%
HTML
0.2%