修复 PDD 颜色卡价格污染导致颜色分类被拒绝 #169

Open
opened 2026-08-31 14:54:50 +08:00 by ila · 2 comments
Owner

原始需求摘要

  • 来源:用户于 2026-08-31 要求按照任务 111 的分析建议建工单并实施。
  • 目的:修复 PDD 图片颜色卡的可点击节点同时包含颜色名称和价格时,颜色维度被安全校验整体拒绝、任务只能 completed_partial 的缺陷。

当前事实与根因

  • 代码基线:ff0cf99,Agent 0.9.33。
  • 任务 111 已安全完成结果提交,但服务端记录 spec_dimension_invalid:color,仅保留尺码。
  • Agent 本机结构化诊断显示:规格面板成功进入,识别 2 行共 5 个可点击颜色候选,5 张颜色图裁剪成功;不是入口或颜色发现失败。
  • Android 当前只规范化尺码,颜色直接使用可点击节点原文;当前商品页面的颜色卡节点至少一个颜色值混入 ¥/¥ 价格。
  • 服务端按 #160 已确认的安全门禁拒绝包含币种符号的整个颜色维度,并清空相关价格、SKU;其后图片上传因颜色不存在而失败。
  • Gitea MCP 当前会话未提供可调用工具,本工单按仓库规则回退 Gitea API 创建;凭据仅从已忽略的 gitea.env 读取。

目标

  1. 从同一颜色卡范围提取可验证的纯颜色名称,同时保留原安全点击目标。
  2. 对颜色值仅执行有边界的末尾价格清理;无法一一映射时继续明确 completed_partial,不得猜测。
  3. 规范化后的颜色在维度、价格、SKU、图片关联中保持一致。
  4. 覆盖任务 111 对应的父卡可点击、子标题不可点击、父卡文本带价格形态。

非目标

  • 不修改服务端 #160 的规格安全门禁。
  • 不使用 OCR/VLM,不保存控件树或整屏截图。
  • 不重跑或重置任务 111。
  • 不扩展采购、下单或支付行为。

前置依赖与并行性

  • 前置依赖:#160 已实现并保留。
  • 可并行:否;Android 解析、结果关联和回归测试必须作为同一交付单元验证。
  • 子项目影响:Android 生产代码与 Android 单元测试;服务端契约行为不变,仅按需运行现有相关测试。

方案

  • 增加颜色值安全规范化:只允许去除字符串末尾、格式明确的 ¥/¥ + 数字(最多两位小数),保留原始证据。
  • 颜色卡存在纯标题后代时优先使用标题文本作为业务值;点击仍绑定唯一安全的可点击卡/祖先,图片仍限制在同一卡子树。
  • 引入颜色规范化跟踪:空值、清理后重名、同一规范值映射多个原始值或其他歧义时,丢弃整个颜色维度并增加 spec_dimension_invalid:color。
  • 确保颜色键统一流入价格采样、SKU 和颜色图片上传。

设计证据

  • 非 UI、恢复既有采集行为的缺陷,不需要原型。
  • 依据:任务 111 结构化任务结果与 Agent 本地脱敏诊断;未读取或保存原始控件树/整屏截图。

验收标准

  • 图片颜色卡父节点含末尾价格、纯标题子节点不可点击时,可采到纯颜色名称并点击唯一安全目标。
  • 清理后的颜色名称用于价格、SKU 与图片键,结果不再因合法末尾价格触发 spec_dimension_invalid:color。
  • 清理后重名或存在不安全颜色文本时,整个颜色维度保持 completed_partial,不猜测、不生成关联 SKU/图片上传。
  • 既有颜色遍历、尺码规范化、评价页防误入测试通过。
  • Android 单元测试与 Debug APK 构建通过。

风险

  • 过度清理可能改变合法商品颜色名;因此仅处理末尾币种价格并要求唯一映射。
  • 点击目标与业务文本分离后必须保持新鲜节点唯一匹配,避免点击错误卡片。
  • 图片键必须与规范化颜色完全一致,否则服务端仍会拒绝上传。

文档影响

无长期文档影响:共享契约和安全门禁不变,本次仅修复 Android 对既有契约的实现,不更新 Wiki。

