JianFeeeee
eeb8f277fd
test(mails.status): "正当"落成可判约束(只许比 archived);欠账补一条"还清即转绿"的判据
pi 2026-09-14 的三点接续。
1. **§1「正当」不能只是标注,要是可判的约束**:按文件+计数登记挡得住"新增一处",
挡不住"**已登记的那一处改变性质**"。已判出来:**任何与 m.status 的比较只允许比
'archived'**(全局属性),与 'read'/'unread' 比较 ⇒ 红(per-reader 属性必须走 mail_reads)。
第一次跑就抓到第三处:`migrate.go` 的 `WHERE m.status = 'read'` ×2 —— 它是**回填**,
职责就是读那个遗留值,所以按文件登记**窄豁免**(allowedCompareExempt,带理由),
而不是"凡是迁移都放行"。
2. **§2 欠账要有"还清即转绿"的判据**:新增 `mail_status_derived_test.go`,三态形状
(与套件探针同族)—— 欠账未清 ⇒ `t.Skip` 并写明还欠什么(**不假红也不假绿**);
还清 ⇒ 开始实跑并断言"详情路径的 status == 按读者派生的值",**转绿即可测事件**;
迁一半(只改 GetMailByID 漏 GetThread)⇒ 红。
实测当前状态:`--- SKIP ... 详情路径返回行级 status="read",而按读者派生说 "unread"`。
**没写成"现在就红"**:恒红的门 = 挂在错误相位的门(CRITERIA.md §11 已为它付过学费)。
另按他的更正把 `migrate.go` 的理由写准:不是"跑过即结束",而是
**"全新安装/空库路径必须存在"**(措辞会影响下一个人敢不敢删它)。
3. **§3 (b) 的语义契约补归属**:归属 = dsh(鸿蒙侧实现者),WebUI 侧不需改动;
落点 = 跨端对齐判据那一族(形状与"预设清单逐项一致"同构,比语义不比数值);
**如实标注当前未建**及原因(鸿蒙侧还没有日历页/手势代码 ⇒ 此时"两端逐项相同"只有一端存在,
建出来就是假判据);到期前提 = P6 第 3 步出现手势代码时立即建,此前是**登记的欠账**。
2026-09-14 17:11:36 +08:00
..
2026-09-14 11:07:03 +08:00
2026-09-14 17:11:36 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00