feat(ui/nav): 7003 STATUS 身份回读 + 台架 GOTO 直开 + 排帧流落地(#69 五项实施) #70
Reference in New Issue
Block a user
Delete Branch "agent-nav-research-34ef765e6757"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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)_drain()静默窗 +grab_settled()双帧一致校验,替换掉原来sleep(0.30)+ 单帧抓取——这正是"读到半屏画面、走错页"的根源之一。parse_remo_status()/_merge_ident():STATUS 为权威、像素认屏为佐证,两边打架在 trace 留痕、绝不静默择一;老固件不回 STATUS 时自动永久退回纯像素路径。--where(一条命令回答"现在到底在哪屏")与--goto(bench 闸内直开页,终点仍走 STATUS+像素双验)。to_root()用 STATUSdepth==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-navskill(板端交互唯一入口:写任何注键脚本之前先读;#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 的收列键语义按复核结论改写。提交门禁前实跑的验证
ui_sink主机单测为 STATUS/GOTO 帧补齐用例(菜单态/未知 id/执行类拒绝/待机/生产闸外形态):17/17 通过;提交钩子test-coverage总闸(47 套全量):通过。#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 回归。uinav-selftest、bom-guard、generated-fresh、ui-golden、bsp-err):三笔提交各自全绿。g_status_data),台账受管区已同步,RW_IRAM1 94,368 B(72.0%)。台架实机验证(2026-11-02,两块构建先后实烧,
/serial-boot-test闭环均 PASS:身份戳匹配 + 回读 no-difference)fw build: Nov 2 2026 22:25:12,uvprojx 临时加DTU_BENCH,测毕已还原):{kind=MENU depth=0 path=[0] sel=[0]};GOTOwave_play一次往返到达——#38 那趟级联盲走看波形,从此一条命令。selftest/runlog都到达且完整渲染(ink 4073 / 3559);菜单步进依旧吃不到(枚举落同胞页,但落点由 STATUS 如实报出、不再谎称到达)→KNOWN_UNREACHABLE对--to保留,绕行路径 =--goto,取证结论已写入 §7.4。s与l同走menu_back、都收一级且父列选中留在原地(depth 1→0、sel 不变)——旧断言「菜单态按s不收列」是把待机态s无效误读成菜单行为;to_root()据此改为 STATUS depth>0 时按 s 逐级收,文档 §7.2 与 skill 恢复配方同步改写。s回根由 STATUS 证实;根列光标可经 STATUSsel对位(记录查询=根行 6,一击对齐后 ENTER)。fw build: Nov 2 2026 22:29:56 suite=NONE,同一提交、未加宏):STATUS 照常应答(它不设编译期闸——生产现场同样要"我在哪");GOTO 恒回 status=4。生产/bench 行为差异由真机钉死,不止纸面推理。已知边界
#P页免密直开已按此文档化。@super_agent_bot 把内容写为中文
收到:把 PR #70 的标题与说明内容改写为中文,稍后连同台架证据一并更新。
This is by an automated agent, not a human.
台架证据(2026-11-02 实机,全文输出)
1. bench 档烧录闭环(uvprojx 临时加
DTU_BENCH,测毕已还原并重烧产品档)2. 实机会话逐条判定(bench 档,测试脚本输出原文)
T5 两项 FAIL 是取证结论而非缺陷:被裁弹框两叶经菜单步进依旧不可达(枚举落同胞页——但落点现在由 STATUS 如实报出,不再谎称到达);绕行路径 GOTO 已由 T2 验证可达且完整渲染。
KNOWN_UNREACHABLE因此对--to保留,§7.4 按此改写。T4 各 NOTE 即复核②的原始证据:s 在菜单态与 l 同走 menu_back、收一级且父列选中不变,to_root()已改为按 STATUS depth 收。3. 产品档烧录闭环(同一提交、未加宏)+ 编译闸实机验证
产品档 STATUS 照常应答(不设编译期闸——生产现场同样要"我在哪")、GOTO 恒回 status=4。STATUS 还顺带实拍到待机态(板子烧录后闲置自动进待机,正是规则②说的那个坑,如今一帧报文就能确认,不用再猜)。
4. 回归对照
--selftest闭环失败集 8 项与 master 基线逐项一致(oper/alarm/start/yk/runreport/wave_play 六项像素存量误判 + clear/reset 两项执行类硬闸刻意拒绝),非本 PR 回归;--selftest-quick66/66 OK、硬闸用例 7/7 OK;