AGENTS.md
cc326eb
purchase/retry.go:143
AgentRetry
BatchRetry
retry.go:67-69
TaskHistoryFragment.kt:82
PurchaseRetryPolicy.showsAction
status == "failed"
TaskHistoryFragment.kt:81
lifecycle.go:182
PurchaseTaskAttempt
RuleSnapshotHash
RuleSnapshot
batch.go:284
service.go:284
ensureCapabilities(...)
lifecycle.go:49/99/174/545
RequiredCapabilitiesJSON
task/lifecycle_service.go:27-37
Reset
ResetForDevice
reset
failed
order_submit_started
RuleType
RuleSchemaVersion
ensureCapabilities
requiredCapabilities
pending
ErrorCode
ErrorMessage
Mapped*
Target*
go test ./app/goauto/purchase/... ./app/goauto/...
cd android && .\gradlew.bat :app:testDebugUnitTest :app:assembleDebug
TaskHistoryFragment.kt
Business-Rules-and-Glossary
Android-Agent-API-Contract
sync
sync --check
待实施。
已按 #157 实施采购失败任务“就地重试”,提交并推送 main。
main
POST /api/agent/v1/purchase-tasks/{taskId}/reset
purchase_task.id
DefaultLiveRule()
requestId
order_created
order_result_unknown
PURCHASE_RETRY_UNSAFE
/reset
/retry
按工单既定门禁复用现有采购详情按钮、确认框、结果卡片和 48dp 按钮规范;未新增页面、组件或导航。文案已明确区分:
go test ./app/goauto/purchase/...
go test ./...
.\scripts\verify.ps1 -Component server
.\gradlew.bat :app:testDebugUnitTest :app:assembleDebug
python dev_scripts/harness.py check --strict
python dev_scripts/harness.py sync
python dev_scripts/harness.py sync --check
git diff --check
新增服务端测试覆盖:
既有 AgentRetry、BatchRetry、替换后继续采购、采集重置相关回归随全量测试通过。
1e9bf2da1957b31236921cbf572fa8a61d78e275
cbbcc9accc4b1de3bd2b87cb816a204d7acf6e99
16948a9 feat(#157): retry purchase tasks in place
origin/main
未执行真机 PKG110 的真实采购重跑:点击重试后 Agent 会正常领取任务并可能进入创建 PDD 待付款订单流程,工单与项目规则要求该步骤另行取得人工授权;本次未创建订单、未修改真实地址、未执行支付。
工单保持打开,等待用户验收或授权真机验证。
用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。
No dependencies set.
The note is not visible to the blocked user.
所属与来源
AGENTS.md「Gitea 交互与工单最小读取」记录回退原因。当前事实(提交
cc326eb复核)purchase/retry.go:143的AgentRetry注释为「creates one safe replacement task」,内部委托BatchRetry;retry.go:67-69明确「creates new pending purchase tasks from failed task identities. The failed rows remain immutable history」。TaskHistoryFragment.kt:82)仍为「系统会保留原任务,并创建一个新的采购任务」。PurchaseRetryPolicy.showsAction要求status == "failed"(TaskHistoryFragment.kt:81)——本工单不改变该显示条件。lifecycle.go:182创建PurchaseTaskAttempt时写入RuleSnapshotHash。因此即使任务上的RuleSnapshot被更新,「历次尝试各自使用了哪一版规则」仍可从 attempt 追溯。batch.go:284与service.go:284均调用ensureCapabilities(...);lifecycle.go:49/99/174/545在调度与执行环节读取RequiredCapabilitiesJSON。task/lifecycle_service.go:27-37的Reset(Admin)与ResetForDevice(Agent)共用同一内部reset,Agent 入口额外校验设备在线与任务归属;AGENTS.md第 1 节已将「重置采集任务保留快照、清空旧结果后重新进入 pending」定为业务规则。最新提交cc326eb进一步实现了采集失败任务按 attempt 复用。目标
非目标
AgentRetry/BatchRetry的既有实现与语义——它们继续服务于「继续采购」与 Admin 的批量重试。实施方案
服务端:新增就地重试
Reset/ResetForDevice:Admin 与 Agent 共用同一内部实现,Agent 入口额外校验设备在线与任务归属(任务不属于该设备时按「任务不存在」处理)。failed;order_submit_started及其之后的任何状态一律拒绝。PDD 侧可能已生成订单,重跑会重复下单,且该事实采购员在 Agent 上无法看到。此为硬性拦截,提示走既有的「授权重新采购」流程;RuleSnapshot、RuleType、RuleSchemaVersion、RequiredCapabilitiesJSON;ensureCapabilities,新规则的requiredCapabilities可能与旧版不同,不校验会把设备不支持的规则下发下去,跑到中途才失败。校验不通过即拒绝重试并给出可读原因;pending,清空租约与运行守卫,清空ErrorCode/ErrorMessage;Agent
安全边界
RuleSnapshotHash保留,不因更新任务快照而丢失审计。验收标准
failed回到pending并可被重新执行。RuleSnapshot更新为当前生效规则;RuleType、RuleSchemaVersion、RequiredCapabilitiesJSON同步更新。Mapped*、Target*、价格上下限等快照逐字段比对无变化。order_submit_started及其之后状态的任务重试被拒绝,提示走「授权重新采购」。AgentRetry/BatchRetry的既有行为未被改动,Admin 批量重试与 #132 的继续采购不受影响。验证方式
go test ./app/goauto/purchase/... ./app/goauto/...cd android && .\gradlew.bat :app:testDebugUnitTest :app:assembleDebug依赖、并行与风险
TaskHistoryFragment.kt的采购任务详情,不建议同时进行。RuleSnapshotHash保留历次版本(事实 4)。文档影响
Business-Rules-and-Glossary:采购任务重试的语义(就地重跑、刷新规则、不限次数),以及与「继续采购」「批量重试」的区别。Android-Agent-API-Contract:新增就地重试接口。sync与一轮sync --check,把页面与 revision 写回本工单。状态
待实施。
实施完成,待验收
已按 #157 实施采购失败任务“就地重试”,提交并推送
main。实现结果
POST /api/agent/v1/purchase-tasks/{taskId}/reset。purchase_task.id,恢复为pending,不创建新采购任务。RuleSnapshotRuleTypeRuleSchemaVersionRequiredCapabilitiesJSONDefaultLiveRule(),没有提前引入数据库表、迁移或第二事实源。pendingattempt,记录规则哈希;正常 Start 复用该 attempt,不重复创建执行记录。requestId通过确定性 attempt ID 幂等;相同请求重放不重复修改任务或增加 attempt。order_submit_started、order_created、order_result_unknown,以及存在不可逆时间、订单提交请求、PDD 订单号或下单时间的任务全部返回PURCHASE_RETRY_UNSAFE,提示走“授权重新采购”。/reset,成功页显示任务号不变和下一 attempt 序号。/retry,继续创建新任务;AgentRetry、BatchRetry与 Admin 批量重试实现和语义均未改动。设计证据
按工单既定门禁复用现有采购详情按钮、确认框、结果卡片和 48dp 按钮规范;未新增页面、组件或导航。文案已明确区分:
自动化验证
go test ./app/goauto/purchase/...:通过。go test ./...:通过。.\scripts\verify.ps1 -Component server:Go 全量测试与 build 通过。.\gradlew.bat :app:testDebugUnitTest :app:assembleDebug:通过,Debug APK 构建成功。python dev_scripts/harness.py check --strict:通过。python dev_scripts/harness.py sync:已执行一次。python dev_scripts/harness.py sync --check:已执行一次并通过。git diff --check/ staged diff check:通过。新增服务端测试覆盖:
既有 AgentRetry、BatchRetry、替换后继续采购、采集重置相关回归随全量测试通过。
Wiki 与提交
Business-Rules-and-Glossaryrevision:1e9bf2da1957b31236921cbf572fa8a61d78e275Android-Agent-API-Contractrevision:cbbcc9accc4b1de3bd2b87cb816a204d7acf6e9916948a9 feat(#157): retry purchase tasks in placeorigin/main未验证边界
未执行真机 PKG110 的真实采购重跑:点击重试后 Agent 会正常领取任务并可能进入创建 PDD 待付款订单流程,工单与项目规则要求该步骤另行取得人工授权;本次未创建订单、未修改真实地址、未执行支付。
工单保持打开,等待用户验收或授权真机验证。
用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。