修复 Agent 重试采购复用旧规格并下发空精确规格 #217

Open
opened 2026-09-05 08:53:15 +08:00 by ila · 2 comments
Owner

原始需求摘要

提出时间:2026-09-05。

本地服务中,SYB 订单 2609045BU9XFDW 的历史采购任务 CG69 在规格角色修复后点击 Agent“重试采购”,仍失败并提示“没有下发可用的精确商品规格”。用户确认按建议建工单修复。

当前事实与根因

  • #216 已修正当前 SYB 明细:目标颜色为“黑色”、尺码为“均碼”;历史采购任务快照按审计边界未被改写。
  • CG69 冻结的是修复前快照:颜色“均碼”、尺码“黑色”。首趟探测候选为颜色“黑色”、尺码“均码”,无匹配决策留下 spec_decision_request_id,但 mapped_color_snapshot / mapped_size_snapshot 均为空。
  • Agent 普通“重试采购”调用 POST /api/agent/v1/purchase-tasks/:taskId/reset,就地复用旧任务和旧规格快照。
  • Reset 只按 spec_source == unresolved 判断是否回到 spec_probe;CG69 的 spec_source=ai_match,因此空映射仍被推进 purchase 阶段,Agent 按安全规则拒绝执行。

目标

  1. Agent 普通“重试采购”保留旧任务历史并创建新任务,使新任务重新读取当前 SYB/PDD 档案、当前规则和规格目标,再执行强制真机规格探测。
  2. 服务端阻止“目标规格存在但对应精确执行规格为空”的任务进入正式采购阶段,不能只依赖 spec_source 或已有决策 ID。
  3. CG69 等历史失败任务保持不变,不修改历史快照,不执行真实下单或支付。

非目标

  • 不修改 AI 匹配算法、PDD 无障碍点击实现或 SYB 解析规则。
  • 不修改历史采购任务快照或删除执行记录。
  • 不触发真实采购、创建订单或付款。

前置依赖与并行性

  • 依赖 #215 的强制当次规格探测与现有 AgentRetry -> BatchRetry -> Create 新任务链路。
  • CG69 当前目标规格纠正依赖 #216;本工单从 #216 实施分支继续,不能与其独立合并。
  • Android 与服务端共享重试语义,需同一工单验证;不与相关文件的其他修改并行。

方案

  • Android 普通“重试采购”改用现有 Agent retry 接口,与替换后的“继续采购”一致创建新任务;同步调整确认与成功文案,明确旧任务保留、新任务使用当前档案和规则。
  • 服务端 Reset 增加完整精确规格门禁:任务存在目标颜色时必须有映射颜色,存在目标尺码时必须有映射尺码;不完整时不得创建 purchase attempt。若仍保留就地 Reset 能力,应安全回到探测或明确拒绝,且不得形成空规格正式采购 payload。
  • 补充服务端与 Android 策略/调用回归测试,覆盖“已有无结果决策但映射为空”的历史任务。

设计证据

现有 Agent 采购历史页的小范围行为与文案修正,复用既有卡片、确认弹窗和成功反馈,不新增页面、导航或组件;属于恢复安全重试语义的缺陷修复,不要求完整原型。需覆盖正常、接口失败、禁用和新任务成功反馈。

验收标准

  • 失败采购任务点击普通“重试采购”后,服务端创建不同 taskId 的新任务,旧任务保持失败历史。
  • 新任务读取当前 SYB 目标规格;对于本地样例应为颜色“黑色”、尺码“均碼”,并以 spec_probe 作为首趟阶段。
  • 任一目标规格对应的精确映射为空时,服务端不得下发 purchase 阶段。
  • Agent 明确提示已创建新任务,且不宣称复用旧规格快照。
  • 自动化测试与 Android APK 构建通过;不进行真机创建订单验证。

风险与确认

采购重试可能进入创建待付款订单流程,属于高风险修改。用户已于 2026-09-05 明确要求“按照你的建议建工单修复”;本次只实施代码和自动化验证,不触发真实任务或下单,付款永久禁止。

文档影响

预期需要更新 Business-Rules-and-Glossary 与 Android-Agent-API-Contract:明确普通 Agent 重试也创建新任务、旧任务不可变,以及空精确规格不得进入正式采购阶段。若实现核对后长期契约已完整表达,则在工单说明无长期文档影响并跳过 Wiki 更新。

工具回退

当前会话未提供可调用的 Gitea MCP,因此按仓库规则回退 Gitea API;凭据仅从已忽略的本机 gitea.env 读取,未写入工单、日志或源码。

