缺陷:采购精确规格已定位仍因点击返回值误报选择失败 #151

Closed
opened 2026-08-29 14:28:50 +08:00 by ila · 2 comments
Owner

来源与现场证据

用户于 2026-08-29 在一加 PKG110 使用 Agent 0.9.21 执行地址后缀 _cg16 的采购任务,观察到选择尺码阶段失败,并要求建单修复、构建 APK、安装到手机。

服务端只读证据:

  • 采购任务:#16,商品 goods_id 808062345927;
  • 目标尺码:3XL;
  • 任务固化映射:3XL 建议:150斤-180斤,来源 ai_match;
  • 异步匹配工作项已 matched,说明服务端候选与映射成功;
  • Agent 错误:RULE_ACTION_FAILED / 规格 3XL 建议:150斤-180斤 选择失败。

根因

Android PurchaseRehearsalExecutor.selectSpecs 已从当前规格面板解析出唯一、可选、逐字相等的目标节点,但随后把 clickFresh 的即时返回值直接作为最终结果。选择颜色会触发 PDD 动态刷新尺码区域;解析与重新点击之间节点可能重绘、移动或更换父容器,导致 fresh lookup 返回 NOT_FOUND/FAILED。也可能点击已生效但 ACTION_CLICK 返回 false。当前代码仅在 SUCCESS 后检查真实选中状态,因而产生假失败。

目标

  1. 对颜色和尺码统一采用真实选中状态作为点击成功后置条件。
  2. 点击返回 SUCCESS、NOT_FOUND 或 FAILED 后均重新解析面板;已精确选中则继续。
  3. 未选中时重新定位同一个完整目标文本并有限重试。
  4. 多个候选、面板关闭、登录、验证码、风控和持续失败仍明确失败。
  5. 保留既有精确规格、安全边界和禁止猜测规则。

非目标

  • 不修改 Admin 采购规则、AI 映射、服务端接口、状态机或数据库。
  • 不选择相似规格,不点击兄弟节点,不盲目点击坐标。
  • 不修改地址,不创建订单,不支付。
  • 不保存控件树或截图。

实施方案

  • 规格点击改用 clickFreshDetailed。
  • 每次尝试前调用既有 locateExactSpec,只接受对应维度内唯一且 available 的逐字目标。
  • 每次点击后在有限窗口内重新读取 selected summary、selected/checked 状态;后置条件成立即成功,不依赖即时返回值。
  • 后置条件未成立时最多重新定位并点击 3 次;歧义立即停止。
  • 持续失败使用稳定错误码并给出不包含页面内容的细分原因。
  • 增加点击假阴性、重绘恢复、持续失败有界以及既有歧义/相似规格不点击回归测试。
  • 版本提升后构建并安装到当前唯一 ADB 设备。

设计证据

恢复既有规格精确选择行为,不新增 UI 或交互,无需原型。

验收

  • 点击返回 FAILED 但规格已实际选中时继续执行。
  • 节点重绘导致首次 NOT_FOUND 时可重新定位同一完整规格并恢复。
  • 持续失败最多 3 次后停止,不忙循环。
  • 多个同名候选仍失败;相似规格永不点击。
  • Android Debug/Release 单元测试通过,Debug/Release APK 构建成功。
  • APK 覆盖安装到一加 PKG110,手机回读最新 versionName/versionCode。
  • 真机重新执行需由用户发起;本工单实施过程不创建订单、不修改地址、不支付。
  • 提交推送并回写证据,保持待验收。

文档影响

仅修复既有规格点击后置条件,无新的长期接口、业务规则、安全边界或运维事实;跳过 Wiki 更新与同步。

