fix(purchase): 真机探测后复用仍有效的已确认规格映射 #223

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

原始需求摘要

来源:用户于 2026-09-05 反馈,本地服务中 SYB 订单 2609044MMAVCFD 已把目标颜色“薑黃色”人工确认映射到 PDD 商品 998477642606 的“黄色”,正式采购仍失败并提示“没有找到可采购的 PDD 颜色或尺码”。用户确认按分析方案建单实施。

当前事实与根因

  • 依赖 #215 已实现:每个新建 SYB 正式采购必须先执行当次 PDD 真机规格探测,历史映射不得绕过探测。
  • CG83/CG85 的探测结果均包含颜色“黄色”和尺码“5XL”,候选完整;失败消息并非候选为空。
  • 蝦皮商品档案存在已确认映射:薑黃色 → 黄色(manual)、5XL → XXXXXL(ai_match)。PDD 档案中对应尺码原文为 XXXXXL,Android 真机探测按既有规范化输出 5XL。
  • 当前 live 创建路径故意把任务映射清空为 unresolved;resolveProbedSpecs 只以 SYB 原始目标与当次候选重新执行确定性/AI 匹配,没有把已确认商品映射作为“经当次候选重新验证后可复用”的决策输入。因此颜色无法确定性匹配,Provider 无有效结果时任务失败。
  • 当前通用失败文案把“候选缺失”和“候选完整但无法决策”混为一类,具有误导性。

目标

保留 #215 强制真机探测安全边界;探测完成后,对每个目标规格角色优先复用仍能映射到当次候选的已确认商品映射,未解决角色再按确定性优先、必要时 AI 的顺序处理。任务最终只能固化当次真机候选中的精确值。

非目标

  • 不跳过真机规格探测。
  • 不允许 Agent 本地猜测或选择相近规格。
  • 不自动改写蝦皮商品的长期映射。
  • 不修改地址、不创建订单、不执行付款。
  • 不在本单调整 Android 规格面板识别(CG84 的 PURCHASE_SPEC_PANEL_EVIDENCE_NOT_MATCHED 另属相邻缺陷)。

前置依赖与并行性

  • 依赖 #215 已实现的双阶段采购状态机与探测结果契约。
  • 可与 Android 面板识别缺陷并行;本单只修改 Server 规格决策及共享契约/长期规则(若契约语义变化)。

实施方案

  1. 创建任务时把对应目标的已确认颜色/尺码映射冻结为待探测指导快照;resolveProbedSpecs 只读取该不可变快照,不读取可能已变化的商品映射,也不得跳过当次探测。
  2. 按规格角色分别解析:
    • 无对应 SYB 目标时视为无需解析;
    • 已确认映射经角色规范化后可唯一对应当次候选时,固化当次候选原文;
    • 否则对未解决角色执行既有确定性匹配;
    • 仍未解决时才把未解决角色及封闭候选交给 AI。
  3. 任一最终值必须逐字属于当次探测候选;陈旧、歧义或集合外映射不得复用。
  4. 决策快照记录每个角色的来源及当次候选结果;任务级 spec_source 保持现有允许值并使用可审计的汇总规则,不新增数据库枚举。
  5. 区分失败原因:候选缺失继续使用“没有找到可采购的 PDD 颜色或尺码”;候选完整但无法确定映射使用“已采集到当前规格,但未能确定颜色或尺码映射”。

验收标准

  • 薑黃色 → 黄色 的 confirmed manual 映射在当次颜色候选包含“黄色”时被安全复用。
  • 历史尺码 XXXXXL 在现有规范化规则下不等于当次候选 5XL,不得直接复用;目标 5XL 应由当次候选确定性匹配并最终固化为 5XL。
  • 已确认映射不在当次候选、规范化后歧义或角色不符时不复用。
  • 已解决角色不重复交给 AI;仅未解决角色执行确定性/AI 匹配。
  • Provider 无结果且当次候选完整时返回准确的新失败文案。
  • 原有探测幂等、候选集合校验、失败收敛和第二阶段精确选择测试继续通过。
  • 不执行真机正式采购、不创建订单、不付款。

