采购:规格面板无可滚动节点时,规则揭示滑动不应判失败(蝦皮 45050538170 时好时坏) #348

Open
opened 2026-09-29 09:11:44 +08:00 by ila · 3 comments
Owner

来源与原始需求摘要

  • 来源:用户 2026-09-29 报告:蝦皮商品 45050538170 多次采购时有时成功有时失败,要求分析最近几次采购任务找出原因;分析后用户要求「建工单」。

前置依赖

  • 无。基于最新 main 开分支;只改 Android Agent。

当前事实(2026-09-29 核对,线上 122.228.200.167)

  • 蝦皮商品 shopee_product 1249 → PDD 商品 8903(goods_id 942187429431),PDD 规格仅 2 个颜色(黑色九分微喇裤、黑色长款微喇裤)、7 个尺码。
  • 最近采购任务(均在设备 8「采购1」PKG110,Agent 0.9.63,同一规则快照):
    任务 结果 spec_probe 尝试
    787(09-24) order_created completed(约 5.8s)
    814(09-26) failed failed RULE_ACTION_FAILED 规则要求的有限滑动失败(约 3.8s)
    973(09-27) order_created completed
    1142、1145(09-28) failed failed 同上(约 3.5s)
  • 设计上每个新的 SYB 采购第一次都是 spec_probe(purchase/service.go:确认过的映射只作指导,不跳过探测),因此同规格次日仍须探测,属预期。
  • 错误出处:PurchaseRehearsalExecutor.applyPostAction——采购规则 openSpecPanel.swipeAfter = {count:2, direction:up, durationMs:500, intervalMs:1000};driver.swipePurchase 返回 false 即失败。唯一例外:currentScreen().specPanelType == NON_SCROLLABLE_CONFIRMATION 时跳过。
  • GoAutoAccessibilityService.swipePurchase 在界面没有任何可见可滚动节点时返回 false。
  • 真机核对(USB 手机 PLY110,打开该商品规格面板后导出控件树):108 个节点中可滚动节点 0 个;面板一屏显示全部颜色、尺码、数量加减、地址、支付方式与「提交订单」;顶部为「请选择:颜色分类 尺码」(无「已选」摘要)。
  • 频率:09-22 起约 600 次 spec_probe,「有限滑动失败」仅出现在该商品(3 次),其他商品为 0。
  • 推断(未能取设备 8 本地诊断日志确认):面板类型识别受当时是否已有「已选」摘要、弹出动画是否完成影响;识别为 NON_SCROLLABLE_CONFIRMATION 时跳过滑动而成功,否则找不到可滚动节点而失败,因此同条件下随机成败。

目标

  1. 规则 swipeAfter(打开规格面板后的揭示滑动)在界面无任何可见可滚动节点时视为无需滑动(跳过并记录诊断),不再判为 RULE_ACTION_FAILED。有可滚动节点但手势派发失败/被取消时仍按失败处理。
  2. 失败或跳过时记录诊断:当时 specPanelType、可见可滚动节点数量、是否为揭示滑动;失败时把关键诊断带入 error_message(如 [panel=…,scrollables=0]),便于服务端直接定位。
  3. 不改变后续 probeSpecs、selectSpec 及最终规格复核的任何校验。

非目标

  • 不改采购规则内容、不改服务端 spec_probe 流程与映射策略。
  • 不改面板类型识别规则本身(另行评估)。
  • 不涉及任何下单/支付/提交订单相关点击;本单不新增任何点击目标。

方案(初步,实施时确认)

  • 在 swipePurchase 的调用路径区分「无可滚动目标」与「手势失败」两种结果(例如返回枚举或新增查询方法),applyPostAction 对「无可滚动目标」跳过剩余次数并记诊断。
  • 单测:无可滚动节点 → 跳过、流程继续到 probeSpecs;有可滚动节点但手势失败 → 仍 RULE_ACTION_FAILED 且带诊断;NON_SCROLLABLE_CONFIRMATION 例外保持。

验收

  1. 单元测试覆盖上述三种情况并通过;Android 单测与 APK 构建通过。
  2. 真机(该商品或同类少规格商品)规格探测不再因揭示滑动失败;其他商品探测行为不变(回归)。
  3. 失败时 error_message 带面板类型与可滚动节点数。

风险

  • 低:仅放宽「本就无处可滚」的揭示滑动;后续规格探测与精确规格复核仍负责确认目标存在。
  • 采购属高风险流程:真机验证只做到规格探测/选规格,不提交订单;真机与发布前需人工确认。

设计证据

  • 无 UI 变化。

文档影响

  • 若 Wiki 业务规则/采购规则说明记录了 swipeAfter 失败语义,需补充「无可滚动节点时跳过」;否则无长期文档影响。实施时核对。
