缺陷:采购规格入口误点商品评价并进入评价列表 #166

Open
opened 2026-08-31 11:31:35 +08:00 by ila · 1 comment
Owner

Gitea MCP 未向当前会话暴露,按仓库规则回退项目安全配置与 Gitea API;凭据不进入代码、日志、工单或 Wiki。

原始需求摘要

来源:用户于 2026-08-31 反馈最新 Agent 采购进入 PDD 商品页后未打开规格面板,反而点击“商品评价”进入评价列表;在只读根因分析后明确要求按建议建工单并实施。

目标:采购规格入口只能点击经过语义与结构双重验证的精确入口;误入评价页时必须安全返回并明确失败,绝不继续规格、地址或订单动作。

基线与事实

代码基线:866aea1(Agent 0.9.30,2026-08-31)。关联 #164、#59。

  • CG30 / device 5,PDD 8.22.0,Agent 0.9.30。
  • CG-33 连续 purchase attempt 最终为 RULE_NOT_MATCHED / 商品规格面板没有打开;用户现场确认点击后进入商品评价列表。
  • CG-33 的规则 openSpecPanel 没有 textAliases,因此 Android 使用解析器生成的语义候选。
  • CG-33 没有 irreversibleAt、orderSubmitRequestId、PDD 订单号或下单时间。
  • safeBottomSpecEntry 接受包含通用“购买”词且满足底部几何条件的节点,未对该候选及其实际可点击祖先执行评价上下文排除;返回的是文字节点而不是已经验证的可点击卡片。
  • clickFreshDetailed 会从文字节点持续向上寻找首个可点击祖先,未绑定解析阶段已验证的卡片边界。
  • purchase openSpecPanel 把 ACTION_CLICK=true 当作点击成功,只轮询规格面板;不检查 reviewPageOpen,不执行安全返回。采集路径 #59 已有评价页误入识别/返回,但采购路径没有复用。
  • #164 修复的是规格面板打开后的五态选择与探测资格;本次失败发生在更早的入口阶段,尚未进入 #164 五态。

当前结构化结果没有保存脱敏的 specEntrySource,因此不能断言 CG30 命中 explicit_selection 或 bottom_purchase 的哪一个;但可确认根因位于规格入口候选、fresh 点击祖先边界和点击后页面确认。

范围

  1. safeBottomSpecEntry 必须同时验证文字节点与最近可点击卡片的评价上下文;候选返回并 fresh 重定位已经验证的可点击卡片,不得重新无限向上漂移。
  2. 底部候选继续只允许规则定义的购买语义、底部区域和受限尺寸;禁止评价、订单提交、支付及宽泛容器。
  3. purchase openSpecPanel 点击后必须区分:规格面板打开、评价页误入、页面未变化/其他页面。识别评价页后最多执行一次系统返回,确认回到同一 PDD 商品页后以稳定错误 PURCHASE_SPEC_ENTRY_OPENED_REVIEW 结束;不得自动再次点击同一入口。
  4. 入口点击使用 detailed fresh 结果,保留稳定的节点失效/歧义/无安全可点击卡片/动作 false 错误,不记录文字、坐标、控件树或截图。
  5. 不修改 #164 的规格严格相等、探测资格、up×2 和有界规格搜索行为。

非目标

  • 不修改 AI 匹配、规格映射或候选相等规则。
  • 不修改历史 task/attempt。
  • 不保存控件树、截图、坐标或规格原文。
  • 不修改地址、不创建订单、不支付;不重试 CG-33 或其他 live 任务。
  • 不把评价入口加入任何可点击白名单。

设计证据

恢复既有安全行为的 Android 缺陷,不新增页面或交互,不需要 UI 原型。代码与自动化测试是设计证据;真机只使用 executionMode=rehearsal 且规则不含 updateShippingAddress、createOrder、readOrderResult。

