review(panels+size): 面板结构收敛收尾、审查清理、新增平行数组护栏

一、审查清理
* `PlotView::FreeMarkerValue` 的 `const Lane&` 形参从未使用(函数体里只有一句
  `(void)lane;`)⇒ 删除形参与该语句,更新 2 个调用点。
* `EdgePanelLayoutFor` 里「选区截取是否就绪(双光标)」算了 3 遍 ⇒ 收敛为函数顶部
  一次 `clipReady`。它同时决定面板高度 footer、条目行可见性、按钮几何,
  三处各算一遍时只要有一处条件写错,就是"底部多一段空白"或"没双光标却能滚动"。

二、新增护栏(离屏检查)
* `panels`:新增「平行数组长度一致」不变式 —— `EdgePanelLayout` 的 13 个按行平行
  vector 必须与行数一致;4 个「重采样」专属数组允许为空、非空则必须对齐。
  这是"某列读到别人矩形"这类错位缺陷的唯一低成本护栏(O(1))。
* `panelscroll`:同样加一份(大文件、566 行时才会暴露的问题)。
* `panels` 输出增加 rows 数,便于定位。

三、文档
* `Documents/Code_Review_Plan.md` 新增 §七(第 35 轮节点与硬约束)。
* `Documents/Code_Review_Progress.md` 新增第 35 轮(面板架构评估 + 三次重构记录)。
* `Documents/Code_Review_Report.md` 新增 §12(评估结论 + gdtoa 最终结论 + 护栏价值)。
* `Documents/agent_mem.md` 新增第 35 轮六条规则。
* `Tools/README.md`:补 `panelscroll`、`integer_replacement_matches_std`,
  断言数更新为 260 / 108,最小集表补充面板相关条目。

验证:
* `make release`(删 .o 全量)零 error / 零 warning,产物 **786,944 B**。
* `make -C Tools` 零 error / 零 warning。
* `UnitTests` → checks=260 failed=0 cases=19。
* `OffscreenChecks -all` → 6/6 检查 PASS,checks=108 failed=0。
* `panels -mode compare` → 7 个面板像素哈希与几何逐项不变。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-11-04 14:37:59 +08:00
1 parent 34365b3c1c
commit b58b427f62
8 files changed
+408 -15

No files matched your search

+33
View File
@@ -203,3 +203,36 @@
3. **"先量后改"**:任何以性能 / 体积为名的改动,必须在同一台机器、同一次会话内给出前后数字;
收益低于噪声、或换来体积上涨的,一律回退,并把数字写进 `Code_Review_Report.md`。
4. **像素基线只做本地 A/B**:哈希与 DPI/字体/数据文件绑定,**不入库、不当黄金图**。
---
## 七、第 35 轮追加(2026-11-04):浮动面板架构评估与收敛 + 整数格式化替换
> 触发:用户指出「7 个实验性功能面板观感/骨架高度一致,但每新增一种或改一次布局
> 总会出意料之外的错误」,要求先**评估**(能否抽公共基类 / 公共组件,浮动面板、
> 二级菜单、右键菜单是否算公共组件),再动手;同时把 §11.5 的
> 「替换 `std::to_wstring` / `std::to_string`」做掉。
### 7.1 节点与验收标准
| 节点 | 内容 | 验收标准 |
| --- | --- | --- |
| **P20** | 面板「特征层」:唯一分类 / 标题 / 滚动几何来源 | 面板像素基线与几何**逐项不变** |
| **P21** | 滚动设置收敛为唯一实现(7 个包装 + 2 条调用链) | `panelscroll` 新检查全绿 |
| **P22** | 全仓替换整数格式化(76 + 2 处) | 面板像素不变 + 单元测试逐字符对照 |
| **P23** | 其余审查清理(垃圾形参 / 重复判定) | 零 warning、像素不变 |
### 7.2 本轮新增硬约束
1. **新增一种实验性功能面板,只允许改三个地方**:
`LanePanelScrollOf` / `PanelStyleOf` / `PanelTitle`(都在 `PlotViewInternal.hpp` /
`PlotViewPanels.cpp`)。三者都是穷举 `switch` 且**不写 `default:`**,
漏登记会被 `-Wswitch` 编译报警。
**禁止**再在宽度 / 布局 / 绘制里各写一份 `kind == XXX` 组合判断。
2. **底部"有按钮行"与"是构建按钮"是两个概念**(`PanelStyle::footerButtons()`
vs `buildButton`)。混用会让面板高度与内容区高度不一致。
3. **整数转文本一律用 `Utf8Util::FormatInteger*`**,不要用 `std::to_wstring` /
`std::to_string`(它们把 MinGW printf 引擎拉进产物,且 libstdc++ 会强制
`__USE_MINGW_ANSI_STDIO=1`,命令行关不掉 —— 见 Makefile 注释)。
4. **改面板几何/绘制前后必须跑** `OffscreenChecks -run panels -mode record/compare`;
本轮它当场抓到了"截取面板少了 37px 高度"的回归。