## 来源与原始需求摘要 - 来源:用户 2026-09-29 报告:蝦皮商品 45050538170 多次采购时有时成功有时失败,要求分析最近几次采购任务找出原因;分析后用户要求「建工单」。 ## 前置依赖 - 无。基于最新 main 开分支;只改 Android Agent。 ## 当前事实(2026-09-29 核对,线上 122.228.200.167) - 蝦皮商品 `shopee_product` 1249 → PDD 商品 8903(goods_id 942187429431),PDD 规格仅 2 个颜色(黑色九分微喇裤、黑色长款微喇裤)、7 个尺码。 - 最近采购任务(均在设备 8「采购1」PKG110,Agent 0.9.63,同一规则快照): | 任务 | 结果 | spec_probe 尝试 | |---|---|---| | 787(09-24) | order_created | completed(约 5.8s) | | 814(09-26) | failed | failed `RULE_ACTION_FAILED` 规则要求的有限滑动失败(约 3.8s) | | 973(09-27) | order_created | completed | | 1142、1145(09-28) | failed | failed 同上(约 3.5s) | - 设计上每个新的 SYB 采购第一次都是 `spec_probe`(`purchase/service.go`:确认过的映射只作指导,不跳过探测),因此同规格次日仍须探测,属预期。 - 错误出处:`PurchaseRehearsalExecutor.applyPostAction`——采购规则 `openSpecPanel.swipeAfter = {count:2, direction:up, durationMs:500, intervalMs:1000}`;`driver.swipePurchase` 返回 false 即失败。唯一例外:`currentScreen().specPanelType == NON_SCROLLABLE_CONFIRMATION` 时跳过。 - `GoAutoAccessibilityService.swipePurchase` 在界面没有任何可见可滚动节点时返回 false。 - **真机核对**(USB 手机 PLY110,打开该商品规格面板后导出控件树):108 个节点中**可滚动节点 0 个**;面板一屏显示全部颜色、尺码、数量加减、地址、支付方式与「提交订单」;顶部为「请选择:颜色分类 尺码」(无「已选」摘要)。 - 频率:09-22 起约 600 次 `spec_probe`,「有限滑动失败」仅出现在该商品(3 次),其他商品为 0。 - **推断(未能取设备 8 本地诊断日志确认)**:面板类型识别受当时是否已有「已选」摘要、弹出动画是否完成影响;识别为 NON_SCROLLABLE_CONFIRMATION 时跳过滑动而成功,否则找不到可滚动节点而失败,因此同条件下随机成败。 ## 目标 1. 规则 `swipeAfter`(打开规格面板后的揭示滑动)在**界面无任何可见可滚动节点**时视为无需滑动(跳过并记录诊断),不再判为 `RULE_ACTION_FAILED`。有可滚动节点但手势派发失败/被取消时仍按失败处理。 2. 失败或跳过时记录诊断:当时 `specPanelType`、可见可滚动节点数量、是否为揭示滑动;失败时把关键诊断带入 `error_message`(如 `[panel=…,scrollables=0]`),便于服务端直接定位。 3. 不改变后续 `probeSpecs`、`selectSpec` 及最终规格复核的任何校验。 ## 非目标 - 不改采购规则内容、不改服务端 `spec_probe` 流程与映射策略。 - 不改面板类型识别规则本身(另行评估)。 - 不涉及任何下单/支付/提交订单相关点击;本单不新增任何点击目标。 ## 方案(初步,实施时确认) - 在 `swipePurchase` 的调用路径区分「无可滚动目标」与「手势失败」两种结果(例如返回枚举或新增查询方法),`applyPostAction` 对「无可滚动目标」跳过剩余次数并记诊断。 - 单测:无可滚动节点 → 跳过、流程继续到 probeSpecs;有可滚动节点但手势失败 → 仍 `RULE_ACTION_FAILED` 且带诊断;NON_SCROLLABLE_CONFIRMATION 例外保持。 ## 验收 1. 单元测试覆盖上述三种情况并通过;Android 单测与 APK 构建通过。 2. 真机(该商品或同类少规格商品)规格探测不再因揭示滑动失败;其他商品探测行为不变(回归)。 3. 失败时 `error_message` 带面板类型与可滚动节点数。 ## 风险 - 低:仅放宽「本就无处可滚」的揭示滑动;后续规格探测与精确规格复核仍负责确认目标存在。 - 采购属高风险流程:真机验证只做到规格探测/选规格,不提交订单;真机与发布前需人工确认。 ## 设计证据 - 无 UI 变化。 ## 文档影响 - 若 Wiki 业务规则/采购规则说明记录了 `swipeAfter` 失败语义,需补充「无可滚动节点时跳过」;否则无长期文档影响。实施时核对。
Author
Owner

