@@ -28,7 +28,7 @@
| 模块设计 | **A− ** | 看门狗(IWDG + 心跳位图 + 4 个 Fault 现场 + `.noinit` )、就绪屏障、卷锁、FTP 鉴权、`Error_Handler` 自恢复、ADC 全链均已落地;**原列的 dhara 移植层两处缺陷(N-12/N-13)与日志逐条开关(N-16)已于 2026-10-15 修复** → `GD5F2GQ5UE_Trap_Records.md` Trap 07、`../架构设计/STM32F4-Base存储架构说明.md` §5.3、`../子系统设计/运行与自检记录设计说明.md` §4.4/§4.5 | 驱动层无统一错误码约定(S-5)、RS485 无协议栈(随 B2 暂缓) |
| 内存使用 | **B+ ** | 堆迁 CCM + 栈/堆三面观测常开 + `mem-budget` 92% 门禁 + 预算台账与趋势基线;**R-9 已落地(2026-10-15)→ SRAM1 由 74.9% 降到 56.1%;同日移植层与日志修复 +1.6 KB → 现 **57.4%(余 55,840 B) ** ,不再是卡点** | **内存优化簇已整簇暂缓 ** (用户裁定 2026-10-15):R-2 后半(待迁 29,570 B → CCM,只差缩堆 56→32 KB)与 R-3 / R-4 / R-6 不再排期,理由与重开条件见 §5.3;**当前真正的约束是 CCM 只剩 7,904 B**——加任务 / 抬栈 / 加堆会先在这里撞墙,届时按 §5.3 重开;MicroLIB 512 B C 堆仍无机械检查(§5.5) |
| Flash 使用 | **A− ** | F-1/F-2/F-3 落地省 64,576 B → 占用 **22.2%( 232,280 B) ** | F-4/F-5/F-6 ≈10 KB + 编译时长(§5.4) |
| UI 标准化 | **B+ ** | W6 第一波已落地(2026-10-15):**L0 设计令牌层** `ui_tokens.h` 建成、**L2 页面注册表** `ui_page_registry.{c,h}` 由生成器产出并**删除了手写 `case` 分发**、`font-charset` 钩子 + `registration-check` 第 ④ 类接线校验上线、字体子集瘦身 −80 B | 无组件库(L1 `ui_w_*` 未建)、**目标页未落地**(现存 7 个 `ui_page_*.c` )、**golden 两脚本仍未挂 pre-commit**( `font-charset` 已挂, golden 未挂 )、`ui_w_form` 推迟 U5(§6) |
| UI 标准化 | **B+ ** | W6 第一波已落地(2026-10-15):**L0 设计令牌层** `ui_tokens.h` 建成、**L2 页面注册表** `ui_page_registry.{c,h}` 由生成器产出并**删除了手写 `case` 分发**、`font-charset` 钩子 + `registration-check` 第 ④ 类接线校验上线、字体子集瘦身 −80 B | 无组件库(L1 `ui_w_*` 未建)、**目标页未落地**(现存 7 个 `ui_page_*.c` )、**golden 像素回归已于 2026-10-20 挂入提交门禁**( `ui- golden` )、`ui_w_form` 推迟 U5(§6) |
### 0.3 主线建议
@@ -452,7 +452,7 @@ Select-String -Path 'MDK-ARM\STM32F407-Demo\STM32F407-Demo.map' -Pattern '__heap
|----|------|------|
| 内容页 | 描述符 `content_page_def_t` 仍是**唯一**页面描述符(刻意不新建第二套);节点→页面映射由**生成器产出** `ui_page_registry.c` , `{node, desc}` 表 + `ui_page_registry_for()` + `ui_page_registry_password()` | ✅(2026-10-15 U3) **手写 `menu_content_page_for()` 已删除**,仓库内仅存 2 处历史说明注释;密码页按代码实况**单独出口**(非节点绑定),不进 `node→desc` 映射 |
| 设计令牌 | `Drivers/BSP/UI/ui_tokens.h` **已建 ** ( 2026-10-15 U1, 20 个宏),框架 + 7 页 + `App/task/ui_task.c` 全部接入;**屏幕几何复用 `ui_port.h` 既有 `UI_SCREEN_W/H` **,不重复定义 | ✅ 纯替换验收:`@build` 0/0 且 Program Size 逐字节不变、golden 逐像素一致、池水位未变。⚠ 落地时修正本报告 L0 清单 9 处取值/存在性错误(见 §6.3 更正块) |
| golden 回归 | `simulator/tests/` 四脚本:`check_menu_rows.py` (菜单 8 状态全像素)、`check_content_pages.py` (内容页黄金参考逐字节 + 文本断言 + **LVGL 池水位门禁 ** )、`regen_ref_png.py` 、`check_remo_sink.py` | 🟡 **有基线但未入门禁 ** :两个脚本未挂 pre-commit / `ui-verify` |
| golden 回归 | `simulator/tests/` 四脚本:`check_menu_rows.py` (菜单 8 状态全像素)、`check_content_pages.py` (内容页黄金参考逐字节 + 文本断言 + **LVGL 池水位门禁 ** )、`regen_ref_png.py` 、`check_remo_sink.py` | ✅ **已入自动门禁(2026-10-20) ** :新钩子 `ui-golden` = 增量构建模拟器 + 两条 golden 串成一条,实测改一个 UI 源文件后合计 2~4 秒;有牙实测 = 注入 3 px 位移 → FAIL 并点名页面与差异像素数 |
### 6.2 新增一个页面要走多少步(当前)
@@ -573,7 +573,7 @@ const ui_page_desc_t ui_page_deadzone = UI_FORM_PAGE("遥测死区", s_items_dea
| U1 | `ui_tokens.h` 令牌化(纯替换,不改行为) | `@build` PASS + 模拟器截图与替换前逐像素一致 | ✅ **已落地(2026-10-15) ** : `ui_tokens.h` 20 个宏 + 15 个文件接令牌。**零行为变化证据**:`@build` 0 错 0 警且 `Program Size` 与改前**逐字节相同**( Code=213540 / RO=18740 / RW=1136 / ZI=131520);golden 菜单 8 状态全像素一致 + 内容页 **11 页逐字节一致 ** ,且比对对象是改前备份的 sha256 基线(**不是 `--update` 刷出来的**);池水位 5368 / 5448 B 未变。⚠ 落地时修正本节 L0 清单 9 处与代码不符(见上) |
| U2 | `ui_w_records` (合并 runlog/selftest) | 两页行为不变,代码 −1 个文件 | ❌ 未办(两份结构几乎相同的代码仍在) |
| U3 | `ui_w_form` + `ui_page_desc_t` 原型化 + 生成器产注册表 | 手工 `menu_content_page_for()` 删除;新增一页只需"改树 + 加实例文件" | ✅ **已落地(2026-10-15) ** : `ui_page_registry.{c,h}` + `ui_style.{c,h}` (原"U1 做不了"的共享 flat 样式一并落)+ 扩 `gen_menu.py` 产注册表**并自动写 `uvprojx` /`CMakeLists.txt` **;手工 `menu_content_page_for()` 已删。**实测单位成本:新增一页 = 3 处人工**(新 `.c` + 新 `.h` + 菜单树那一行加 ` #page=<名>` )**+ 1 条生成器命令,手工编辑注册文件 0 处**;生成器**双向对账**(增 `registered` / 删 `pruned` )且双向校验死代码。验收:`@build` 0/0、golden 菜单 8 状态 + 内容页 11 页逐字节一致、池水位 5368/5448 B 未变、`ER_IROM1` 232,052 B(较已提交 HEAD − 228 B)、SRAM1 零增量。⚠ **本报告原口径"8 处降到 1 处"须修正 ** :那个 1 只在"1 处对既有文件的修改"意义下成立,页面自身 2 个文件本就要写,真实改动处数是 **3 ** |
| U4 | golden + 字符集检查 + 注册检查入 pre-commit | 三个新 hook 全绿 | 🟡 **2 /3 落地(2026-10-15) ** : `font-charset` 新钩子(字符集差集,防缺字白框)+ `registration-check` 补第 ④ 类"UI 页面描述符表接线"检查。钩子数 34 → **35 ** 。钩子数 34 → **35 ** 。⚠ **修正我自己上一版的错 ** :此处原写"3/3 落地",是把"golden 脚本早已存在"误当成"golden 已进自动门禁"。实况是**两个 golden 脚本至今未挂 pre-commit**(一直在人工跑,无自动门禁),故改回 **2/3 ** ,缺口单列为待办 。⚠ * * `--strict` 的验收口径已改**:判据是"**未知**冗余 = 0"而非"冗余 = 0"——`ui_cn_chars.txt` 里 异/常/片/芯 4 字属**刻意保留**( 2026-09-14 `9eb1bd63` 写入的中文自检描述曾落盘 `/log/selftest.log` ,定长 64 B 记录跨固件持久,删字形会使历史故障行渲染空白),按 `check_registration.py` 的 `KNOWN_GAPS` 同构做法进带理由的保留清单;上/电/重 3 字已证从未出现在任何字符串字面量(仅注释),照删。为几百字节牺牲已落盘审计记录的可读性不划算——同一权衡口径见 §5.3 内存簇暂缓裁定 |
| U4 | golden + 字符集检查 + 注册检查入 pre-commit | 三个新 hook 全绿 | ✅ **3 /3 落地(2026-10-15 起,10-20 补齐 ) ** : `font-charset` 新钩子(字符集差集,防缺字白框)+ `registration-check` 补第 ④ 类"UI 页面描述符表接线"检查。钩子数 34 → **35 ** 。钩子数 34 → **35 ** 。⚠ **修正我自己上一版的错 ** :此处原写"3/3 落地",是把"golden 脚本早已存在"误当成"golden 已进自动门禁"。实况是**两个 golden 脚本至今未挂 pre-commit**(一直在人工跑,无自动门禁),故当时 改回 **2/3 ** 。⚠ **10-20 已补齐第三件 ** :新钩子 `ui-golden` 把"增量构建模拟器 + 两条 golden"串成一条自动门禁(实测 2~4 秒、注入 3 px 位移可 FAIL 并点名页面),故 3/3 此刻才真正成立——**这次是真的进了自动门禁,不是"脚本存在"** 。⚠ * * `--strict` 的验收口径已改**:判据是"**未知**冗余 = 0"而非"冗余 = 0"——`ui_cn_chars.txt` 里 异/常/片/芯 4 字属**刻意保留**( 2026-09-14 `9eb1bd63` 写入的中文自检描述曾落盘 `/log/selftest.log` ,定长 64 B 记录跨固件持久,删字形会使历史故障行渲染空白),按 `check_registration.py` 的 `KNOWN_GAPS` 同构做法进带理由的保留清单;上/电/重 3 字已证从未出现在任何字符串字面量(仅注释),照删。为几百字节牺牲已落盘审计记录的可读性不划算——同一权衡口径见 §5.3 内存簇暂缓裁定 |
| U5 | 用原型批量落剩余 **27 页 ** (每页 ≤30 行) | 菜单树全绿、无 `CONTENT_PAGE_COUNT` 哨兵命中 | ❌ 未动 |
> ✅ **2026-10-15 用户裁定启动**(覆盖 2026-10-11 的「本轮不排期」,登记簿 U 簇 / W6):已开智能体团队推进。**并行度受注册文件约束**——新增一个 `.c` 必须同时改 `MDK-ARM/STM32F407-Demo.uvprojx` 与 `simulator/CMakeLists.txt` 这两个共享文件,所以任何时刻只允许一个成员碰它们。实际排法:**第一波 U1(令牌层,不新增 .c)∥ U4 残余(只动 scripts/ 与门禁文档)真并行** → U3(原型化 + 生成器,独占注册文件,串行段)→ U2 → U5(页面批量,须等 U3 的生成器把注册自动化,否则无法并行)。⚠ 本节原写「27 页」是**目标页数**,现存 `ui_page_*.c` 实测只有 **7 个** → U5 开工前先对齐目标页清单差集。
@@ -661,6 +661,9 @@ const ui_page_desc_t ui_page_deadzone = UI_FORM_PAGE("遥测死区", s_items_dea
| **2026-10-15 ** | **启动 W6 UI 标准化簇 ** (用户裁定,覆盖 2026-10-11 的「本轮不排期」) | §0.3 删掉内存主线后只剩 UI 这一条,随即启动。已按 §6.5 的 U1~U5 拆成 5 个工作包上共享任务板,第一波 **U1 令牌层 ∥ U4 门禁补强 ** 两名成员并行(写范围严格不相交:U1 只写 `Drivers/BSP/UI/` + `App/task/ui_task.c` , U4 只写 `scripts/` + 门禁与规范文档)。**并行度的真实约束不是任务数量,而是注册文件**:新增 `.c` 必须改 `uvprojx` + `CMakeLists.txt` 两个共享文件,同工作树两人同改必互相踩,故 U3(生成器/注册表)是必须串行的一段,U2/U5 排在它后面——U5 的页面批量要等 U3 把注册自动化之后才谈得上并行。同步 §6.5 注与本表 W6 行;`../任务规划/README.md` §2.0 W6 行同步。另修正交付物清单:移植层单测拟名 `test/host/dhara/` 实际落地为 `test/host/nand_port/` ,状态 ❌ → ✅ |
| **2026-10-15 ** | * * §6 顶部加"建议栏不可照抄"总警示** | 启动 W6 后按 §6 执行 U1/U3/U4, **四次证伪**:① §6.3 要新建 `UI_SCREEN_W/H` 而 `ui_port.h:21-22` 早有同名宏;② `LV_COLOR_BLACK/WHITE` 在 LVGL 9.3 不存在**且极性反了**(墨色实为 white),照抄先编译失败、改完整屏反色;③ "27 页未落地"是**目标页数**、现存 `ui_page_*.c` 实测 7 个;④ 生成器草图漏掉**密码页非节点绑定**。另有 L0 清单 9 条取值错,明细在 §6.3 更正块。**不再逐条打补丁**,改为节顶立总口径:动手前逐条 grep 对代码核、不符一律以代码为准、差集必须回报不得静默修正;并明确**"发现"栏可信、"建议"栏不可照抄**。同一规律在 §4 的 N-13(`DHARA_E_UNSUPPORTED` 不存在)已复现,故这不是 UI 章节局部问题,而是"建议"这一体裁的通病 → 后续任务卡须显式写"报告建议值不可直接采用" |
| **2026-10-15 ** | **W6 第一波落地:U1 + U3 验证通过并回填现状表 ** | Lead 亲自验证(成员被模型路由变更连续打断,最终停用):`@build` **0 错 0 警 ** ; golden **菜单 8 状态全像素 + 内容页 11 页逐字节一致 ** 、池水位 **5368 / 5448 B 与 U1 基线相同 ** 、参考图 sha256 **差异 0 条 ** (证明无人用 `--update` 刷基线);`registration-check` (含第 ④ 类"页面必须被表引用")与 `font-charset` **Passed ** ; `ER_IROM1` **232,052 B ** (较已提交 HEAD − 228 B)、`RW_IRAM1` **75,232 B 零增量 ** ;对 38 个在途修改文件逐个核对 **BOM / CRLF / U+FFFD 全部与 HEAD 一致 ** 。**单位成本实测**(临时页 `zzprobe` 绑到 `遥信量` 叶子 → 只跑生成器 → 带页 `@build` 0/0 → 注册表出现 `{5u, &ui_page_zzprobe_desc}` → 回滚后 6 个产出文件的 `zzprobe` 残留计数均为 0、重编回基线)得出 **新增一页 = 3 处人工(新 `.c` + 新 `.h` + 树那一行加 ` #page=<名>`)+ 1 条生成器命令,手工编辑注册文件 0 处 ** ,并确认生成器 `registered` / `pruned` **双向对账 ** (不只增、也减)。据此修正 §0.1 UI 行(B → **B+ ** )、§6.1「内容页」与「设计令牌」两行、§6.5 U3 行;并把 §6.5 U4 从我上一版**误写的 3/3 改回 2/3**( golden 两脚本至今未挂 pre-commit, "脚本已存在"≠"已进自动门禁");§6.5 U3 原口径"8 处降到 1 处"改为**真实 3 处**。**"分三笔提交"计划作废**:U1 与 U3 改同一批文件、文件内交叠,硬切会产生不可编译的中间态,改为整波一笔 |
| **2026-10-20 ** | **补上 U4 缺的第三件:golden 像素回归入提交门禁(35→36 钩子) ** | 先实测成本再定形态:改一个 UI 源文件后「增量重编模拟器 + 两条 golden」合计 **2~4 秒 ** ,支持走自动门禁(若实测要几分钟,正确做法是明确不挂、改为文档化人工门禁——一个逼人 `--no-verify` 的门禁等于没有门禁)。新增 `scripts/check_ui_golden.py` 包装器(**有意忽略 argv 并 `pass_filenames: false` **:两条 golden 按整棵菜单树 + 全量参考图工作,不接受文件参数),新钩子 `ui-golden` 的 `files:` 覆盖 UI 源 + `ui_task.{c,h}` + 模拟器 tests/sim/src + `lv_conf.h` + 包装器与本配置文件自身。
⚠ **端到端验的是钩子不是脚本 ** :干净树连跑 3 次 `rc=0` 全 Passed;注入 `ui_page_dc.c` 的 `.top_y +5` → **钩子 Failed ** 并点名 `[dc] FAIL 与参考页不一致(1882 px 差异)` ;还原后 `git diff` 干净、`simulator/tests/ref` 的 `git status` 为空(**全程未用 `--update` 刷基线**)。诚实记录一次瑕疵:首次实测在连续注入/还原的紧邻重建之间偶发失败一次,疑似 MSBuild 节点争用,已把"单次失败先复跑、连续两次才当真、不许直接绕过"写进钩子注释。
据此 §6.5 U4 由 **2/3 → 3/3 ** (这次是"真进了自动门禁",不是"脚本存在")、§6.1 golden 行转 ✅、§0.1 UI 行缺口描述更新、`AGENTS.md` 钩子数与文末索引 35→36、`pre-commit使用说明.md` 概览计数同步。**W6 剩余**:U2 合并两页记录、U5 落地目标页(须先对齐"目标页 vs 现存 7 个 `ui_page_*.c` "差集)。
| **2026-10-14 ** | **清理:删除已完成与过时内容 ** | ① **已修复项按销项删除 ** (去处见下表):N-02(FTP 鉴权)、N-03c( `Error_Handler` 降级)、**N-11(DMA 可达性三层防线 + 规则族 R1~R4)**、S-3(注册反向校验)、P2-5/P2-6( SD2506 负温度与 WRTC)、P2-8( `NET_RECV_TIMEOUT_MS` 已删)、P2-9( `mkdir` 幂等重试)、§5.5 前三条(内存治理三件套)、交付物清单已建项。② **删除过时层 ** : 2026-09-16 / 2026-10-11 双列基线表与"复核期间未提交改动"口径说明、旧"组合结果预估"表、逐条"2026-10-11 复核"批注、历史变更记录行——内存数字改由 `../内存管理/RAM预算台账.md` 与 `scripts/ram_baseline.tsv` 持有。③ **按 2026-10-14 `.map` 与代码重测**全部保留结论的数字(含 `lftpd_log.c` 已删除并入 `lftpd_auth.c`, N-06 残余只剩 `rs485_task.c` 一条刻意缺口)。④ **修正三处错误 ** : R-5( `configMAX_PRIORITIES` 56→32) **判定不可行**( CMSIS-RTOS2 `#error` );原 §7 把报告 S-5(驱动统一错误码)与登记簿 S-5(卷锁覆盖面)混为一谈;原 §5.5 第 4 条建议的 `_Static_assert` 形态在 AC5 上取不到链接期地址,已被"窗口断言 + 启动自检 + 运行时守卫"三层取代。⑤ 报告自有编号**不回改、不重排**(`../编号规范.md` ) |
### 已销项条目的记录去处