21a19ab374
两个 recorder 里逐字重复的 `_missing_columns_message` 收敛为 `schema.py` 的 `missing_columns_warning(backend, missing, *, alien_table)`。这条消息拼的是 给人执行的 DDL,与库自己执行的 ALTER 必须同源——留在两个 recorder 里等于在 单一事实源上开了个口子,而 Task 7 的文档还要引用这个消息格式。 纯收敛,行为零变化: 两端语句仍分别取自各自的 `SQLITE_BACKFILL` / `PG_BACKFILL` (函数内不硬编码任何 DDL 文本),措辞、标点与换行逐字保留。已用改动前后的两份 实现对 16 组入参(4 种缺列组合 × alien 两态 × 两后端)逐串比对,输出完全相同。 顺带把 postgres.py 从 281 行降到 250、sqlite.py 降到 157。