当前页面采集:规格面板已打开但当前视口无可点击规格时被误判 #112

Closed
opened 2026-08-27 16:47:17 +08:00 by ila · 3 comments
Owner

所属与来源

  • 关联工单:#101 当前页面采集、#110 Activity 证据隔离与详情入口诊断、#111 唯一颜色消失后的尺码遍历。
  • 来源:用户于 2026-08-27 在 PKG110、Agent 0.9.8(GoAuto 提交 a10f9833e7efbf3e5612392bfcf7bad9b1ff42dd)执行最新当前页面采集后反馈:停留在 PDD 商品页,最终失败并返回 Agent,错误为 SPEC_PANEL_EVIDENCE_NOT_MATCHED:规格面板页面结构无法确认;用户要求参考 D:\chengma\cmautobuy\client 已实现采集逻辑分析,并确认按分析建议新建独立工单。
  • 参考实现:D:\chengma\cmautobuy 提交基线 9fbed74e86a700bb162c7456974d7166dbb6f13d;相关参考文件存在本地未提交改动,本工单只将其当前工作树作为行为参考,不把它声明为该提交的纯净实现,也不复制其原始 XML/截图诊断方式。
  • 类型:Android Agent / PDD 商品详情 / 规格面板入口证据误判缺陷。
  • 设计证据:恢复既有规格采集行为,不新增或改变页面、组件、导航、文案、接口、数据库或规则 JSON,无需 UI 原型。

当前事实与根因

已证实事实

  • 最新任务 #80 已完成 goods_id 身份识别,并以 SPEC_PANEL_EVIDENCE_NOT_MATCHED 失败;身份确认到任务结束约 11.15 秒。
  • 规则快照的 specPanel 超时为 10000ms,与该失败耗时一致。
  • 本地安全诊断显示:
    • DETAIL_ENTRY_MATCHED:首次即通过 package、Activity、selector 三项强证据,耗时约 125ms;
    • 分享、复制链接、剪贴板、短链展开和身份解析均成功;
    • 没有 SIZE_DISCOVERY 记录,说明失败发生在 #111 尺码遍历启动之前。
  • 当前采集器点击规格入口后会记录页面是否变化;页面发生变化但在超时内始终未得到 specPanelOpen,且未识别为评价误入时,返回 SPEC_PANEL_EVIDENCE_NOT_MATCHED。
  • 当前 PddProductDetailCollector 把 dimensions.isNotEmpty() 作为 panelOpen 的必要条件;只有当前视口至少解析出一个带可见可点击值的规格维度,面板才会被认定为已打开。
  • 因此当前实现把两个不同事实耦合在一起:
    1. 规格/确认面板是否已经打开;
    2. 当前视口是否已解析到至少一个可点击规格值。
  • #111 只有在 specPanelOpen 已成立并取得已确认面板容器后才开始回顶和尺码扫描,无法修复该上游门禁。

参考实现差异

D:\chengma\cmautobuy\client\src\pdd_collect_service.py 的现有实现将“面板打开证据”和“规格解析结果”分离:

  • _find_non_scrollable_spec_panel 使用确认标题/关闭入口、唯一提交提示、数量输入与加减控件等组合证据识别自绘或非滚动确认面板。
  • _is_spec_panel_open 不要求当前视口一定暴露规格选项;已确认非滚动面板,或可滚动区域联合已选摘要、提交提示、规格标题之一,都可证明面板已打开。
  • parse_spec_panel 可以返回维度暂为空的快照,后续再通过有界恢复与遍历取得规格。
  • _wait_spec_panel 区分普通规格面板、确认页、快速确认恢复和不完整读取,不因当前视口没有可点击值就立即否定面板。

GoAuto 不复制参考项目依赖 uiautomator2、原始控件 XML 或截图的诊断实现;只借鉴状态分离和组合证据设计。

高概率但待真机证实的页面序列

以下为根据任务 #79/#80、现有代码和 PDD 状态延续行为得到的推断,不作为已证实页面内容:

  1. 前一任务选中了唯一颜色,PDD 保留了选择状态。
  2. 本次点击购买/规格入口后,PDD 打开快速确认页或已滚动的确认面板,故页面确实发生变化。
  3. 当前视口存在已选摘要、标题、数量控件或底部动作,但唯一已选颜色不再以可点击无障碍节点出现,尺码也可能位于另一屏。
  4. dimensions 因没有“标题 + 可点击值”而为空,导致 panelOpen=false。
  5. 快速确认恢复可能因当前主规格值已从可点击节点消失而无法定位,最终等待 10 秒后失败。