## 原始需求摘要 提出时间:2026-09-05。 本地服务中,SYB 订单 `2609045BU9XFDW` 的历史采购任务 CG69 在规格角色修复后点击 Agent“重试采购”,仍失败并提示“没有下发可用的精确商品规格”。用户确认按建议建工单修复。 ## 当前事实与根因 - #216 已修正当前 SYB 明细:目标颜色为“黑色”、尺码为“均碼”;历史采购任务快照按审计边界未被改写。 - CG69 冻结的是修复前快照:颜色“均碼”、尺码“黑色”。首趟探测候选为颜色“黑色”、尺码“均码”,无匹配决策留下 `spec_decision_request_id`,但 `mapped_color_snapshot` / `mapped_size_snapshot` 均为空。 - Agent 普通“重试采购”调用 `POST /api/agent/v1/purchase-tasks/:taskId/reset`,就地复用旧任务和旧规格快照。 - Reset 只按 `spec_source == unresolved` 判断是否回到 `spec_probe`;CG69 的 `spec_source=ai_match`,因此空映射仍被推进 `purchase` 阶段,Agent 按安全规则拒绝执行。 ## 目标 1. Agent 普通“重试采购”保留旧任务历史并创建新任务,使新任务重新读取当前 SYB/PDD 档案、当前规则和规格目标,再执行强制真机规格探测。 2. 服务端阻止“目标规格存在但对应精确执行规格为空”的任务进入正式采购阶段,不能只依赖 `spec_source` 或已有决策 ID。 3. CG69 等历史失败任务保持不变,不修改历史快照,不执行真实下单或支付。 ## 非目标 - 不修改 AI 匹配算法、PDD 无障碍点击实现或 SYB 解析规则。 - 不修改历史采购任务快照或删除执行记录。 - 不触发真实采购、创建订单或付款。 ## 前置依赖与并行性 - 依赖 #215 的强制当次规格探测与现有 `AgentRetry -> BatchRetry -> Create` 新任务链路。 - CG69 当前目标规格纠正依赖 #216;本工单从 #216 实施分支继续,不能与其独立合并。 - Android 与服务端共享重试语义,需同一工单验证;不与相关文件的其他修改并行。 ## 方案 - Android 普通“重试采购”改用现有 Agent retry 接口,与替换后的“继续采购”一致创建新任务;同步调整确认与成功文案,明确旧任务保留、新任务使用当前档案和规则。 - 服务端 Reset 增加完整精确规格门禁:任务存在目标颜色时必须有映射颜色,存在目标尺码时必须有映射尺码;不完整时不得创建 `purchase` attempt。若仍保留就地 Reset 能力,应安全回到探测或明确拒绝,且不得形成空规格正式采购 payload。 - 补充服务端与 Android 策略/调用回归测试,覆盖“已有无结果决策但映射为空”的历史任务。 ## 设计证据 现有 Agent 采购历史页的小范围行为与文案修正,复用既有卡片、确认弹窗和成功反馈,不新增页面、导航或组件;属于恢复安全重试语义的缺陷修复,不要求完整原型。需覆盖正常、接口失败、禁用和新任务成功反馈。 ## 验收标准 - 失败采购任务点击普通“重试采购”后,服务端创建不同 taskId 的新任务,旧任务保持失败历史。 - 新任务读取当前 SYB 目标规格;对于本地样例应为颜色“黑色”、尺码“均碼”,并以 `spec_probe` 作为首趟阶段。 - 任一目标规格对应的精确映射为空时,服务端不得下发 `purchase` 阶段。 - Agent 明确提示已创建新任务,且不宣称复用旧规格快照。 - 自动化测试与 Android APK 构建通过;不进行真机创建订单验证。 ## 风险与确认 采购重试可能进入创建待付款订单流程,属于高风险修改。用户已于 2026-09-05 明确要求“按照你的建议建工单修复”;本次只实施代码和自动化验证,不触发真实任务或下单,付款永久禁止。 ## 文档影响 预期需要更新 `Business-Rules-and-Glossary` 与 `Android-Agent-API-Contract`:明确普通 Agent 重试也创建新任务、旧任务不可变,以及空精确规格不得进入正式采购阶段。若实现核对后长期契约已完整表达,则在工单说明无长期文档影响并跳过 Wiki 更新。 ## 工具回退 当前会话未提供可调用的 Gitea MCP,因此按仓库规则回退 Gitea API;凭据仅从已忽略的本机 `gitea.env` 读取,未写入工单、日志或源码。
Author
Owner

实施完成,待验收

实现

  • Android 普通“重试采购”不再调用就地 /reset,统一调用既有 /retry;旧失败任务保留,新任务读取当前 SYB、虾皮/PDD 档案与当前采购规则。
  • Agent 确认、边界和成功反馈文案已改为“保留旧任务并创建新任务”。
  • 服务端统一推导 attempt 阶段;目标颜色/尺码存在但对应精确映射为空时不能判定为 purchase。
  • 历史兼容 /reset 对“已有决策但执行规格不完整”的任务返回 PURCHASE_SPEC_MAPPING_REQUIRED,不修改旧任务、不创建 attempt。
  • Start 增加预建 attempt 阶段与任务当前安全阶段一致性校验。
  • Agent 版本提升为 0.9.40 (53),debug APK 已构建;未安装真机、未创建采购任务或订单、未支付。