验收标准

  • 底部购买文字位于评价卡片/推荐区域,或其最近可点击祖先包含评价上下文时,不得成为规格入口。
  • 解析器返回的底部入口与实际 fresh 点击目标是同一个已验证可点击卡片;点击不得越过该卡片继续向父链漂移。
  • PDD 无障碍节点为父子或常见扁平/兄弟结构时,评价候选均安全拒绝。
  • 正确底部购买入口和显式“选择规格”入口仍可打开规格面板。
  • 点击误入评价列表时,Agent 最多返回一次并确认回到商品页,提交 PURCHASE_SPEC_ENTRY_OPENED_REVIEW;不再点击同一入口。
  • 点击节点失效、歧义、无安全可点击卡片、动作 false 与点击后未打开面板可区分。
  • 自动化测试与 APK 构建通过;CG30 安全 rehearsal 能进入规格面板,或以稳定入口阶段安全失败并返回商品页。
  • 真机验证没有修改地址、创建订单或支付。

必测场景

  • 正确显式规格入口;正确底部购买卡片。
  • 评价卡片内出现颜色/尺码或“购买”文字。
  • 评价文字与购买文字为兄弟节点,共享宽泛可点击父容器。
  • fresh 节点失效、重复候选、不可点击祖先、点击返回 false。
  • 点击进入评价页;返回成功、返回失败、返回后商品页证据缺失。
  • 现有危险动作拒绝、#164 规格五态和安全尾价用例回归。

风险与门禁

这是采购点击安全判据修改。实施与自动化测试已由用户本次“建工单,做”确认;真机固定为无地址、无订单动作 rehearsal。任何 live 重试、地址修改、创建待付款订单或支付仍需独立明确授权;永久禁止支付。

文档影响

有长期契约影响:新增采购入口误入评价页稳定错误和安全返回语义,更新 Wiki Android-Agent-API-Contract,在线回读 revision 后执行一次 harness.py sync 和一次 sync --check。

状态

待验收(实现、自动化验证、Wiki 同步与 CG30 安全演练已完成;等待用户验收,不自动关闭)。

