cards() 把店铺行当成订单卡片 #314

Open
opened 2026-09-18 14:24:42 +08:00 by ila · 1 comment
Owner

原始需求

用户 2026-09-18:「agent回填还是失败,真机停留现场,你分析原因」。

事实(真机 192.168.0.173:38881,0.9.59,2026-09-18)

回填结果:「等待订单列表加载超时,未完整扫描」,已检查 0。前一次为「返回后未识别全部订单列表」,同样已检查 0。checked++ 无条件执行,两次都证明没有任何一张订单卡片被打开过。

拿真机控件树(445 节点)逐条复算判据:

  • 连续三帧间隔 2 秒完全一致(445 节点、166 个非零高度),布局是稳定的。第一张卡片子树塌成零高度是列表滚动后节点被移出视口上方所致,不是重排中间态——#313 据此做的推断不成立。
  • allTab() 的全部前置在真实树上通过:无风险词、无「订单编号」、「我的订单」存在、label=="全部" 唯一、与禁词无几何重叠。
  • 复算 cards():返回 4 个容器,全部是店铺行,例如 [0,588][1080,696] 高 108,其中唯一的图面积 3600(60×60 店铺 logo),没有商品图。

根因:cardContext 含状态词「待收货」「待发货」,而状态词就长在卡片顶部的店铺行里(如 [924,618][1047,666]),与店铺 logo、店铺名同行。店铺行于是自己凑齐「有图 + 有 ≥4 字文本 + 有上下文词」三个条件;它比真卡片更深,「最小容器」规则把真卡片当祖先滤掉。店铺行里只有 logo 一张图,cardEntry 取面积最大的图仍然指向它,入口回到店铺名——#311 的前提因此也是错的,那条改动是在错误的容器上做优化。

换成仅用动作词复算,结果正确:

容器 高 锚点图 入口 唯一
[0,588][1080,1341] 753 240x240 商品标题 是
[0,1362][1080,2112] 750 240x240 商品标题 是
[0,2133][1080,2328] 195 240x93 商品标题 是

方案

  • cardContext 去掉状态词「待发货」「待收货」「交易成功」,只保留动作词。动作词只出现在卡片底部按钮行,能同时包住店铺行与按钮行的容器才是真卡片。
  • 撤销 #313 给稳定签名加的「可见非零高度节点数」。该改动基于已被证伪的中间帧推断,且会让签名在列表加载期间始终变化,8 次重试用尽即「等待订单列表加载超时」——本次失败就是它造成的。awaitOrders() 的两处调用保留:把单帧不合格即中止改成有界重试,与该推断无关。

代价:完全没有动作按钮的卡片会被跳过。跳过是安全的,误点不是。

验收

  • 测试夹具按真机层级重建(店铺行、商品行、动作行各自成块),新增「店铺行不得被当作卡片」。
  • 把状态词放回 cardContext 后相关用例必须变红。
  • 真机回填读到订单编号与下单时间。

风险与回退

回退即还原 cardContext 与签名两处。

文档影响

无长期文档影响:未改入口、配置、接口和状态机。

