修复采购规格探测未识别安全入口 #61

Closed
opened 2026-08-21 15:40:28 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:缺陷
  • 所属 Epic:采购 MVP
  • 所属 MVP / 版本:Android PDD 采购规格探测
  • 阶段:待实施
  • 前置依赖:#59 已实现的安全 PDD 规格入口识别、#36 已实现的采购执行器;可独立实施,不创建订单。
  • 是否可并行:否;涉及默认采购规则与 Android 采购执行器的共享行为。
  • 子项目影响:server/ 默认采购规则、android/ 采购执行器与测试、Wiki 文档;不改 Web、数据库或公共 API。

原始需求与事实证据

  • 来源:用户对话,2026-08-21。用户创建采购任务后,三星 Agent 通过浏览器跳转 PDD,报“没有找到商品规格入口”;再次操作显示“同一 SYB 商品已有更新任务 CG-4”。
  • 数据库:CG-3 和 CG-4 都关联 SYB 明细 2726、PDD 商品 172119352488、三星设备 4;二者均在 spec_probe 阶段失败,错误为 RULE_NOT_MATCHED:没有找到商品规格入口。CG-4 是较新的任务。
  • 同一商品的采集任务已验证可用入口文本为“快要抢光 免拼购买”,并可打开规格面板;用户也确认颜色可手动选择,因此不是无规格商品。
  • CG-4 的不可变规则快照在 openSpecPanel 写死 textAliases:["选择规格"]。Android openSpecPanel 一旦收到别名,就只在原始节点中按精确文字筛选,绕过 PddScreenParser 的安全入口 specEntry;实际页面没有精确“选择规格”文字,故失败。
  • “同一 SYB 商品已有更新任务 CG-4”来自旧任务 CG-3 的重试保护:同一 SYB 明细只允许最新任务重试,防止旧任务倒序重新采购;CG-4 当前已失败、无活动槽,不是并发运行。

目标

  • 默认正式采购规则不再写死“选择规格”作为规格入口。
  • Android 采购执行器始终以安全语义规格入口为候选;显式文字别名只能收窄安全候选,不能退回任意原始节点匹配。
  • 支持真实底部购买/拼单入口(如“免拼购买”)以及明确选择入口;继续排除评价、评论、订单和支付控件。
  • 只重试最新的 CG-4 对应的新任务,验证 spec_probe 完成并回传规格;该阶段在探测后立即停止,不修改地址、不创建订单、不支付。

非目标

  • 不执行正式下单、地址修改、订单读取或支付。
  • 不改采购任务并发/旧任务重试规则;CG-3 的阻止提示保持不变。
  • 不新增页面、Admin 交互、数据库迁移、OCR/VLM、控件树或截图持久化。

实施方案

  1. 调整服务端 DefaultLiveRule:openSpecPanel 不提供固定 textAliases,继续保存既有受控滑动参数。
  2. 调整 Android openSpecPanel:先从 screen.specEntry 与 quickConfirmationEntry 组成安全候选;若规则提供别名,只在该安全集合内筛选,不允许扫描所有原始节点。
  3. 增加服务端默认规则测试、Android “免拼购买”入口测试及“别名不能绕过安全候选”测试。
  4. 构建 Debug APK 并安装三星;经正式重试接口只重试最新失败任务 CG-4,验证新任务的 spec_probe 结果和无订单事实。

设计证据

  • 内部规则和 Agent 缺陷,无新增 UI、页面或用户交互;不需要 QuantUX/HTML 原型。

验收标准

  • 默认采购规则的规格面板动作不再锁死“选择规格”。
  • Android 能通过安全底部“免拼购买”等入口打开规格面板。
  • 显式别名不能令 Agent 从原始页面任意节点点击规格入口。
  • 评价、订单、支付控件不会成为采购规格入口。
  • 服务端与 Android 相关自动化测试、Debug APK 构建和组件验证通过。
  • 三星仅完成最新任务 CG-4 派生任务的规格探测,回传规格且无地址修改、订单号、下单时间或支付动作。