> Gitea MCP 未向当前会话暴露,按仓库规则回退项目安全配置与 Gitea API;凭据不进入代码、日志、工单或 Wiki。 ## 原始需求摘要 来源:用户于 2026-08-31 反馈最新 Agent 采购进入 PDD 商品页后未打开规格面板,反而点击“商品评价”进入评价列表;在只读根因分析后明确要求按建议建工单并实施。 目标:采购规格入口只能点击经过语义与结构双重验证的精确入口;误入评价页时必须安全返回并明确失败,绝不继续规格、地址或订单动作。 ## 基线与事实 代码基线:`866aea1`(Agent 0.9.30,2026-08-31)。关联 #164、#59。 - CG30 / device 5,PDD 8.22.0,Agent 0.9.30。 - CG-33 连续 purchase attempt 最终为 `RULE_NOT_MATCHED / 商品规格面板没有打开`;用户现场确认点击后进入商品评价列表。 - CG-33 的规则 `openSpecPanel` 没有 `textAliases`,因此 Android 使用解析器生成的语义候选。 - CG-33 没有 `irreversibleAt`、`orderSubmitRequestId`、PDD 订单号或下单时间。 - `safeBottomSpecEntry` 接受包含通用“购买”词且满足底部几何条件的节点,未对该候选及其实际可点击祖先执行评价上下文排除;返回的是文字节点而不是已经验证的可点击卡片。 - `clickFreshDetailed` 会从文字节点持续向上寻找首个可点击祖先,未绑定解析阶段已验证的卡片边界。 - purchase `openSpecPanel` 把 `ACTION_CLICK=true` 当作点击成功,只轮询规格面板;不检查 `reviewPageOpen`,不执行安全返回。采集路径 #59 已有评价页误入识别/返回,但采购路径没有复用。 - #164 修复的是规格面板打开后的五态选择与探测资格;本次失败发生在更早的入口阶段,尚未进入 #164 五态。 当前结构化结果没有保存脱敏的 `specEntrySource`,因此不能断言 CG30 命中 `explicit_selection` 或 `bottom_purchase` 的哪一个;但可确认根因位于规格入口候选、fresh 点击祖先边界和点击后页面确认。 ## 范围 1. `safeBottomSpecEntry` 必须同时验证文字节点与最近可点击卡片的评价上下文;候选返回并 fresh 重定位已经验证的可点击卡片,不得重新无限向上漂移。 2. 底部候选继续只允许规则定义的购买语义、底部区域和受限尺寸;禁止评价、订单提交、支付及宽泛容器。 3. purchase `openSpecPanel` 点击后必须区分:规格面板打开、评价页误入、页面未变化/其他页面。识别评价页后最多执行一次系统返回,确认回到同一 PDD 商品页后以稳定错误 `PURCHASE_SPEC_ENTRY_OPENED_REVIEW` 结束;不得自动再次点击同一入口。 4. 入口点击使用 detailed fresh 结果,保留稳定的节点失效/歧义/无安全可点击卡片/动作 false 错误,不记录文字、坐标、控件树或截图。 5. 不修改 #164 的规格严格相等、探测资格、`up×2` 和有界规格搜索行为。 ## 非目标 - 不修改 AI 匹配、规格映射或候选相等规则。 - 不修改历史 task/attempt。 - 不保存控件树、截图、坐标或规格原文。 - 不修改地址、不创建订单、不支付;不重试 CG-33 或其他 live 任务。 - 不把评价入口加入任何可点击白名单。 ## 设计证据 恢复既有安全行为的 Android 缺陷,不新增页面或交互,不需要 UI 原型。代码与自动化测试是设计证据;真机只使用 `executionMode=rehearsal` 且规则不含 `updateShippingAddress`、`createOrder`、`readOrderResult`。 ## 验收标准 - [ ] 底部购买文字位于评价卡片/推荐区域,或其最近可点击祖先包含评价上下文时,不得成为规格入口。 - [ ] 解析器返回的底部入口与实际 fresh 点击目标是同一个已验证可点击卡片;点击不得越过该卡片继续向父链漂移。 - [ ] PDD 无障碍节点为父子或常见扁平/兄弟结构时,评价候选均安全拒绝。 - [ ] 正确底部购买入口和显式“选择规格”入口仍可打开规格面板。 - [ ] 点击误入评价列表时,Agent 最多返回一次并确认回到商品页,提交 `PURCHASE_SPEC_ENTRY_OPENED_REVIEW`;不再点击同一入口。 - [ ] 点击节点失效、歧义、无安全可点击卡片、动作 false 与点击后未打开面板可区分。 - [ ] 自动化测试与 APK 构建通过;CG30 安全 rehearsal 能进入规格面板,或以稳定入口阶段安全失败并返回商品页。 - [ ] 真机验证没有修改地址、创建订单或支付。 ## 必测场景 - 正确显式规格入口;正确底部购买卡片。 - 评价卡片内出现颜色/尺码或“购买”文字。 - 评价文字与购买文字为兄弟节点,共享宽泛可点击父容器。 - fresh 节点失效、重复候选、不可点击祖先、点击返回 false。 - 点击进入评价页;返回成功、返回失败、返回后商品页证据缺失。 - 现有危险动作拒绝、#164 规格五态和安全尾价用例回归。 ## 风险与门禁 这是采购点击安全判据修改。实施与自动化测试已由用户本次“建工单,做”确认;真机固定为无地址、无订单动作 rehearsal。任何 live 重试、地址修改、创建待付款订单或支付仍需独立明确授权;永久禁止支付。 ## 文档影响 有长期契约影响:新增采购入口误入评价页稳定错误和安全返回语义,更新 Wiki `Android-Agent-API-Contract`,在线回读 revision 后执行一次 `harness.py sync` 和一次 `sync --check`。 ## 状态 待验收(实现、自动化验证、Wiki 同步与 CG30 安全演练已完成;等待用户验收,不自动关闭)。
Author
Owner

实施与验证结果(待验收)

Gitea MCP 当前不可用,本次按仓库规则回退 Gitea API;凭据仅从安全配置读取,未写入代码、日志或工单。

