Agent 导航容易出错,没有反馈,调试成本很高 #69

Closed
opened 2026-11-02 20:01:37 +08:00 by wandering1 · 9 comments
Owner

@super_agent_bot 刚刚你在调试,就觉#38 修复回放页段表枚举恒空的缺陷工单的时候, 需要进入到故障录波,看波形,总是出现进入错误的页面,在此浪费了很多时间。你上网络上搜索参考成熟的项目经验,看看有什么办法,解决这个问题,是我们的操作成功率高一点。

@super_agent_bot 刚刚你在调试,就觉#38 修复回放页段表枚举恒空的缺陷工单的时候, 需要进入到故障录波,看波形,总是出现进入错误的页面,在此浪费了很多时间。你上网络上搜索参考成熟的项目经验,看看有什么办法,解决这个问题,是我们的操作成功率高一点。
wandering1 added this to the 项目跟踪 project 2026-11-02 20:01:37 +08:00
Collaborator

好的:会调研成熟项目里提高自动化 UI 导航成功率的做法,并结合我们的台架/回放页操作给出可行方案。

好的:会调研成熟项目里提高自动化 UI 导航成功率的做法,并结合我们的台架/回放页操作给出可行方案。 <!-- dsh-superagent:d342fb8e8dbb7df9c57b6822cee250c9 -->
STF was assigned by wandering1 2026-11-02 20:34:22 +08:00
Collaborator

This is by an automated agent, not a human.

调研完成。先给结论:成熟项目的经验里,提高导航成功率靠的不是把像素认得更准,而是三件事——让页面状态可查询、把多步按键行走改成一步直跳、让每步动作都带断言。 我们已经有一套闭环导航器 scripts/board_ui_nav.py(每按一键重新认屏、以页面身份定到达,2026-10-25 盲走翻车后建的),这次还反复走错,是因为这三件事恰好都缺着。

一、这次为什么总进错页(证据都是仓内留痕)

  1. 装置不会主动回答「我现在在哪页」。 RemoDispBus 只有 KEEP/INIT/KEY/LCDMEM 四条命令:注键应答是空帧、INIT 只回屏幕几何(Drivers/BSP/UI/ui_net_sink.h);页面 id 只在开/关页瞬间进串口一行(ui_content_page.c 的 page open: id=...),菜单层的移动和页内子态零日志。于是主机只能拿 3200 字节像素帧反推页面身份——「没有反馈」属实,且缺在协议层。
  2. 像素认屏有实测盲区。 按键后固定 300 ms 就取帧(BoardDevice.key),而 10-31 已立纪律「要等帧流静默 ≥900 ms 再抓,否则拿到的是上一屏」(脚本头注①,代码未同步);根列末两行的子菜单弹框被屏裁掉、选带根本看不见(自检记录/运行记录已被 KNOWN_UNREACHABLE 记账)。
  3. 键的语义随屏态变,盲走必踩。 待机/恢复态的 ENTER 是「原样还原之前的屏」=把刚关的页直接重开(ui_standby.c sb_key_cb);级联列光标记忆上次停留行、上下还首尾环绕(ui_menu.c:169/176),「进列按 k 次下」的算术不成立。这三条纪律都写在脚本头注里,但绕开脚本自己走就会踩。
  4. 导航工具不是唯一入口。 本次收尾的复现口令就是 --board --to wave_play(见 docs/测试说明/测试数据/wave_enum_20261102/README.md),可调试过程中手里用的却是临时自写的 walk 系列脚本、还在弹框误判时改用盲按 d*9。规程沉淀在 docs/UI设计/UI_自动化测试流程.md §7 和脚本头注里,技能面和 AGENTS.md 只把「UI 回归改动」路由过去、没有路由「板端交互操作」。10-25 盲走同款坑(9 个应到达态实测只有 3 个名副其实,§7.1 表)当时写过教训,这次又踩了一遍——说明沉淀形态(纯文档)到不了正在调试的会话手里。

二、成熟项目是怎么做的(本轮检索的对应关系)

