缺陷:补齐采购规则参数化动作契约,解除 #42 阻塞 #53

Closed
opened 2026-08-20 17:40:32 +08:00 by ila · 4 comments
Owner

原始需求摘要

执行 #42 时发现:已验收的采购规则服务端契约只能保存 actions[].type,但 #42 已确认的验收要求是按钮同义词、等待时间和滑动次数可以只改规则、不重新发布 APK。当前严格 JSON 校验会拒绝这些参数,Android 因而无法从合法的任务规则快照取得它们。

提出时间:2026-08-20。来源:#42 实施前契约核对。

类型与范围

  • 类型:共享 API 契约缺陷
  • 交付单元:server、共享 API 文档
  • 前置依赖:#33、#34(均已验收)
  • 阻塞:#42
  • 可并行:否;#42 的 Android 解释器必须依赖本单确认后的快照结构
  • 不包含:Android 页面执行、真实 PDD 操作、地址修改、创建订单、支付、Admin 新页面

当前事实与复现证据

  1. server/app/goauto/purchasecontract/contract.go 中 Action 只有 Type string。
  2. 采购规则使用严格解码,未知字段会直接失败。
  3. 因此在规则里加入 selector/文字同义词、等待时间、滑动次数等配置时,服务端无法创建或保存规则。
  4. 若 #42 直接在 APK 内写死这些值,将无法满足规则 A / 规则 B 无需重新发布 APK 的验收条件,也会重现 cmautobuy 每遇到页面变化就修改客户端的问题。

建议方案(实施前需确认)

在既有 pddPurchase schema v1 中补齐受类型约束且有边界的动作参数,不引入任意脚本:

  • 文字匹配:支持动作所需的候选文字/同义词列表;仍要求唯一、精确命中,歧义必须失败。
  • 等待:支持动作后的等待时间,并设置服务端允许的最小/最大值。
  • 滑动:只允许已声明方向与有上限的次数/时长;不允许无限循环。
  • 未配置参数时使用明确默认值,保持已保存的仅含 type 的规则兼容。
  • 每类 action 单独校验允许参数,未知参数继续拒绝。
  • 继续在服务端拒绝改地址、创建订单、读取订单结果和任何付款相关 action。
  • 任务创建后保存完整规则快照;后续规则 B 的修改不能改变已有任务的规则 A 快照。

最终字段名、取值边界和各 action 参数矩阵在本单实施前写入 docs/08-agent-api-contract.md 对应 Wiki 页面并确认;Android #42 只消费该已确认契约。

验收标准

  • 规则 A 可合法保存按钮候选文字、有限等待和有限滑动配置。
  • 规则 B 只修改上述参数即可通过服务端校验,无需 APK 变化。
  • 未知字段、越界等待/滑动、含糊或空候选明确拒绝。
  • 旧的仅含 actions[].type 的采购规则仍可读取并按明确默认值解释。
  • 演练模式继续拒绝地址修改、创建订单、订单结果读取及全部付款动作。
  • 服务端单元测试覆盖合法、越界、未知字段、危险动作和旧规则兼容。
  • Wiki API 契约先更新并读取确认,再导出核心 docs/ 镜像。

风险

规则参数过宽会变成远程脚本执行能力;参数过窄则仍会迫使 APK 随页面文案变化发布。本单只允许可审计、可限界的结构化能力,并保持危险动作黑名单。

文档影响

  • Wiki:Agent API Contract / Delivery Issues
  • Git 镜像:docs/08-agent-api-contract.md、docs/09-delivery-issues.md