现有诊断没有记录面板形态和恢复尝试,实施必须补充安全结构化证据以验证该推断,不能保存文本、控件树或截图。

目标

  1. 将“规格面板已打开”和“当前已解析规格值”建模为独立状态。
  2. 已由强组合证据确认的规格/确认面板,即使当前视口没有可点击规格值,也不得报 SPEC_PANEL_EVIDENCE_NOT_MATCHED。
  3. 面板已确认但规格维度暂为空时,只在已确认面板容器内执行一次有界回顶/恢复并重新解析,再进入既有颜色与 #111 尺码遍历。
  4. 支持普通可滚动规格面板、快速确认页和自绘/非滚动确认面板;未知或证据不足页面仍明确失败。
  5. 增加不含敏感内容的规格面板入口诊断,区分页面未变化、面板形态、证据不完整、恢复是否尝试及恢复结果。
  6. 保持精确页面门禁和所有采购/订单安全边界。

非目标

  • 不修改 goods_id 获取、分享、剪贴板、短链展开、身份裁决、任务创建时序或 #110 Activity 修复。
  • 不改变 #111 的颜色/尺码遍历上限、单规格商品完整性规则或 missing:size 契约。
  • 不修改服务端、数据库、共享 API、Web、规则 JSON 和默认超时。
  • 不引入 OCR/VLM、uiautomator2、原始控件树、XML 或截图采集。
  • 不点击相近规格,不猜测规格,不自动确认规格。
  • 不点击“现在买”、提交订单、支付或其他不可逆动作。
  • 不涉及采购、地址、创建订单和支付。

实施方案

1. 分离面板状态与解析结果

  1. 为采集器内部解析结果增加明确的面板状态/类型,例如:
    • NORMAL_SCROLLABLE:普通可滚动规格面板;
    • NON_SCROLLABLE_CONFIRMATION:自绘或非滚动确认面板;
    • QUICK_CONFIRMATION:快速确认页;
    • UNKNOWN:证据不足。
  2. panelOpen 由面板强证据决定,不再以 dimensions.isNotEmpty() 为必要条件;dimensions 仅表示当前视口已解析到的规格。
  3. 保持现有页面 package、精确 Activity 和详情节点强证据;面板状态只在已确认 PDD 商品详情上下文内判定,不跨页面复用。

2. 收紧且扩展面板强证据

  1. 普通滚动面板可由“已确认的规格面板滚动区域”联合以下至少一类证据确认:选择摘要、规格维度标题、受控底部规格/确认动作。
  2. 自绘/非滚动确认面板必须使用强组合证据,不允许单个通用文本或单个控件成立:
    • 确认款式/关闭类面板标题或入口;或
    • 唯一受控底部动作 + 唯一正整数数量输入 + 唯一减号 + 唯一加号;
    • 并继续排除评价、评论、晒单、问答及购买流程外页面。
  3. 支持现有 PDD 可能出现的简体/繁体确认标题与按钮变体,但只用于精确白名单证据,不做模糊文本猜测。
  4. 底部“现在买”、提交订单或支付动作只能作为只读页面证据,绝不作为恢复点击目标。

3. 面板确认后的有界恢复

  1. 面板已经确认但 dimensions 为空时,优先复用已确认的面板容器执行有界回顶和重新解析;不得在页面最大滚动区域或未知容器盲目滑动。
  2. 快速确认页只允许一次安全恢复:仅在当前主规格值是唯一、可见、可点击且证据完整时点击该规格值;不得点击底部购买/确认/提交动作。
  3. 恢复后重新读取页面并重算面板类型、容器和规格维度;成功后进入现有颜色遍历和 #111 尺码扫描。
  4. 容器无法确认、滑动无效、证据冲突或恢复后仍未知时,按有界超时明确失败;不增加固定长等待或无限往返。
  5. 离开详情页、进入登录、验证码、风控或评价误入时继续沿用现有专用错误处理,不用面板证据掩盖。

4. 安全诊断

  1. 复用现有 AgentDiagnosticStore 表结构,增加 SPEC_PANEL_ENTRY 阶段及稳定原因枚举;不新增 SQLite 版本、服务端字段或共享接口。
  2. 诊断至少记录:
  • screenChanged;
  • 面板状态/类型;
  • 可滚动候选数量;
  • 规格标题数量;
  • 可点击规格候选数量;
  • 是否存在选择摘要;
  • 是否存在数量输入与唯一加减控件组合;
  • 快速确认恢复是否尝试及结果;
  • 尝试次数和耗时。
  1. 诊断不得记录控件文本、控件树、XML、截图、链接、goods_id、剪贴板内容、地址或账号信息。

