diff --git a/.ua/backlog.json b/.ua/backlog.json index 2e50129..b8eb18f 100644 --- a/.ua/backlog.json +++ b/.ua/backlog.json @@ -2915,6 +2915,15 @@ "status": "done", "domain": "tune", "notes": "隐藏时主动 paint(null) 而不是等下一次校验:否则用户切换选项的瞬间会留下一个「看不见的红框」,而它仍存在于 DOM 的错误区里。校验的早退放在函数首行而不是规则循环里,是为了让「隐藏 = 不参与」成为唯一判定点——两处各写一份条件迟早会漂。form 的参数表用(formItem)前缀登记子接口字段,是这套清单既有的约定,新增字段必须跟着加。" + }, + { + "id": "g281", + "title": "抽出 diffKit 纯逻辑并给皮肤包加冒烟脚本", + "motivation": "g269 把行级差异算法直接写在 diffView 的渲染函数里,于是它有「三处前缀 / 后缀 / 中间段」这种一眼看不出对错的逻辑,却没有任何断言——改一个比较符肉眼完全看不出来,只有等某次审阅漏掉一行才可能发现。皮肤包此前冒烟覆盖为 0:frame 14 条、table-core 31 条,皮肤层全靠演示页人工看。", + "acceptance": "新增 packages/skin/ui/src/diffKit.ts(normalizeLine / toRows / alignMiddle / diffLines 四个纯函数 + DiffOp / DiffRow 类型 + DP_LIMIT 常量),diffView 只保留渲染;新增 packages/skin/ui/scripts/smoke.mjs 八条断言(相同文本全 same、纯增、纯删、尾部换行不算差异、忽略空白生效、不忽略时报差异、行内空白归一、超限退化后内容不丢),npm run smoke 串上第三段,SKIN SMOKE OK 是门禁的一部分;AGENTS.md 的 smoke 描述同步为「三段 / skin 8 条」;npm run check 全绿", + "status": "done", + "domain": "tooling", + "notes": "第 6 条「不忽略空白时同一对文本必须报差异」是对照组:只测「忽略后无差异」会被「函数永远返回空」的实现骗过——每个开关类特性都该配一条反向断言。冒烟直接 import dist/diffKit.js(构建产物),因此 npm run check 里 smoke 必须排在 build 之后,这一点由 check 链顺序保证。踩坑:style 门禁要求导出类型也带 /*** ***/ 注释,抽出模块时把注释写成 // 会直接红。" } ] } \ No newline at end of file diff --git a/.ua/iterations.log b/.ua/iterations.log index 5ca93ec..a765037 100644 --- a/.ua/iterations.log +++ b/.ua/iterations.log @@ -325,3 +325,4 @@ {"ts":"2026-10-26T23:04:20+08:00","id":"g278","result":"done","commit":"c36b507","summary":"热力图图例与网格尺寸同源(删掉样式表第二份宽高),抽查清单加 heatmap / sparkline 至十三段"} {"ts":"2026-10-26T23:05:23+08:00","id":"g279","result":"done","commit":"ef58a41","summary":"diffView 增加 ignoreWhitespace:比对键归一行内空白、展示仍用原文,统计条标注口径"} {"ts":"2026-10-26T23:06:22+08:00","id":"g280","result":"done","commit":"865477c","summary":"formItem 增加 visible:隐藏即清错误态并退出同步 / 异步校验"} +{"ts":"2026-10-26T23:07:50+08:00","id":"g281","result":"done","commit":"82e69df","summary":"抽出 diffKit 纯逻辑 + 皮肤冒烟 8 条断言并入 check 链,smoke 变三段"}