## 原始需求摘要 执行 #42 时发现:已验收的采购规则服务端契约只能保存 `actions[].type`,但 #42 已确认的验收要求是按钮同义词、等待时间和滑动次数可以只改规则、不重新发布 APK。当前严格 JSON 校验会拒绝这些参数,Android 因而无法从合法的任务规则快照取得它们。 提出时间:2026-08-20。来源:#42 实施前契约核对。 ## 类型与范围 - 类型:共享 API 契约缺陷 - 交付单元:`server`、共享 API 文档 - 前置依赖:#33、#34(均已验收) - 阻塞:#42 - 可并行:否;#42 的 Android 解释器必须依赖本单确认后的快照结构 - 不包含:Android 页面执行、真实 PDD 操作、地址修改、创建订单、支付、Admin 新页面 ## 当前事实与复现证据 1. `server/app/goauto/purchasecontract/contract.go` 中 `Action` 只有 `Type string`。 2. 采购规则使用严格解码,未知字段会直接失败。 3. 因此在规则里加入 selector/文字同义词、等待时间、滑动次数等配置时,服务端无法创建或保存规则。 4. 若 #42 直接在 APK 内写死这些值,将无法满足规则 A / 规则 B 无需重新发布 APK 的验收条件,也会重现 cmautobuy 每遇到页面变化就修改客户端的问题。 ## 建议方案(实施前需确认) 在既有 `pddPurchase` schema v1 中补齐**受类型约束且有边界**的动作参数,不引入任意脚本: - 文字匹配:支持动作所需的候选文字/同义词列表;仍要求唯一、精确命中,歧义必须失败。 - 等待:支持动作后的等待时间,并设置服务端允许的最小/最大值。 - 滑动:只允许已声明方向与有上限的次数/时长;不允许无限循环。 - 未配置参数时使用明确默认值,保持已保存的仅含 `type` 的规则兼容。 - 每类 action 单独校验允许参数,未知参数继续拒绝。 - 继续在服务端拒绝改地址、创建订单、读取订单结果和任何付款相关 action。 - 任务创建后保存完整规则快照;后续规则 B 的修改不能改变已有任务的规则 A 快照。 最终字段名、取值边界和各 action 参数矩阵在本单实施前写入 `docs/08-agent-api-contract.md` 对应 Wiki 页面并确认;Android #42 只消费该已确认契约。 ## 验收标准 - [ ] 规则 A 可合法保存按钮候选文字、有限等待和有限滑动配置。 - [ ] 规则 B 只修改上述参数即可通过服务端校验,无需 APK 变化。 - [ ] 未知字段、越界等待/滑动、含糊或空候选明确拒绝。 - [ ] 旧的仅含 `actions[].type` 的采购规则仍可读取并按明确默认值解释。 - [ ] 演练模式继续拒绝地址修改、创建订单、订单结果读取及全部付款动作。 - [ ] 服务端单元测试覆盖合法、越界、未知字段、危险动作和旧规则兼容。 - [ ] Wiki API 契约先更新并读取确认,再导出核心 `docs/` 镜像。 ## 风险 规则参数过宽会变成远程脚本执行能力;参数过窄则仍会迫使 APK 随页面文案变化发布。本单只允许可审计、可限界的结构化能力,并保持危险动作黑名单。 ## 文档影响 - Wiki:Agent API Contract / Delivery Issues - Git 镜像:`docs/08-agent-api-contract.md`、`docs/09-delivery-issues.md`
Author
Owner

用户于 2026-08-20 回复“通过验收 #53”。核对后确认本单尚无实现提交、测试证据或 API/Wiki 文档更新,当前仓库最新提交仍为 #34,因此不能按完成状态关闭。将本次回复记录为对本单建议方案与验收标准的确认;工单保持打开,下一步需执行 #53,完成实现和验证后再等待功能验收。

用户于 2026-08-20 回复“通过验收 #53”。核对后确认本单尚无实现提交、测试证据或 API/Wiki 文档更新,当前仓库最新提交仍为 #34,因此不能按完成状态关闭。将本次回复记录为对本单建议方案与验收标准的确认;工单保持打开,下一步需执行 #53,完成实现和验证后再等待功能验收。
Author
Owner

实施完成,等待验收

最终方案:

  • 安全 action 增加受限 textAliases、waitAfterMs;仅 openProduct / openSpecPanel / selectSpec / probeSpecs 允许有限 swipeAfter。
  • 服务端校验精确候选、动作参数矩阵和全部数值边界,拒绝未知字段、空/重复候选及地址、下单、支付相关候选文字。
  • 旧 type-only 规则保持兼容;参数化规则可创建演练任务且完整原始 JSON 原样固化到任务快照。
  • 正式高风险动作暂不支持本单参数;演练仍禁止改地址、创建订单和核单,任何模式永远禁止支付。

