修复正式采购规格滚动定位与重复探测卡死 #64

Closed
opened 2026-08-22 08:57:26 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:缺陷
  • 所属 Epic:采购 MVP
  • 所属 MVP / 版本:Android 正式采购规格选择
  • 阶段:待验收
  • 前置依赖:#36、#61 已实现代码;可独立修复,不需要 UI 原型。
  • 是否可并行:否;同时影响服务端采购状态机和 Android 采购执行器。
  • 子项目影响:server/、android/、Wiki;不改 Web、数据库和支付边界。

原始需求与事实证据

  • 来源:用户对话,2026-08-22。用户确认取消 CG-7,并要求建立缺陷工单后实施。
  • CG-7 关联 SYB 商品 2726、PDD goods_id 172119352488、三星设备 4,正式采购目标为 8913#长裤 / 4XL 160-170斤、数量 1。
  • 两次 attempt 均为 purchase 阶段,却提交 spec_probe_completed;两次均采到颜色 8913#长裤、9031#长裤 和 8 个尺码,目标尺码明确存在。
  • Android selectSpecs 只读取规格面板当前可见节点;目标 4XL 160-170斤 位于下方时不会受控滚动查找,于是错误回退到规格探测。
  • 第一次探测后服务端已固化精确匹配并再次派发;第二次探测提交时先清空映射,再因已有 spec_decision_request_id 拒绝重复固化,任务遗留在 spec_probe_pending。
  • 用户已确认取消 CG-7;取消后无不可逆时间、订单号或下单时间,未创建订单、未支付。

目标

  1. Android 在规格面板内通过有限、受控的纵向滑动重新读取节点,精确定位服务端下发的原始颜色/尺码标签;不做相近匹配或猜测。
  2. 服务端对同一采购任务的第二次规格探测安全收敛为明确失败,不清空已有决策后遗留活动任务,也不自动循环派发。
  3. 保持地址修改、创建订单、只读核单和永不支付边界不变。

非目标

  • 不创建新采购任务,不执行真机地址修改、创建订单或支付。
  • 不新增 OCR/VLM、模糊匹配、Agent 本地规格决策。
  • 不改 Web 页面、公共设置、数据库结构、价格保护或采购并发规则。
  • 不在本工单自动关闭 #36、#59、#60、#61。

实施方案

  1. Android:为 selectSpecs 增加有限次数的纵向搜索。每次只在同角色规格候选中按完整文字和可选状态精确匹配;未找到时向下滑动并重新抓取当前快照,连续无新证据或达到上限即停止。颜色和尺码分别重新定位,不复用旧节点。
  2. Android:保留首次 PURCHASE_SPEC_NOT_MATCHED 回退探测;不得因为滚动扩大到任意页面节点或相近规格。
  3. 服务端:提交 spec_probe_completed 时检查该任务是否已有已完成的规格探测/已固化规格决策。第二次探测直接把当前 attempt 和任务写为明确失败,保留既有映射决策证据,不再进入 spec_probe_pending。
  4. 增加 Android “目标尺码初始不可见、滑动后出现”及“有限滑动后仍不存在”测试;增加服务端重复探测安全失败和首次探测正常决策测试。
  5. 完成组件验证、APK 构建和安装准备;真机正式采购复验属于高风险动作,另行等待用户确认。

设计证据

内部执行与状态机缺陷,无页面、组件或交互变化;不需要 QuantUX/HTML 原型。

验收标准

  • 目标规格在规格面板下方时,Agent 能有限向下滑动、重新读取并精确选中。
  • Agent 不点击相近规格,不使用 OCR/VLM,不保存控件树或截图。
  • 规格搜索达到上限后明确失败,不无限滑动。
  • 同一任务第二次提交规格探测时,服务端将任务明确置为失败并释放活动槽;不遗留 spec_probe_pending,不自动循环派发。
  • 首次规格探测和服务端匹配流程保持可用。
  • 服务端和 Android 相关测试、APK 构建、组件验证通过。
  • 未创建采购任务、未修改真实地址、未创建订单、未支付。

验证

  • go test ./app/goauto/purchase/...
  • android/gradlew.bat test assembleDebug
  • scripts/verify.ps1 -Component server
  • scripts/verify.ps1 -Component android
  • 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,说明精确规格的有限滚动定位和重复探测失败收敛;完成后创建 Wiki 任务归档,不自动导出 docs/task/。

风险与控制

  • 滑动误入其他区域:只在规格面板已确认打开后使用固定有限的纵向手势,每次重新解析规格维度并仅点击完整文字精确候选。
  • 重复探测可能循环创建订单前动作:服务端第二次探测直接失败并释放租约,绝不再次派发。
  • 正式采购属于高风险:本工单只做代码和自动化验证,修复后真机下单再次等待人工确认;自动支付始终禁止。