## 来源与现场证据 用户于 2026-08-29 在一加 PKG110 使用 Agent 0.9.21 执行地址后缀 `_cg16` 的采购任务,观察到选择尺码阶段失败,并要求建单修复、构建 APK、安装到手机。 服务端只读证据: - 采购任务:#16,商品 goods_id `808062345927`; - 目标尺码:`3XL`; - 任务固化映射:`3XL 建议:150斤-180斤`,来源 `ai_match`; - 异步匹配工作项已 `matched`,说明服务端候选与映射成功; - Agent 错误:`RULE_ACTION_FAILED / 规格 3XL 建议:150斤-180斤 选择失败`。 ## 根因 Android `PurchaseRehearsalExecutor.selectSpecs` 已从当前规格面板解析出唯一、可选、逐字相等的目标节点,但随后把 `clickFresh` 的即时返回值直接作为最终结果。选择颜色会触发 PDD 动态刷新尺码区域;解析与重新点击之间节点可能重绘、移动或更换父容器,导致 fresh lookup 返回 NOT_FOUND/FAILED。也可能点击已生效但 ACTION_CLICK 返回 false。当前代码仅在 SUCCESS 后检查真实选中状态,因而产生假失败。 ## 目标 1. 对颜色和尺码统一采用真实选中状态作为点击成功后置条件。 2. 点击返回 SUCCESS、NOT_FOUND 或 FAILED 后均重新解析面板;已精确选中则继续。 3. 未选中时重新定位同一个完整目标文本并有限重试。 4. 多个候选、面板关闭、登录、验证码、风控和持续失败仍明确失败。 5. 保留既有精确规格、安全边界和禁止猜测规则。 ## 非目标 - 不修改 Admin 采购规则、AI 映射、服务端接口、状态机或数据库。 - 不选择相似规格,不点击兄弟节点,不盲目点击坐标。 - 不修改地址,不创建订单,不支付。 - 不保存控件树或截图。 ## 实施方案 - 规格点击改用 `clickFreshDetailed`。 - 每次尝试前调用既有 `locateExactSpec`,只接受对应维度内唯一且 available 的逐字目标。 - 每次点击后在有限窗口内重新读取 selected summary、selected/checked 状态;后置条件成立即成功,不依赖即时返回值。 - 后置条件未成立时最多重新定位并点击 3 次;歧义立即停止。 - 持续失败使用稳定错误码并给出不包含页面内容的细分原因。 - 增加点击假阴性、重绘恢复、持续失败有界以及既有歧义/相似规格不点击回归测试。 - 版本提升后构建并安装到当前唯一 ADB 设备。 ## 设计证据 恢复既有规格精确选择行为,不新增 UI 或交互,无需原型。 ## 验收 - [ ] 点击返回 FAILED 但规格已实际选中时继续执行。 - [ ] 节点重绘导致首次 NOT_FOUND 时可重新定位同一完整规格并恢复。 - [ ] 持续失败最多 3 次后停止,不忙循环。 - [ ] 多个同名候选仍失败;相似规格永不点击。 - [ ] Android Debug/Release 单元测试通过,Debug/Release APK 构建成功。 - [ ] APK 覆盖安装到一加 PKG110,手机回读最新 versionName/versionCode。 - [ ] 真机重新执行需由用户发起;本工单实施过程不创建订单、不修改地址、不支付。 - [ ] 提交推送并回写证据,保持待验收。 ## 文档影响 仅修复既有规格点击后置条件,无新的长期接口、业务规则、安全边界或运维事实;跳过 Wiki 更新与同步。
Author
Owner

实施完成并安装,待用户真机验收