5. 测试

  1. 增加合成页面回归:
  • 面板已打开、当前视口没有可点击规格值,仍识别为 open;
  • 唯一颜色选中后从可点击节点消失,面板仍成立并可进入后续恢复/遍历;
  • 快速确认页的安全恢复成功与不满足唯一证据时拒绝恢复;
  • 自绘/非滚动确认面板由强组合证据识别;
  • 简体/繁体确认标题与动作白名单;
  • 只有通用按钮、数量控件不唯一、评价页或未知页面不得误判;
  • 任何路径都不点击购买、提交订单或支付动作。
  1. 回归 #110 的详情入口强证据和 #111 的有界尺码发现,确保本工单只放宽“面板已打开”和“当前值已解析”的错误耦合,不放宽详情页与安全动作门禁。

安全边界

  • 继续要求 PDD 包名、精确 Activity 和商品详情页面强证据。
  • 面板识别采用多项组合证据;未知页面保持失败,不以“页面变化”单独视为成功。
  • 所有滑动限定在已确认规格面板容器内并受规则上限约束。
  • 规格恢复最多点击一次经唯一证据确认的当前主规格值;不点击底部购买、确认订单、提交订单或支付。
  • 不记录或上传控件文本/树、XML、截图、链接、goods_id、剪贴板、地址或账号数据。
  • 不创建采购任务,不修改地址,不创建订单,永久禁止支付。

验收标准

  • 采集器的面板状态与 dimensions 独立;面板强证据成立且维度暂为空时,panelOpen 仍成立。
  • 合成测试覆盖普通滚动面板、快速确认页、自绘/非滚动确认面板,以及未知/评价页面负向场景。
  • 唯一颜色选中后可点击节点消失、当前视口无尺码时,不再因 dimensions.isEmpty() 返回 SPEC_PANEL_EVIDENCE_NOT_MATCHED,而是安全恢复并进入既有遍历。
  • 面板确认后的回顶/恢复只发生在已确认容器内,次数有界;证据不足时停止,不猜测、不盲滑。
  • 任一测试和真机路径均不点击“现在买”、提交订单、支付或其他不可逆动作。
  • PKG110 复采同一已授权商品:不再在约 10 秒后报 SPEC_PANEL_EVIDENCE_NOT_MATCHED;任务继续进入颜色/尺码采集,并按真实结果完成、部分完成或返回更具体的后续错误。
  • SPEC_PANEL_ENTRY 诊断能说明面板类型、结构计数和恢复结果,且不新增 schema/API,也不含控件内容、树、XML、截图或商品身份信息。
  • #110 的 DETAIL_ENTRY_MATCHED 保持小于 3 秒;#111 的 SIZE_DISCOVERY 在进入尺码扫描后正常产生,既有普通管理端采集和采购路径不回退。
  • 服务端、数据库、共享 API、Web 和规则 JSON 无变化。

验证方式

  • cd android && .\gradlew.bat :app:testDebugUnitTest :app:assembleDebug
  • .\scripts\verify.ps1 -Component android
  • 目标单测覆盖面板状态分离、强组合证据、快速确认安全恢复、容器内有界回顶和危险动作负向断言。
  • python dev_scripts/harness.py check --strict
  • PKG110:安装新 Agent 后,由人工从已授权 PDD 商品页执行一次当前页面采集;只记录任务号、Agent 版本、规则 ID/快照、诊断原因、耗时、结构计数和最终状态,不记录商品链接、goods_id、控件文本/树或截图。

依赖、并行与风险

  • 前置依赖:#110 提交 e606096034dcd9484af213101ea92e24fa48dfdc 与 #111 提交 a10f9833e7efbf3e5612392bfcf7bad9b1ff42dd 已实现;两工单仍待用户验收,本工单应基于二者当前代码继续。
  • 不建议与其他修改 PddProductDetailCollector、规格面板解析或滚动容器证据的工单并行。
  • 风险:放宽面板判定可能误认评价页或购买确认外页面。通过“已确认详情上下文 + 多项组合证据 + 唯一数量控件 + 危险按钮只读”的正负向门禁控制。
  • 风险:PDD 页面结构存在变体。诊断只保存结构计数和枚举状态,用真机证据校准,不保存原始树或截图。
  • 回退:还原本工单 Android 提交即可,不涉及迁移、接口或服务端部署。

文档影响

