兼容纵向颜色规格列表并安全选择目标 #264

Open
opened 2026-08-18 11:29:57 +08:00 by ila · 4 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#96
  • 所属 MVP / 版本:#97 真实采购首单闭环(不支付)
  • 阶段:阶段 2/4,提交前采购规格安全选择

要解决什么

cg52 的 PDD 商品规格面板将 14 个颜色款式放在单列纵向滚动容器中,目标颜色位于首屏以下。当前 Client 的颜色选择器把所有可滚动颜色区域都按横向列表处理,只左右滑动;纵向容器没有移动,页面签名稳定后提前结束,误报 PURCHASE_OPTIONS_MISMATCH / 没有找到目标颜色。

复现:领取 cg52,进入 PDD 商品规格面板,首屏只显示前 9 个颜色;目标颜色在纵向列表末尾。Client 两次均停在 purchase_select_options,未写入不可逆标记。

做什么 / 不做什么

  • 做:根据颜色候选坐标分布与滚动容器结构可靠判断横向、纵向或网格布局;按方向有界滑动并逐屏精确查找;方向不可靠时安全停止;补充单元和采购 Adapter 回归测试。
  • 不做:不修改任务原始规格、AI 规格解析、数据库或 Admin 接口;不做模糊选款;不改变价格、数量、不可逆标记、单次提交、核单或禁止付款门禁。

怎么做

  • 修改 client/src/util/select_color_size.py:
    • 增加颜色区域布局方向判断,优先使用同一滚动容器内可点击颜色候选的中心点分布;单列纵向、单行横向和多行网格分别明确处理。
    • 横向布局保留现有先归左再向右扫描;纵向和纵向网格在规格容器内向上滑动内容,逐屏刷新 XML、重新定位区域并查找目标。
    • 每种扫描都限制最大次数并使用页面签名判断边界;不能可靠判断时返回失败,不盲目滑动或点击。
    • 找到目标后继续使用现有精确/繁简等价唯一候选和选中确认,不放宽安全点击范围。
  • 修改 client/test/test_select_color_size.py:增加目标在纵向首屏以下、横向列表兼容、网格判断、方向不明和滚动到底仍不存在等测试。
  • 必要时同步 client/test/test_pdd_u2_purchase_adapter.py 和 docs/client/06-quality-security.md,验证采购入口仍在不可逆前安全失败。

预计不修改数据库和接口。

验收标准

  • 单列纵向颜色列表能先判断为纵向,只执行上下滑动,并选中首屏以下的唯一目标。
  • 单行横向颜色列表继续只执行左右滑动并找到目标。
  • 多行网格根据滚动方向正确扫描,不把纵向容器误当横向列表。
  • 方向无法可靠判断时不滑动、不点击,返回安全失败。
  • 滚动到边界仍没有目标时返回 PURCHASE_OPTIONS_MISMATCH,不选择近似颜色。
  • 繁简等价、重复候选、不可点击候选和选中确认等现有安全规则继续通过。
  • cg52 对应纵向 14 色场景的脱敏模拟测试通过;代码不会在规格选择阶段写入不可逆标记或提交订单。
  • Python 3.10 定向测试、Client 全量回归、语法检查和离屏 UI 冒烟完成。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m py_compile src/util/select_color_size.py test/test_select_color_size.py
C:/Python310/python.exe -m pytest -q test/test_select_color_size.py test/test_pdd_u2_purchase_adapter.py
C:/Python310/python.exe -m pytest -q test
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()"
Remove-Item Env:QT_QPA_PLATFORM

真机验收只在提交订单前观察规格选择;不得点击最终提交或付款。

风险和回退

风险是布局误判导致滑错区域或误选相似规格。方向判断必须基于候选坐标和可信滚动容器,找不到唯一目标或无法确认选中即停止。回退时恢复原颜色选择器并让纵向场景安全失败;不得放宽精确匹配或不可逆门禁。