回归证据

  • go test ./app/goauto/purchase:通过。
  • scripts/verify.ps1 -Component android:Debug/Release 单元测试与 Debug APK 构建通过。
  • scripts/verify.ps1 -Component all:服务端全部测试及构建通过;随后被仓库当前 web/src/views/goauto/purchase-tasks/index.vue 的既有 tab/space lint 错误阻断。本工单未修改该文件,未混入相邻修复。
  • python dev_scripts/harness.py check --strict:通过。
  • Wiki 已在线更新、回读并在独立干净工作树执行一次 sync 和一次 sync --check:
    • Business-Rules-and-Glossary revision bd2748f2b58daee92eaa1e5ed16ce61fa18f728f
    • Android-Agent-API-Contract revision 644b864833730130cf4a2098a01611da0c0ac45d

提交与分支

  • 96cc2ab docs(purchase): 更新 Agent 重试契约 (#217)
  • 8d2e61b fix(purchase): 重建 Agent 重试任务 (#217)
  • 已推送:origin/fix/217-agent-retry-current-spec
  • 本分支基于尚待验收的 #216 提交 bd386cf,合并/部署时须保持该依赖顺序。

未验证与验收建议

未进行真机重试,因为点击后可能创建正式待付款订单,需要单独人工授权。部署服务端并安装 Agent 0.9.40 (53) 后,可在手机对 CG69 点击“重试采购”:预期界面提示创建新的 CG 任务;CG69 保持失败历史;新任务目标规格读取当前数据并从 spec_probe 开始。到达可能创建订单的后续步骤前,仍须遵循真机高风险授权边界。

## 实施完成,待验收 ### 实现 - Android 普通“重试采购”不再调用就地 `/reset`,统一调用既有 `/retry`;旧失败任务保留,新任务读取当前 SYB、虾皮/PDD 档案与当前采购规则。 - Agent 确认、边界和成功反馈文案已改为“保留旧任务并创建新任务”。 - 服务端统一推导 attempt 阶段;目标颜色/尺码存在但对应精确映射为空时不能判定为 `purchase`。 - 历史兼容 `/reset` 对“已有决策但执行规格不完整”的任务返回 `PURCHASE_SPEC_MAPPING_REQUIRED`,不修改旧任务、不创建 attempt。 - Start 增加预建 attempt 阶段与任务当前安全阶段一致性校验。 - Agent 版本提升为 `0.9.40 (53)`,debug APK 已构建;未安装真机、未创建采购任务或订单、未支付。 ### 回归证据 - `go test ./app/goauto/purchase`:通过。 - `scripts/verify.ps1 -Component android`:Debug/Release 单元测试与 Debug APK 构建通过。 - `scripts/verify.ps1 -Component all`:服务端全部测试及构建通过;随后被仓库当前 `web/src/views/goauto/purchase-tasks/index.vue` 的既有 tab/space lint 错误阻断。本工单未修改该文件,未混入相邻修复。 - `python dev_scripts/harness.py check --strict`:通过。 - Wiki 已在线更新、回读并在独立干净工作树执行一次 `sync` 和一次 `sync --check`: - `Business-Rules-and-Glossary` revision `bd2748f2b58daee92eaa1e5ed16ce61fa18f728f` - `Android-Agent-API-Contract` revision `644b864833730130cf4a2098a01611da0c0ac45d` ### 提交与分支 - `96cc2ab` `docs(purchase): 更新 Agent 重试契约 (#217)` - `8d2e61b` `fix(purchase): 重建 Agent 重试任务 (#217)` - 已推送:`origin/fix/217-agent-retry-current-spec` - 本分支基于尚待验收的 #216 提交 `bd386cf`,合并/部署时须保持该依赖顺序。 ### 未验证与验收建议 未进行真机重试,因为点击后可能创建正式待付款订单,需要单独人工授权。部署服务端并安装 Agent `0.9.40 (53)` 后,可在手机对 CG69 点击“重试采购”:预期界面提示创建新的 CG 任务;CG69 保持失败历史;新任务目标规格读取当前数据并从 `spec_probe` 开始。到达可能创建订单的后续步骤前,仍须遵循真机高风险授权边界。
Author
Owner

#225 已修正本单引入的普通 Agent 重试语义回归:普通“重试采购”恢复复用原 task ID 并新增 attempt;本单的 /retry 新任务路径只保留给替代商品“继续采购”,Admin 批量重试仍保持新任务语义。长期 Wiki/API 契约已按 #225 修正。#217 仍保持未验收状态,不以其“普通重试创建新任务”作为验收事实。

#225 已修正本单引入的普通 Agent 重试语义回归:普通“重试采购”恢复复用原 task ID 并新增 attempt;本单的 `/retry` 新任务路径只保留给替代商品“继续采购”,Admin 批量重试仍保持新任务语义。长期 Wiki/API 契约已按 #225 修正。#217 仍保持未验收状态,不以其“普通重试创建新任务”作为验收事实。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#217