验证

  • Server:采购生命周期、批量预检、确定性/AI 匹配及新增混合来源测试。
  • 运行受影响 Go 测试和构建;必要时运行仓库 Server 验证。
  • 真机只读 spec_probe 与后续正式采购均待用户另行授权/验收。

风险与安全边界

采购状态机属于高风险范围。本单只实现并自动测试规格决策,不触发 Agent 领取,不执行地址或订单动作。历史映射必须经过当次候选重新验证,严禁直接信任或绕过探测。

设计证据

后端状态与决策流程变更,不需要 UI 原型;以上架构/状态方案经用户于 2026-09-05 以“建工单,做”确认。

文档影响

该变更细化 #215 的长期规格决策规则,需要更新 Gitea Wiki 的业务规则及 Agent API 契约,在线回读 revision 后同步本地镜像,并执行一次 sync 与一次 sync --check。

任务记录

  • 默认不创建任务快照。
  • 完成后提交、推送并回写验证和提交哈希,状态停在待验收。
## 原始需求摘要 来源:用户于 2026-09-05 反馈,本地服务中 SYB 订单 `2609044MMAVCFD` 已把目标颜色“薑黃色”人工确认映射到 PDD 商品 `998477642606` 的“黄色”,正式采购仍失败并提示“没有找到可采购的 PDD 颜色或尺码”。用户确认按分析方案建单实施。 ## 当前事实与根因 - 依赖 #215 已实现:每个新建 SYB 正式采购必须先执行当次 PDD 真机规格探测,历史映射不得绕过探测。 - CG83/CG85 的探测结果均包含颜色“黄色”和尺码“5XL”,候选完整;失败消息并非候选为空。 - 蝦皮商品档案存在已确认映射:`薑黃色 → 黄色`(manual)、`5XL → XXXXXL`(ai_match)。PDD 档案中对应尺码原文为 `XXXXXL`,Android 真机探测按既有规范化输出 `5XL`。 - 当前 live 创建路径故意把任务映射清空为 `unresolved`;`resolveProbedSpecs` 只以 SYB 原始目标与当次候选重新执行确定性/AI 匹配,没有把已确认商品映射作为“经当次候选重新验证后可复用”的决策输入。因此颜色无法确定性匹配,Provider 无有效结果时任务失败。 - 当前通用失败文案把“候选缺失”和“候选完整但无法决策”混为一类,具有误导性。 ## 目标 保留 #215 强制真机探测安全边界;探测完成后,对每个目标规格角色优先复用仍能映射到当次候选的已确认商品映射,未解决角色再按确定性优先、必要时 AI 的顺序处理。任务最终只能固化当次真机候选中的精确值。 ## 非目标 - 不跳过真机规格探测。 - 不允许 Agent 本地猜测或选择相近规格。 - 不自动改写蝦皮商品的长期映射。 - 不修改地址、不创建订单、不执行付款。 - 不在本单调整 Android 规格面板识别(CG84 的 `PURCHASE_SPEC_PANEL_EVIDENCE_NOT_MATCHED` 另属相邻缺陷)。 ## 前置依赖与并行性 - 依赖 #215 已实现的双阶段采购状态机与探测结果契约。 - 可与 Android 面板识别缺陷并行;本单只修改 Server 规格决策及共享契约/长期规则(若契约语义变化)。 ## 实施方案 1. 创建任务时把对应目标的已确认颜色/尺码映射冻结为待探测指导快照;`resolveProbedSpecs` 只读取该不可变快照,不读取可能已变化的商品映射,也不得跳过当次探测。 2. 按规格角色分别解析: - 无对应 SYB 目标时视为无需解析; - 已确认映射经角色规范化后可唯一对应当次候选时,固化当次候选原文; - 否则对未解决角色执行既有确定性匹配; - 仍未解决时才把未解决角色及封闭候选交给 AI。 3. 任一最终值必须逐字属于当次探测候选;陈旧、歧义或集合外映射不得复用。 4. 决策快照记录每个角色的来源及当次候选结果;任务级 `spec_source` 保持现有允许值并使用可审计的汇总规则,不新增数据库枚举。 5. 区分失败原因:候选缺失继续使用“没有找到可采购的 PDD 颜色或尺码”;候选完整但无法确定映射使用“已采集到当前规格,但未能确定颜色或尺码映射”。 ## 验收标准 - `薑黃色 → 黄色` 的 confirmed manual 映射在当次颜色候选包含“黄色”时被安全复用。 - 历史尺码 `XXXXXL` 在现有规范化规则下不等于当次候选 `5XL`,不得直接复用;目标 `5XL` 应由当次候选确定性匹配并最终固化为 `5XL`。 - 已确认映射不在当次候选、规范化后歧义或角色不符时不复用。 - 已解决角色不重复交给 AI;仅未解决角色执行确定性/AI 匹配。 - Provider 无结果且当次候选完整时返回准确的新失败文案。 - 原有探测幂等、候选集合校验、失败收敛和第二阶段精确选择测试继续通过。 - 不执行真机正式采购、不创建订单、不付款。 ## 验证 - Server:采购生命周期、批量预检、确定性/AI 匹配及新增混合来源测试。 - 运行受影响 Go 测试和构建;必要时运行仓库 Server 验证。 - 真机只读 `spec_probe` 与后续正式采购均待用户另行授权/验收。 ## 风险与安全边界 采购状态机属于高风险范围。本单只实现并自动测试规格决策,不触发 Agent 领取,不执行地址或订单动作。历史映射必须经过当次候选重新验证,严禁直接信任或绕过探测。 ## 设计证据 后端状态与决策流程变更,不需要 UI 原型;以上架构/状态方案经用户于 2026-09-05 以“建工单,做”确认。 ## 文档影响 该变更细化 #215 的长期规格决策规则,需要更新 Gitea Wiki 的业务规则及 Agent API 契约,在线回读 revision 后同步本地镜像,并执行一次 `sync` 与一次 `sync --check`。 ## 任务记录 - 默认不创建任务快照。 - 完成后提交、推送并回写验证和提交哈希,状态停在待验收。
Author
Owner