预计为 Android 内部解析状态修复和本地诊断增强,不改变长期业务规则、共享 API、数据结构或运行方式。实施时检查 Wiki 是否枚举规格面板诊断阶段;若未枚举,则在工单记录“无长期文档影响”并跳过 Wiki 更新与同步;若已有枚举,则按 Wiki-first 门禁更新。

状态

方案已根据 2026-08-27 的代码、任务结构化结果与参考实现分析建立,待实施。

## 所属与来源 - 关联工单:#101 当前页面采集、#110 Activity 证据隔离与详情入口诊断、#111 唯一颜色消失后的尺码遍历。 - 来源:用户于 2026-08-27 在 PKG110、Agent 0.9.8(GoAuto 提交 `a10f9833e7efbf3e5612392bfcf7bad9b1ff42dd`)执行最新当前页面采集后反馈:停留在 PDD 商品页,最终失败并返回 Agent,错误为 `SPEC_PANEL_EVIDENCE_NOT_MATCHED:规格面板页面结构无法确认`;用户要求参考 `D:\chengma\cmautobuy\client` 已实现采集逻辑分析,并确认按分析建议新建独立工单。 - 参考实现:`D:\chengma\cmautobuy` 提交基线 `9fbed74e86a700bb162c7456974d7166dbb6f13d`;相关参考文件存在本地未提交改动,本工单只将其当前工作树作为行为参考,不把它声明为该提交的纯净实现,也不复制其原始 XML/截图诊断方式。 - 类型:Android Agent / PDD 商品详情 / 规格面板入口证据误判缺陷。 - 设计证据:恢复既有规格采集行为,不新增或改变页面、组件、导航、文案、接口、数据库或规则 JSON,无需 UI 原型。 ## 当前事实与根因 ### 已证实事实 - 最新任务 #80 已完成 goods_id 身份识别,并以 `SPEC_PANEL_EVIDENCE_NOT_MATCHED` 失败;身份确认到任务结束约 11.15 秒。 - 规则快照的 `specPanel` 超时为 10000ms,与该失败耗时一致。 - 本地安全诊断显示: - `DETAIL_ENTRY_MATCHED`:首次即通过 package、Activity、selector 三项强证据,耗时约 125ms; - 分享、复制链接、剪贴板、短链展开和身份解析均成功; - 没有 `SIZE_DISCOVERY` 记录,说明失败发生在 #111 尺码遍历启动之前。 - 当前采集器点击规格入口后会记录页面是否变化;页面发生变化但在超时内始终未得到 `specPanelOpen`,且未识别为评价误入时,返回 `SPEC_PANEL_EVIDENCE_NOT_MATCHED`。 - 当前 `PddProductDetailCollector` 把 `dimensions.isNotEmpty()` 作为 `panelOpen` 的必要条件;只有当前视口至少解析出一个带可见可点击值的规格维度,面板才会被认定为已打开。 - 因此当前实现把两个不同事实耦合在一起: 1. 规格/确认面板是否已经打开; 2. 当前视口是否已解析到至少一个可点击规格值。 - #111 只有在 `specPanelOpen` 已成立并取得已确认面板容器后才开始回顶和尺码扫描,无法修复该上游门禁。 ### 参考实现差异 `D:\chengma\cmautobuy\client\src\pdd_collect_service.py` 的现有实现将“面板打开证据”和“规格解析结果”分离: - `_find_non_scrollable_spec_panel` 使用确认标题/关闭入口、唯一提交提示、数量输入与加减控件等组合证据识别自绘或非滚动确认面板。 - `_is_spec_panel_open` 不要求当前视口一定暴露规格选项;已确认非滚动面板,或可滚动区域联合已选摘要、提交提示、规格标题之一,都可证明面板已打开。 - `parse_spec_panel` 可以返回维度暂为空的快照,后续再通过有界恢复与遍历取得规格。 - `_wait_spec_panel` 区分普通规格面板、确认页、快速确认恢复和不完整读取,不因当前视口没有可点击值就立即否定面板。 GoAuto 不复制参考项目依赖 uiautomator2、原始控件 XML 或截图的诊断实现;只借鉴状态分离和组合证据设计。 ### 高概率但待真机证实的页面序列 以下为根据任务 #79/#80、现有代码和 PDD 状态延续行为得到的推断,不作为已证实页面内容: 1. 前一任务选中了唯一颜色,PDD 保留了选择状态。 2. 本次点击购买/规格入口后,PDD 打开快速确认页或已滚动的确认面板,故页面确实发生变化。 3. 当前视口存在已选摘要、标题、数量控件或底部动作,但唯一已选颜色不再以可点击无障碍节点出现,尺码也可能位于另一屏。 4. `dimensions` 因没有“标题 + 可点击值”而为空,导致 `panelOpen=false`。 5. 快速确认恢复可能因当前主规格值已从可点击节点消失而无法定位,最终等待 10 秒后失败。 现有诊断没有记录面板形态和恢复尝试,实施必须补充安全结构化证据以验证该推断,不能保存文本、控件树或截图。 ## 目标 1. 将“规格面板已打开”和“当前已解析规格值”建模为独立状态。 2. 已由强组合证据确认的规格/确认面板,即使当前视口没有可点击规格值,也不得报 `SPEC_PANEL_EVIDENCE_NOT_MATCHED`。 3. 面板已确认但规格维度暂为空时,只在已确认面板容器内执行一次有界回顶/恢复并重新解析,再进入既有颜色与 #111 尺码遍历。 4. 支持普通可滚动规格面板、快速确认页和自绘/非滚动确认面板;未知或证据不足页面仍明确失败。 5. 增加不含敏感内容的规格面板入口诊断,区分页面未变化、面板形态、证据不完整、恢复是否尝试及恢复结果。 6. 保持精确页面门禁和所有采购/订单安全边界。 ## 非目标 - 不修改 goods_id 获取、分享、剪贴板、短链展开、身份裁决、任务创建时序或 #110 Activity 修复。 - 不改变 #111 的颜色/尺码遍历上限、单规格商品完整性规则或 `missing:size` 契约。 - 不修改服务端、数据库、共享 API、Web、规则 JSON 和默认超时。 - 不引入 OCR/VLM、uiautomator2、原始控件树、XML 或截图采集。 - 不点击相近规格,不猜测规格,不自动确认规格。 - 不点击“现在买”、提交订单、支付或其他不可逆动作。 - 不涉及采购、地址、创建订单和支付。 ## 实施方案 ### 1. 分离面板状态与解析结果 1. 为采集器内部解析结果增加明确的面板状态/类型,例如: - `NORMAL_SCROLLABLE`:普通可滚动规格面板; - `NON_SCROLLABLE_CONFIRMATION`:自绘或非滚动确认面板; - `QUICK_CONFIRMATION`:快速确认页; - `UNKNOWN`:证据不足。 2. `panelOpen` 由面板强证据决定,不再以 `dimensions.isNotEmpty()` 为必要条件;`dimensions` 仅表示当前视口已解析到的规格。 3. 保持现有页面 package、精确 Activity 和详情节点强证据;面板状态只在已确认 PDD 商品详情上下文内判定,不跨页面复用。 ### 2. 收紧且扩展面板强证据 4. 普通滚动面板可由“已确认的规格面板滚动区域”联合以下至少一类证据确认:选择摘要、规格维度标题、受控底部规格/确认动作。 5. 自绘/非滚动确认面板必须使用强组合证据,不允许单个通用文本或单个控件成立: - 确认款式/关闭类面板标题或入口;或 - 唯一受控底部动作 + 唯一正整数数量输入 + 唯一减号 + 唯一加号; - 并继续排除评价、评论、晒单、问答及购买流程外页面。 6. 支持现有 PDD 可能出现的简体/繁体确认标题与按钮变体,但只用于精确白名单证据,不做模糊文本猜测。 7. 底部“现在买”、提交订单或支付动作只能作为只读页面证据,绝不作为恢复点击目标。 ### 3. 面板确认后的有界恢复 8. 面板已经确认但 `dimensions` 为空时,优先复用已确认的面板容器执行有界回顶和重新解析;不得在页面最大滚动区域或未知容器盲目滑动。 9. 快速确认页只允许一次安全恢复:仅在当前主规格值是唯一、可见、可点击且证据完整时点击该规格值;不得点击底部购买/确认/提交动作。 10. 恢复后重新读取页面并重算面板类型、容器和规格维度;成功后进入现有颜色遍历和 #111 尺码扫描。 11. 容器无法确认、滑动无效、证据冲突或恢复后仍未知时,按有界超时明确失败;不增加固定长等待或无限往返。 12. 离开详情页、进入登录、验证码、风控或评价误入时继续沿用现有专用错误处理,不用面板证据掩盖。 ### 4. 安全诊断 13. 复用现有 `AgentDiagnosticStore` 表结构,增加 `SPEC_PANEL_ENTRY` 阶段及稳定原因枚举;不新增 SQLite 版本、服务端字段或共享接口。 14. 诊断至少记录: - `screenChanged`; - 面板状态/类型; - 可滚动候选数量; - 规格标题数量; - 可点击规格候选数量; - 是否存在选择摘要; - 是否存在数量输入与唯一加减控件组合; - 快速确认恢复是否尝试及结果; - 尝试次数和耗时。 15. 诊断不得记录控件文本、控件树、XML、截图、链接、goods_id、剪贴板内容、地址或账号信息。 ### 5. 测试 16. 增加合成页面回归: - 面板已打开、当前视口没有可点击规格值,仍识别为 open; - 唯一颜色选中后从可点击节点消失,面板仍成立并可进入后续恢复/遍历; - 快速确认页的安全恢复成功与不满足唯一证据时拒绝恢复; - 自绘/非滚动确认面板由强组合证据识别; - 简体/繁体确认标题与动作白名单; - 只有通用按钮、数量控件不唯一、评价页或未知页面不得误判; - 任何路径都不点击购买、提交订单或支付动作。 17. 回归 #110 的详情入口强证据和 #111 的有界尺码发现,确保本工单只放宽“面板已打开”和“当前值已解析”的错误耦合,不放宽详情页与安全动作门禁。 ## 安全边界 - 继续要求 PDD 包名、精确 Activity 和商品详情页面强证据。 - 面板识别采用多项组合证据;未知页面保持失败,不以“页面变化”单独视为成功。 - 所有滑动限定在已确认规格面板容器内并受规则上限约束。 - 规格恢复最多点击一次经唯一证据确认的当前主规格值;不点击底部购买、确认订单、提交订单或支付。 - 不记录或上传控件文本/树、XML、截图、链接、goods_id、剪贴板、地址或账号数据。 - 不创建采购任务,不修改地址,不创建订单,永久禁止支付。 ## 验收标准 - [ ] 采集器的面板状态与 `dimensions` 独立;面板强证据成立且维度暂为空时,`panelOpen` 仍成立。 - [ ] 合成测试覆盖普通滚动面板、快速确认页、自绘/非滚动确认面板,以及未知/评价页面负向场景。 - [ ] 唯一颜色选中后可点击节点消失、当前视口无尺码时,不再因 `dimensions.isEmpty()` 返回 `SPEC_PANEL_EVIDENCE_NOT_MATCHED`,而是安全恢复并进入既有遍历。 - [ ] 面板确认后的回顶/恢复只发生在已确认容器内,次数有界;证据不足时停止,不猜测、不盲滑。 - [ ] 任一测试和真机路径均不点击“现在买”、提交订单、支付或其他不可逆动作。 - [ ] PKG110 复采同一已授权商品:不再在约 10 秒后报 `SPEC_PANEL_EVIDENCE_NOT_MATCHED`;任务继续进入颜色/尺码采集,并按真实结果完成、部分完成或返回更具体的后续错误。 - [ ] `SPEC_PANEL_ENTRY` 诊断能说明面板类型、结构计数和恢复结果,且不新增 schema/API,也不含控件内容、树、XML、截图或商品身份信息。 - [ ] #110 的 `DETAIL_ENTRY_MATCHED` 保持小于 3 秒;#111 的 `SIZE_DISCOVERY` 在进入尺码扫描后正常产生,既有普通管理端采集和采购路径不回退。 - [ ] 服务端、数据库、共享 API、Web 和规则 JSON 无变化。 ## 验证方式 - `cd android && .\gradlew.bat :app:testDebugUnitTest :app:assembleDebug` - `.\scripts\verify.ps1 -Component android` - 目标单测覆盖面板状态分离、强组合证据、快速确认安全恢复、容器内有界回顶和危险动作负向断言。 - `python dev_scripts/harness.py check --strict` - PKG110:安装新 Agent 后,由人工从已授权 PDD 商品页执行一次当前页面采集;只记录任务号、Agent 版本、规则 ID/快照、诊断原因、耗时、结构计数和最终状态,不记录商品链接、goods_id、控件文本/树或截图。 ## 依赖、并行与风险 - 前置依赖:#110 提交 `e606096034dcd9484af213101ea92e24fa48dfdc` 与 #111 提交 `a10f9833e7efbf3e5612392bfcf7bad9b1ff42dd` 已实现;两工单仍待用户验收,本工单应基于二者当前代码继续。 - 不建议与其他修改 `PddProductDetailCollector`、规格面板解析或滚动容器证据的工单并行。 - 风险:放宽面板判定可能误认评价页或购买确认外页面。通过“已确认详情上下文 + 多项组合证据 + 唯一数量控件 + 危险按钮只读”的正负向门禁控制。 - 风险:PDD 页面结构存在变体。诊断只保存结构计数和枚举状态,用真机证据校准,不保存原始树或截图。 - 回退:还原本工单 Android 提交即可,不涉及迁移、接口或服务端部署。 ## 文档影响 预计为 Android 内部解析状态修复和本地诊断增强,不改变长期业务规则、共享 API、数据结构或运行方式。实施时检查 Wiki 是否枚举规格面板诊断阶段;若未枚举,则在工单记录“无长期文档影响”并跳过 Wiki 更新与同步;若已有枚举,则按 Wiki-first 门禁更新。 ## 状态 方案已根据 2026-08-27 的代码、任务结构化结果与参考实现分析建立,待实施。
Author
Owner

