T27 修复相似商品区域导致假售罄恢复不触发 #29

Closed
opened 2026-08-15 17:54:08 +08:00 by ila · 2 comments
Owner

原始需求摘要

正式任务 #28 使用已启用入口恢复和假售罄恢复的新规则,进入 PDD NewPageActivity 后显示假售罄页面,但 Agent 未执行向下拉动,最终以 RULE_NOT_MATCHED / 未找到 PDD 商品规格入口 失败。用户确认按分析建议修复。

已确认事实

  • 任务 #28 快照:pageRecovery.transientSoldOut.enabled=true,下拉次数 2。
  • Activity:com.xunmeng.pinduoduo.activity.NewPageActivity。
  • 日志没有 transient-sold-out recovery=start,却执行了两次普通商品页向上滑动。
  • 失败后的页面无障碍摘要以顶部“相似商品”和推荐商品卡片为主;推荐卡片包含标题、价格和销量。
  • 当前检测器把整页推荐卡片的标题/价格/销量当成主商品正常证据,导致假售罄候选被否决;“商品已售罄”文字本身也不能保证稳定暴露在无障碍树中。

目标

在不使用 OCR/VLM、不保存原始控件树或截图的前提下,可靠识别“顶部相似商品推荐 + 缺少主商品关键控件”的假售罄页面,并执行已有的一次性向下刷新恢复。

非目标

  • 不把正常商品详情页下方的“相似商品”区域判为假售罄。
  • 不改变入口重开、规格遍历、下单或付款边界。
  • 不增加无限重试,不保存原始页面数据。

前置依赖

T25 #27、T26 #28。

是否可并行

否。规则契约、Android 解析和模板字段必须一致。

子项目影响

  • server/:假售罄恢复契约和内置模板增加固定兜底标题。
  • android/:主商品证据范围修正、顶部推荐标题兜底、测试。
  • web/:只读 JSON/既有安全表单透传固定字段。
  • docs/:API 契约、规则样例、项目状态和工单索引。

方案

  1. pageRecovery.transientSoldOut 增加可缺省字段 fallbackTopText: 相似商品;缺省时 Agent 使用同一安全默认值,兼容旧快照。
  2. 假售罄候选满足以下任一入口:
    • 无障碍树精确出现“商品已售罄”;或
    • “相似商品”精确标题位于屏幕顶部区域。
  3. 正常证据只使用主商品强证据:规格面板、规格入口、快速确认入口、底部购买/规格容器和主商品店铺/评价操作锚点;不再用任意推荐卡片标题、价格、销量否决恢复。
  4. 顶部兜底必须同时满足精确商品 Activity、缺少主商品强证据;正常详情页中位于下方的“相似商品”不触发。
  5. 继续沿用已有恢复上限:下拉 2 次、最多 1 轮,恢复后仍异常明确失败。

验收标准

  • #28 对应页面结构能判为假售罄候选。
  • 推荐卡片标题、价格、销量不会被当成主商品正常证据。
  • 正常详情页顶部不存在兜底标题时不触发。
  • 正常详情页下方出现“相似商品”且有规格/购买强证据时不触发。
  • 规格面板内 SKU 售罄不触发。
  • 旧规则快照缺少 fallbackTopText 时仍可解析并使用安全默认值。
  • 三端契约测试、Android 单测/APK 构建、Web lint/build/Playwright 通过。
  • 一加真机重新执行商品 731370706977;若假售罄可复现,观察到两次向下刷新或明确失败结果。

验证计划

  • Go:兼容缺省、固定兜底标题、未知值拒绝、模板有效。
  • Android:纯快照覆盖推荐卡片污染、顶部位置、主商品强证据、旧快照默认值;采集器恢复流程回归。
  • Web:模板预览包含固定兜底字段。
  • 真机:安装 APK,创建新任务并观察日志、Activity 与任务结果。

风险

  • “相似商品”也可能出现在正常详情页下部,因此必须同时限制顶部位置和主商品强证据缺失。
  • PDD 后续更换标题时需要更新受控规则契约,不能使用模糊相似文本猜测。

文档影响

更新 docs/00-project-profile.md、docs/03-business-rules-and-glossary.md、docs/08-agent-api-contract.md、docs/09-delivery-issues.md 和规则样例。

