fix(agent): 普通重试采购恢复同任务新增 attempt #225

Open
opened 2026-09-05 16:31:06 +08:00 by ila · 1 comment
Owner

原始需求摘要

来源:用户于 2026-09-05 反馈,CG90 在 Agent 点击普通“重试采购”后被创建为不同任务 CG91;用户重申此前确认的规则是“普通重试不新建采购任务,只让原任务重新执行采购操作”,并明确要求修复。

当前事实与根因

  • #159 已实现并验收采购失败任务就地重试:复用原 purchase_task.id,只新增 attempt。
  • 尚未验收的 #217 为解决历史任务规格快照陈旧问题,把 Agent 普通重试从 /reset 改为 /retry;该接口委托 AgentRetry → BatchRetry → Create 创建新任务。CG90 因此生成 CG91。
  • #217 把“同一业务快照因代码/规则问题重新执行”和“商品替换/业务规格变化后按当前档案重新创建”混为同一按钮语义,覆盖了既有已验收行为。
  • 服务端现有 /reset 已具备同任务 attempt 归档、幂等、最新正式采购规则、不可逆边界、设备归属和映射完整性门禁,可直接恢复普通重试。

目标

  1. Agent 普通“重试采购”恢复调用 /api/agent/v1/purchase-tasks/{taskId}/reset,复用相同 task ID,仅新增 attempt。
  2. 普通重试使用最新版 Agent 代码和当前有效采购规则,但保持原任务商品、目标规格、执行规格、数量、价格和地址等业务快照。
  3. 替代商品完成后的“继续采购”继续调用 /retry 创建新任务,重新读取当前商品/规格档案;两种行为和文案明确区分。
  4. Admin 批量重试的新任务语义保持不变。

非目标

  • 不修改 CG90/CG91 历史数据,不删除或合并任务。
  • 不允许普通重试刷新商品、目标规格、执行规格或价格快照;需要这些变化时走明确的新任务流程。
  • 不修改规格匹配算法或 #224 最终规格复核。
  • 不自动触发真机重试,不修改地址、不创建订单、不付款。
  • 不新增数据库迁移、权限或页面。

前置依赖与并行性

  • 关联回归来源 #217,并恢复 #159 已验收的普通重试语义。
  • 复用现有 /reset,保留 #217 已增加的“映射不完整不得进入 purchase attempt”安全门禁。
  • 可与 #224 v2 的 Android 最终规格复核并行设计;若构建/安装合并版本,需明确包含的提交。

实施方案

  • Android 普通重试调用 resetPurchaseTask;成功后显示相同 CG 编号和新的 attempt 序号。
  • “继续采购”保留 retryPurchaseTask,成功后明确显示源任务与新任务编号。
  • 修改普通重试确认、详情边界和成功文案:同任务、新 attempt、刷新当前规则、保留业务快照、可能创建待付款订单且不会支付。
  • 保留服务端 /retry 和 Admin 批量重试;服务端 /reset 门禁及 attempt 审计不放宽。
  • 修正长期 Wiki/API 契约中 #217 写入的“普通 Agent 重试创建新任务”描述。

验收标准

  • 对安全可重试的失败任务点击普通“重试采购”,响应 taskId 与原任务一致,attemptNumber +1,不新增 purchase_task。
  • 新 attempt 使用当前有效规则;原商品、目标/执行规格、数量、价格、地址快照不变。
  • Android 提示同一任务进入第 N 次执行,不显示“已创建新任务”。
  • 替代商品“继续采购”仍创建不同 taskId,新任务读取当前档案。
  • 映射不完整、存在不可逆下单证据、设备不符、已有更新任务等门禁继续拒绝。
  • Android 回归测试、APK 构建及服务端相关 Reset/AgentRetry 测试通过。

验证

  • Android:普通重试/继续采购分流、确认文案、成功反馈单元测试;完整单元测试和 APK 构建。
  • Server:既有 reset 与 AgentRetry 定向测试,确认无行为回归。
  • 真机只安装新版;由用户另行点击安全失败任务做同 task ID / attempt +1 验收。

风险与安全边界

采购重试可能继续到创建待付款订单,属于高风险流程。本单只改重试请求分流和文案,不自动发起任务;不可逆边界存在时继续禁止普通重试,付款永久禁止。

设计证据

复用现有列表/详情按钮、确认框、加载和结果反馈,仅纠正既有行为与文案。用户于 2026-09-05 明确确认普通重试应复用原任务并要求修复,无新增页面、导航或组件,按规则免完整原型。

文档影响

需要修正 Gitea Wiki Business-Rules-and-Glossary 与 Android-Agent-API-Contract 的普通重试长期契约;在线更新并回读 revision 后同步本地镜像,执行一次 sync 与一次 sync --check。

工具说明

当前会话没有项目 Gitea MCP 工单/Wiki 写入工具,按规则回退本机配置的 Gitea API;凭据只从已忽略的 gitea.env 读取。

