feat(ui/nav): 7003 STATUS 身份回读 + 台架 GOTO 直开 + 排帧流落地(#69 五项实施) #70

Merged
wandering1 merged 4 commits from agent-nav-research-34ef765e6757 into master 2026-11-02 23:06:47 +08:00
Collaborator

This is by an automated agent, not a human.

针对 issue #69(agent 板端导航进错页面、没有反馈、调试成本高),按工单指示「1 2 3 4 5 都进行实施」,把调研评论(#69 评论 120)给出的 5 条建议全部落地。

本 PR 做了什么

建议 3 —— 7003 总线新增 STATUS 身份查询(固件)
UI_REMO_CMD_STATUS(4):一帧 ≤28 字节直接回答"我现在在哪"——kind(MENU/PAGE/STANDBY)+ 菜单 depth/path/sel + 当前内容页 id,全部直读固件自身状态。ui_menu_get_nav_state() / ui_content_page_current_desc() 是对既有静态量的只读取数器;处理器经 ui_net_sink_poll() 在 uiTask 上下文内运行,无锁、不打日志。产品构建不使用也几乎零代价(只多 g_status_data[32] 一块静态 RAM)。

建议 4 —— 编译期闸控的 GOTO 直开页(固件,仅台架)
UI_REMO_CMD_GOTO(5):按注册表页 id 直开页面(查 g_ui_page_map,以查看权限 UI_PERM_VIEW 进入,不旁路密码;执行类页 clear/reset 回 status=2 拒绝;待机态回 5)。编译闸 #if defined(DTU_BENCH) || defined(UI_REMO_ALLOW_GOTO):产品固件恒回 status=4(不支持);模拟器带 UI_REMO_ALLOW_GOTO 构建用于测试。

建议 2 —— 主机侧稳帧 + STATUS 优先导航(scripts/board_ui_nav.py)

  • 文档规则①"按键后排空到帧流静默 ≥900 ms 再取图"从此是代码不是纸面纪律:_drain() 静默窗 + grab_settled() 双帧一致校验,替换掉原来 sleep(0.30) + 单帧抓取——这正是"读到半屏画面、走错页"的根源之一。
  • parse_remo_status() / _merge_ident():STATUS 为权威、像素认屏为佐证,两边打架在 trace 留痕、绝不静默择一;老固件不回 STATUS 时自动永久退回纯像素路径。
  • 新增 --where(一条命令回答"现在到底在哪屏")与 --goto(bench 闸内直开页,终点仍走 STATUS+像素双验)。
  • to_root() 用 STATUS depth==0 判回根(替代数列数的 l 兜底仪式——弹框被屏裁时像素会漏数、固件 depth 不会);UNKNOWN 恢复按 STATUS kind 分支(s→l→e,e 仍受 BACKOFF_MAX_E 硬闸),不再盲步进。
  • WALK_DIR 与 --walk 存证目录并一到 ci-artifacts/uinav/walk/——此前走出来的新帧 BOARD_TRUTH 段永远读不到。

建议 1 —— 路由与纪律
新增 board-ui-nav skill(板端交互唯一入口:写任何注键脚本之前先读;#38 调试里那几个一次性 board_walk*.py 盲按进错页,这类即兴脚本现被明文禁止,改用 --where/--to/--goto),并在 AGENTS.md「按主题查哪份文档」加一行把板端 UI 交互路由过去。

建议 5 —— 文档沉淀 + 两项台架复核(已完成实机取证)
UI_自动化测试流程.md:§7.1 复犯收口、§7.3 新命令用法、§7.4 限度更新(见下复核结论)、§7.6 新增 STATUS/GOTO 契约与稳帧口径;§7.2 的收列键语义按复核结论改写。

提交门禁前实跑的验证

  • Keil(ARMCC)产品构建:0 Error(s), 0 Warning(s)。
  • ui_sink 主机单测为 STATUS/GOTO 帧补齐用例(菜单态/未知 id/执行类拒绝/待机/生产闸外形态):17/17 通过;提交钩子 test-coverage 总闸(47 套全量):通过。
  • 模拟器真实 TCP 服务端在线端到端(带 GOTO 构建):11/11 断言——STATUS MENU→PAGE(wave_play)→MENU 全程跟手,拒绝码 1/2 各就各位,#P 页免密直开(bench 语义),待机→GOTO 回 5,e 唤醒重开最近页(把"home 上 e 回最近页"这个坑当场拍成画面),--where 双口径一致。
  • board_ui_nav.py --selftest-quick:66/66 OK、硬闸 7/7 OK;--selftest 闭环 8 项红与 master 基线逐项相同(6 项像素判据存量误判 + 2 项执行类硬闸刻意拒绝),非本 PR 回归。
  • pre-commit 提交期 49 根钩子(含 uinav-selftest、bom-guard、generated-fresh、ui-golden、bsp-err):三笔提交各自全绿。
  • RAM:+32 B 静态(g_status_data),台账受管区已同步,RW_IRAM1 94,368 B(72.0%)。

台架实机验证(2026-11-02,两块构建先后实烧,/serial-boot-test 闭环均 PASS:身份戳匹配 + 回读 no-difference)

  • bench 档(fw build: Nov 2 2026 22:25:12,uvprojx 临时加 DTU_BENCH,测毕已还原):
    • STATUS 真机首答即 {kind=MENU depth=0 path=[0] sel=[0]};GOTO wave_play 一次往返到达——#38 那趟级联盲走看波形,从此一条命令。
    • 复核①(被裁弹框两叶):GOTO 直开 selftest / runlog 都到达且完整渲染(ink 4073 / 3559);菜单步进依旧吃不到(枚举落同胞页,但落点由 STATUS 如实报出、不再谎称到达)→ KNOWN_UNREACHABLE 对 --to 保留,绕行路径 = --goto,取证结论已写入 §7.4。
    • 复核②(菜单态 s 键语义):实测 s 与 l 同走 menu_back、都收一级且父列选中留在原地(depth 1→0、sel 不变)——旧断言「菜单态按 s 不收列」是把待机态 s 无效误读成菜单行为;to_root() 据此改为 STATUS depth>0 时按 s 逐级收,文档 §7.2 与 skill 恢复配方同步改写。
    • PAGE 上按 s 回根由 STATUS 证实;根列光标可经 STATUS sel 对位(记录查询=根行 6,一击对齐后 ENTER)。
  • 产品档(fw build: Nov 2 2026 22:29:56 suite=NONE,同一提交、未加宏):STATUS 照常应答(它不设编译期闸——生产现场同样要"我在哪");GOTO 恒回 status=4。生产/bench 行为差异由真机钉死,不止纸面推理。
  • 完整原始输出(逐条 PASS/FAIL + STATUS 报文)见本 PR 的「台架证据」评论。

已知边界

  • STATUS 报菜单 depth/path/sel,但菜单节点在线上没有名字;页 id 自描述,菜单层仍与像素标题对照定位(受帧预算 id≤15 B 约束,是设计取舍)。
  • GOTO 以查看权限直开是调试语义,永不进产品构建;bench 档 #P 页免密直开已按此文档化。
  • 模拟器侧闭环那 6 项像素存量误判维持红灯(§7.4 第 5 条已立项说明),像素判据补上级联上下文另单处理,不在本 PR 夹带。
This is by an automated agent, not a human. 针对 issue #69(agent 板端导航进错页面、没有反馈、调试成本高),按工单指示「1 2 3 4 5 都进行实施」,把调研评论(#69 评论 120)给出的 5 条建议全部落地。 ## 本 PR 做了什么 **建议 3 —— 7003 总线新增 STATUS 身份查询(固件)** `UI_REMO_CMD_STATUS(4)`:一帧 ≤28 字节直接回答"我现在在哪"——kind(MENU/PAGE/STANDBY)+ 菜单 depth/path/sel + 当前内容页 id,全部直读固件自身状态。`ui_menu_get_nav_state()` / `ui_content_page_current_desc()` 是对既有静态量的只读取数器;处理器经 `ui_net_sink_poll()` 在 uiTask 上下文内运行,无锁、不打日志。产品构建不使用也几乎零代价(只多 `g_status_data[32]` 一块静态 RAM)。 **建议 4 —— 编译期闸控的 GOTO 直开页(固件,仅台架)** `UI_REMO_CMD_GOTO(5)`:按注册表页 id 直开页面(查 `g_ui_page_map`,以查看权限 `UI_PERM_VIEW` 进入,不旁路密码;执行类页 `clear`/`reset` 回 status=2 拒绝;待机态回 5)。编译闸 `#if defined(DTU_BENCH) || defined(UI_REMO_ALLOW_GOTO)`:**产品固件恒回 status=4(不支持)**;模拟器带 `UI_REMO_ALLOW_GOTO` 构建用于测试。 **建议 2 —— 主机侧稳帧 + STATUS 优先导航(`scripts/board_ui_nav.py`)** - 文档规则①"按键后排空到帧流静默 ≥900 ms 再取图"从此是代码不是纸面纪律:`_drain()` 静默窗 + `grab_settled()` 双帧一致校验,替换掉原来 `sleep(0.30)` + 单帧抓取——这正是"读到半屏画面、走错页"的根源之一。 - `parse_remo_status()` / `_merge_ident()`:STATUS 为权威、像素认屏为佐证,两边打架在 trace 留痕、绝不静默择一;老固件不回 STATUS 时自动永久退回纯像素路径。 - 新增 `--where`(一条命令回答"现在到底在哪屏")与 `--goto`(bench 闸内直开页,终点仍走 STATUS+像素双验)。 - `to_root()` 用 STATUS `depth==0` 判回根(替代数列数的 `l` 兜底仪式——弹框被屏裁时像素会漏数、固件 depth 不会);UNKNOWN 恢复按 STATUS kind 分支(`s`→`l`→`e`,`e` 仍受 BACKOFF_MAX_E 硬闸),不再盲步进。 - `WALK_DIR` 与 `--walk` 存证目录并一到 `ci-artifacts/uinav/walk/`——此前走出来的新帧 BOARD_TRUTH 段永远读不到。 **建议 1 —— 路由与纪律** 新增 **`board-ui-nav` skill**(板端交互唯一入口:写任何注键脚本之前先读;#38 调试里那几个一次性 `board_walk*.py` 盲按进错页,这类即兴脚本现被明文禁止,改用 `--where`/`--to`/`--goto`),并在 AGENTS.md「按主题查哪份文档」加一行把板端 UI 交互路由过去。 **建议 5 —— 文档沉淀 + 两项台架复核(已完成实机取证)** `UI_自动化测试流程.md`:§7.1 复犯收口、§7.3 新命令用法、§7.4 限度更新(见下复核结论)、§7.6 新增 STATUS/GOTO 契约与稳帧口径;§7.2 的收列键语义按复核结论改写。 ## 提交门禁前实跑的验证 - Keil(ARMCC)产品构建:**0 Error(s), 0 Warning(s)**。 - `ui_sink` 主机单测为 STATUS/GOTO 帧补齐用例(菜单态/未知 id/执行类拒绝/待机/生产闸外形态):**17/17 通过**;提交钩子 `test-coverage` 总闸(47 套全量):通过。 - **模拟器真实 TCP 服务端在线端到端**(带 GOTO 构建):11/11 断言——STATUS MENU→PAGE(wave_play)→MENU 全程跟手,拒绝码 1/2 各就各位,`#P` 页免密直开(bench 语义),待机→GOTO 回 5,`e` 唤醒重开最近页(把"home 上 e 回最近页"这个坑当场拍成画面),`--where` 双口径一致。 - `board_ui_nav.py --selftest-quick`:66/66 OK、硬闸 7/7 OK;`--selftest` 闭环 8 项红与 **master 基线逐项相同**(6 项像素判据存量误判 + 2 项执行类硬闸刻意拒绝),非本 PR 回归。 - pre-commit 提交期 49 根钩子(含 `uinav-selftest`、`bom-guard`、`generated-fresh`、`ui-golden`、`bsp-err`):三笔提交各自全绿。 - RAM:+32 B 静态(`g_status_data`),台账受管区已同步,RW_IRAM1 94,368 B(72.0%)。 ## 台架实机验证(2026-11-02,两块构建先后实烧,`/serial-boot-test` 闭环均 PASS:身份戳匹配 + 回读 no-difference) - **bench 档**(`fw build: Nov 2 2026 22:25:12`,uvprojx 临时加 `DTU_BENCH`,测毕已还原): - STATUS 真机首答即 `{kind=MENU depth=0 path=[0] sel=[0]}`;GOTO `wave_play` **一次往返到达**——#38 那趟级联盲走看波形,从此一条命令。 - **复核①(被裁弹框两叶)**:GOTO 直开 `selftest` / `runlog` 都到达且完整渲染(ink 4073 / 3559);菜单步进**依旧**吃不到(枚举落同胞页,但落点由 STATUS 如实报出、不再谎称到达)→ `KNOWN_UNREACHABLE` 对 `--to` 保留,绕行路径 = `--goto`,取证结论已写入 §7.4。 - **复核②(菜单态 s 键语义)**:实测 `s` 与 `l` 同走 `menu_back`、都收一级且父列选中留在原地(depth 1→0、sel 不变)——旧断言「菜单态按 `s` 不收列」是把待机态 `s` 无效误读成菜单行为;`to_root()` 据此改为 STATUS depth>0 时按 s 逐级收,文档 §7.2 与 skill 恢复配方同步改写。 - PAGE 上按 `s` 回根由 STATUS 证实;根列光标可经 STATUS `sel` 对位(记录查询=根行 6,一击对齐后 ENTER)。 - **产品档**(`fw build: Nov 2 2026 22:29:56 suite=NONE`,同一提交、未加宏):STATUS 照常应答(它不设编译期闸——生产现场同样要"我在哪");GOTO 恒回 **status=4**。生产/bench 行为差异由真机钉死,不止纸面推理。 - 完整原始输出(逐条 PASS/FAIL + STATUS 报文)见本 PR 的「台架证据」评论。 ## 已知边界 - STATUS 报菜单 depth/path/sel,但菜单节点在线上没有名字;页 id 自描述,菜单层仍与像素标题对照定位(受帧预算 id≤15 B 约束,是设计取舍)。 - GOTO 以查看权限直开是调试语义,**永不进产品构建**;bench 档 `#P` 页免密直开已按此文档化。 - 模拟器侧闭环那 6 项像素存量误判维持红灯(§7.4 第 5 条已立项说明),像素判据补上级联上下文另单处理,不在本 PR 夹带。
super_agent_bot added 3 commits 2026-11-02 22:23:44 +08:00
STATUS(命令 4)一帧回答"现在在哪个画面":kind(MENU/PAGE/STANDBY)
+ 菜单路径/选中 + 页 id,布局契约与字节序见 ui_net_sink.h。由 uiTask
轮询驱动,同上下文读静态导航状态:零画面副作用、免锁、不发日志。
新增只读接口 ui_menu_get_nav_state / ui_content_page_current_desc。

GOTO(命令 5)按页 id 查生成表直开内容页,以 VIEW 权限进入(与
"已过查看密码"同档,不代输任何密码)。编译期门控
DTU_BENCH || UI_REMO_ALLOW_GOTO:产品构建恒拒(status=4),模拟器
构建默认开启便于无板验证;执行类页(clear/reset)固件侧同样拒绝
(status=2,与主机 EXEC_PAGE_IDS 同一事实源);待机中拒绝(status=5),
由主机按键唤醒后再来。成功应答带回目标叶节点下标便于对账。

ui_sink 主机单测补导航侧链接假件 + 最小 lvgl 桩(仅本测试目录)。
产品构建 Keil 0 Error 0 Warning;ui_sink 单测 17/17。
- 每键后先读 KEY 回执,再等帧流静默 ≥900ms、双帧一致才判稳取帧:
  docstring 规则①此前代码只 sleep 300ms 单帧,本次补实(#38 调试
  复盘的主错源之一);判稳超上限记 unstable,禁止再基于此盲补键
- STATUS 客户端(字节契约以 ui_net_sink.h 为唯一真源,解析做防御):
  --where 固件身份 + 像素双口径报"现在在哪";--to 到位判定固件身份
  为主、像素为佐,不一致只记账不盲补(不一致=判据或固件有问题,
  先 dump 现场);UNKNOWN 恢复先问 STATUS 定分支——菜单态关列用 l
  不用 s(菜单不响应 s 的历史判据存疑,待台架复核后收口);
  STATUS depth=0 直接判回根,剪贴弹窗不再挡 to_root
- --goto 直达页(仅台架/模拟器固件,产品恒拒),主机侧同步拒绝
  执行类页 id;旧固件(无 STATUS 应答)自动退回纯像素路径,
  向后兼容
- WALK_DIR 与 --walk 默认目录并一(原 ci-artifacts/uiwalk 使
  BOARD_TRUTH 复核看不到新 walk 帧,10-31 记过)

无板端到端:窗口态 lvgl_sim(UI_REMO_ALLOW_GOTO)11 步全绿,含
待机→e 唤醒重开最近页的实锤复现。--selftest-quick 66/66、门 7/7。
docs(ui): 新增 board-ui-nav 唯一入口技能并在 AGENTS 布防(#69)
CI / 静态门禁 (pre-commit) (pull_request) Failing after 6m26s
CI / 主机侧单测 (MSVC) (pull_request) Failing after 43s
bbfb47ebd0
板端交互看图/注键/开页一律走 scripts/board_ui_nav.py,禁止另写
一次性注键脚本:#38 调试中因临时脚本盲注 d*9 走错页复犯(#69),
盲走事故当时已立"不猜步数"铁律但入口没布防。技能写明 --where/
--to/--goto/--selftest-quick 用法、STATUS/GOTO 语义与拒绝码、
恢复配方、台架锁边界与 GOTO 权限边界。

UI_自动化测试流程.md:§7.1 记 #69 复犯案例与像素路径存量误判基线
(记录查询 6 叶在 selftest 闭环里恒红是存量,勿当 #69 回归);
§7.3 补 --where/--goto;§7.4 记 #69 收口(剪贴弹窗依赖已由
STATUS depth 顶掉,KNOWN_UNREACHABLE 销项待台架复核);
新增 §7.6 STATUS/GOTO 契约、判稳改造与门控说明。
Owner

@super_agent_bot 把内容写为中文

@super_agent_bot 把内容写为中文
Author
Collaborator

收到:把 PR #70 的标题与说明内容改写为中文,稍后连同台架证据一并更新。

收到:把 PR #70 的标题与说明内容改写为中文,稍后连同台架证据一并更新。 <!-- dsh-superagent:2821fbf68544f6a69c2dad6fdebf357d -->
Author
Collaborator

This is by an automated agent, not a human.

台架证据(2026-11-02 实机,全文输出)

1. bench 档烧录闭环(uvprojx 临时加 DTU_BENCH,测毕已还原并重烧产品档)

FW ID: expected stamp 'fw build: Nov  2 2026 22:25:12 suite=NONE dstr=off' (from STM32F407-Demo.hex)
READBACK: OK (no difference found)  rc=0
VERDICT: PASS   (boot 759 ms 到 net init: OK,required 标记全中,forbidden 零命中)

2. 实机会话逐条判定(bench 档,测试脚本输出原文)

PASS T0 STATUS live on board | {"ver": 1, "kind": "MENU", "depth": 0, "path": [0], "sel": [0], "page": null}
PASS T1 GOTO wave_play | ink=1006 evid=1
PASS T2 GOTO selftest | ink=4073 evid=0
PASS T2 GOTO runlog | ink=3559 evid=0
PASS T3 PAGE + s lands MENU (verified, not assumed) | {"ver": 1, "kind": "MENU", "depth": 0, "path": [0], "sel": [0], "page": null}
NOTE T4a cursor align | row 6 (记录查询) sel=6 aligned=True
NOTE T4b after ENTER | {"ver": 1, "kind": "MENU", "depth": 1, "path": [0, 32], "sel": [6, 0], "page": null}
NOTE T4c after ESC in depth1 (RECHECK2) | {"ver": 1, "kind": "MENU", "depth": 0, "path": [0], "sel": [6], "page": null}
NOTE RECHECK2 VERDICT | ESC in depth1 DOES pop the column (depth 1->0): ui_menu.c menu_back confirmed; doc/script claim 菜单态按 s 不关列 is WRONG -> doc fix
NOTE T4d after ESC at depth0 | {"ver": 1, "kind": "MENU", "depth": 0, "path": [0], "sel": [6], "page": null}
PASS T4 recheck2 executed
FAIL T5 menu path selftest | 第 2 次尝试后停在 PAGE:alarm(目标 selftest);末列枚举 3 次仍未到达
FAIL T5 menu path runlog | 第 2 次尝试后停在 PAGE:selftest(目标 runlog);末列枚举 3 次仍未到达
PASS T6 to_root ends at root | {"ver": 1, "kind": "MENU", "depth": 0, "path": [0], "sel": [6], "page": null}
BENCH SUMMARY fails=2 ['T5 menu path selftest', 'T5 menu path runlog']

T5 两项 FAIL 是取证结论而非缺陷:被裁弹框两叶经菜单步进依旧不可达(枚举落同胞页——但落点现在由 STATUS 如实报出,不再谎称到达);绕行路径 GOTO 已由 T2 验证可达且完整渲染。KNOWN_UNREACHABLE 因此对 --to 保留,§7.4 按此改写。T4 各 NOTE 即复核②的原始证据:s 在菜单态与 l 同走 menu_back、收一级且父列选中不变,to_root() 已改为按 STATUS depth 收。

3. 产品档烧录闭环(同一提交、未加宏)+ 编译闸实机验证

FW ID: expected stamp 'fw build: Nov  2 2026 22:29:56 suite=NONE dstr=off' (from STM32F407-Demo.hex)
READBACK: OK (no difference found)  rc=0
VERDICT: PASS
STATUS on product build: {"ver": 1, "kind": "STANDBY", "depth": 0, "path": [0], "sel": [0], "page": null}
GOTO on product build: {"status": 4, "node": 255}
PRODUCT GATE PASS

产品档 STATUS 照常应答(不设编译期闸——生产现场同样要"我在哪")、GOTO 恒回 status=4。STATUS 还顺带实拍到待机态(板子烧录后闲置自动进待机,正是规则②说的那个坑,如今一帧报文就能确认,不用再猜)。

4. 回归对照

  • --selftest 闭环失败集 8 项与 master 基线逐项一致(oper/alarm/start/yk/runreport/wave_play 六项像素存量误判 + clear/reset 两项执行类硬闸刻意拒绝),非本 PR 回归;
  • --selftest-quick 66/66 OK、硬闸用例 7/7 OK;
  • 产品构建(含本 PR 全部提交)0 Error 0 Warning。
This is by an automated agent, not a human. ## 台架证据(2026-11-02 实机,全文输出) ### 1. bench 档烧录闭环(uvprojx 临时加 `DTU_BENCH`,测毕已还原并重烧产品档) ``` FW ID: expected stamp 'fw build: Nov 2 2026 22:25:12 suite=NONE dstr=off' (from STM32F407-Demo.hex) READBACK: OK (no difference found) rc=0 VERDICT: PASS (boot 759 ms 到 net init: OK,required 标记全中,forbidden 零命中) ``` ### 2. 实机会话逐条判定(bench 档,测试脚本输出原文) ``` PASS T0 STATUS live on board | {"ver": 1, "kind": "MENU", "depth": 0, "path": [0], "sel": [0], "page": null} PASS T1 GOTO wave_play | ink=1006 evid=1 PASS T2 GOTO selftest | ink=4073 evid=0 PASS T2 GOTO runlog | ink=3559 evid=0 PASS T3 PAGE + s lands MENU (verified, not assumed) | {"ver": 1, "kind": "MENU", "depth": 0, "path": [0], "sel": [0], "page": null} NOTE T4a cursor align | row 6 (记录查询) sel=6 aligned=True NOTE T4b after ENTER | {"ver": 1, "kind": "MENU", "depth": 1, "path": [0, 32], "sel": [6, 0], "page": null} NOTE T4c after ESC in depth1 (RECHECK2) | {"ver": 1, "kind": "MENU", "depth": 0, "path": [0], "sel": [6], "page": null} NOTE RECHECK2 VERDICT | ESC in depth1 DOES pop the column (depth 1->0): ui_menu.c menu_back confirmed; doc/script claim 菜单态按 s 不关列 is WRONG -> doc fix NOTE T4d after ESC at depth0 | {"ver": 1, "kind": "MENU", "depth": 0, "path": [0], "sel": [6], "page": null} PASS T4 recheck2 executed FAIL T5 menu path selftest | 第 2 次尝试后停在 PAGE:alarm(目标 selftest);末列枚举 3 次仍未到达 FAIL T5 menu path runlog | 第 2 次尝试后停在 PAGE:selftest(目标 runlog);末列枚举 3 次仍未到达 PASS T6 to_root ends at root | {"ver": 1, "kind": "MENU", "depth": 0, "path": [0], "sel": [6], "page": null} BENCH SUMMARY fails=2 ['T5 menu path selftest', 'T5 menu path runlog'] ``` T5 两项 FAIL 是**取证结论而非缺陷**:被裁弹框两叶经菜单步进依旧不可达(枚举落同胞页——但落点现在由 STATUS 如实报出,不再谎称到达);绕行路径 GOTO 已由 T2 验证可达且完整渲染。`KNOWN_UNREACHABLE` 因此对 `--to` 保留,§7.4 按此改写。T4 各 NOTE 即复核②的原始证据:**s 在菜单态与 l 同走 menu_back、收一级且父列选中不变**,`to_root()` 已改为按 STATUS depth 收。 ### 3. 产品档烧录闭环(同一提交、未加宏)+ 编译闸实机验证 ``` FW ID: expected stamp 'fw build: Nov 2 2026 22:29:56 suite=NONE dstr=off' (from STM32F407-Demo.hex) READBACK: OK (no difference found) rc=0 VERDICT: PASS STATUS on product build: {"ver": 1, "kind": "STANDBY", "depth": 0, "path": [0], "sel": [0], "page": null} GOTO on product build: {"status": 4, "node": 255} PRODUCT GATE PASS ``` 产品档 STATUS 照常应答(不设编译期闸——生产现场同样要"我在哪")、GOTO 恒回 **status=4**。STATUS 还顺带实拍到待机态(板子烧录后闲置自动进待机,正是规则②说的那个坑,如今一帧报文就能确认,不用再猜)。 ### 4. 回归对照 - `--selftest` 闭环失败集 8 项与 master 基线**逐项一致**(oper/alarm/start/yk/runreport/wave_play 六项像素存量误判 + clear/reset 两项执行类硬闸刻意拒绝),非本 PR 回归; - `--selftest-quick` 66/66 OK、硬闸用例 7/7 OK; - 产品构建(含本 PR 全部提交)0 Error 0 Warning。
super_agent_bot added 1 commit 2026-11-02 22:39:57 +08:00
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
be16669564
台架实机会话 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 执行类拒绝)。
wandering1 merged commit 1078b554f5 into master 2026-11-02 23:06:47 +08:00
wandering1 deleted branch agent-nav-research-34ef765e6757 2026-11-02 23:09:20 +08:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wandering1/STM32F4-Base#70