提交:4a7a483 fix(#151): verify exact spec selection after click,已推送 main,本地与 origin/main 一致。

修复

  • 颜色与尺码统一使用“真实选中状态”作为成功后置条件,不再仅相信无障碍点击即时返回值。
  • 每次点击后重新读取选中摘要及目标节点 selected/checked;即使返回 FAILED/NOT_FOUND,只要完整目标已选中就继续。
  • 未选中时重新调用既有精确定位,只重找同一维度内唯一、available、逐字相等的目标,最多 3 次。
  • 多候选仍立即失败;不点击相似规格、兄弟节点或盲目坐标。
  • 持续失败保留 RULE_ACTION_FAILED,并区分节点变化、无可点击祖先和 ACTION_CLICK 未生效。
  • Agent 升级为 0.9.22 (35)。

验证

  • 定向 PurchaseRehearsalExecutorTest:通过。
  • 新增覆盖:
    • 点击返回 FAILED 但精确尺码已实际选中;
    • 首次 NOT_FOUND 后重新定位并第二次成功;
    • 持续失败精确停止在 3 次。
  • 既有相似规格不点击、纵向发现、歧义和安全采购测试继续通过。
  • .\scripts\verify.ps1 -Component android:Debug/Release 单元测试及 Debug APK 构建通过。
  • .\gradlew.bat assembleRelease:通过。
  • git diff --check:通过。

APK 与安装

  • Debug APK:versionName=0.9.22、versionCode=35,SHA-256 DBBC47C92063EF29B576DC4913ED48F96D664A0FB969FE4F9039E76D5616D8FD。
  • Release unsigned APK:同版本,SHA-256 163ACC08ED0C76985ADE0C65DBF73A57E8D3F52963D892AE1AD67DFBCD9B7CDD。
  • 当前唯一 ADB 设备一加 PKG110 覆盖安装:Success。
  • 手机 dumpsys package 回读:versionName=0.9.22、versionCode=35。

未执行

未自动重试采购任务 #16。该任务为 live,重新采购后可能进入修改地址和创建待付款订单边界,必须由用户按既有高风险门禁自行发起并观察;本次实施未修改地址、未创建订单、未支付。

文档

仅恢复既有规格精确选择后置条件,无新的长期事实,跳过 Wiki 更新与同步。未改动既有未跟踪文件。

状态:实现与安装完成,等待用户真机验收。

## 实施完成并安装,待用户真机验收 提交:`4a7a483 fix(#151): verify exact spec selection after click`,已推送 `main`,本地与 `origin/main` 一致。 ### 修复 - 颜色与尺码统一使用“真实选中状态”作为成功后置条件,不再仅相信无障碍点击即时返回值。 - 每次点击后重新读取选中摘要及目标节点 selected/checked;即使返回 FAILED/NOT_FOUND,只要完整目标已选中就继续。 - 未选中时重新调用既有精确定位,只重找同一维度内唯一、available、逐字相等的目标,最多 3 次。 - 多候选仍立即失败;不点击相似规格、兄弟节点或盲目坐标。 - 持续失败保留 `RULE_ACTION_FAILED`,并区分节点变化、无可点击祖先和 ACTION_CLICK 未生效。 - Agent 升级为 `0.9.22 (35)`。 ### 验证 - 定向 `PurchaseRehearsalExecutorTest`:通过。 - 新增覆盖: - 点击返回 FAILED 但精确尺码已实际选中; - 首次 NOT_FOUND 后重新定位并第二次成功; - 持续失败精确停止在 3 次。 - 既有相似规格不点击、纵向发现、歧义和安全采购测试继续通过。 - `.\scripts\verify.ps1 -Component android`:Debug/Release 单元测试及 Debug APK 构建通过。 - `.\gradlew.bat assembleRelease`:通过。 - `git diff --check`:通过。 ### APK 与安装 - Debug APK:`versionName=0.9.22`、`versionCode=35`,SHA-256 `DBBC47C92063EF29B576DC4913ED48F96D664A0FB969FE4F9039E76D5616D8FD`。 - Release unsigned APK:同版本,SHA-256 `163ACC08ED0C76985ADE0C65DBF73A57E8D3F52963D892AE1AD67DFBCD9B7CDD`。 - 当前唯一 ADB 设备一加 PKG110 覆盖安装:`Success`。 - 手机 `dumpsys package` 回读:`versionName=0.9.22`、`versionCode=35`。 ### 未执行 未自动重试采购任务 #16。该任务为 live,重新采购后可能进入修改地址和创建待付款订单边界,必须由用户按既有高风险门禁自行发起并观察;本次实施未修改地址、未创建订单、未支付。 ### 文档 仅恢复既有规格精确选择后置条件,无新的长期事实,跳过 Wiki 更新与同步。未改动既有未跟踪文件。 状态:实现与安装完成,等待用户真机验收。
Author
Owner

用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。

用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。
ila closed this issue 2026-08-29 20:44:23 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#151