任务记录

  • 默认不创建任务快照。
  • 实现、测试、提交、推送及 Wiki 证据完成后保持待验收。
## 原始需求摘要 来源:用户于 2026-09-05 反馈,CG90 在 Agent 点击普通“重试采购”后被创建为不同任务 CG91;用户重申此前确认的规则是“普通重试不新建采购任务,只让原任务重新执行采购操作”,并明确要求修复。 ## 当前事实与根因 - #159 已实现并验收采购失败任务就地重试:复用原 `purchase_task.id`,只新增 attempt。 - 尚未验收的 #217 为解决历史任务规格快照陈旧问题,把 Agent 普通重试从 `/reset` 改为 `/retry`;该接口委托 `AgentRetry → BatchRetry → Create` 创建新任务。CG90 因此生成 CG91。 - #217 把“同一业务快照因代码/规则问题重新执行”和“商品替换/业务规格变化后按当前档案重新创建”混为同一按钮语义,覆盖了既有已验收行为。 - 服务端现有 `/reset` 已具备同任务 attempt 归档、幂等、最新正式采购规则、不可逆边界、设备归属和映射完整性门禁,可直接恢复普通重试。 ## 目标 1. Agent 普通“重试采购”恢复调用 `/api/agent/v1/purchase-tasks/{taskId}/reset`,复用相同 task ID,仅新增 attempt。 2. 普通重试使用最新版 Agent 代码和当前有效采购规则,但保持原任务商品、目标规格、执行规格、数量、价格和地址等业务快照。 3. 替代商品完成后的“继续采购”继续调用 `/retry` 创建新任务,重新读取当前商品/规格档案;两种行为和文案明确区分。 4. Admin 批量重试的新任务语义保持不变。 ## 非目标 - 不修改 CG90/CG91 历史数据,不删除或合并任务。 - 不允许普通重试刷新商品、目标规格、执行规格或价格快照;需要这些变化时走明确的新任务流程。 - 不修改规格匹配算法或 #224 最终规格复核。 - 不自动触发真机重试,不修改地址、不创建订单、不付款。 - 不新增数据库迁移、权限或页面。 ## 前置依赖与并行性 - 关联回归来源 #217,并恢复 #159 已验收的普通重试语义。 - 复用现有 `/reset`,保留 #217 已增加的“映射不完整不得进入 purchase attempt”安全门禁。 - 可与 #224 v2 的 Android 最终规格复核并行设计;若构建/安装合并版本,需明确包含的提交。 ## 实施方案 - Android 普通重试调用 `resetPurchaseTask`;成功后显示相同 CG 编号和新的 attempt 序号。 - “继续采购”保留 `retryPurchaseTask`,成功后明确显示源任务与新任务编号。 - 修改普通重试确认、详情边界和成功文案:同任务、新 attempt、刷新当前规则、保留业务快照、可能创建待付款订单且不会支付。 - 保留服务端 `/retry` 和 Admin 批量重试;服务端 `/reset` 门禁及 attempt 审计不放宽。 - 修正长期 Wiki/API 契约中 #217 写入的“普通 Agent 重试创建新任务”描述。 ## 验收标准 - 对安全可重试的失败任务点击普通“重试采购”,响应 taskId 与原任务一致,attemptNumber +1,不新增 `purchase_task`。 - 新 attempt 使用当前有效规则;原商品、目标/执行规格、数量、价格、地址快照不变。 - Android 提示同一任务进入第 N 次执行,不显示“已创建新任务”。 - 替代商品“继续采购”仍创建不同 taskId,新任务读取当前档案。 - 映射不完整、存在不可逆下单证据、设备不符、已有更新任务等门禁继续拒绝。 - Android 回归测试、APK 构建及服务端相关 Reset/AgentRetry 测试通过。 ## 验证 - Android:普通重试/继续采购分流、确认文案、成功反馈单元测试;完整单元测试和 APK 构建。 - Server:既有 reset 与 AgentRetry 定向测试,确认无行为回归。 - 真机只安装新版;由用户另行点击安全失败任务做同 task ID / attempt +1 验收。 ## 风险与安全边界 采购重试可能继续到创建待付款订单,属于高风险流程。本单只改重试请求分流和文案,不自动发起任务;不可逆边界存在时继续禁止普通重试,付款永久禁止。 ## 设计证据 复用现有列表/详情按钮、确认框、加载和结果反馈,仅纠正既有行为与文案。用户于 2026-09-05 明确确认普通重试应复用原任务并要求修复,无新增页面、导航或组件,按规则免完整原型。 ## 文档影响 需要修正 Gitea Wiki `Business-Rules-and-Glossary` 与 `Android-Agent-API-Contract` 的普通重试长期契约;在线更新并回读 revision 后同步本地镜像,执行一次 `sync` 与一次 `sync --check`。 ## 工具说明 当前会话没有项目 Gitea MCP 工单/Wiki 写入工具,按规则回退本机配置的 Gitea API;凭据只从已忽略的 `gitea.env` 读取。 ## 任务记录 - 默认不创建任务快照。 - 实现、测试、提交、推送及 Wiki 证据完成后保持待验收。
Author
Owner