实施核对修正:现有 Agent/Server 规格规范化只处理尾价、繁简、空白/全半角/大小写等,不会把 XXXXXL 改写为 5XL。因此 #223 不复用该历史尺码标签;CG85 场景只复用经当次候选验证仍有效的颜色 黄色,尺码由目标 5XL 与当次候选 5XL 确定性匹配。已确认映射指导信息在任务创建时冻结,避免探测期间的商品映射变化影响同一任务。

实施核对修正:现有 Agent/Server 规格规范化只处理尾价、繁简、空白/全半角/大小写等,不会把 `XXXXXL` 改写为 `5XL`。因此 #223 不复用该历史尺码标签;CG85 场景只复用经当次候选验证仍有效的颜色 `黄色`,尺码由目标 `5XL` 与当次候选 `5XL` 确定性匹配。已确认映射指导信息在任务创建时冻结,避免探测期间的商品映射变化影响同一任务。
Author
Owner

实施完成,待验收

提交:d84f6dd(分支 fix/223-probed-confirmed-mapping,已推送)

最终实现

  • 新建 SYB 正式采购任务仍固定先进入 spec_probe;创建时只把对应目标的 confirmed 商品映射冻结为不可变指导快照,mappedColor / mappedSize 仍为空。
  • 当次探测完成后按角色处理:先验证冻结映射能否规范化后唯一对应当次候选;不匹配的角色再做确定性匹配;仍未解决的角色才交给 AI。
  • 已解决角色不发送给 AI;最终任务规格始终固化为当次真机候选原文,并再次执行集合校验。
  • roleSources 分角色记录 manual_mapping / exact_match / ai_match,现有任务级 specSource 枚举不变,无数据库迁移。
  • 候选完整但无法匹配时改为“已采集到当前规格,但未能确定颜色或尺码映射”;候选缺失仍保留原提示。
  • CG85 对应场景:颜色复用 薑黃色 → 黄色;历史 XXXXXL 不与当次 5XL 冒充等价,尺码由目标和当次候选确定性得到 5XL;无需调用 AI。