实现

  • 已提交并推送:a3628df fix(agent): reject review-page spec entry misroutes (#166)。
  • Agent 版本升至 0.9.31(versionCode 44)。
  • 规格入口现在同时绑定“语义锚点”和经过校验的可点击目标;商品评价语义会在锚点与点击目标两层排除。
  • 明确识别商品评价列表页;误入后只返回一次并确认回到商品页,不再次点击同一候选。
  • 点击时不再从已失效/不可点击的目标向更宽父节点漂移;新增稳定错误码区分入口缺失、目标歧义、点击失败、误入评价页和面板未打开。

自动化验证

  • 定向单测:PddProductDetailCollectorTest、PurchaseRehearsalExecutorTest 通过。
  • Android 全量:.\gradlew.bat testDebugUnitTest assembleDebug --rerun-tasks 通过(41 tasks)。
  • git diff --check 通过。

文档

  • 已先更新线上 Wiki Android-Agent-API-Contract 并回读,revision:484a645058de780abe2ff2951afd25d38a03b74e。
  • python dev_scripts/harness.py sync 与 python dev_scripts/harness.py sync --check 均通过。

CG30 安全演练

  • 设备:CG30(序列号脱敏不写入工单),安装 Agent 0.9.31。
  • CG-34:安装 APK 后系统清除了原先已启用的无障碍服务,因此在打开 PDD 前以 ACCESSIBILITY_NOT_READY 失败;随后仅恢复安装前同一无障碍组件状态。
  • CG-35:使用 rehearsal 规则,未包含地址更新、创建订单、订单结果读取或支付动作。结果为 RULE_ACTION_FAILED / 规则要求的有限滑动失败。
  • 控制流证据:该失败只能由 openSpecPanel 成功返回后的 applyPostAction(swipeAfter) 产生,因此已证明本次版本成功进入规格面板;未出现评价列表误跳错误,也未对入口重试。
  • 数据库复核:CG-35 的 irreversible_at、order_submit_request_id、pdd_order_no、order_submitted_at 均为空;未创建订单、未修改地址、未支付。

CG-35 暴露的是规格面板打开后的既有 up×2 后置滑动失败,属于 #164 Phase B 的相邻问题,不纳入 #166,避免扩大本单范围。

结论:#166 的代码、自动化、Wiki 和 CG30 安全演练闭环已完成,现转待验收;工单保持打开,不自动关闭。

## 实施与验证结果(待验收) Gitea MCP 当前不可用,本次按仓库规则回退 Gitea API;凭据仅从安全配置读取,未写入代码、日志或工单。 ### 实现 - 已提交并推送:`a3628df fix(agent): reject review-page spec entry misroutes (#166)`。 - Agent 版本升至 `0.9.31`(versionCode 44)。 - 规格入口现在同时绑定“语义锚点”和经过校验的可点击目标;商品评价语义会在锚点与点击目标两层排除。 - 明确识别商品评价列表页;误入后只返回一次并确认回到商品页,不再次点击同一候选。 - 点击时不再从已失效/不可点击的目标向更宽父节点漂移;新增稳定错误码区分入口缺失、目标歧义、点击失败、误入评价页和面板未打开。 ### 自动化验证 - 定向单测:`PddProductDetailCollectorTest`、`PurchaseRehearsalExecutorTest` 通过。 - Android 全量:`.\gradlew.bat testDebugUnitTest assembleDebug --rerun-tasks` 通过(41 tasks)。 - `git diff --check` 通过。 ### 文档 - 已先更新线上 Wiki `Android-Agent-API-Contract` 并回读,revision:`484a645058de780abe2ff2951afd25d38a03b74e`。 - `python dev_scripts/harness.py sync` 与 `python dev_scripts/harness.py sync --check` 均通过。 ### CG30 安全演练 - 设备:CG30(序列号脱敏不写入工单),安装 Agent `0.9.31`。 - CG-34:安装 APK 后系统清除了原先已启用的无障碍服务,因此在打开 PDD 前以 `ACCESSIBILITY_NOT_READY` 失败;随后仅恢复安装前同一无障碍组件状态。 - CG-35:使用 `rehearsal` 规则,未包含地址更新、创建订单、订单结果读取或支付动作。结果为 `RULE_ACTION_FAILED / 规则要求的有限滑动失败`。 - 控制流证据:该失败只能由 `openSpecPanel` 成功返回后的 `applyPostAction(swipeAfter)` 产生,因此已证明本次版本成功进入规格面板;未出现评价列表误跳错误,也未对入口重试。 - 数据库复核:CG-35 的 `irreversible_at`、`order_submit_request_id`、`pdd_order_no`、`order_submitted_at` 均为空;未创建订单、未修改地址、未支付。 CG-35 暴露的是规格面板打开后的既有 `up×2` 后置滑动失败,属于 #164 Phase B 的相邻问题,不纳入 #166,避免扩大本单范围。 结论:#166 的代码、自动化、Wiki 和 CG30 安全演练闭环已完成,现转待验收;工单保持打开,不自动关闭。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#166