开始实施 #348,基于 origin/main 7a2c2d1,分支 fix/348-reveal-swipe。仅改 Android 揭示滑动结果区分、脱敏诊断及对应测试,不调整探测/规格选择/最终复核,也不修改规则或 Server/Web。本轮完成单测、APK 构建、提交推送后待验收;不安装真机、不创建订单、不发布线上。Gitea MCP 不可用,回退 Gitea API。

开始实施 #348,基于 origin/main 7a2c2d1,分支 fix/348-reveal-swipe。仅改 Android 揭示滑动结果区分、脱敏诊断及对应测试,不调整探测/规格选择/最终复核,也不修改规则或 Server/Web。本轮完成单测、APK 构建、提交推送后待验收;不安装真机、不创建订单、不发布线上。Gitea MCP 不可用,回退 Gitea API。
Author
Owner

实施完成,待真机验证与验收(2026-09-29)

基线 main 7a2c2d1;分支 fix/348-reveal-swipe 已提交推送。源码 6550b9f,Wiki 镜像 fcb7dad。未合并 main、未发布 Server/Admin、未安装 APK、未执行真实采购或支付。

实现

  • 仅 Android:新增 PurchaseSwipeOutcome 与 SUCCESS / NO_SCROLLABLE_TARGET / ROOT_UNAVAILABLE / FAILED 四类结果。生产无障碍驱动从同一个实时 root 统计可见可滚动节点并选择目标;原 Boolean swipePurchase、方向目标选择及 swipeNode 执行语义不变。
  • 仅 openSpecPanel 的规则揭示滑动遇到 NO_SCROLLABLE_TARGET 时跳过剩余次数并记录诊断;保留 NON_SCROLLABLE_CONFIRMATION 原例外。
  • 有目标而手势派发/执行失败,以及 root 不可用,仍 RULE_ACTION_FAILED;其他动作继续原必需滑动路径,不放宽。
  • 跳过/失败诊断含面板类型、scrollables 数量、reveal 布尔、固定原因;失败结果摘要携带这些标量。不保存或输出节点文本、坐标、原始控件树、整屏截图、地址或凭据。
  • probeSpecs、selectSpec、最终复核、规则 JSON/能力/任务快照、采集器、Server/Web、数据库、地址与订单/支付边界均未改变。跳过滑动后探测仍可以明确失败,不把跳过当成功证据。

验证

  • 先加入无滚动节点且非 NON_SCROLLABLE_CONFIRMATION 的既有合成面板回归用例,在原实现上失败,修复后通过。
  • 采购执行器86个测试通过;新增7例覆盖:非旧面板类型无目标继续探测、有目标手势失败、root不可用、首次滑动后目标消失、原滑动次数/间隔、非揭示动作仍必需、跳过后探测失败仍失败。旧非滚动例外补诊断断言。
  • 最终命令 .\gradlew.bat test assembleDebug --console=plain 成功:Debug/Release 各48套、463个测试,失败/错误/跳过均0;APK构建成功。
  • 首次全量运行曾中断做线程诊断;确认耗时在未修改的图搜恢复测试真实计时等待。最终重新完整运行约10分钟成功,未排除测试、未更改图搜代码。
  • git diff --check 通过;工作区干净。

APK

Android 0.9.64 / versionCode 77,Manifest 经 aapt 回读。
本地:D:/OPC/goauto-348/android/app/build/outputs/apk/debug/app-debug.apk
大小6400321字节;SHA256 fe2f696c9847f42225311efc52a7b1ce21bbcdc967281e46c3762c0e8c1da1e0。

Wiki 与事实边界

  • Architecture-and-Code-Map:88ed799e92f64a73b3bd9472ab6c0b06fa080b37
  • Business-Rules-and-Glossary:5d9810286d76c52a90902c27a5316f39164f36e0
  • Android-Agent-API-Contract:18260ec2725eaeb4dcf2543422d58ee4ede8b981
    先线上更新并在线回读revision,再完成唯一一轮 harness.py sync 与 sync --check,全部一致。
    核对发现历史 #238 说明绑定58a6c1c,该提交不在本轮main祖先中,当前代码仍执行后置滑动;文档已说明历史分支边界,未混入该历史分支或改为跳过全部预滑动。
    Gitea MCP不可用,按仓库规则回退API。

未验证 / 下一步

真机及实际商品回归尚未验证。需另行授权安装与只读规格探测验证;验证不得提交订单或付款。工单保持待验收,不关闭。