## 原始需求摘要 - 来源:用户于 2026-08-31 要求按照任务 111 的分析建议建工单并实施。 - 目的:修复 PDD 图片颜色卡的可点击节点同时包含颜色名称和价格时,颜色维度被安全校验整体拒绝、任务只能 `completed_partial` 的缺陷。 ## 当前事实与根因 - 代码基线:`ff0cf99`,Agent 0.9.33。 - 任务 111 已安全完成结果提交,但服务端记录 `spec_dimension_invalid:color`,仅保留尺码。 - Agent 本机结构化诊断显示:规格面板成功进入,识别 2 行共 5 个可点击颜色候选,5 张颜色图裁剪成功;不是入口或颜色发现失败。 - Android 当前只规范化尺码,颜色直接使用可点击节点原文;当前商品页面的颜色卡节点至少一个颜色值混入 `¥/¥` 价格。 - 服务端按 #160 已确认的安全门禁拒绝包含币种符号的整个颜色维度,并清空相关价格、SKU;其后图片上传因颜色不存在而失败。 - Gitea MCP 当前会话未提供可调用工具,本工单按仓库规则回退 Gitea API 创建;凭据仅从已忽略的 `gitea.env` 读取。 ## 目标 1. 从同一颜色卡范围提取可验证的纯颜色名称,同时保留原安全点击目标。 2. 对颜色值仅执行有边界的末尾价格清理;无法一一映射时继续明确 `completed_partial`,不得猜测。 3. 规范化后的颜色在维度、价格、SKU、图片关联中保持一致。 4. 覆盖任务 111 对应的父卡可点击、子标题不可点击、父卡文本带价格形态。 ## 非目标 - 不修改服务端 #160 的规格安全门禁。 - 不使用 OCR/VLM,不保存控件树或整屏截图。 - 不重跑或重置任务 111。 - 不扩展采购、下单或支付行为。 ## 前置依赖与并行性 - 前置依赖:#160 已实现并保留。 - 可并行:否;Android 解析、结果关联和回归测试必须作为同一交付单元验证。 - 子项目影响:Android 生产代码与 Android 单元测试;服务端契约行为不变,仅按需运行现有相关测试。 ## 方案 - 增加颜色值安全规范化:只允许去除字符串末尾、格式明确的 `¥/¥ + 数字(最多两位小数)`,保留原始证据。 - 颜色卡存在纯标题后代时优先使用标题文本作为业务值;点击仍绑定唯一安全的可点击卡/祖先,图片仍限制在同一卡子树。 - 引入颜色规范化跟踪:空值、清理后重名、同一规范值映射多个原始值或其他歧义时,丢弃整个颜色维度并增加 `spec_dimension_invalid:color`。 - 确保颜色键统一流入价格采样、SKU 和颜色图片上传。 ## 设计证据 - 非 UI、恢复既有采集行为的缺陷,不需要原型。 - 依据:任务 111 结构化任务结果与 Agent 本地脱敏诊断;未读取或保存原始控件树/整屏截图。 ## 验收标准 - [ ] 图片颜色卡父节点含末尾价格、纯标题子节点不可点击时,可采到纯颜色名称并点击唯一安全目标。 - [ ] 清理后的颜色名称用于价格、SKU 与图片键,结果不再因合法末尾价格触发 `spec_dimension_invalid:color`。 - [ ] 清理后重名或存在不安全颜色文本时,整个颜色维度保持 `completed_partial`,不猜测、不生成关联 SKU/图片上传。 - [ ] 既有颜色遍历、尺码规范化、评价页防误入测试通过。 - [ ] Android 单元测试与 Debug APK 构建通过。 ## 风险 - 过度清理可能改变合法商品颜色名;因此仅处理末尾币种价格并要求唯一映射。 - 点击目标与业务文本分离后必须保持新鲜节点唯一匹配,避免点击错误卡片。 - 图片键必须与规范化颜色完全一致,否则服务端仍会拒绝上传。 ## 文档影响 无长期文档影响:共享契约和安全门禁不变,本次仅修复 Android 对既有契约的实现,不更新 Wiki。
Author
Owner

实施完成,待验收

最终方案与差异

  • Agent 颜色规格现在只移除末尾格式明确的 ¥/¥ + 数字(最多两位小数),不会清理中间价格或带“起”等不安全文本。
  • 原始可点击节点及原始文本继续保留用于新鲜节点点击和歧义判断;规范化颜色统一用于维度、颜色价格、SKU 与颜色图片键。
  • 同一规范化颜色对应多个原始文本、清理后为空或仍包含币种符号时,清空整个颜色维度及其价格、SKU、待上传图片,返回 completed_partial 和 spec_dimension_invalid:color,不猜测。
  • 增加任务 111 对应的图片卡父节点带价格、标题子节点不可点击,以及清理后重名/图片不上传回归测试。
  • Agent 版本提升到 0.9.34(versionCode 47)。

