fix(判据脚本): --walk 存证不进工作树;真机动作需显式持锁确认

票 = task-26(自报缺陷,Lead 批准开树自修)。两处都是我上一笔(导航器入库)留下的:
一条会让工作树变脏,另一条更严重——动到了不属于我的台架。

一、--walk 的存证落点
- 症状:outdir = os.path.join(HERE, "walk"),HERE = <仓库根>/scripts → 真机跑完在
  scripts/walk/ 落 12 个帧:git status 立刻脏、done 的并集残留审计会把它当任务遗留物,
  下一个窗口还盖掉上一个窗口的证据。我自己刚立过「轨迹只在 --trace 给了路径才落盘」的
  规矩,这条路径上被自己破了。
- 改法:默认落 <仓库根>/ci-artifacts/uinav/walk/(已 gitignore,本仓台架产物一贯在此),
  --outdir 可改;并加**反向拒绝**——解析后的目录若落在版本控制内且不在 ci-artifacts 之下,
  直接 [FAIL] 退出 3、连目录都不建。「跑完记得删」只防得住记得的人(同 bom-guard 立项
  理由,也同今天 .map / 缺 lvgl_sim.exe 那一族:事实源不存在就大声失败)。

二、未持锁就注入了按键(实测踩到,已做成参数闸)
- 我给「默认落点会打印成什么」做验收时跑了 --walk,脚本在没有任何拦截的情况下连上 7003
  并开始注键;而那时台架属于验收窗的准备方,板子停在主干 mega 镜像上。**板端 UI 状态可能
  已被推到别处**:只注入了方向/进入/退出类按键,未烧录、未碰串口、未触发任何写操作
  (网口设置的保存行走不到——导航器从不在保存行按 ENTER,过密码默认也只走只读查看密码)。
- 根因不是手滑,是「必须持 bench 锁」只写在文档与 print 里:跑的人自认为在跑一次离线
  检查,脚本就真去连了。于是把确认做成参数 --i-hold-bench-lock:不给就拒绝(退出码 3,
  不碰网络);脚本不代取锁,也不替人判断「应该没人在用」。
- 给窗口方的处置建议:验收窗前先复位一次,或直接以 --walk 起步(导航器第一步就是回根,
  且回根后还补收一次 l 防被裁弹框漏计)——别把我注入后的残留状态当成验收现象。

验收(本机、无板,全部实跑)
- --walk --outdir <仓库内目录> → rc=3 + [FAIL] + 目录未被创建;
- --walk / --board 未给确认位 → rc=3 且**不触网**(瞬时返回,不再有任何连板可能);
- --selftest-quick rc=0(黄金参考 18 帧 0 错);check_doc_links 通过;
- 一笔提交,未用 --no-verify;工作树仅这 2 个文件改动,无多余产物。