## 实施完成,待真机验证与验收(2026-09-29) 基线 main `7a2c2d1`;分支 `fix/348-reveal-swipe` 已提交推送。源码 `6550b9f`,Wiki 镜像 `fcb7dad`。未合并 main、未发布 Server/Admin、未安装 APK、未执行真实采购或支付。 ### 实现 - 仅 Android:新增 PurchaseSwipeOutcome 与 SUCCESS / NO_SCROLLABLE_TARGET / ROOT_UNAVAILABLE / FAILED 四类结果。生产无障碍驱动从同一个实时 root 统计可见可滚动节点并选择目标;原 Boolean swipePurchase、方向目标选择及 swipeNode 执行语义不变。 - 仅 openSpecPanel 的规则揭示滑动遇到 NO_SCROLLABLE_TARGET 时跳过剩余次数并记录诊断;保留 NON_SCROLLABLE_CONFIRMATION 原例外。 - 有目标而手势派发/执行失败,以及 root 不可用,仍 RULE_ACTION_FAILED;其他动作继续原必需滑动路径,不放宽。 - 跳过/失败诊断含面板类型、scrollables 数量、reveal 布尔、固定原因;失败结果摘要携带这些标量。不保存或输出节点文本、坐标、原始控件树、整屏截图、地址或凭据。 - probeSpecs、selectSpec、最终复核、规则 JSON/能力/任务快照、采集器、Server/Web、数据库、地址与订单/支付边界均未改变。跳过滑动后探测仍可以明确失败,不把跳过当成功证据。 ### 验证 - 先加入无滚动节点且非 NON_SCROLLABLE_CONFIRMATION 的既有合成面板回归用例,在原实现上失败,修复后通过。 - 采购执行器86个测试通过;新增7例覆盖:非旧面板类型无目标继续探测、有目标手势失败、root不可用、首次滑动后目标消失、原滑动次数/间隔、非揭示动作仍必需、跳过后探测失败仍失败。旧非滚动例外补诊断断言。 - 最终命令 `.\gradlew.bat test assembleDebug --console=plain` 成功:Debug/Release 各48套、463个测试,失败/错误/跳过均0;APK构建成功。 - 首次全量运行曾中断做线程诊断;确认耗时在未修改的图搜恢复测试真实计时等待。最终重新完整运行约10分钟成功,未排除测试、未更改图搜代码。 - `git diff --check` 通过;工作区干净。 ### APK Android 0.9.64 / versionCode 77,Manifest 经 aapt 回读。 本地:`D:/OPC/goauto-348/android/app/build/outputs/apk/debug/app-debug.apk` 大小6400321字节;SHA256 `fe2f696c9847f42225311efc52a7b1ce21bbcdc967281e46c3762c0e8c1da1e0`。 ### Wiki 与事实边界 - Architecture-and-Code-Map:`88ed799e92f64a73b3bd9472ab6c0b06fa080b37` - Business-Rules-and-Glossary:`5d9810286d76c52a90902c27a5316f39164f36e0` - Android-Agent-API-Contract:`18260ec2725eaeb4dcf2543422d58ee4ede8b981` 先线上更新并在线回读revision,再完成唯一一轮 `harness.py sync` 与 `sync --check`,全部一致。 核对发现历史 #238 说明绑定58a6c1c,该提交不在本轮main祖先中,当前代码仍执行后置滑动;文档已说明历史分支边界,未混入该历史分支或改为跳过全部预滑动。 Gitea MCP不可用,按仓库规则回退API。 ### 未验证 / 下一步 真机及实际商品回归尚未验证。需另行授权安装与只读规格探测验证;验证不得提交订单或付款。工单保持待验收,不关闭。
Author
Owner

用户授权合并 main 并发布最新版 APK 到线上 Admin(122.228.200.167:9527),供其他设备自行更新;不强制安装、不执行采购。已完成无冲突合并并推送 main:bf06b2d500c9a875ea8aa9aa07b56275434c096d,合并树与已验证 fcb7dad 完全一致。APK 0.9.64(77)SHA256 与构建证据一致。使用现有管理员浏览器会话走版本管理上传与设为当前入口。Gitea MCP 本会话不可用,评论回退配置的 Gitea API。

用户授权合并 main 并发布最新版 APK 到线上 Admin(122.228.200.167:9527),供其他设备自行更新;不强制安装、不执行采购。已完成无冲突合并并推送 main:bf06b2d500c9a875ea8aa9aa07b56275434c096d,合并树与已验证 fcb7dad 完全一致。APK 0.9.64(77)SHA256 与构建证据一致。使用现有管理员浏览器会话走版本管理上传与设为当前入口。Gitea MCP 本会话不可用,评论回退配置的 Gitea API。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#348