rule
Made the timezone bug unrepresentable instead of fixed
A budgeting app has exactly one product unit: the calendar day. If a user in Los Angeles marks rent paid on 28 February, it is 28 February — not “16:39 Pacific”, and never “1 March UTC”. That rule kept getting eroded by well-meaning changes, because a database date type still comes back as a timestamp with a timezone attached, which leaves the same mistake available to the next person who touches it.
So the five user-facing date columns were moved to canonical YYYY-MM-DD text. Plain text has no timezone to misuse, and lexicographic ordering of that form is chronological, so range filters and sorting stay correct for free. The bug stopped being something to remember and became something the schema cannot express.
The migration that proved it was worth doing measured the damage first: on the live snapshot, 3 of 166 override rows resolved to a different calendar day depending on which reading you took — one of them across a month boundary, a settled rent payment that belonged in February and read as March.