## 原始需求摘要 正式任务 #28 使用已启用入口恢复和假售罄恢复的新规则,进入 PDD `NewPageActivity` 后显示假售罄页面,但 Agent 未执行向下拉动,最终以 `RULE_NOT_MATCHED / 未找到 PDD 商品规格入口` 失败。用户确认按分析建议修复。 ## 已确认事实 - 任务 #28 快照:`pageRecovery.transientSoldOut.enabled=true`,下拉次数 2。 - Activity:`com.xunmeng.pinduoduo.activity.NewPageActivity`。 - 日志没有 `transient-sold-out recovery=start`,却执行了两次普通商品页向上滑动。 - 失败后的页面无障碍摘要以顶部“相似商品”和推荐商品卡片为主;推荐卡片包含标题、价格和销量。 - 当前检测器把整页推荐卡片的标题/价格/销量当成主商品正常证据,导致假售罄候选被否决;“商品已售罄”文字本身也不能保证稳定暴露在无障碍树中。 ## 目标 在不使用 OCR/VLM、不保存原始控件树或截图的前提下,可靠识别“顶部相似商品推荐 + 缺少主商品关键控件”的假售罄页面,并执行已有的一次性向下刷新恢复。 ## 非目标 - 不把正常商品详情页下方的“相似商品”区域判为假售罄。 - 不改变入口重开、规格遍历、下单或付款边界。 - 不增加无限重试,不保存原始页面数据。 ## 前置依赖 T25 #27、T26 #28。 ## 是否可并行 否。规则契约、Android 解析和模板字段必须一致。 ## 子项目影响 - `server/`:假售罄恢复契约和内置模板增加固定兜底标题。 - `android/`:主商品证据范围修正、顶部推荐标题兜底、测试。 - `web/`:只读 JSON/既有安全表单透传固定字段。 - `docs/`:API 契约、规则样例、项目状态和工单索引。 ## 方案 1. `pageRecovery.transientSoldOut` 增加可缺省字段 `fallbackTopText: 相似商品`;缺省时 Agent 使用同一安全默认值,兼容旧快照。 2. 假售罄候选满足以下任一入口: - 无障碍树精确出现“商品已售罄”;或 - “相似商品”精确标题位于屏幕顶部区域。 3. 正常证据只使用主商品强证据:规格面板、规格入口、快速确认入口、底部购买/规格容器和主商品店铺/评价操作锚点;不再用任意推荐卡片标题、价格、销量否决恢复。 4. 顶部兜底必须同时满足精确商品 Activity、缺少主商品强证据;正常详情页中位于下方的“相似商品”不触发。 5. 继续沿用已有恢复上限:下拉 2 次、最多 1 轮,恢复后仍异常明确失败。 ## 验收标准 - [ ] #28 对应页面结构能判为假售罄候选。 - [ ] 推荐卡片标题、价格、销量不会被当成主商品正常证据。 - [ ] 正常详情页顶部不存在兜底标题时不触发。 - [ ] 正常详情页下方出现“相似商品”且有规格/购买强证据时不触发。 - [ ] 规格面板内 SKU 售罄不触发。 - [ ] 旧规则快照缺少 `fallbackTopText` 时仍可解析并使用安全默认值。 - [ ] 三端契约测试、Android 单测/APK 构建、Web lint/build/Playwright 通过。 - [ ] 一加真机重新执行商品 731370706977;若假售罄可复现,观察到两次向下刷新或明确失败结果。 ## 验证计划 - Go:兼容缺省、固定兜底标题、未知值拒绝、模板有效。 - Android:纯快照覆盖推荐卡片污染、顶部位置、主商品强证据、旧快照默认值;采集器恢复流程回归。 - Web:模板预览包含固定兜底字段。 - 真机:安装 APK,创建新任务并观察日志、Activity 与任务结果。 ## 风险 - “相似商品”也可能出现在正常详情页下部,因此必须同时限制顶部位置和主商品强证据缺失。 - PDD 后续更换标题时需要更新受控规则契约,不能使用模糊相似文本猜测。 ## 文档影响 更新 `docs/00-project-profile.md`、`docs/03-business-rules-and-glossary.md`、`docs/08-agent-api-contract.md`、`docs/09-delivery-issues.md` 和规则样例。
Author
Owner

实施回写

实现提交:924c6e0(fix: recover PDD similar-product sold-out page (#29))

实现内容:

  • 假售罄判断新增顶部固定兜底证据“相似商品”,推荐卡片标题、价格和销量不再作为主商品正常证据。
  • 主商品规格入口、快捷确认入口、进店、商品评价和购买动作继续阻止误触发;页面下方普通“相似商品”不触发恢复。
  • 规则契约、内置模板、管理端规则内容和 Android 解析器增加 fallbackTopText,旧任务快照缺省时兼容为“相似商品”。
  • Android 无障碍服务补充 canPerformGestures=true;下拉在主线程派发,并记录完成、取消、未排队和超时结果。
  • 同步更新业务规则、Agent API 契约、规则示例、项目档案和交付索引。

验证:

  • go test ./app/goauto/...:通过。
  • android/gradlew.bat testDebugUnitTest assembleDebug:通过。
  • pnpm lint:0 errors(仓库既有 30 warnings)。
  • pnpm build:prod:通过。
  • pnpm exec playwright test tests/e2e/collection-rule-editor.spec.ts:2 passed。
  • 一加真机、商品 731370706977、任务 32:识别假售罄后两次下拉均收到系统 completed 回调,随后 recovery=completed,继续完成颜色/尺码采集,任务最终为 completed。

工单保持打开,等待用户验收。

## 实施回写 实现提交:`924c6e0`(`fix: recover PDD similar-product sold-out page (#29)`) 实现内容: - 假售罄判断新增顶部固定兜底证据“相似商品”,推荐卡片标题、价格和销量不再作为主商品正常证据。 - 主商品规格入口、快捷确认入口、进店、商品评价和购买动作继续阻止误触发;页面下方普通“相似商品”不触发恢复。 - 规则契约、内置模板、管理端规则内容和 Android 解析器增加 `fallbackTopText`,旧任务快照缺省时兼容为“相似商品”。 - Android 无障碍服务补充 `canPerformGestures=true`;下拉在主线程派发,并记录完成、取消、未排队和超时结果。 - 同步更新业务规则、Agent API 契约、规则示例、项目档案和交付索引。 验证: - `go test ./app/goauto/...`:通过。 - `android/gradlew.bat testDebugUnitTest assembleDebug`:通过。 - `pnpm lint`:0 errors(仓库既有 30 warnings)。 - `pnpm build:prod`:通过。 - `pnpm exec playwright test tests/e2e/collection-rule-editor.spec.ts`:2 passed。 - 一加真机、商品 `731370706977`、任务 32:识别假售罄后两次下拉均收到系统 `completed` 回调,随后 `recovery=completed`,继续完成颜色/尺码采集,任务最终为 `completed`。 工单保持打开,等待用户验收。
Author
Owner

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

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