diff --git a/docs/tasks/T-104.md b/docs/tasks/T-104.md new file mode 100644 index 0000000..c3e77fe --- /dev/null +++ b/docs/tasks/T-104.md @@ -0,0 +1,82 @@ +--- +id: T-104 +title: 验证规格选择能力安全退出 +phase: 1 +deps: [T-103] +status: TODO +created: 2026-08-04 +vikunja_task_id: 32 +context_ref: 9a4d11f +work_branch: task/t-104-safe-exit +needs_device: true +needs_human_review: true +write_paths: + - docs/tasks/T-104.md + - client/src/cmbuyer_client/pdd/sku_selection.py + - client/src/cmbuyer_client/pdd/sku_selection_runner.py + - client/tests/pdd/test_sku_selection.py + - client/tests/pdd/fixtures/product_exit_8_17_0.xml + - client/scripts/capture_sku_exit_spike.py + - client/scripts/run_t103_sku_selection.py + - docs/current-state.md +--- + + +## 问题 / 背景 + +T-103 已实现受控规格选择、读价、截图和单次 Back,但当前 `exit_sku_panel_safely()` 在 hierarchy 变化且规格面板判据不再成立时就返回成功。2026-08-04 的只读诊断已证明:通知栏覆盖时 `app_current` 仍可能报告拼多多,而节点树全部属于 SystemUI。因此“已不在面板”不是安全退出的充分条件。T-104 用独立真机证据把后置条件收紧为“稳定回到同一目标商品详情页”。 + +## 关联需求与交互 + +- 功能:F-006 单趟流程中的安全退出边界。 +- 架构/API:复用 `SkuSelectionFlow.exit_sku_panel_safely()`;不改变服务端 API。 +- 依赖:T-103 完成真机规格选择/读价/人眼安全退出验收后才开工。 + +## 方案 + +1. 先新增窄取证脚本:只在已验证 PDD 8.17.0 目标规格面板上发送一次 Back,随后采集本机截图/XML/App/设备/goods_id 元数据;不得打开确认页、设置数量或点击任何页面控件。 +2. 由人确认 post-exit 截图确为 goods_id `937122477375` 商品详情、规格面板已关闭、未进入确认页/外部支付页,并确认截图/XML 对应;`needs_device=true`,agent 保持 DOING。 +3. 从本项目 post-exit XML 提取只含判据节点的最小 fixture。成功判据必须稳定命中该商品详情的证据绑定正结构;可复用 T-103 的“快要抢光”五层入口链,但必须由新的 post-exit 证据再次验证。 +4. 收紧 `exit_sku_panel_safely()`:版本和前台包正确、节点树仅含 PDD 受控页面、目标商品详情正判据精确唯一并连续稳定;面板仍在、SystemUI/锁屏、PDD 其他页、确认/提交/支付语义、入口缺失/重复或结构漂移均不得记成功。 +5. Back 最多发送一次。超时或响应不明不重试;故障调和也不能产生第二次 Back。失败不得发布 `safe_exit=completed` manifest。 +6. 复用 T-103 runner/flow,不新建第二套采购流程;可增加 post-exit 本机原始截图和无页面正文摘要,完整 XML 仍只留本机,不上传、Git 或日志。 + +## 验收要点 + +- 真机证据记录路径、截图/XML hash、PKG110、Android 16、Wi-Fi/USB、拼多多 8.17.0 和 goods_id;只有人能完成页面对应性与无订单创建确认。 +- 离线测试覆盖成功稳定详情页,以及面板未退、SystemUI/锁屏、PDD 其他页、确认/提交/支付页、入口缺失/重复/漂移、版本/前台漂移。 +- 所有失败分支 Back 总数最多 1;超时不重试;失败不发布 completed manifest。 +- 静态证明没有数量、确认页导航、提交订单、围栏或支付能力。 +- client 全量单测、compileall、完整 init、上下文校验与 diff-check 通过。 + +## 执行记录 + +等待 T-103 完成后认领。 + +## 执行记录 + +(暂无) + + +## 边界 + +- T-104 必须等待 T-103 完成人工真机验收后才可转 `DOING`。本任务先取证、后写退出成功判据;不得从 + 当前实现、前序项目、旧 XML、Activity 名或推理直接声明商品详情页。 +- 取证动作只允许在已证明为拼多多 8.17.0、goods_id `937122477375` 的目标规格面板上发送一次 + Android Back,随后只读采集截图/XML/App/设备摘要。不得点击关闭坐标、空白处、购买、数量、确认、 + 提交或支付控件,也不得在 Back 失败或结果不明时重试。 +- “规格面板已消失”不是退出成功。成功必须由本项目 post-exit 真机证据证明:版本和前台包正确、节点树 + 仅属于 PDD 受控页面、同一目标商品详情正判据精确唯一并连续稳定;SystemUI/锁屏、PDD 其他页面、 + 确认页、提交页、外部支付页、入口缺失/重复或结构漂移一律停止且不得发布 completed manifest。 +- 可以复用 T-103 已取证的“快要抢光”五层入口链作为候选结构,但必须在新的 post-exit 截图/XML 上 + 重新验证并由人确认页面对应性;不得使用相似文本、包含/前缀、OCR、裸坐标或其他购买文案兜底。 +- 只收紧现有 `SkuSelectionFlow` 与 runner 的退出后置条件,不新建第二套采购流程,不新增通用 `click`、 + 数量、确认页导航、授权、提交围栏、创建待付款订单或支付能力。第一趟与任何真实提交函数继续静态隔离。 +- 原始完整 XML 只保存在 `%LOCALAPPDATA%\cmbuyer\artifacts\T-104\...`,不得上传、提交 Git、写入 + Vikunja 或日志。Git 中最小 fixture 只能保留退出判据所需结构,并由人确认不含地址、手机号或支付凭据。 +- `needs_device: true`:agent 不得自行标 `DONE`。只有人确认 post-exit 截图为同一目标商品详情、面板 + 已关闭、未进入确认/提交/支付页、未创建订单,且截图/XML 对应后,任务才可完成。 +- 本任务不实现、不调用 `set_quantity_and_readback()`、`go_to_order_confirm()`、 + `create_submission_fence()`、`submit_order_once()`、支付、免密支付、先用后付或任何扣款能力;既有 + 三道价格闸门、服务端围栏、只点一次且不重试的约束不得放宽。 +