## 基本信息 - 类型:缺陷 - 所属 Epic:采购 MVP - 所属 MVP / 版本:Android 正式采购规格选择 - 阶段:待验收 - 前置依赖:#36、#61 已实现代码;可独立修复,不需要 UI 原型。 - 是否可并行:否;同时影响服务端采购状态机和 Android 采购执行器。 - 子项目影响:`server/`、`android/`、Wiki;不改 Web、数据库和支付边界。 ## 原始需求与事实证据 - 来源:用户对话,2026-08-22。用户确认取消 CG-7,并要求建立缺陷工单后实施。 - CG-7 关联 SYB 商品 2726、PDD goods_id 172119352488、三星设备 4,正式采购目标为 `8913#长裤 / 4XL 160-170斤`、数量 1。 - 两次 attempt 均为 `purchase` 阶段,却提交 `spec_probe_completed`;两次均采到颜色 `8913#长裤`、`9031#长裤` 和 8 个尺码,目标尺码明确存在。 - Android `selectSpecs` 只读取规格面板当前可见节点;目标 `4XL 160-170斤` 位于下方时不会受控滚动查找,于是错误回退到规格探测。 - 第一次探测后服务端已固化精确匹配并再次派发;第二次探测提交时先清空映射,再因已有 `spec_decision_request_id` 拒绝重复固化,任务遗留在 `spec_probe_pending`。 - 用户已确认取消 CG-7;取消后无不可逆时间、订单号或下单时间,未创建订单、未支付。 ## 目标 1. Android 在规格面板内通过有限、受控的纵向滑动重新读取节点,精确定位服务端下发的原始颜色/尺码标签;不做相近匹配或猜测。 2. 服务端对同一采购任务的第二次规格探测安全收敛为明确失败,不清空已有决策后遗留活动任务,也不自动循环派发。 3. 保持地址修改、创建订单、只读核单和永不支付边界不变。 ## 非目标 - 不创建新采购任务,不执行真机地址修改、创建订单或支付。 - 不新增 OCR/VLM、模糊匹配、Agent 本地规格决策。 - 不改 Web 页面、公共设置、数据库结构、价格保护或采购并发规则。 - 不在本工单自动关闭 #36、#59、#60、#61。 ## 实施方案 1. Android:为 `selectSpecs` 增加有限次数的纵向搜索。每次只在同角色规格候选中按完整文字和可选状态精确匹配;未找到时向下滑动并重新抓取当前快照,连续无新证据或达到上限即停止。颜色和尺码分别重新定位,不复用旧节点。 2. Android:保留首次 `PURCHASE_SPEC_NOT_MATCHED` 回退探测;不得因为滚动扩大到任意页面节点或相近规格。 3. 服务端:提交 `spec_probe_completed` 时检查该任务是否已有已完成的规格探测/已固化规格决策。第二次探测直接把当前 attempt 和任务写为明确失败,保留既有映射决策证据,不再进入 `spec_probe_pending`。 4. 增加 Android “目标尺码初始不可见、滑动后出现”及“有限滑动后仍不存在”测试;增加服务端重复探测安全失败和首次探测正常决策测试。 5. 完成组件验证、APK 构建和安装准备;真机正式采购复验属于高风险动作,另行等待用户确认。 ## 设计证据 内部执行与状态机缺陷,无页面、组件或交互变化;不需要 QuantUX/HTML 原型。 ## 验收标准 - [ ] 目标规格在规格面板下方时,Agent 能有限向下滑动、重新读取并精确选中。 - [ ] Agent 不点击相近规格,不使用 OCR/VLM,不保存控件树或截图。 - [ ] 规格搜索达到上限后明确失败,不无限滑动。 - [ ] 同一任务第二次提交规格探测时,服务端将任务明确置为失败并释放活动槽;不遗留 `spec_probe_pending`,不自动循环派发。 - [ ] 首次规格探测和服务端匹配流程保持可用。 - [ ] 服务端和 Android 相关测试、APK 构建、组件验证通过。 - [ ] 未创建采购任务、未修改真实地址、未创建订单、未支付。 ## 验证 - `go test ./app/goauto/purchase/...` - `android/gradlew.bat test assembleDebug` - `scripts/verify.ps1 -Component server` - `scripts/verify.ps1 -Component android` - `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`,说明精确规格的有限滚动定位和重复探测失败收敛;完成后创建 Wiki 任务归档,不自动导出 `docs/task/`。 ## 风险与控制 - 滑动误入其他区域:只在规格面板已确认打开后使用固定有限的纵向手势,每次重新解析规格维度并仅点击完整文字精确候选。 - 重复探测可能循环创建订单前动作:服务端第二次探测直接失败并释放租约,绝不再次派发。 - 正式采购属于高风险:本工单只做代码和自动化验证,修复后真机下单再次等待人工确认;自动支付始终禁止。
Author
Owner

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

  • 安全处置:CG-7 已通过管理端取消;取消前后均无不可逆时间、PDD 订单号或下单时间,未修改地址、未创建订单、未支付。
  • Android:规格面板内先有限向下恢复顶部、再有限向上查看下方内容;每次重新读取节点,只点击同角色、完整文字相等且可选的唯一规格,证据不变提前停止。
  • 服务端:已有一次规格决策后再次提交探测,任务和当前 attempt 明确失败并释放活动槽;保留第一次映射及决策,不再遗留 spec_probe_pending 或循环派发。
  • 源码提交:22a024be641239d4aea8dceb42e077a5f36c82b7(已推送 main)。
  • 核心 Wiki:Business-Rules-and-Glossary、Android-Agent-API-Contract 已通过 Wiki Git 推送并回读,revision e4ecce2abf9a5ac210522747ccadee110aec0aa1;本地镜像正文比对一致。
  • 任务归档:Task-64,revision bef18b86f4576f4c108d42d0492087f884e50118。
  • 验证通过:go test ./...、android/gradlew.bat test assembleDebug、scripts/verify.ps1 -Component server、scripts/verify.ps1 -Component android、python dev_scripts/harness.py check --strict、git diff --check。
  • python dev_scripts/harness.py sync --verify 因当前 Gitea Wiki API 返回 404 未能自动执行;已按 Wiki Git 回退完成在线写入、回读和本地镜像一致性核对。
  • 未验证:新 APK 尚未安装三星;未再次执行正式采购、真实地址修改或创建订单。真机复验前再次等待用户明确授权,自动支付始终禁止。