验证

  • go test ./app/goauto/purchasecontract/... ./app/goauto/purchase/...
  • android/gradlew.bat test assembleDebug
  • scripts/verify.ps1 -Component all
  • 三星 SM-G9700:通过正式重试接口重试最新任务 CG-4,检查 attempt、任务状态、规格回传与订单字段。
  • python dev_scripts/harness.py sync --check
  • python dev_scripts/harness.py check --strict
  • git diff --check

文档影响

  • 更新 Wiki Business-Rules-and-Glossary、Android-Agent-API-Contract、OnePlus-Real-Device-Acceptance;完成后创建 Wiki 任务归档,不自动导出 docs/task/。

风险与控制

  • 规格入口错误可能进入评价或触发采购动作:只复用安全入口集合,继续排除评价、订单和支付;探测阶段提前结束。
  • 任务重试可能误选旧任务:只允许最新 CG-4 派生新任务,旧 CG-3 保持重试拒绝。
  • 真机为正式采购模式:本次仅允许 spec_probe,代码路径在 probeSpecs 成功后立即返回;任何进入地址或订单动作均视为失败并停止。
## 基本信息 - 类型:缺陷 - 所属 Epic:采购 MVP - 所属 MVP / 版本:Android PDD 采购规格探测 - 阶段:待实施 - 前置依赖:#59 已实现的安全 PDD 规格入口识别、#36 已实现的采购执行器;可独立实施,不创建订单。 - 是否可并行:否;涉及默认采购规则与 Android 采购执行器的共享行为。 - 子项目影响:`server/` 默认采购规则、`android/` 采购执行器与测试、Wiki 文档;不改 Web、数据库或公共 API。 ## 原始需求与事实证据 - 来源:用户对话,2026-08-21。用户创建采购任务后,三星 Agent 通过浏览器跳转 PDD,报“没有找到商品规格入口”;再次操作显示“同一 SYB 商品已有更新任务 CG-4”。 - 数据库:CG-3 和 CG-4 都关联 SYB 明细 `2726`、PDD 商品 `172119352488`、三星设备 4;二者均在 `spec_probe` 阶段失败,错误为 `RULE_NOT_MATCHED:没有找到商品规格入口`。CG-4 是较新的任务。 - 同一商品的采集任务已验证可用入口文本为“快要抢光 免拼购买”,并可打开规格面板;用户也确认颜色可手动选择,因此不是无规格商品。 - CG-4 的不可变规则快照在 `openSpecPanel` 写死 `textAliases:["选择规格"]`。Android `openSpecPanel` 一旦收到别名,就只在原始节点中按精确文字筛选,绕过 `PddScreenParser` 的安全入口 `specEntry`;实际页面没有精确“选择规格”文字,故失败。 - “同一 SYB 商品已有更新任务 CG-4”来自旧任务 CG-3 的重试保护:同一 SYB 明细只允许最新任务重试,防止旧任务倒序重新采购;CG-4 当前已失败、无活动槽,不是并发运行。 ## 目标 - 默认正式采购规则不再写死“选择规格”作为规格入口。 - Android 采购执行器始终以安全语义规格入口为候选;显式文字别名只能收窄安全候选,不能退回任意原始节点匹配。 - 支持真实底部购买/拼单入口(如“免拼购买”)以及明确选择入口;继续排除评价、评论、订单和支付控件。 - 只重试最新的 CG-4 对应的新任务,验证 `spec_probe` 完成并回传规格;该阶段在探测后立即停止,不修改地址、不创建订单、不支付。 ## 非目标 - 不执行正式下单、地址修改、订单读取或支付。 - 不改采购任务并发/旧任务重试规则;CG-3 的阻止提示保持不变。 - 不新增页面、Admin 交互、数据库迁移、OCR/VLM、控件树或截图持久化。 ## 实施方案 1. 调整服务端 `DefaultLiveRule`:`openSpecPanel` 不提供固定 `textAliases`,继续保存既有受控滑动参数。 2. 调整 Android `openSpecPanel`:先从 `screen.specEntry` 与 `quickConfirmationEntry` 组成安全候选;若规则提供别名,只在该安全集合内筛选,不允许扫描所有原始节点。 3. 增加服务端默认规则测试、Android “免拼购买”入口测试及“别名不能绕过安全候选”测试。 4. 构建 Debug APK 并安装三星;经正式重试接口只重试最新失败任务 CG-4,验证新任务的 `spec_probe` 结果和无订单事实。 ## 设计证据 - 内部规则和 Agent 缺陷,无新增 UI、页面或用户交互;不需要 QuantUX/HTML 原型。 ## 验收标准 - [ ] 默认采购规则的规格面板动作不再锁死“选择规格”。 - [ ] Android 能通过安全底部“免拼购买”等入口打开规格面板。 - [ ] 显式别名不能令 Agent 从原始页面任意节点点击规格入口。 - [ ] 评价、订单、支付控件不会成为采购规格入口。 - [ ] 服务端与 Android 相关自动化测试、Debug APK 构建和组件验证通过。 - [ ] 三星仅完成最新任务 CG-4 派生任务的规格探测,回传规格且无地址修改、订单号、下单时间或支付动作。 ## 验证 - `go test ./app/goauto/purchasecontract/... ./app/goauto/purchase/...` - `android/gradlew.bat test assembleDebug` - `scripts/verify.ps1 -Component all` - 三星 SM-G9700:通过正式重试接口重试最新任务 CG-4,检查 attempt、任务状态、规格回传与订单字段。 - `python dev_scripts/harness.py sync --check` - `python dev_scripts/harness.py check --strict` - `git diff --check` ## 文档影响 - 更新 Wiki `Business-Rules-and-Glossary`、`Android-Agent-API-Contract`、`OnePlus-Real-Device-Acceptance`;完成后创建 Wiki 任务归档,不自动导出 `docs/task/`。 ## 风险与控制 - 规格入口错误可能进入评价或触发采购动作:只复用安全入口集合,继续排除评价、订单和支付;探测阶段提前结束。 - 任务重试可能误选旧任务:只允许最新 CG-4 派生新任务,旧 CG-3 保持重试拒绝。 - 真机为正式采购模式:本次仅允许 `spec_probe`,代码路径在 `probeSpecs` 成功后立即返回;任何进入地址或订单动作均视为失败并停止。
Author
Owner

