-- 0026 的回滚:先删索引、再删列(与 0019 同一顺序口径 —— SQLite 拒绝 DROP COLUMN -- 删除一个仍被索引引用的列)。 -- -- 回滚的代价(如实登记):`retention_tier` 这一列的值**全部丢失**。它对本迁移之前 -- 写入的行本来就恒为 `''`(未分型),因此丢的只是「本迁移之后被判出来的档位」。 -- 真正不可逆的只有一条:**判成 temp 的行不会被自动改回长期层** —— 它们的 -- `expires_at` 是另一列(0019 就存在),本回滚**刻意不动它**: -- -- - 若回滚时顺手清空 `expires_at`,一次 schema 回滚就会把已经判定的临时记忆 -- 全部升回永久(那是改数据,不是回滚结构); -- - 若不清空,回滚后这些行仍是「有时效的行」,读侧时效闸(纯 SQL,不依赖本列) -- 照旧隐藏它们,后台清扫照旧删除它们 —— 即**行为不变**。 -- -- 因此本回滚只撤结构、绝不改写任何一行的时效数据;要重判档位,重跑判定即可 -- (`retention_tier` 列会以默认值 `''` 重建,历史行回到「未分型」)。 DROP INDEX IF EXISTS idx_memory_items_retention_tier; ALTER TABLE memory_items DROP COLUMN retention_tier;