开始实施。按工单正文限定只修改 Android Agent:分离规格面板已打开状态与当前规格值解析结果,补充强组合证据、有界安全恢复和 SPEC_PANEL_ENTRY 本地诊断;不修改服务端、数据库、共享 API、Web、规则 JSON,不读取或保存控件树/截图,不点击购买、提交订单或支付动作。

开始实施。按工单正文限定只修改 Android Agent:分离规格面板已打开状态与当前规格值解析结果,补充强组合证据、有界安全恢复和 `SPEC_PANEL_ENTRY` 本地诊断;不修改服务端、数据库、共享 API、Web、规则 JSON,不读取或保存控件树/截图,不点击购买、提交订单或支付动作。
Author
Owner

实施完成,待验收

已按工单正文完成 Android 修复,提交:c782103b6f0e65c275361daa0bab9b5aeef04764。

实现

  • 新增内部 SpecPanelType,区分 NORMAL_SCROLLABLE、NON_SCROLLABLE_CONFIRMATION、QUICK_CONFIRMATION 和 UNKNOWN。
  • 面板打开证据不再依赖 dimensions.isNotEmpty();当前视口没有可点击规格值时,只要强组合证据成立,仍认定面板已打开。
  • 普通滚动面板继续要求受限嵌套滚动区域,并联合选择摘要、提交提示或标题+动作证据;自绘/非滚动确认面板要求选择摘要、确认标题和确认动作组合。
  • 快速确认页要求关闭、已选摘要、支付区域、底部“现在买”、唯一正整数数量输入和唯一加减控件共同成立。
  • 快速确认页存在唯一主规格时只安全点击一次该规格进行恢复;该规格已消失时记录“恢复不可用”并继续既有有界采集,不再等待 10 秒误报面板结构不匹配。
  • 简繁体确认标题、动作、选择摘要、数量控件和快速购买文本纳入精确白名单。
  • 明确把简繁体“现在买”以及确认、订单、支付等动作排除出规格候选,避免底部危险动作位于规格标题下方时被通用解析误认。
  • 新增 SPEC_PANEL_ENTRY 本地诊断及打开、恢复成功、恢复不可用、恢复失败、证据不匹配、点击无变化原因;复用现有 SQLite schema,只记录面板类型、结构计数、布尔状态、次数和耗时,不记录文本、控件树、XML、截图、链接或 goods_id。
  • Agent 版本更新为 0.9.9(versionCode 22)。
  • 服务端、数据库、共享 API、Web、规则 JSON、采购和订单流程均未修改。