验证:

  • go test ./...(server/):通过。
  • python dev_scripts/harness.py check --strict:通过。
  • python dev_scripts/harness.py sync --check:通过。
  • Wiki Android-Agent-API-Contract revision:8b81c816989f9063a6927939a3391c103ddc08ad。
  • Wiki Delivery-Issues revision:f1f993a6ed4aa4dc53e1ad7943ac60bca6db790e。

提交:afeb2723ea0acfb03f2ab31b7b12f491602f4a9b(fix(#53): parameterize purchase rule actions)。

任务归档:https://git.ilapage.cn/OPC/goauto/wiki/Task-53-%E8%A1%A5%E9%BD%90%E9%87%87%E8%B4%AD%E8%A7%84%E5%88%99%E5%8F%82%E6%95%B0%E5%8C%96%E5%8A%A8%E4%BD%9C%E5%A5%91%E7%BA%A6.-
归档 revision:778012fcf4d14ba0888dfe75c94dd5bdfd666fc4。

未验证范围:本单没有修改 Android,因此未构建 APK、未做真机/PDD 操作;Android 消费该契约由 #42 实现和验收。工单保持打开,等待用户验收。

## 实施完成,等待验收 最终方案: - 安全 action 增加受限 `textAliases`、`waitAfterMs`;仅 `openProduct` / `openSpecPanel` / `selectSpec` / `probeSpecs` 允许有限 `swipeAfter`。 - 服务端校验精确候选、动作参数矩阵和全部数值边界,拒绝未知字段、空/重复候选及地址、下单、支付相关候选文字。 - 旧 type-only 规则保持兼容;参数化规则可创建演练任务且完整原始 JSON 原样固化到任务快照。 - 正式高风险动作暂不支持本单参数;演练仍禁止改地址、创建订单和核单,任何模式永远禁止支付。 验证: - `go test ./...`(`server/`):通过。 - `python dev_scripts/harness.py check --strict`:通过。 - `python dev_scripts/harness.py sync --check`:通过。 - Wiki `Android-Agent-API-Contract` revision:`8b81c816989f9063a6927939a3391c103ddc08ad`。 - Wiki `Delivery-Issues` revision:`f1f993a6ed4aa4dc53e1ad7943ac60bca6db790e`。 提交:`afeb2723ea0acfb03f2ab31b7b12f491602f4a9b`(`fix(#53): parameterize purchase rule actions`)。 任务归档:https://git.ilapage.cn/OPC/goauto/wiki/Task-53-%E8%A1%A5%E9%BD%90%E9%87%87%E8%B4%AD%E8%A7%84%E5%88%99%E5%8F%82%E6%95%B0%E5%8C%96%E5%8A%A8%E4%BD%9C%E5%A5%91%E7%BA%A6.- 归档 revision:`778012fcf4d14ba0888dfe75c94dd5bdfd666fc4`。 未验证范围:本单没有修改 Android,因此未构建 APK、未做真机/PDD 操作;Android 消费该契约由 #42 实现和验收。工单保持打开,等待用户验收。
Author
Owner

补充:提交 afeb2723ea0acfb03f2ab31b7b12f491602f4a9b 已推送到 origin/main,远端推送前检查为纯快进。

补充:提交 `afeb2723ea0acfb03f2ab31b7b12f491602f4a9b` 已推送到 `origin/main`,远端推送前检查为纯快进。
Author
Owner

用户于 2026-08-20 明确验收通过。任务归档已更新并在线回读,revision 05a5fd3cde4a58d774a3eef9bc3d7c1034238893;核心 Delivery Issues 镜像提交 997f4e7463559d48269d4c4914422f9341800098 已推送。关闭本单,#42 参数契约阻塞解除。

用户于 2026-08-20 明确验收通过。任务归档已更新并在线回读,revision `05a5fd3cde4a58d774a3eef9bc3d7c1034238893`;核心 Delivery Issues 镜像提交 `997f4e7463559d48269d4c4914422f9341800098` 已推送。关闭本单,#42 参数契约阻塞解除。
ila closed this issue 2026-08-20 18:04:57 +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#53