## 基本信息 - 类型:缺陷 - 父级大工单:#96 - 所属 MVP / 版本:#97 真实采购首单闭环(不支付) - 阶段:阶段 2/4,提交前采购规格安全选择 ## 要解决什么 cg52 的 PDD 商品规格面板将 14 个颜色款式放在单列纵向滚动容器中,目标颜色位于首屏以下。当前 Client 的颜色选择器把所有可滚动颜色区域都按横向列表处理,只左右滑动;纵向容器没有移动,页面签名稳定后提前结束,误报 `PURCHASE_OPTIONS_MISMATCH / 没有找到目标颜色`。 复现:领取 cg52,进入 PDD 商品规格面板,首屏只显示前 9 个颜色;目标颜色在纵向列表末尾。Client 两次均停在 `purchase_select_options`,未写入不可逆标记。 ## 做什么 / 不做什么 - 做:根据颜色候选坐标分布与滚动容器结构可靠判断横向、纵向或网格布局;按方向有界滑动并逐屏精确查找;方向不可靠时安全停止;补充单元和采购 Adapter 回归测试。 - 不做:不修改任务原始规格、AI 规格解析、数据库或 Admin 接口;不做模糊选款;不改变价格、数量、不可逆标记、单次提交、核单或禁止付款门禁。 ## 怎么做 - 修改 `client/src/util/select_color_size.py`: - 增加颜色区域布局方向判断,优先使用同一滚动容器内可点击颜色候选的中心点分布;单列纵向、单行横向和多行网格分别明确处理。 - 横向布局保留现有先归左再向右扫描;纵向和纵向网格在规格容器内向上滑动内容,逐屏刷新 XML、重新定位区域并查找目标。 - 每种扫描都限制最大次数并使用页面签名判断边界;不能可靠判断时返回失败,不盲目滑动或点击。 - 找到目标后继续使用现有精确/繁简等价唯一候选和选中确认,不放宽安全点击范围。 - 修改 `client/test/test_select_color_size.py`:增加目标在纵向首屏以下、横向列表兼容、网格判断、方向不明和滚动到底仍不存在等测试。 - 必要时同步 `client/test/test_pdd_u2_purchase_adapter.py` 和 `docs/client/06-quality-security.md`,验证采购入口仍在不可逆前安全失败。 预计不修改数据库和接口。 ## 验收标准 - [x] 单列纵向颜色列表能先判断为纵向,只执行上下滑动,并选中首屏以下的唯一目标。 - [x] 单行横向颜色列表继续只执行左右滑动并找到目标。 - [x] 多行网格根据滚动方向正确扫描,不把纵向容器误当横向列表。 - [x] 方向无法可靠判断时不滑动、不点击,返回安全失败。 - [x] 滚动到边界仍没有目标时返回 `PURCHASE_OPTIONS_MISMATCH`,不选择近似颜色。 - [x] 繁简等价、重复候选、不可点击候选和选中确认等现有安全规则继续通过。 - [x] cg52 对应纵向 14 色场景的脱敏模拟测试通过;代码不会在规格选择阶段写入不可逆标记或提交订单。 - [x] Python 3.10 定向测试、Client 全量回归、语法检查和离屏 UI 冒烟完成。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m py_compile src/util/select_color_size.py test/test_select_color_size.py C:/Python310/python.exe -m pytest -q test/test_select_color_size.py test/test_pdd_u2_purchase_adapter.py C:/Python310/python.exe -m pytest -q test $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()" Remove-Item Env:QT_QPA_PLATFORM ``` 真机验收只在提交订单前观察规格选择;不得点击最终提交或付款。 ## 风险和回退 风险是布局误判导致滑错区域或误选相似规格。方向判断必须基于候选坐标和可信滚动容器,找不到唯一目标或无法确认选中即停止。回退时恢复原颜色选择器并让纵向场景安全失败;不得放宽精确匹配或不可逆门禁。
ila changed title from ????????????????? to 兼容纵向颜色规格列表并安全选择目标 2026-08-18 11:30:48 +08:00
Author
Owner

实施进度(进行中):

  • 已确认根因并实现颜色滚动方向判断:单列纵向、单行横向及多行网格强证据;方向不明时不滑动、不点击。
  • 纵向列表有界回到起点并向下扫描,横向原有先归左再向右扫描保持不变;目标仍要求精确或唯一繁简等价匹配并确认选中。
  • cg52 当前真机控件树只读判定为 vertical,未执行规格点击或提交订单。
  • 定向测试:74 passed。
  • Client 全量:518 passed,2 failed;失败均为工作区既有 0.1.2 与测试固定期望 0.1.0 不一致,与本工单无关。
  • Python 语法检查、git diff --check、离屏 MainWindow 冒烟通过。