验证

  • android\\gradlew.bat testDebugUnitTest --tests "cn.ilapage.goauto.agent.SpecValueNormalizerTest" --tests "cn.ilapage.goauto.agent.PddProductDetailCollectorTest":通过(71 个采集器测试加规范化测试)。
  • android\\gradlew.bat testDebugUnitTest assembleDebug:通过。
  • go test ./app/goauto/task:通过。
  • git diff --check / 暂存差异检查:通过。
  • Debug APK:android/app/build/outputs/apk/debug/app-debug.apk,SHA-256 7BB0B92151C484603E5C58B8E878327798047EB6510C45DCDB999ABF1E0AF10D。

提交与推送

  • 提交:d89a0270b74c037bbc2334e1488b12363c9b0604
  • 已推送到 origin/main,远端 main 已核对为同一提交。

未验证与风险

  • 未安装到真机、未重置或重跑任务 111;真机需要用 0.9.34 新建/重置采集任务验证实际 PDD 页面。
  • 不涉及采购、下单或支付。

文档影响

无长期文档影响:共享契约及 #160 服务端安全门禁未改变,只修复 Android 既有契约实现,因此按规则跳过 Wiki 更新与同步。

Gitea MCP 当前会话未提供可调用工具,本次创建和回写均回退 Gitea API;凭据仅从已忽略的 gitea.env 读取,未写入工单、代码或日志。

## 实施完成,待验收 ### 最终方案与差异 - Agent 颜色规格现在只移除末尾格式明确的 `¥/¥ + 数字(最多两位小数)`,不会清理中间价格或带“起”等不安全文本。 - 原始可点击节点及原始文本继续保留用于新鲜节点点击和歧义判断;规范化颜色统一用于维度、颜色价格、SKU 与颜色图片键。 - 同一规范化颜色对应多个原始文本、清理后为空或仍包含币种符号时,清空整个颜色维度及其价格、SKU、待上传图片,返回 `completed_partial` 和 `spec_dimension_invalid:color`,不猜测。 - 增加任务 111 对应的图片卡父节点带价格、标题子节点不可点击,以及清理后重名/图片不上传回归测试。 - Agent 版本提升到 `0.9.34`(versionCode 47)。 ### 验证 - `android\\gradlew.bat testDebugUnitTest --tests "cn.ilapage.goauto.agent.SpecValueNormalizerTest" --tests "cn.ilapage.goauto.agent.PddProductDetailCollectorTest"`:通过(71 个采集器测试加规范化测试)。 - `android\\gradlew.bat testDebugUnitTest assembleDebug`:通过。 - `go test ./app/goauto/task`:通过。 - `git diff --check` / 暂存差异检查:通过。 - Debug APK:`android/app/build/outputs/apk/debug/app-debug.apk`,SHA-256 `7BB0B92151C484603E5C58B8E878327798047EB6510C45DCDB999ABF1E0AF10D`。 ### 提交与推送 - 提交:`d89a0270b74c037bbc2334e1488b12363c9b0604` - 已推送到 `origin/main`,远端 main 已核对为同一提交。 ### 未验证与风险 - 未安装到真机、未重置或重跑任务 111;真机需要用 0.9.34 新建/重置采集任务验证实际 PDD 页面。 - 不涉及采购、下单或支付。 ### 文档影响 无长期文档影响:共享契约及 #160 服务端安全门禁未改变,只修复 Android 既有契约实现,因此按规则跳过 Wiki 更新与同步。 Gitea MCP 当前会话未提供可调用工具,本次创建和回写均回退 Gitea API;凭据仅从已忽略的 `gitea.env` 读取,未写入工单、代码或日志。
Author
Owner

真机安装补充(2026-08-31):已将 Debug APK 覆盖安装到设备 3B65BD02H7F00000,安装成功;设备回读 ersionName=0.9.34、 ersionCode=47,GoAuto 无障碍服务保持启用,应用进程正常运行。此次未重置或重跑任务 111,颜色采集功能仍待真机任务验收。

真机安装补充(2026-08-31):已将 Debug APK 覆盖安装到设备 3B65BD02H7F00000,安装成功;设备回读 ersionName=0.9.34、 ersionCode=47,GoAuto 无障碍服务保持启用,应用进程正常运行。此次未重置或重跑任务 111,颜色采集功能仍待真机任务验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#169