文档同步:docs/UI设计/UI_自动化测试流程.md §7.3 补「存证不进工作树」「真机动作需显式
确认位」两条并把用法示例改对(同一事实只在一处,正文仍在那一节)。
This commit is contained in:
2026-10-25 18:30:41 +08:00
parent e771a8ea21
commit 621421f3ca
2 changed files with 67 additions and 9 deletions
+22 -5
View File
@@ -140,6 +140,7 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
- **收级联列按 `l`、不按 `s`**:菜单态按 `s` 不收列,用 `ssssssss` 回根正是深页错位的来源之一;
- 菜单树的 `#P` 注记可能写在 `#page=` **之前**(`网口设置 #P #page=net_cfg`),解析顺序错了就
剥不掉,那一叶的页面 id 也永远认不出来。
### 7.3 用法与门禁档位
```powershell
@@ -147,17 +148,30 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
& '.venv\Scripts\python.exe' scripts/board_ui_nav.py --selftest-quick
# 完整自检:再加全绑定页闭环导航(需模拟器可执行文件,约 30 s)
& '.venv\Scripts\python.exe' scripts/board_ui_nav.py --selftest
# 台架窗口:一条命令走完全部绑定页并逐页存帧(须持 bench 锁)
& '.venv\Scripts\python.exe' scripts/board_ui_nav.py --walk
# 只走一页并抓图;--trace 落步迹、--dump-fail 落「认错的那一屏」
& '.venv\Scripts\python.exe' scripts/board_ui_nav.py --board --to yx --grab D:/tmp/yx
# 台架窗口:一条命令走完全部绑定页并逐页存证
# ⚠ 真机动作必须显式确认已持 bench 锁,否则脚本直接拒绝(不碰网络,退出码 3)
& '.venv\Scripts\python.exe' scripts/board_ui_nav.py --walk --i-hold-bench-lock
# 只走一页并抓图;--trace 落步迹、--dump-fail 落「认错的那一屏」,--outdir 改存证目录
& '.venv\Scripts\python.exe' scripts/board_ui_nav.py --board --to yx --grab D:/tmp/yx \
--i-hold-bench-lock --trace D:/tmp/uinav_trace.json
```
- 提交钩子 `uinav-selftest` 跑的是**快检档**(`--selftest-quick`)。为什么不挂完整档:闭环
那一段要模拟器可执行文件——它是构建产物,新工作树里没有,正是同一天 `mem-numbers` 缺
`.map` 那课的形状。脚本对「缺可执行文件」报 FAIL 并给可执行提示,不「跳过当通过」;
合入前 / 上板前请手工跑一次完整档(快检 ≠ 闭环,两者结论不同,别互相顶替)。
- 板端后端只连 7003 取图注键,**不含串口、烧录、复位**;跑真机必须自己持 `bench` 锁。
- 板端后端只连 7003 取图注键,**不含串口、烧录、复位**;`--board` / `--walk` 必须另加
`--i-hold-bench-lock` 才会去连——没给就直接拒绝(退出码 3,不碰网络)。这条不是防御性
设计,是**同一天踩出来的**:跑 `--walk` 想看一眼默认存证目录打印成什么,脚本就照着连上
板子注入了按键,而那时台架属于验收窗的准备方。「必须持锁」写在文档里防不住「我只是跑
一下」,所以把确认做成命令行参数:要动真机,就得在命令行里留下字面证据(脚本不代取锁,
也不替人判断「应该没人在用」)。
- **存证不进工作树**:`--walk` 的帧默认落 `ci-artifacts/uinav/walk/`(版本控制之外),
`--outdir` 可改;给的路径若落在版本控制内(且不在 `ci-artifacts` 之下),脚本**直接拒绝
执行**并退出 3。理由与提交门禁同一条:产物一旦写进工作树,`git status` 就不再是判据,
而「记得删」只防得住记得的人。
- 步迹只在 `--trace <路径>` 给出时落盘;认错那一屏只在 `--dump-fail <目录>` 给出时留存——
两者都指到 `ci-artifacts/` 下,窗口结束把工作目录交回来时工作树仍是干净的。
- 台架留档帧目录在 gitignore 内、不入库:缺就整段跳过,不算失败——但脚本把「没跑」与
「跑过且通过」分开打印,不把前者写成后者。
@@ -196,6 +210,9 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
| 2026-09-13 | 管线同步:`UI_界面制作流程.md` 移除 HTML 样机阶段(五阶段 → 四阶段 P0~P4),本文定位改为"P2/P3 门禁的可执行版本";§六 关系描述更新为 P0 规格 → P1 编码 → P2 本文回归 → P3 上机目检 → P4 归档;移除 `tools/ui_mock/` 引用 |
| 2026-10-11 | **裁剪 LVGL 死代码(F-1/F-2/F-3)时的门禁记录**:先用**未裁剪**配置 `--update` 生成 11 页黄金参考,再切到裁剪配置重编重跑 → **逐字节全部一致**(菜单 8 状态像素一致),证明裁剪零视觉影响。池水位门禁随之 5440/5520 → **5368/5448**(−72 B;一次性残留仍 80 B,故非泄漏变化,见 §三 水位历史)。顺带揪出并修掉 `Lib/lv_conf.h` 与 `simulator/lv_conf.h` 的**长期漂移**(模拟器早已 I1-only、MCU 端未裁)→ 规则见 `UI_设计架构.md` §1.4 第 10 条,量化见 `../内存管理/RAM使用分析与优化方案.md` §2.6.4 |
| 2026-10-15 | **回归改为自洽运行(修 `netcfg_save` 假失败)**:`check_menu_rows.py` / `check_content_pages.py` 一律以**空临时目录当工作目录**跑 `lvgl_sim`(模拟器按 CWD 读写 `sim_config.ini`,残留档会改变页面内容);`simulator/main.c` 的 `--cfgtest` 加外壳,**无论成败一律删除伪造的 4000 B 配置档**——旧行为连 PASS 路径也会留雷,之后每次 UI 回归的保存行都从 `OK` 变 `ERR`(引擎拒写超长文档,属正确行为)。脚本里"删 `sim_netcfg.bin` 残留"的旧兼容清理随之作废(旧档迁移 2026-10-10 已删),改为**只提示不删除**。修后 11 页 + 往返池水位 5,448 B 全过,**未刷任何黄金参考**;排查口径见 §五 |
| 2026-10-25 | 第七节同日修订:`--walk` 的存证默认落 `ci-artifacts/uinav/walk/`(第一版写进
`scripts/walk/`,污染工作树);路径落在版本控制内直接拒绝;`--board` / `--walk` 需显式
`--i-hold-bench-lock`(实测过一次未持锁就注入按键,故把确认做成参数而非文字纪律)|
| 2026-10-25 | 新增第七节「板端有状态导航判据」(`scripts/board_ui_nav.py`):真机侧闭环导航、
盲走 9 帧仅 3 帧名副其实的实测表、认屏三判据、`uinav-selftest` 钩子档位、四条已知限度与
过密码口径;三张证据 PNG 落 `boot_log_data/` |