验证

  • go test ./app/goauto/purchase ./app/goauto/aimatching:通过。
  • go test ./app/goauto/...:通过。
  • go build ./...:通过。
  • python dev_scripts/harness.py check --strict:通过。
  • python dev_scripts/harness.py sync:通过。
  • python dev_scripts/harness.py sync --check:通过。
  • Wiki:Business-Rules-and-Glossary@21ad1681d12a、Android-Agent-API-Contract@e5a443e16e28,均已在线回读并同步镜像。同步同时带入其他核心页面已经在线存在的新 revision,仅更新生成镜像,不属于 #223 产品行为改动。

未验证与安全边界

  • 未重启当前本地 Admin/API,当前运行实例尚未加载该提交。
  • 未领取采购任务、未修改地址、未创建订单、未付款。
  • 真机正式采购验证需在代码合入当前运行分支并重启 API 后,由用户另行触发;工单保持待验收。
## 实施完成,待验收 提交:`d84f6dd`(分支 `fix/223-probed-confirmed-mapping`,已推送) ### 最终实现 - 新建 SYB 正式采购任务仍固定先进入 `spec_probe`;创建时只把对应目标的 confirmed 商品映射冻结为不可变指导快照,`mappedColor` / `mappedSize` 仍为空。 - 当次探测完成后按角色处理:先验证冻结映射能否规范化后唯一对应当次候选;不匹配的角色再做确定性匹配;仍未解决的角色才交给 AI。 - 已解决角色不发送给 AI;最终任务规格始终固化为当次真机候选原文,并再次执行集合校验。 - `roleSources` 分角色记录 `manual_mapping` / `exact_match` / `ai_match`,现有任务级 `specSource` 枚举不变,无数据库迁移。 - 候选完整但无法匹配时改为“已采集到当前规格,但未能确定颜色或尺码映射”;候选缺失仍保留原提示。 - CG85 对应场景:颜色复用 `薑黃色 → 黄色`;历史 `XXXXXL` 不与当次 `5XL` 冒充等价,尺码由目标和当次候选确定性得到 `5XL`;无需调用 AI。 ### 验证 - `go test ./app/goauto/purchase ./app/goauto/aimatching`:通过。 - `go test ./app/goauto/...`:通过。 - `go build ./...`:通过。 - `python dev_scripts/harness.py check --strict`:通过。 - `python dev_scripts/harness.py sync`:通过。 - `python dev_scripts/harness.py sync --check`:通过。 - Wiki:`Business-Rules-and-Glossary@21ad1681d12a`、`Android-Agent-API-Contract@e5a443e16e28`,均已在线回读并同步镜像。同步同时带入其他核心页面已经在线存在的新 revision,仅更新生成镜像,不属于 #223 产品行为改动。 ### 未验证与安全边界 - 未重启当前本地 Admin/API,当前运行实例尚未加载该提交。 - 未领取采购任务、未修改地址、未创建订单、未付款。 - 真机正式采购验证需在代码合入当前运行分支并重启 API 后,由用户另行触发;工单保持待验收。
Author
Owner

本地运行验证更新:用户授权后已将 d84f6dd 快进合入 D:\OPC\goauto 当前运行分支,并在确认无 running / order_submit_started / spec_probe_pending 采购任务及无 running 采集任务后,仅重启 goauto-admin-api。Supervisor 状态 Running,启动日志显示 JobCore start success;http://127.0.0.1:8010/ 与 Swagger 均返回 HTTP 200。Web 未重启,无数据库迁移,未自动创建或重试采购任务。CG87 保留失败历史,下一步由用户从 CG87 发起重试生成新任务验收。

本地运行验证更新:用户授权后已将 `d84f6dd` 快进合入 `D:\OPC\goauto` 当前运行分支,并在确认无 `running` / `order_submit_started` / `spec_probe_pending` 采购任务及无 running 采集任务后,仅重启 `goauto-admin-api`。Supervisor 状态 Running,启动日志显示 JobCore start success;`http://127.0.0.1:8010/` 与 Swagger 均返回 HTTP 200。Web 未重启,无数据库迁移,未自动创建或重试采购任务。CG87 保留失败历史,下一步由用户从 CG87 发起重试生成新任务验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#223