实施完成,等待用户验收。 - 安全处置:CG-7 已通过管理端取消;取消前后均无不可逆时间、PDD 订单号或下单时间,未修改地址、未创建订单、未支付。 - Android:规格面板内先有限向下恢复顶部、再有限向上查看下方内容;每次重新读取节点,只点击同角色、完整文字相等且可选的唯一规格,证据不变提前停止。 - 服务端:已有一次规格决策后再次提交探测,任务和当前 attempt 明确失败并释放活动槽;保留第一次映射及决策,不再遗留 `spec_probe_pending` 或循环派发。 - 源码提交:`22a024be641239d4aea8dceb42e077a5f36c82b7`(已推送 `main`)。 - 核心 Wiki:`Business-Rules-and-Glossary`、`Android-Agent-API-Contract` 已通过 Wiki Git 推送并回读,revision `e4ecce2abf9a5ac210522747ccadee110aec0aa1`;本地镜像正文比对一致。 - 任务归档:[Task-64](https://git.ilapage.cn/OPC/goauto/wiki/Task-64-%E4%BF%AE%E5%A4%8D%E6%AD%A3%E5%BC%8F%E9%87%87%E8%B4%AD%E8%A7%84%E6%A0%BC%E6%BB%9A%E5%8A%A8%E5%AE%9A%E4%BD%8D%E4%B8%8E%E9%87%8D%E5%A4%8D%E6%8E%A2%E6%B5%8B%E5%8D%A1%E6%AD%BB.-),revision `bef18b86f4576f4c108d42d0492087f884e50118`。 - 验证通过:`go test ./...`、`android/gradlew.bat test assembleDebug`、`scripts/verify.ps1 -Component server`、`scripts/verify.ps1 -Component android`、`python dev_scripts/harness.py check --strict`、`git diff --check`。 - `python dev_scripts/harness.py sync --verify` 因当前 Gitea Wiki API 返回 404 未能自动执行;已按 Wiki Git 回退完成在线写入、回读和本地镜像一致性核对。 - 未验证:新 APK 尚未安装三星;未再次执行正式采购、真实地址修改或创建订单。真机复验前再次等待用户明确授权,自动支付始终禁止。
Author
Owner

三星真机补充验证(2026-08-22):

  • 已安装提交 22a024b 构建的 Debug APK,并重启服务端加载 #64。
  • 正式任务 CG-8 使用 8913#长裤 / 4XL 160-170斤、数量 1;Agent 已通过规格选择、数量、价格及摘要检查并进入 updateShippingAddress,证明目标尺码位于下方时的有限滚动精确定位在三星生效。
  • CG-8 随后以 PURCHASE_ADDRESS_UPDATE_FAILED:页面切换超时,未创建订单 安全失败;irreversible_at、PDD 订单号和下单时间均为空,未创建订单、未支付。
  • 地址页面切换超时属于 #64 范围外的新缺陷;本次未自动重试任务,避免重复真实操作。
三星真机补充验证(2026-08-22): - 已安装提交 `22a024b` 构建的 Debug APK,并重启服务端加载 #64。 - 正式任务 CG-8 使用 `8913#长裤 / 4XL 160-170斤`、数量 1;Agent 已通过规格选择、数量、价格及摘要检查并进入 `updateShippingAddress`,证明目标尺码位于下方时的有限滚动精确定位在三星生效。 - CG-8 随后以 `PURCHASE_ADDRESS_UPDATE_FAILED:页面切换超时,未创建订单` 安全失败;`irreversible_at`、PDD 订单号和下单时间均为空,未创建订单、未支付。 - 地址页面切换超时属于 #64 范围外的新缺陷;本次未自动重试任务,避免重复真实操作。
Author
Owner

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

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