"Selecting an earlier day files the crumb under that date without pretending it was submitted then."
The Model's Truth Has to Reach the Surface
Keeping two dates in the database is only half the job. If the interface shows only one of them, the user's head quietly re-collapses the model — they see a single date on a card and assume it means 'when I wrote this', even when the crumb was backdated. The two-truth rule has to be visible, or it isn't really honored. So when a crumb's target_date differs from the day its captured_at falls on, Vesta's card shows both, plainly: filed to one day, written on another.
When the two agree — the common case, a crumb captured today about today — showing both would be noise, so the card shows one date. The rule is simple and it keeps the surface calm: show one date when the truths agree, show both the moment they diverge. The interface never invents a date and never hides the divergence; it mirrors exactly what the model knows.
Local Dates Are Explicit, Never Guessed
There's a quieter trap the surface has to avoid: inferring a local date at read time. If you store only a UTC instant and compute 'which day was that?' whenever you render, the answer drifts with the reader's current time zone — a crumb written at 11pm in one zone can jump to the next day when viewed from another. Vesta refuses that: local dates and time zones are captured explicitly at write time and stored, never re-derived on read. The day a crumb was written is a fact fixed the moment it happened, not a calculation that changes depending on where you're standing when you look.