--- id: T-103 title: 验证规格面板精确选择与 SKU 单价 phase: 1 deps: [T-102] status: DOING created: 2026-08-04 vikunja_task_id: 23 context_ref: 1dc8308 work_branch: task/t-103-sku-panel needs_device: true needs_human_review: true write_paths: - docs/tasks/T-103.md - client/src/cmbuyer_client/pdd/** - client/src/cmbuyer_client/device/** - client/tests/pdd/** - client/tests/device/** - client/scripts/capture_sku_panel_spike.py - docs/02-requirements.md - docs/03-tech-stack.md - docs/04-architecture.md - docs/api.md - docs/current-state.md --- ## 问题 / 背景 T-102 已在 PKG110 / Android 16 / 拼多多 8.17.0 上证明 canonical 链接可进入 goods_id `958756616606` 的目标商品,并留下截图/XML。MVP 生死线是第一趟能否在不进入下单流程的前提下打开规格面板、按维度精确选择并从面板读取该 SKU 单价。T-102 截图当前可见底部“单独购买 / 免拼购买”和“先用后付 / 0元下单”文案,这些均属于本任务禁止触碰的购买或资金入口;当前截图视口没有证明存在独立安全规格入口,不能从旧项目或推理补选择器。 ## 关联需求与交互 - 功能:F-006 第一趟试选;只覆盖 `open_sku_panel()`、`select_sku_options()`、`read_sku_unit_price()` 的真机 spike。 - 用户故事:US-003、US-004、US-008;本任务无生产 GUI。 - 架构 / API:`docs/04-architecture.md` 第三、四、六节;`docs/api.md` 第三节设备自动化边界;T-104、T-105 与 Phase 2 的前置。 ## 方案 1. 先执行证据门禁,后写页面判据。由人把手机停在同一商品的详情页,手工寻找并只通过独立的“规格 / 已选”等非购买入口打开规格面板;不得点击“单独购买”“免拼购买”“直接拼成”“现在买”“先用后付”“0元下单”或任何购买/下单入口。若拼多多 8.17.0 与当前商品没有独立安全规格入口,记录 no-go 并停止,不能为了跑通放宽第一趟边界。 2. 人在规格面板初始态、手工选择一个维度后、全部维度选中后三个状态分别用现有只读取证能力保存 screenshot/XML;记录 goods_id、PKG110、Android 16、拼多多 8.17.0、路径与 SHA-256,并完成隐私检查。商品应具有 `颜色分类` 与 `尺码` 两个维度;当前商品不满足时由人另选 canonical 链接并记录。原始证据只留 `%LOCALAPPDATA%`。 3. 主 agent 只在上述证据完成且经人确认隐私后分析 XML,提取最小、脱敏 fixture,并把每条面板入口、维度容器、选项、选中态和价格判据绑定到证据哈希与 PDD 8.17.0;不得复用 cmroubao/cmpdd 的节点、Activity、文本常量或结论。 4. 实现安全的规格面板边界:版本必须精确为 8.17.0;只允许点击证据证明的独立规格入口及规格面板内选项。按维度容器隔离候选,文本等值匹配并读回选中态;缺失、重复、禁用、维度不明或选中态不唯一均停止,不点击相近项。纯函数测试必须覆盖 `红`/`粉红`、`1`/`10` 等前缀碰撞,即使真实商品未恰好包含该组合。 5. 单价只从规格面板证据确定的节点读取,以十进制字符串返回,禁止浮点。必须记录实际文本是否含“券后”、货币符号是否拆节点、是否同时出现原价/区间价;语义不唯一、节点缺失、多个候选冲突或只能从详情页读到时返回 unreadable 并转人工,不用其他数字补。 6. 提供离线 mock/fixture 测试与受限真机 spike CLI。第一趟模块不得导入或引用数量、订单确认、提交订单、付款函数;测试证明找不到精确值时零点击、价格不可读时停止、购买/资金入口永不可达。由人最终执行真机脚本并确认实际选中颜色/尺码与面板单价、截图/XML 隐私;agent 始终保持 DOING。 ## 验收要点 - 证据先行:任务执行记录先出现规格面板三态的设备/App/goods_id/路径/SHA-256 与人工隐私结论,之后才允许出现页面判据代码。 - 拼多多 8.17.0 上仅通过独立安全规格入口打开面板;若只能通过购买入口打开,则明确判定 MVP 当前边界下不可行,不写兜底点击。 - `颜色分类=X`、`尺码=Y` 在各自维度内精确唯一匹配并读回;前缀碰撞、缺失、重复、禁用和选中态不唯一均 fail closed。 - 从规格面板可靠读取选中 SKU 单价并记录真实文本语义;无法区分券后价、原价、区间价或节点拆分时返回 unreadable。 - 测试证明 T-103 路径不点击任何购买/下单/支付入口,不引用 `set_quantity()`、`go_to_order_confirm()`、`submit_order()` 或支付动作。 - client 全部单测、compileall、wheel metadata、上下文校验、完整 `init.ps1` 与 diff-check 通过。 - `needs_device=true`:只有人完成安全入口、精确选择、单价读取、页面对应性和隐私验收后才能 DONE。 ## 执行记录 ### 2026-08-04T01:58:01Z · ila 2026-08-04:已认领 T-103,工作分支 `task/t-103-sku-panel`,任务定义基线 `27999c8`。先执行人工证据门禁,不立即编写页面判据:T-102 现有详情截图只证明目标商品,且当前视口可见“单独购买 / 免拼购买”“先用后付 / 0元下单”等禁触入口,没有证明独立安全规格入口。下一步由人手工寻找非购买的“规格 / 已选”入口;若不存在就记录 no-go,不点击购买按钮兜底。规格面板三态证据与隐私确认完成前,受托 agent 只允许做证据采集脚手架、纯函数边界和只读审计,T-103 保持 DOING。 ## 边界 - 任何规格面板入口、维度容器、选项、选中态和价格判据都必须来自本项目新采集且已由人完成 隐私检查的拼多多 8.17.0 screenshot/XML;T-102 详情页证据只能证明已到目标商品,不能证明 规格面板结构。证据路径、SHA-256、goods_id、设备、Android 与 App 版本写入执行记录之前, 不得提交页面判据代码。 - 第一趟绝不点击“单独购买”“免拼购买”“直接拼成”“现在买”“先用后付”“0元下单”或任何 购买、下单、提交、付款入口。只有真机证据证明存在独立的“规格 / 已选”等非购买入口时才允许 自动打开面板;没有安全入口即判定 no-go 并停止,不能把购买按钮改名包装成规格入口。 - 规格选项只能在已确认的面板及对应维度容器内按文本精确唯一匹配;缺失、重复、禁用、维度不明、 选中态无法唯一读回或页面版本不符均 fail closed。不得前缀、包含、模糊、相似或跨维度匹配, 不得用 OCR / 坐标兜底猜选项。 - 单价只允许从规格面板证据确认的节点读取,并以十进制字符串表达;不得使用浮点,不得从详情页、 搜索卡片或其他页面的数字补值。券后价、原价、区间价、货币符号拆分或多个候选的语义无法唯一 证明时必须返回 unreadable 并转人工。 - T-103 代码路径不得引用或实现 `set_quantity()`、`go_to_order_confirm()`、`submit_order()`、 创建订单、授权、提交围栏或任何支付能力;不得进入订单确认页,不得创建待付款订单。 - 不把 `/mnt/d/chengma/cmroubao`、`/mnt/d/chengma/cmpdd` 或任何旧版本的节点、Activity、选择器、 坐标、文本形态和页面结论当作事实;前序项目只可用于理解为什么必须 fail closed。 - 原始 screenshot/XML 只保存在 `%LOCALAPPDATA%\cmbuyer\artifacts\T-103`,不得提交 Git 或 Vikunja; 只有最小脱敏 fixture、路径、SHA-256 与非敏感结论可入库。未由人确认隐私前 agent 不读取原始证据。 - `needs_device: true`:agent 只能完成离线实现并保持 `DOING`;只有人完成安全入口、精确规格选择、 SKU 单价语义、页面对应性与隐私验收后才能标 `DONE`。