实施完成,等待用户验收。

  • 提交:aebe80f(修复)与 5a94f4f(Wiki 镜像)。
  • 完整三端验证:scripts/verify.ps1 -Component all 通过(Web lint 保留 30 条既有 warning,0 error)。
  • 三星 SM-G9700 真机:新规则快照的 CG-5 第一趟 spec_probe 返回 spec_probe_completed,采到 2 个颜色、8 个尺码;没有地址修改、订单号、下单时间或支付动作。
  • 任务归档已在线回读:Task-61(revision 052f51785bd3fcd3e60470b13b81eefec76417a3)。

CG-5 停在 spec_probe_pending 是 #46 未实施的规格决策链路,不是规格入口失败。

实施完成,等待用户验收。 - 提交:`aebe80f`(修复)与 `5a94f4f`(Wiki 镜像)。 - 完整三端验证:`scripts/verify.ps1 -Component all` 通过(Web lint 保留 30 条既有 warning,0 error)。 - 三星 SM-G9700 真机:新规则快照的 CG-5 第一趟 `spec_probe` 返回 `spec_probe_completed`,采到 2 个颜色、8 个尺码;没有地址修改、订单号、下单时间或支付动作。 - 任务归档已在线回读:[Task-61](https://git.ilapage.cn/OPC/goauto/wiki/Task-61-%E4%BF%AE%E5%A4%8D%E9%87%87%E8%B4%AD%E8%A7%84%E6%A0%BC%E6%8E%A2%E6%B5%8B%E6%9C%AA%E8%AF%86%E5%88%AB%E5%AE%89%E5%85%A8%E5%85%A5%E5%8F%A3.-)(revision `052f51785bd3fcd3e60470b13b81eefec76417a3`)。 CG-5 停在 `spec_probe_pending` 是 #46 未实施的规格决策链路,不是规格入口失败。
Author
Owner

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

用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。
ila closed this issue 2026-08-29 20:43:30 +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#61