待提交代码和完成归档。

实施进度(进行中): - 已确认根因并实现颜色滚动方向判断:单列纵向、单行横向及多行网格强证据;方向不明时不滑动、不点击。 - 纵向列表有界回到起点并向下扫描,横向原有先归左再向右扫描保持不变;目标仍要求精确或唯一繁简等价匹配并确认选中。 - cg52 当前真机控件树只读判定为 `vertical`,未执行规格点击或提交订单。 - 定向测试:74 passed。 - Client 全量:518 passed,2 failed;失败均为工作区既有 `0.1.2` 与测试固定期望 `0.1.0` 不一致,与本工单无关。 - Python 语法检查、`git diff --check`、离屏 MainWindow 冒烟通过。 待提交代码和完成归档。
Author
Owner

实施完成,状态:待用户验收。

最终实现:

  • 颜色选择器先判断单列纵向、单行横向或多行网格的主要方向;方向证据不足时不滑动、不点击。
  • 纵向列表有界归位并向下扫描,横向原扫描保持;目标仍须精确或唯一繁简等价匹配并确认选中。
  • cg52 当前真机控件树只读判定为 vertical;未自动点击规格、提交订单或付款。

验证:

  • 定向测试:74 passed。
  • 全量测试:518 passed,2 failed;失败是工作区既有版本号 0.1.2 与旧测试期望 0.1.0 不一致,与 #264 无关。
  • 语法、git diff --check、离屏 MainWindow 冒烟通过。