实施完成,待验收

提交并推送分支 fix/225-in-place-purchase-retry:

  • 9124e92:普通“重试采购”恢复调用 /reset,复用原 task ID、新增 attempt;替代商品“继续采购”仍调用 /retry 创建新任务;更新确认、边界和成功反馈;Agent 版本提升为 0.9.47 (60)。
  • 8f5ff45:同步普通重试业务规则。
  • b306f41:同步 Agent API 契约。

验证

  • Android 普通重试/继续采购分流及 #224 规格复核定向测试:通过。
  • scripts/verify.ps1 -Component android:Debug/Release 全部单元测试和 Debug APK 构建通过。
  • Server TestPurchaseReset|TestAgentRetry:通过,确认既有同任务 attempt、幂等、业务快照不变、映射完整性和新任务继续采购门禁无回归。
  • git diff --check、python dev_scripts/harness.py check --strict:通过。
  • Wiki:Business-Rules-and-Glossary@66dddbe756fd、Android-Agent-API-Contract@0c6d95d07adc,在线全文回读成功;独立干净 worktree 完成一次镜像同步和一次 sync --check。
  • APK:6,281,288 bytes,SHA-256 373bff7b3fe3eaa630c3787f8d488b9834a0aa31814245c78a8c60c54a7a1d9e;已安装到 192.168.0.173:41751,设备回读 0.9.47 (60),无障碍服务启用。

Wiki 写入恢复记录

当前 Gitea 更新接口要求 content_base64;首次按不兼容的 content 字段调用产生了两个空正文 revision。镜像同步立即发现异常,错误临时提交未合入且已删除;随后用现有完整镜像恢复线上全文,再以 content_base64 应用 #225 修改。最终在线正文长度、标题、revision 与镜像一致性均已复核,不存在空页遗留。

安全与未验证

  • 安装前设备 10 无活动采购/采集任务。
  • Server 无代码变化,无需重启。
  • 未修改 CG90/CG91 历史数据,未自动发起重试、修改地址、创建订单或付款。
  • 请在 Agent 对 CG91 手动点击普通“重试采购”验收:预期仍为 CG91、attempt 增加,不创建 CG92;随后采购执行结果用于 #224 真机验收。
  • 工作区既有文档、配置与未跟踪文件未纳入提交。
## 实施完成,待验收 提交并推送分支 `fix/225-in-place-purchase-retry`: - `9124e92`:普通“重试采购”恢复调用 `/reset`,复用原 task ID、新增 attempt;替代商品“继续采购”仍调用 `/retry` 创建新任务;更新确认、边界和成功反馈;Agent 版本提升为 `0.9.47 (60)`。 - `8f5ff45`:同步普通重试业务规则。 - `b306f41`:同步 Agent API 契约。 ### 验证 - Android 普通重试/继续采购分流及 #224 规格复核定向测试:通过。 - `scripts/verify.ps1 -Component android`:Debug/Release 全部单元测试和 Debug APK 构建通过。 - Server `TestPurchaseReset|TestAgentRetry`:通过,确认既有同任务 attempt、幂等、业务快照不变、映射完整性和新任务继续采购门禁无回归。 - `git diff --check`、`python dev_scripts/harness.py check --strict`:通过。 - Wiki:`Business-Rules-and-Glossary@66dddbe756fd`、`Android-Agent-API-Contract@0c6d95d07adc`,在线全文回读成功;独立干净 worktree 完成一次镜像同步和一次 `sync --check`。 - APK:6,281,288 bytes,SHA-256 `373bff7b3fe3eaa630c3787f8d488b9834a0aa31814245c78a8c60c54a7a1d9e`;已安装到 `192.168.0.173:41751`,设备回读 `0.9.47 (60)`,无障碍服务启用。 ### Wiki 写入恢复记录 当前 Gitea 更新接口要求 `content_base64`;首次按不兼容的 `content` 字段调用产生了两个空正文 revision。镜像同步立即发现异常,错误临时提交未合入且已删除;随后用现有完整镜像恢复线上全文,再以 `content_base64` 应用 #225 修改。最终在线正文长度、标题、revision 与镜像一致性均已复核,不存在空页遗留。 ### 安全与未验证 - 安装前设备 10 无活动采购/采集任务。 - Server 无代码变化,无需重启。 - 未修改 CG90/CG91 历史数据,未自动发起重试、修改地址、创建订单或付款。 - 请在 Agent 对 CG91 手动点击普通“重试采购”验收:预期仍为 CG91、attempt 增加,不创建 CG92;随后采购执行结果用于 #224 真机验收。 - 工作区既有文档、配置与未跟踪文件未纳入提交。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#225