Lesson.

Migrating values into a new model, I left the original fields in place — the classic “clean up later”. The old values then showed up raw in the UI, next to the new, correct ones.

The fix was a one-line display filter. The lesson is bigger than the fix: “clean up later” duplicated data has a visible cost, and it usually surfaces in the one place you weren’t looking — the public UI. Plan the cleanup step into the migration, so there’s never a window where two copies of the truth are both live.

The related habit that prevents this class of bug: decide one owner and one direction per field before you build. If a value has a single home, there’s no stale copy left to leak.