提交:

  • d69c9cc fix: 兼容纵向颜色规格列表 (#264)
  • be73e8d docs: 归档任务 #264

归档:docs/task/264-兼容纵向颜色规格列表并安全选择目标.md

工单保持开启,等待用户用重启后的最新 Client 复验 cg52。

实施完成,状态:待用户验收。 最终实现: - 颜色选择器先判断单列纵向、单行横向或多行网格的主要方向;方向证据不足时不滑动、不点击。 - 纵向列表有界归位并向下扫描,横向原扫描保持;目标仍须精确或唯一繁简等价匹配并确认选中。 - cg52 当前真机控件树只读判定为 `vertical`;未自动点击规格、提交订单或付款。 验证: - 定向测试:74 passed。 - 全量测试:518 passed,2 failed;失败是工作区既有版本号 `0.1.2` 与旧测试期望 `0.1.0` 不一致,与 #264 无关。 - 语法、`git diff --check`、离屏 MainWindow 冒烟通过。 提交: - `d69c9cc` `fix: 兼容纵向颜色规格列表 (#264)` - `be73e8d` `docs: 归档任务 #264` 归档:`docs/task/264-兼容纵向颜色规格列表并安全选择目标.md` 工单保持开启,等待用户用重启后的最新 Client 复验 cg52。
Author
Owner

用户真机验收失败,#264 状态退回:进行中。

新增事实:

  • 最新源码进程启动后,cg52 第 3、4 次仍在 1~2 秒内以 PURCHASE_OPTIONS_MISMATCH 结束;两次 irreversible_action_at 均为空。
  • 当前真实首屏方向判断返回 None,没有执行纵向滑动。
  • 根因是 _color_scroll_direction() 从整棵控件树收集“中心点落在区域内”的所有 clickable 节点,混入了规格容器外的悬浮控件和跨越容器的大面积父节点。污染后的横纵跨度接近,方向证据被误判为不足。
  • 同时 _heading_bounds() 可能先命中规格面板外的背景“颜色”文字,说明标题也需要按所选规格容器收窄作用域。

修正边界:

  1. 找到与 region 对应的真实 scrollable 节点后,只使用该容器后代且边界完整落在容器内的 clickable 规格节点;去重嵌套重复边界。
  2. 排除跨越容器的父节点和容器外悬浮控件;标题定位优先限制到同一规格容器。
  3. 增加“纵向颜色列表 + 外部悬浮按钮 + 大面积 clickable 父层”的真实结构等价回归测试,断言方向为纵向并能找到末尾目标。
  4. 继续保持方向不明时不滑动、不点击,且不放宽精确规格匹配和不可逆门禁。

现有提交保留供修订;归档将在修复验证后更新。

用户真机验收失败,#264 状态退回:进行中。 新增事实: - 最新源码进程启动后,cg52 第 3、4 次仍在 1~2 秒内以 `PURCHASE_OPTIONS_MISMATCH` 结束;两次 `irreversible_action_at` 均为空。 - 当前真实首屏方向判断返回 `None`,没有执行纵向滑动。 - 根因是 `_color_scroll_direction()` 从整棵控件树收集“中心点落在区域内”的所有 clickable 节点,混入了规格容器外的悬浮控件和跨越容器的大面积父节点。污染后的横纵跨度接近,方向证据被误判为不足。 - 同时 `_heading_bounds()` 可能先命中规格面板外的背景“颜色”文字,说明标题也需要按所选规格容器收窄作用域。 修正边界: 1. 找到与 `region` 对应的真实 scrollable 节点后,只使用该容器后代且边界完整落在容器内的 clickable 规格节点;去重嵌套重复边界。 2. 排除跨越容器的父节点和容器外悬浮控件;标题定位优先限制到同一规格容器。 3. 增加“纵向颜色列表 + 外部悬浮按钮 + 大面积 clickable 父层”的真实结构等价回归测试,断言方向为纵向并能找到末尾目标。 4. 继续保持方向不明时不滑动、不点击,且不放宽精确规格匹配和不可逆门禁。 现有提交保留供修订;归档将在修复验证后更新。
Author
Owner

#264 修订完成,重新进入待用户验收。

针对首次真机验收失败已完成:

  • 方向证据只从边界对应的真实 scrollable 容器后代中读取,并要求候选完整落在容器内。
  • 排除跨越容器的大面积 clickable 父节点和容器外悬浮控件。
  • 颜色标题优先限定到同一滚动容器;横向内层 RecyclerView 仍优先于外层面板。
  • 新增“纵向 14 色 + 两层 clickable 父层 + 外部悬浮按钮”结构等价测试。

验证:

  • cg52 当前真机首屏只读结果:container_found=true、heading_in_region=true、direction=vertical;未滑动、未点击规格、未提交订单。
  • 定向测试:75 passed。
  • 全量测试:519 passed,2 failed;仍为工作区既有版本号 0.1.2 与旧测试期望 0.1.0 不一致。
  • 语法、git diff --check、离屏 MainWindow 冒烟通过。

新增提交:

  • 2e40bc6 fix: 收窄颜色方向识别范围 (#264)
  • fc13b2c docs: 更新任务 #264 修订记录

归档已更新:docs/task/264-兼容纵向颜色规格列表并安全选择目标.md。工单保持开启,等待重启最新 Client 后复验 cg52。

#264 修订完成,重新进入待用户验收。 针对首次真机验收失败已完成: - 方向证据只从边界对应的真实 scrollable 容器后代中读取,并要求候选完整落在容器内。 - 排除跨越容器的大面积 clickable 父节点和容器外悬浮控件。 - 颜色标题优先限定到同一滚动容器;横向内层 RecyclerView 仍优先于外层面板。 - 新增“纵向 14 色 + 两层 clickable 父层 + 外部悬浮按钮”结构等价测试。 验证: - cg52 当前真机首屏只读结果:`container_found=true`、`heading_in_region=true`、`direction=vertical`;未滑动、未点击规格、未提交订单。 - 定向测试:75 passed。 - 全量测试:519 passed,2 failed;仍为工作区既有版本号 `0.1.2` 与旧测试期望 `0.1.0` 不一致。 - 语法、`git diff --check`、离屏 MainWindow 冒烟通过。 新增提交: - `2e40bc6` `fix: 收窄颜色方向识别范围 (#264)` - `fc13b2c` `docs: 更新任务 #264 修订记录` 归档已更新:`docs/task/264-兼容纵向颜色规格列表并安全选择目标.md`。工单保持开启,等待重启最新 Client 后复验 cg52。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#264