docs(ui/nav): 台架复核落地——收列键语义、回根按 depth、限度取证结论(#69)
CI / 静态门禁 (pre-commit) (push) Failing after 4m56s
CI / 主机侧单测 (MSVC) (push) Successful in 47s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 4m4s
CI / 主机侧单测 (MSVC) (pull_request) Failing after 42s

台架实机会话 2026-11-02(bench 档 fw 22:25:12 / 产品档
22:29:56,均经 /serial-boot-test 闭环:身份戳匹配 + 回读
no-difference):

- 复核② 收列键语义:菜单态按 s 与按 l 同走 menu_back、均收
  一级且父列选中留在原地(depth 1→0、sel 不变)——旧断言
  「菜单态按 s 不收列」是把待机态 s 无效(task-24 实证)误
  读成菜单行为。to_root() 据此在 STATUS depth>0 时按 s 逐级
  收(弹框被屏裁时像素 n_cols 漏计、固件 depth 不漏),老固
  件像素路径保留 l 兜底仪式。§7.2 纪律与 board-ui-nav skill
  恢复配方同步改写。
- 复核① 被裁弹框两叶:菜单步进依旧吃不到(枚举落同胞页,
  落点由 STATUS 如实报出、不再谎称到达);GOTO 直开两叶到
  达且完整渲染(自检记录 ink 4073 / 运行记录 ink 3559)→
  KNOWN_UNREACHABLE 对 --to 保留,绕行路径 --goto。§7.4 改写。
- 产品档(未加宏)实测:STATUS 照常应答(不设闸)、GOTO 回
  status=4——生产/bench 行为差异真机钉死;§7.6 增实机验证记
  录段。回归:--selftest-quick 66/66+闸 7/7;--selftest 闭环
  失败集与 master 基线逐项一致(6 存量像素 + 2 执行类拒绝)。
This commit is contained in:
2026-11-02 22:37:49 +08:00
parent bbfb47ebd0
commit be16669564
3 changed files with 38 additions and 9 deletions
+2 -1
View File
@@ -57,7 +57,8 @@ whenToUse: 需要上真机/台架进某页面看图(如故障录波、回放
1. `--where` 先看 STATUS:`PAGE` → 按 `s` 关页(导航器 `--to` 自动做);
`STANDBY` → 按 `e` 唤醒(注意规则②:home 上 `e` 可能重开最近页);
`MENU depth>0` → `l` 收列,别按 `s`(菜单态 `s` 不收列)。
`MENU depth>0` → 按 `s` 或 `l` 都收一级(台架复核 2026-11-02:菜单态 `s` 与 `l` 同走
`menu_back`,父列选中留在原地;旧说法"`s` 不收列"系把待机态 `s` 无效误读成菜单行为)。
2. STATUS 无应答(老固件)才吃退避键序(默认 `esl`,`--backoff-keys sl` 可去 ENTER);
ENTER 上限 1 次是硬闸(BACKOFF_MAX_E),报停机就 dump 帧人眼看,不许连按。
3. 反复落错页且 trace 里出现"像素与 STATUS 不一致" → 分类器或固件有账要记,
+17 -4
View File
@@ -147,7 +147,7 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
另两条实测纪律(理由写死在代码注释里,此处不重述):
- **收级联列按 `l`、不按 `s`**:菜单态按 `s` 不收列,用 `ssssssss` 回根正是深页错位的来源之一;
- **收级联列的键语义已台架复核定型(2026-11-02,#69)**:菜单态按 `s` 与 `l` 同走 `menu_back`,**都收一级**且父列选中留在原位(实测 depth 1→0、sel 不变)——旧断言「菜单态按 `s` 不收列」是把**待机态 `s` 无效**(task-24 实证)误读成了菜单行为;`ssssssss` 盲按回根不可信这个结论仍然成立,不可信的是"不看回读连按",不是键本身。有 STATUS 时按 depth 收(弹框被屏裁时像素 `n_cols` 会漏数、固件 depth 不会),老固件继续按 `l` 收 + 验终点;
- 菜单树的 `#P` 注记可能写在 `#page=` **之前**(`网口设置 #P #page=net_cfg`),解析顺序错了就
剥不掉,那一叶的页面 id 也永远认不出来。
@@ -196,9 +196,13 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
身份裁定,所以它会大声报错而不是静默走错页。实测 `自检记录` / `运行记录` 两页在模拟器
上 5 次枚举内没吃到,现场帧见
[popup_clipped](../测试说明/测试数据/boot_log_data/20261025_uinav_popup_clipped.png);
**真机上那层弹框究竟画在哪,留台架窗口取证后再定修法**——这是取证题,不是编码题。
#69 之后:真机(新固件)侧该漏计已被 STATUS 的 `depth` 事实顶掉——"回根"直接认
`depth==0`,不再依赖数得到列数;`KNOWN_UNREACHABLE` 两条按对称设计留待台架走到后销项。
**真机上弹框位置的取证已完成(2026-11-02 台架,#69)**:菜单步进**依旧**吃不到这两叶
(末列枚举落到同胞页 `alarm` / `selftest`——但落点现在由 STATUS 如实报出,不再谎称到达);
GOTO 直开两叶都到达且完整渲染(自检记录 ink 4073 / 运行记录 ink 3559,证据在 PR #70
台架段)。故 `KNOWN_UNREACHABLE` 对 `--to` 步进**保留**(对称设计的销项条件"真走到"
尚未满足),已验证的绕行路径是 `--goto`;真机(新固件)侧"回根"改认 STATUS `depth`:
`depth==0` 直接返根、`depth>0` 按 s 逐级收(弹框被裁时像素漏计、固件 depth 不漏),
旧的"补按 `l` 兜底"仪式只留给无 STATUS 的老固件像素路径。
2. 同一标题的多个显示态(网口设置的 只读 / 编辑 / 保存)在分类里都是同一个页面 id
`net_cfg`;要区分得看行内文本,写路径判据需要时再加。
3. 认屏复用黄金参考的文案:改了页面文案而没同步 `simulator/tests/` 的文本断言表,本节脚本
@@ -245,3 +249,12 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
- **留档帧目录已并一**:`WALK_DIR` 与 `--walk` 存证目录同指 `ci-artifacts/uinav/walk/`
(#69 前指 `ci-artifacts/uiwalk/`,走的新帧 BOARD_TRUTH 段永远读不到,静默"跳过(无
留档)")。
- **实机验证记录(2026-11-02 台架,两档实烧,输出全文贴在 PR #70 的台架证据评论)**:
bench 档(`fw build: Nov 2 2026 22:25:12`)上 STATUS 首答 `{kind=MENU depth=0 path=[0]
sel=[0]}`;GOTO `wave_play` 一次往返到达——#38 那趟"进故障录波看波形"的级联盲走就此降为
一条命令;`selftest` / `runlog` 直开渲染完整(见 §7.4 第 1 条取证结论);PAGE 上按 s 回根
由 STATUS 证实;级联收列按 s 逐级收回(§7.2 纪律据此改写);根列光标可经 STATUS `sel`
对位(记录查询 = 根行 6,对齐一击命中再 ENTER)。换回**产品档**(`fw build: Nov 2 2026
22:29:56 suite=NONE`,同一提交、未加宏)复烧后:STATUS 照常应答(它不设编译期闸),
GOTO 回 **status=4(不支持)**——同一对命令在生产/bench 两侧的行为差异由真机钉死,不止
纸面推理。烧录两轮均过 `/serial-boot-test` 闭环(身份戳匹配 + 回读 `no difference`)。
+19 -4
View File
@@ -835,10 +835,13 @@ class Navigator(object):
def to_root(self, limit=14):
"""回到"只有一列打开"的根菜单。
两条实测纪律写在这里:
两条实测纪律写在这里(第二条已于 2026-11-02 台架复核改写,#69):
· 页面态用 s 退(s = 退出页);
· **级联列只能用 l 收**,菜单态按 s 不收列(Lead 大窗实测)——沿用盲走脚本
的 ssssssss 回根法,正是深页错位的来源之一。
· **级联列收级看回读**:有 STATUS 时按 depth 收——菜单态 s 与 l 同走
menu_back、都收一级且父列选中留在原地(台架实测 depth 1→0、sel 不变);
旧断言"菜单态按 s 不收列(Lead 大窗实测)"是把待机态 s 无效(task-24)
误读成了菜单行为。盲按 ssssssss 回根依旧禁止:不可信的是"不看回读连按",
不是键本身。老固件无 STATUS 时仍用 l 收(下方像素分支保留原路)。
"""
unk = 0
unk_e = 0 # 本次 to_root() 已投出去的 ENTER 次数(见 BACKOFF_MAX_E)
@@ -854,6 +857,14 @@ class Navigator(object):
# 以前它被像素判成 BLANK 走"s 关页"分支——在待机页上按 s 是空转。
self._step("e", "待机态(STATUS)→ e 唤醒进菜单")
continue
if s and s["kind"] == "MENU" and s.get("depth", 0) > 0:
# 有固件身份回读时按 depth 收级(2026-11-02 台架复核,#69):菜单态
# s = menu_back,收一级且父列选中留在原地。子列弹框被屏裁时像素
# n_cols 会漏数、固件 depth 不漏——这正替掉了旧"补按 l 兜底"仪式要
# 防的那类漏计。s 在根列上无效但无害(台架同轮实测 depth0 按 s 原地)。
self._step("s", "STATUS depth=%d 级联 → s 收一级(台架复核 2026-11-02)"
% s["depth"])
continue
if st["kind"] == "MENU" and self.n_cols(st) == 1:
# "只有一列"不等于"在根":子列弹框被屏幕裁掉时它的选带根本不在可扫窗口
# 里,n_cols 会漏数它——于是上一轮留在弹框里的选中项还在,直接按 e 就
@@ -1050,7 +1061,11 @@ class Navigator(object):
# 理由;把它写成断言而不是评论,是因为下次改 UI 后这条结论也要能被重新检查。
# 已声明的导航限度(不是"允许失败",是**记账**):这两页落在根列最后两行,其子菜单
# 弹框会被屏幕裁掉、选带不在可扫窗口内,"枚举 + 验终点"目前吃不到它们。
# 依据与现场帧见 docs/UI设计/UI_自动化测试流程.md §7.4;真机上弹框画在哪要等台架取证。
# 依据与现场帧见 docs/UI设计/UI_自动化测试流程.md §7.4。台架复核 2026-11-02(#69,
# bench 固件 + STATUS):菜单步进**依旧**吃不到这两叶(末列枚举落到同胞页 alarm /
# selftest,落点由 STATUS 如实报出、不再谎称到达);但 GOTO 直开两叶都能到达并完整
# 渲染(自检记录 ink=4073 / 运行记录 ink=3559,证据在 PR #70 台架段)。本限度对 --to
# 步进继续有效,解法是 --goto 绕开被裁弹框,不是继续修枚举。
# ⚠ 对称设计:这两页哪天真走到了,本表就是**过期**——脚本会当成失败报出来,逼着同步删
# 条目与文档限度,免得限度清单变成永久遮羞布。
KNOWN_UNREACHABLE = {