自动验证

  • 目标 PddProductDetailCollectorTest:通过。
  • .\android\gradlew.bat -p android :app:testDebugUnitTest :app:assembleDebug:通过。
  • .\scripts\verify.ps1 -Component android:通过(Debug/Release 单元测试及 Debug APK)。
  • python dev_scripts/harness.py check --strict:通过。
  • git diff --check:通过。
  • 新增/调整回归覆盖:
    • 面板已打开但当前无规格值;
    • 唯一已选颜色从可点击节点消失;
    • 普通滚动、快速确认、自绘/非滚动确认三类面板;
    • 简繁体确认页面;
    • 数量输入不唯一时拒绝误判;
    • 快速确认恢复成功与恢复不可用;
    • 只点击唯一主规格一次,绝不点击“现在买”、订单或支付动作。

文档影响

现有 Wiki 未枚举 DETAIL_ENTRY、SIZE_DISCOVERY 等本地诊断阶段;本次为 Android 内部解析与诊断增强,不改变长期业务规则、API、数据结构或运行方式,因此无长期文档影响,按正文约定跳过 Wiki 更新与同步。

PKG110

  • 安装前确认服务端没有 pending/running 采集任务或采购任务。
  • 已成功安装 Agent 0.9.9(versionCode 22)。
  • 无障碍授权仍在,已启动 Agent 主界面。
  • 未代替用户从真实商品点击“当前页面采集”,未读取或保存控件树、截图、链接、goods_id 或剪贴板内容,也未触碰购买、订单和支付。
  • 待人工从已授权 PDD 商品页复采,确认任务不再以 SPEC_PANEL_EVIDENCE_NOT_MATCHED 结束,并检查后续 SPEC_PANEL_ENTRY / SIZE_DISCOVERY 诊断与最终规格结果。