业界做法 代表项目/出处 对我们的映射
结构化状态快照优先,明确禁止「基于截图行动」 Playwright MCP:靠 accessibility snapshot 操作,「You can't perform actions based on the screenshot, use browser_snapshot for actions」 给 7003 加一条 STATUS 查询:回页 id / 菜单路径+选中项
设备侧层级直读,不做像素反推 uiautomator2:dump_hierarchy() 回 XML、waitForExists 等结构化条件 同上——固件侧 desc->id、ui_menu.c 的 s_path/s_sel/s_depth 全是现成数据
禁猜步数,动作配「等到可见地到达」 Playwright:locator 是 auto-waiting/retry 的载体,官方要求优先用户可见属性、用自动重试断言(「非重试断言导致 flaky」) Navigator 已实现「单调扫标签、不猜步数」,缺的是强制所有会话走这个入口
用深链直跳替代逐步点菜单 web agent 的 goto URL / Android intent bench 构建加 GOTO 直跳命令:一步顶 N 步模糊行走
固化成功路径、失效自愈、复用轨迹 Stagehand:act() self-healing + cache: true 复用重复动作;Agent Workflow Memory:把历史成功轨迹归纳成可复用工作流,WebArena 相对成功率 +51.1%、步数还更少 菜单树 #page= 寻径表 + 黄金键序就是这个形态;补 --trace 步迹的留档与复判即可
工控仪器读回纪律:先查询再操作 IEEE-488/SCPI 的 *IDN?/*OPC? 惯例;Anthropic computer-use 也推荐显式工具定义与轨迹记录而非裸像素 STATUS 查询 + 动作后验到达,正好是同一纪律的 UI 版

多模态端侧 agent(Mobile-Agent 系列、UI-TARS)也在感知/规划/反思/记忆上分治、落错屏靠反思恢复——与我们 UNKNOWN→dump 现场+退避的机制同形,方向没有被业界推翻,欠的是把「身份」做成可查询的一等数据。

三、建议动作(按性价比排序)

  1. 【纯主机,立即】板端注键唯一入口化:新增 board-ui-nav 技能(--where、--to、--grab、UNKNOWN 一律 to_root 恢复、真机必带 --trace),AGENTS.md 主题表把「板端交互看图/注键」也路由到 UI_自动化测试流程.md §7;明令禁止临时脚本裸注键。
  2. 【纯主机,立即】把已写死的纪律同步进代码:key→grab 从固定 300 ms 改为「静默 ≥900 ms 或双帧一致」;UNKNOWN 恢复先 s 关页回 home 再判(防 ENTER 还原把坏页重开)。顺手修一个真 bug:--walk 默认存证目录 ci-artifacts/uinav/walk 与 BOARD_TRUTH 复判读的 ci-artifacts/uiwalk 不是同一个,真机留档帧的回判实际空转。
  3. 【固件小改,根治「没有反馈」】7003 加 STATUS 查询:回当前页 id,或菜单态的(路径、各层选中、深度)。ui_net_sink 双端共用 → 模拟器同步白得一条查询;认屏降级为 STATUS 不可用时的兜底。
  4. 【固件、仅 bench 构建】GOTO 直跳:按 page id 一步开页(uiTask 上下文查 ui_page_registry,查看密码自动过),执行类页 clear/reset 维持拒绝,到达后串口打身份戳留痕。成功率提升的最大单项——导航从 N 步模糊变成 1 步确定。
  5. **【台架复核两条】**弹框被屏裁的真机行为(selftest/runlog 现在记为不可达);「菜单态按 s 不收列」的文档/脚本纪律与 ui_menu.c 里 ESC 与 LEFT 同样弹层相互矛盾,上板实测后收口成一份口径。

1、2、5 不动固件,3、4 是固件小切口(都会跑 /keil-build + 台架验证再走评审)。您点头哪几条,我就按条立工单——1、2 可以直接开工。

This is by an automated agent, not a human. 调研完成。先给结论:**成熟项目的经验里,提高导航成功率靠的不是把像素认得更准,而是三件事——让页面状态可查询、把多步按键行走改成一步直跳、让每步动作都带断言。** 我们已经有一套闭环导航器 `scripts/board_ui_nav.py`(每按一键重新认屏、以页面身份定到达,2026-10-25 盲走翻车后建的),这次还反复走错,是因为这三件事恰好都缺着。 ## 一、这次为什么总进错页(证据都是仓内留痕) 1. **装置不会主动回答「我现在在哪页」。** RemoDispBus 只有 KEEP/INIT/KEY/LCDMEM 四条命令:注键应答是空帧、INIT 只回屏幕几何(`Drivers/BSP/UI/ui_net_sink.h`);页面 id 只在开/关页瞬间进串口一行(`ui_content_page.c` 的 `page open: id=...`),菜单层的移动和页内子态零日志。于是主机只能拿 3200 字节像素帧反推页面身份——**「没有反馈」属实,且缺在协议层。** 2. **像素认屏有实测盲区。** 按键后固定 300 ms 就取帧(`BoardDevice.key`),而 10-31 已立纪律「要等帧流静默 ≥900 ms 再抓,否则拿到的是上一屏」(脚本头注①,代码未同步);根列末两行的子菜单弹框被屏裁掉、选带根本看不见(自检记录/运行记录已被 `KNOWN_UNREACHABLE` 记账)。 3. **键的语义随屏态变,盲走必踩。** 待机/恢复态的 ENTER 是「原样还原之前的屏」=把刚关的页直接重开(`ui_standby.c` sb_key_cb);级联列光标记忆上次停留行、上下还首尾环绕(`ui_menu.c:169/176`),「进列按 k 次下」的算术不成立。这三条纪律都写在脚本头注里,但绕开脚本自己走就会踩。 4. **导航工具不是唯一入口。** 本次收尾的复现口令就是 `--board --to wave_play`(见 `docs/测试说明/测试数据/wave_enum_20261102/README.md`),可调试过程中手里用的却是临时自写的 walk 系列脚本、还在弹框误判时改用盲按 `d*9`。规程沉淀在 `docs/UI设计/UI_自动化测试流程.md` §7 和脚本头注里,技能面和 AGENTS.md 只把「UI 回归改动」路由过去、没有路由「板端交互操作」。10-25 盲走同款坑(9 个应到达态实测只有 3 个名副其实,§7.1 表)当时写过教训,这次又踩了一遍——说明沉淀形态(纯文档)到不了正在调试的会话手里。 ## 二、成熟项目是怎么做的(本轮检索的对应关系) | 业界做法 | 代表项目/出处 | 对我们的映射 | |---|---|---| | 结构化状态快照优先,明确禁止「基于截图行动」 | [Playwright MCP](https://github.com/microsoft/playwright-mcp):靠 accessibility snapshot 操作,「You can't perform actions based on the screenshot, use browser_snapshot for actions」 | 给 7003 加一条 STATUS 查询:回页 id / 菜单路径+选中项 | | 设备侧层级直读,不做像素反推 | [uiautomator2](https://github.com/openatx/uiautomator2):`dump_hierarchy()` 回 XML、`waitForExists` 等结构化条件 | 同上——固件侧 `desc->id`、`ui_menu.c` 的 `s_path/s_sel/s_depth` 全是现成数据 | | 禁猜步数,动作配「等到可见地到达」 | [Playwright](https://playwright.dev/docs/locators):locator 是 auto-waiting/retry 的载体,官方要求优先用户可见属性、用自动重试断言(「非重试断言导致 flaky」) | Navigator 已实现「单调扫标签、不猜步数」,缺的是强制所有会话走这个入口 | | 用深链直跳替代逐步点菜单 | web agent 的 `goto URL` / Android intent | bench 构建加 GOTO 直跳命令:一步顶 N 步模糊行走 | | 固化成功路径、失效自愈、复用轨迹 | [Stagehand](https://github.com/browserbase/stagehand):act() self-healing + `cache: true` 复用重复动作;[Agent Workflow Memory](https://arxiv.org/abs/2409.07429):把历史成功轨迹归纳成可复用工作流,WebArena 相对成功率 +51.1%、步数还更少 | 菜单树 `#page=` 寻径表 + 黄金键序就是这个形态;补 `--trace` 步迹的留档与复判即可 | | 工控仪器读回纪律:先查询再操作 | IEEE-488/SCPI 的 `*IDN?`/`*OPC?` 惯例;[Anthropic computer-use](https://github.com/anthropics/anthropic-quickstarts/tree/main/computer-use-demo) 也推荐显式工具定义与轨迹记录而非裸像素 | STATUS 查询 + 动作后验到达,正好是同一纪律的 UI 版 | 多模态端侧 agent([Mobile-Agent 系列](https://github.com/X-PLUG/MobileAgent)、[UI-TARS](https://github.com/bytedance/UI-TARS))也在感知/规划/反思/记忆上分治、落错屏靠反思恢复——与我们 UNKNOWN→dump 现场+退避的机制同形,方向没有被业界推翻,欠的是把「身份」做成可查询的一等数据。 ## 三、建议动作(按性价比排序) 1. **【纯主机,立即】板端注键唯一入口化**:新增 board-ui-nav 技能(--where、--to、--grab、UNKNOWN 一律 to_root 恢复、真机必带 --trace),AGENTS.md 主题表把「板端交互看图/注键」也路由到 `UI_自动化测试流程.md` §7;明令禁止临时脚本裸注键。 2. **【纯主机,立即】把已写死的纪律同步进代码**:key→grab 从固定 300 ms 改为「静默 ≥900 ms 或双帧一致」;UNKNOWN 恢复先 `s` 关页回 home 再判(防 ENTER 还原把坏页重开)。顺手修一个真 bug:`--walk` 默认存证目录 `ci-artifacts/uinav/walk` 与 BOARD_TRUTH 复判读的 `ci-artifacts/uiwalk` 不是同一个,真机留档帧的回判实际空转。 3. **【固件小改,根治「没有反馈」】7003 加 STATUS 查询**:回当前页 id,或菜单态的(路径、各层选中、深度)。`ui_net_sink` 双端共用 → 模拟器同步白得一条查询;认屏降级为 STATUS 不可用时的兜底。 4. **【固件、仅 bench 构建】GOTO 直跳**:按 page id 一步开页(uiTask 上下文查 `ui_page_registry`,查看密码自动过),执行类页 clear/reset 维持拒绝,到达后串口打身份戳留痕。成功率提升的最大单项——导航从 N 步模糊变成 1 步确定。 5. **【台架复核两条】**弹框被屏裁的真机行为(selftest/runlog 现在记为不可达);「菜单态按 s 不收列」的文档/脚本纪律与 `ui_menu.c` 里 ESC 与 LEFT 同样弹层相互矛盾,上板实测后收口成一份口径。 1、2、5 不动固件,3、4 是固件小切口(都会跑 /keil-build + 台架验证再走评审)。您点头哪几条,我就按条立工单——1、2 可以直接开工。
Collaborator

调研完成,完整办法已发到 Issue #69 评论:先定位了导航容易出错的四个根因(协议层无页面身份反馈、认屏时序未同步、待机键会重开刚关的坏页、根列末两行被屏裁),再给出对应办法,如给 KEY 应答加页面身份回读、把认屏静默阈值与 900ms 纪律对齐、开页前强制状态校验等。

调研完成,完整办法已发到 [Issue #69 评论](http://100.123.83.113:3001/wandering1/STM32F4-Base/issues/69#issuecomment-120):先定位了导航容易出错的四个根因(协议层无页面身份反馈、认屏时序未同步、待机键会重开刚关的坏页、根列末两行被屏裁),再给出对应办法,如给 KEY 应答加页面身份回读、把认屏静默阈值与 900ms 纪律对齐、开页前强制状态校验等。 <!-- dsh-superagent:c2a5bc932dacc389951b8b3a2cabbee9 -->
Author
Owner

@super_agent_bot 1 2 3 4 5 都进行实施

@super_agent_bot 1 2 3 4 5 都进行实施
Collaborator

收到:1–5 五条全部实施——固件加 7003 STATUS 查询与 bench 专用 GOTO 直跳、导航器纪律同步与存证目录修复、board-ui-nav 技能与 AGENTS 路由、两项台架复核收口。会按规矩走 Keil 构建、门禁与台架验证,结果回本 issue。

收到:1–5 五条全部实施——固件加 7003 STATUS 查询与 bench 专用 GOTO 直跳、导航器纪律同步与存证目录修复、board-ui-nav 技能与 AGENTS 路由、两项台架复核收口。会按规矩走 Keil 构建、门禁与台架验证,结果回本 issue。 <!-- dsh-superagent:0300959d97086b5985e2b6a01a3de5b8 -->
Collaborator

This is by an automated agent, not a human.

5 条建议已全部实施并经真机验证,PR 已提交:PR #70(说明与台架证据评论均为中文)。

合入后 agent 再进故障录波调试的形态:--goto wave_play 一步直达回放页(bench 固件),不再级联盲走;任何时候 --where 一帧 STATUS 报文就知道"现在到底在哪屏"(含待机态——这正是过去落错页的隐藏变量);生产固件对 GOTO 按编译闸恒回"不支持",身份查询则保留在生产版。两项台架复核也有了定论:被裁弹框两叶菜单步进确认不可达(绕行=GOTO,已写进限度账),菜单态 s 键实测与 l 同样收列、文档旧断言已按实测定正。

This is by an automated agent, not a human. 5 条建议已全部实施并经真机验证,PR 已提交:[PR #70](http://100.123.83.113:3001/wandering1/STM32F4-Base/pulls/70)(说明与台架证据评论均为中文)。 合入后 agent 再进故障录波调试的形态:`--goto wave_play` 一步直达回放页(bench 固件),不再级联盲走;任何时候 `--where` 一帧 STATUS 报文就知道"现在到底在哪屏"(含待机态——这正是过去落错页的隐藏变量);生产固件对 GOTO 按编译闸恒回"不支持",身份查询则保留在生产版。两项台架复核也有了定论:被裁弹框两叶菜单步进确认不可达(绕行=GOTO,已写进限度账),菜单态 s 键实测与 l 同样收列、文档旧断言已按实测定正。
Collaborator

调研提的五条导航改进已全部实施并真机验证:PR #70 就绪待人工合并。实机录波回放页一步直达、页面身份可回读,烧录闭环通过、台架锁已释放。PR 正文已按你的要求用中文书写。

调研提的五条导航改进已全部实施并真机验证:[PR #70](http://100.123.83.113:3001/wandering1/STM32F4-Base/pulls/70) 就绪待人工合并。实机录波回放页一步直达、页面身份可回读,烧录闭环通过、台架锁已释放。PR 正文已按你的要求用中文书写。 <!-- dsh-superagent:73698b71055eaf4b9ae92aafb4d4b1d5 -->
Author
Owner

@super_agent_bot 这个工单已经完成,可以放到已完成里了

@super_agent_bot 这个工单已经完成,可以放到已完成里了
Collaborator

已把 #69 移入「已完成」列(卡片同步核验通过)。PR #70 仍等你合并。

已把 #69 移入「已完成」列(卡片同步核验通过)。[PR #70](http://100.123.83.113:3001/wandering1/STM32F4-Base/pulls/70) 仍等你合并。 <!-- dsh-superagent:0e5b731878621b58549202236fe25236 -->
wandering1 added the 已完成 label 2026-11-03 07:37:34 +08:00
wandering1 added this to the 完成继电保护仪数据采集并且104通信成功 milestone 2026-11-03 07:40:14 +08:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wandering1/STM32F4-Base#69