Hand-rolled SELECT lists silently drop new columns
Adding a column to a SQL table and threading it through a TypeScript application that uses an ORM-less Record<string, unknown> row mapper.
When a public type gains a new field backed by a new column, updating the table schema, the row mapper, and the type definition feels complete — every unit test passes, the typecheck is clean, the DB has the value. But any other SELECT in the codebase that explicitly enumerated columns (because that surface deliberately differs from your one-true MESSAGE_COLS const) will silently omit the new field. The row mapper reads row.new_field as undefined, optional-chains it to null, and the API ships null to the client. No error anywhere — until the UI rendering depends on the value and the user notices. Sweep the codebase for hand-written SELECT lists targeting the affected table whenever you add a column, or write a test that exercises every public API path on a row where the new field is set to a sentinel non-null value.
grep for SELECT.*FROM <table> after schema migrations; any hand-enumerated column list is a landmine waiting for a regression.