工单保持 open / 待验收。

## 实施完成,待验收 已按工单正文完成 Android 修复,提交:`c782103b6f0e65c275361daa0bab9b5aeef04764`。 ### 实现 - 新增内部 `SpecPanelType`,区分 `NORMAL_SCROLLABLE`、`NON_SCROLLABLE_CONFIRMATION`、`QUICK_CONFIRMATION` 和 `UNKNOWN`。 - 面板打开证据不再依赖 `dimensions.isNotEmpty()`;当前视口没有可点击规格值时,只要强组合证据成立,仍认定面板已打开。 - 普通滚动面板继续要求受限嵌套滚动区域,并联合选择摘要、提交提示或标题+动作证据;自绘/非滚动确认面板要求选择摘要、确认标题和确认动作组合。 - 快速确认页要求关闭、已选摘要、支付区域、底部“现在买”、唯一正整数数量输入和唯一加减控件共同成立。 - 快速确认页存在唯一主规格时只安全点击一次该规格进行恢复;该规格已消失时记录“恢复不可用”并继续既有有界采集,不再等待 10 秒误报面板结构不匹配。 - 简繁体确认标题、动作、选择摘要、数量控件和快速购买文本纳入精确白名单。 - 明确把简繁体“现在买”以及确认、订单、支付等动作排除出规格候选,避免底部危险动作位于规格标题下方时被通用解析误认。 - 新增 `SPEC_PANEL_ENTRY` 本地诊断及打开、恢复成功、恢复不可用、恢复失败、证据不匹配、点击无变化原因;复用现有 SQLite schema,只记录面板类型、结构计数、布尔状态、次数和耗时,不记录文本、控件树、XML、截图、链接或 goods_id。 - Agent 版本更新为 0.9.9(versionCode 22)。 - 服务端、数据库、共享 API、Web、规则 JSON、采购和订单流程均未修改。 ### 自动验证 - 目标 `PddProductDetailCollectorTest`:通过。 - `.\android\gradlew.bat -p android :app:testDebugUnitTest :app:assembleDebug`:通过。 - `.\scripts\verify.ps1 -Component android`:通过(Debug/Release 单元测试及 Debug APK)。 - `python dev_scripts/harness.py check --strict`:通过。 - `git diff --check`:通过。 - 新增/调整回归覆盖: - 面板已打开但当前无规格值; - 唯一已选颜色从可点击节点消失; - 普通滚动、快速确认、自绘/非滚动确认三类面板; - 简繁体确认页面; - 数量输入不唯一时拒绝误判; - 快速确认恢复成功与恢复不可用; - 只点击唯一主规格一次,绝不点击“现在买”、订单或支付动作。 ### 文档影响 现有 Wiki 未枚举 `DETAIL_ENTRY`、`SIZE_DISCOVERY` 等本地诊断阶段;本次为 Android 内部解析与诊断增强,不改变长期业务规则、API、数据结构或运行方式,因此无长期文档影响,按正文约定跳过 Wiki 更新与同步。 ### PKG110 - 安装前确认服务端没有 `pending/running` 采集任务或采购任务。 - 已成功安装 Agent 0.9.9(versionCode 22)。 - 无障碍授权仍在,已启动 Agent 主界面。 - 未代替用户从真实商品点击“当前页面采集”,未读取或保存控件树、截图、链接、goods_id 或剪贴板内容,也未触碰购买、订单和支付。 - 待人工从已授权 PDD 商品页复采,确认任务不再以 `SPEC_PANEL_EVIDENCE_NOT_MATCHED` 结束,并检查后续 `SPEC_PANEL_ENTRY` / `SIZE_DISCOVERY` 诊断与最终规格结果。 工单保持 open / 待验收。
Author
Owner

用户于 2026-08-28 明确确认本工单验收通过。按项目流程记录验收结论并关闭工单;本次仅更新工单状态,无新增长期文档事实,不重复同步 Wiki。

用户于 2026-08-28 明确确认本工单验收通过。按项目流程记录验收结论并关闭工单;本次仅更新工单状态,无新增长期文档事实,不重复同步 Wiki。
ila closed this issue 2026-08-28 15:07:11 +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#112