## 原始需求 用户 2026-09-18:「agent回填还是失败,真机停留现场,你分析原因」。 ## 事实(真机 192.168.0.173:38881,0.9.59,2026-09-18) 回填结果:「等待订单列表加载超时,未完整扫描」,已检查 0。前一次为「返回后未识别全部订单列表」,同样已检查 0。`checked++` 无条件执行,两次都证明**没有任何一张订单卡片被打开过**。 拿真机控件树(445 节点)逐条复算判据: - 连续三帧间隔 2 秒完全一致(445 节点、166 个非零高度),布局是稳定的。第一张卡片子树塌成零高度是列表滚动后节点被移出视口上方所致,不是重排中间态——#313 据此做的推断不成立。 - `allTab()` 的全部前置在真实树上通过:无风险词、无「订单编号」、「我的订单」存在、`label=="全部"` 唯一、与禁词无几何重叠。 - 复算 `cards()`:返回 4 个容器,全部是**店铺行**,例如 `[0,588][1080,696]` 高 108,其中唯一的图面积 3600(60×60 店铺 logo),没有商品图。 根因:`cardContext` 含状态词「待收货」「待发货」,而状态词就长在卡片顶部的店铺行里(如 `[924,618][1047,666]`),与店铺 logo、店铺名同行。店铺行于是自己凑齐「有图 + 有 ≥4 字文本 + 有上下文词」三个条件;它比真卡片更深,「最小容器」规则把真卡片当祖先滤掉。店铺行里只有 logo 一张图,`cardEntry` 取面积最大的图仍然指向它,入口回到店铺名——#311 的前提因此也是错的,那条改动是在错误的容器上做优化。 换成仅用动作词复算,结果正确: | 容器 | 高 | 锚点图 | 入口 | 唯一 | |---|---|---|---|---| | [0,588][1080,1341] | 753 | 240x240 | 商品标题 | 是 | | [0,1362][1080,2112] | 750 | 240x240 | 商品标题 | 是 | | [0,2133][1080,2328] | 195 | 240x93 | 商品标题 | 是 | ## 方案 - `cardContext` 去掉状态词「待发货」「待收货」「交易成功」,只保留动作词。动作词只出现在卡片底部按钮行,能同时包住店铺行与按钮行的容器才是真卡片。 - 撤销 #313 给稳定签名加的「可见非零高度节点数」。该改动基于已被证伪的中间帧推断,且会让签名在列表加载期间始终变化,8 次重试用尽即「等待订单列表加载超时」——本次失败就是它造成的。`awaitOrders()` 的两处调用保留:把单帧不合格即中止改成有界重试,与该推断无关。 代价:完全没有动作按钮的卡片会被跳过。跳过是安全的,误点不是。 ## 验收 - 测试夹具按真机层级重建(店铺行、商品行、动作行各自成块),新增「店铺行不得被当作卡片」。 - 把状态词放回 `cardContext` 后相关用例必须变红。 - 真机回填读到订单编号与下单时间。 ## 风险与回退 回退即还原 `cardContext` 与签名两处。 ## 文档影响 无长期文档影响:未改入口、配置、接口和状态机。
Author
Owner

实施

提交 92fa73d(deploy-main)。

  • cardContext 去掉状态词「待发货」「待收货」「交易成功」,只保留动作词。
  • 撤销 #313 给 awaitOrders() 稳定签名加的可见非零高度节点数;两处 awaitOrders() 调用保留。
  • 测试夹具按真机层级重建:店铺行、商品行、动作行各自成块。

验证

  • 单测 407 通过 0 失败。
  • 反证:把状态词放回 cardContext,6 条用例变红(含新增的「店铺行不得被当作卡片」)。旧的平层夹具无法复现该缺陷,已一并修正。
  • 真机树离线复算:动作词判据下得到 3 个真卡片,锚点均为 240x240 商品图,入口均为商品标题且唯一。
  • 已装机 192.168.0.173:38881,0.9.59,lastUpdateTime 2026-09-18 14:25:00,无障碍服务仍开启。

未验证

真机回填能否完整跑完——待人工触发。

更正

#311 的根因判断不成立:问题不在卡片内锚错了图,而在 cards() 返回的根本不是卡片。#313 的中间帧推断被三帧实测证伪,其签名改动已撤销。

状态:待验收。

## 实施 提交 `92fa73d`(deploy-main)。 - `cardContext` 去掉状态词「待发货」「待收货」「交易成功」,只保留动作词。 - 撤销 #313 给 `awaitOrders()` 稳定签名加的可见非零高度节点数;两处 `awaitOrders()` 调用保留。 - 测试夹具按真机层级重建:店铺行、商品行、动作行各自成块。 ## 验证 - 单测 407 通过 0 失败。 - 反证:把状态词放回 `cardContext`,6 条用例变红(含新增的「店铺行不得被当作卡片」)。旧的平层夹具无法复现该缺陷,已一并修正。 - 真机树离线复算:动作词判据下得到 3 个真卡片,锚点均为 240x240 商品图,入口均为商品标题且唯一。 - 已装机 192.168.0.173:38881,0.9.59,lastUpdateTime 2026-09-18 14:25:00,无障碍服务仍开启。 ## 未验证 真机回填能否完整跑完——待人工触发。 ## 更正 #311 的根因判断不成立:问题不在卡片内锚错了图,而在 `cards()` 返回的根本不是卡片。#313 的中间帧推断被三帧实测证伪,其签名改动已撤销。 状态:待验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#314