docs(architecture): approve controlled trial SKU entry

This commit is contained in:
QiuSW
2026-08-04 10:59:40 +08:00
parent d81fc722dc
commit 82f57c7233
8 changed files with 198 additions and 100 deletions
+19 -7
View File
@@ -99,14 +99,20 @@ US-006(付款前核对)在 MVP 降级为:系统展示订单截图与授权
- **F-005**:执行员启动会话后桌面端定时轮询,同时领取待试选与已授权两类任务。 - **F-005**:执行员启动会话后桌面端定时轮询,同时领取待试选与已授权两类任务。
两个实例并发领取同一条时只有一个成功,另一个得到明确的「无可领任务」而不是报错。 两个实例并发领取同一条时只有一个成功,另一个得到明确的「无可领任务」而不是报错。
**关闭会话即停止轮询;连续失败达到阈值自动停止并提示原因。** **关闭会话即停止轮询;连续失败达到阈值自动停止并提示原因。**
- **F-006**:手机打开对应商品详情页,打开规格面板,按维度精确匹配颜色分类和尺码。 - **F-006**:手机打开对应商品详情页,只点击与当前拼多多版本及本项目真机证据绑定的精确唯一
**受控规格面板入口**,打开规格面板后按维度精确匹配颜色分类和尺码。当前只确认拼多多
`8.17.0`、goods_id `937122477375` 上的“快要抢光”;其他入口文案必须分别取证,不能按购买
语义泛化。
**任一维度找不到精确值即停止并转人工,不选相近选项。** 勾选后读取该 SKU 单价 **任一维度找不到精确值即停止并转人工,不选相近选项。** 勾选后读取该 SKU 单价
(闸门一),读不到即转人工,**不用商品详情页正文或搜索页的数字凑合**。 (闸门一),读不到即转人工,**不用商品详情页正文或搜索页的数字凑合**。
- **F-006 释放要求**:试选完成后**必须退出商品页释放手机**,不得停在规格面板等待人工。 - **F-006 释放要求**:试选完成后**必须退出商品页释放手机**,不得停在规格面板等待人工。
- **F-006 硬边界**:试选阶段**绝不点击「现在买」或任何进入下单流程的入口**。 - **F-006 硬边界**:第一趟只把上述精确入口点击视为可逆的“打开规格面板”能力;进入面板后
必须有测试证明该路径不调用任何下单语义动作。 不得调整数量、进入订单确认页、点击“提交订单”或任何支付/资金控件,也不得暴露通用任意点击能力。
必须有静态调用链和测试证明上述下单语义动作不可达。入口缺失、重复、版本失配或打开后不是已取证
面板时立即停止,不尝试“免拼购买 / 单独购买 / 直接拼成”等相似文案。
- **F-007**:回传商品标题、实际勾选到的颜色分类与尺码、单价、合计(单价 × 数量)和 - **F-007**:回传商品标题、实际勾选到的颜色分类与尺码、单价、合计(单价 × 数量)和
规格面板截图;任务转「等你确认」。 **自动脱敏后的**规格面板截图;任务转「等你确认」。原始 screenshot/XML 只能留在采购工具本机
隔离目录,不能上传、写日志或提交 Git。
### 决策与资金 ### 决策与资金
@@ -138,7 +144,8 @@ US-006(付款前核对)在 MVP 降级为:系统展示订单截图与授权
- **F-011**:失败必须可区分至少这些原因:设备未连接、商品页打不开、规格面板打不开、 - **F-011**:失败必须可区分至少这些原因:设备未连接、商品页打不开、规格面板打不开、
规格不匹配、单价读不到、单价与授权价不符、数量设置失败、金额超上限、提交控件不唯一、 规格不匹配、单价读不到、单价与授权价不符、数量设置失败、金额超上限、提交控件不唯一、
页面识别失败、安全校验、外部支付交接、超时。每种都保留截图和页面快照。 页面识别失败、安全校验、外部支付交接、超时。原始截图/页面快照只留采购工具本机隔离目录;
脱敏成功时保留派生物,任何上传、远程审阅或服务端展示都只能使用自动复检通过的派生证据。
- **版本失配**:运行时读取到的拼多多 App 版本与当前已取证版本不一致时,桌面端必须停止 - **版本失配**:运行时读取到的拼多多 App 版本与当前已取证版本不一致时,桌面端必须停止
领取真机任务并提示重新取证;不得继续使用旧页面判据。 领取真机任务并提示重新取证;不得继续使用旧页面判据。
- **付款收口(MVP 简化版)**:订单创建后任务转「待付款」,页面展示订单截图、商品、 - **付款收口(MVP 简化版)**:订单创建后任务转「待付款」,页面展示订单截图、商品、
@@ -177,8 +184,13 @@ US-006(付款前核对)在 MVP 降级为:系统展示订单截图与授权
可配置的动作节奏,并在检测到安全校验时立即停止。 可配置的动作节奏,并在检测到安全校验时立即停止。
- **自动化边界风险**:会自动点击并创建订单,属不可逆操作。必须支持 dry-run(跑到 - **自动化边界风险**:会自动点击并创建订单,属不可逆操作。必须支持 dry-run(跑到
订单确认页停止)、服务端提交围栏和点击后调和;任一环节状态不明都不得继续点击。 订单确认页停止)、服务端提交围栏和点击后调和;任一环节状态不明都不得继续点击。
- **隐私风险**:订单确认页含收货地址和掩码手机号。**只读取非敏感摘要,不提取地址 - **隐私风险**:规格面板和订单确认页都会显示收货地址和掩码手机号。允许原始 screenshot/XML
原文、手机号或支付凭据**;上传服务端的证据需先脱敏。 仅在采购工具本机隔离目录短链路落盘供确定性脱敏器消费;业务逻辑、日志、agent、fixture 与采购
服务**不得提取或接收地址原文、手机号或支付凭据**。只有脱敏成功且自动复检通过的派生证据才能
上传或进入开发材料,无法确认脱敏完整即 fail closed。
- **受控规格入口风险**:T-103 已证明当前衣服商品只有购买语义按钮能打开规格面板。项目所有者批准
仅把经真机取证的精确唯一入口作为第一趟可逆导航;该批准不覆盖其他文案,不授权调整数量、提交订单、
进入确认页或付款。T-103 必须用 capability 隔离和不可达测试证明边界没有扩散。
- **规格面板上的单价位置未取证(阻塞 F-006 闸门一)**:选中 SKU 后价格显示在哪个节点、 - **规格面板上的单价位置未取证(阻塞 F-006 闸门一)**:选中 SKU 后价格显示在哪个节点、
是否带「券后」前缀、是否与原价并列,尚无本项目的真机证据。**T-103 必须一并取证。** 是否带「券后」前缀、是否与原价并列,尚无本项目的真机证据。**T-103 必须一并取证。**
若规格面板上无法可靠读到单价,闸门一要改为「只截图不判价」,确认页设计随之调整。 若规格面板上无法可靠读到单价,闸门一要改为「只截图不判价」,确认页设计随之调整。
+18 -15
View File
@@ -43,7 +43,7 @@
| 调用位置 | 采购工具 | 已定 | PC 有算力;改 prompt 不需要重新打包 | | 调用位置 | 采购工具 | 已定 | PC 有算力;改 prompt 不需要重新打包 |
| provider | 待定 | **待定** | 需先确认预算与合规;不得由 agent 自行选定 | | provider | 待定 | **待定** | 需先确认预算与合规;不得由 agent 自行选定 |
| 凭据存储 | 采购工具本机配置文件,不入库、不上传 | 已定 | 采购服务不保存、不代理、不下发任何模型凭据 | | 凭据存储 | 采购工具本机配置文件,不入库、不上传 | 已定 | 采购服务不保存、不代理、不下发任何模型凭据 |
| 输入 | 完整节点树 XML + 页面截图 | 已定 | `dump_hierarchy(compressed=False)` 不丢节点 | | 输入 | 自动复检通过的脱敏派生 XML + 页面截图 | 已定 | 原始证据只允许本机确定性脱敏器消费,AI/agent 不读取原始地址或手机号 |
## 四、决策记录与演进 ## 四、决策记录与演进
@@ -125,7 +125,7 @@ D:\Portable\adb\adb.exe devices -l
证据不得提交 Git。T-102 已由人确认 goods_id `958756616606` 对应目标商品并完成截图/XML 隐私检查, 证据不得提交 Git。T-102 已由人确认 goods_id `958756616606` 对应目标商品并完成截图/XML 隐私检查,
设备、版本、证据路径与 SHA-256 已记录到任务执行记录。 设备、版本、证据路径与 SHA-256 已记录到任务执行记录。
### T-103 规格面板三状态只读取证(真机结论:no-go) ### T-103 规格面板三状态只读取证(T-110 边界调整后待重新验证)
`client/scripts/capture_sku_panel_spike.py` 只采集人已在手机上准备好的规格面板截图和完整 XML。 `client/scripts/capture_sku_panel_spike.py` 只采集人已在手机上准备好的规格面板截图和完整 XML。
它不打开链接或规格面板,不识别面板,不点击、滑动、输入或选择规格,也不读取价格;接口只暴露 它不打开链接或规格面板,不识别面板,不点击、滑动、输入或选择规格,也不读取价格;接口只暴露
@@ -134,24 +134,27 @@ D:\Portable\adb\adb.exe devices -l
不得将其当作自动识别结果。运行拼多多版本必须精确为 `8.17.0`,前台 package 必须是拼多多,否则 不得将其当作自动识别结果。运行拼多多版本必须精确为 `8.17.0`,前台 package 必须是拼多多,否则
fail closed;目标目录已存在、截图/XML 无效或超时均不得覆盖已有内容或发布半成品。 fail closed;目标目录已存在、截图/XML 无效或超时均不得覆盖已有内容或发布半成品。
人工只能通过商品页上独立且安全的「规格/已选」入口打开面板。不得点击或借用「单独购买」「免拼购买」 T-103 已证明当前衣服商品没有独立「规格/已选」入口。T-110 只批准拼多多 `8.17.0`、goods_id
「直接拼成」「现在买」「先用后付」「0 元下单」等购买、下单或支付入口;没有独立入口即记录 no-go。 `937122477375` 上经真机确认的精确唯一 `快要抢光` 作为可逆的受控规格面板入口;“免拼购买 / 单独购买 /
三种状态分别使用一个全新证据目录: 直接拼成”等其他文案不能凭人工经验复用,必须分别重新取证。只读取证 CLI 本身仍不执行点击;三种状态
分别使用一个全新原始证据目录:
```powershell ```powershell
.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial <SERIAL> --url "https://mobile.yangkeduo.com/goods.html?goods_id=<GOODS_ID>" --state initial --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-initial-<GOODS_ID>" --timeout 10 --adb D:\Portable\adb\adb.exe .\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial <SERIAL> --url "https://mobile.yangkeduo.com/goods.html?goods_id=<GOODS_ID>" --state initial --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-initial-<GOODS_ID>\raw" --timeout 10 --adb D:\Portable\adb\adb.exe
.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial <SERIAL> --url "https://mobile.yangkeduo.com/goods.html?goods_id=<GOODS_ID>" --state one-dimension-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-one-dimension-<GOODS_ID>" --timeout 10 --adb D:\Portable\adb\adb.exe .\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial <SERIAL> --url "https://mobile.yangkeduo.com/goods.html?goods_id=<GOODS_ID>" --state one-dimension-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-one-dimension-<GOODS_ID>\raw" --timeout 10 --adb D:\Portable\adb\adb.exe
.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial <SERIAL> --url "https://mobile.yangkeduo.com/goods.html?goods_id=<GOODS_ID>" --state all-dimensions-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-all-dimensions-<GOODS_ID>" --timeout 10 --adb D:\Portable\adb\adb.exe .\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial <SERIAL> --url "https://mobile.yangkeduo.com/goods.html?goods_id=<GOODS_ID>" --state all-dimensions-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-all-dimensions-<GOODS_ID>\raw" --timeout 10 --adb D:\Portable\adb\adb.exe
``` ```
原始截图/XML 只能留在本机。人先核对三次截图的声明状态并完成隐私检查,再回报 manifest 路径、精确 PDD 规格面板不可避免显示收货区域和掩码手机号。原始截图/XML 只能留在
选择值和面板可见价格文本;agent 在此之前不得读取原始页面内容或编写任何规格面板判据。 `%LOCALAPPDATA%\cmbuyer\artifacts\...\raw` 隔离目录,不供 agent、fixture、业务或 HTTP 上传读取;
T-103 必须实现本机确定性脱敏器,把隐私区域从 screenshot/XML 同时移除并在 sibling `derived` 目录
原子发布。脱敏器必须绑定 PDD 版本、设备分辨率与页面结构,派生 XML 仍命中手机号模式、隐私区域无法
确认、版本/分辨率/结构失配或哈希不一致时拒绝发布。只有派生 manifest 和人工状态确认完成后,agent
才能从派生物提取最小 fixture、编写判据。
2026-08-04 的 PKG110 / Android 16 / 拼多多 8.17.0 真机验证中,人确认衣服商品 2026-08-04 的首轮证据只用于确认上述入口事实;其中 `initial` 不是规格面板,另两张原始截图含隐私
goods_id `937122477375` 的规格面板只能从详情页右下角“快要抢光”等购买语义按钮进入;通常同类入口 区域,因此 XML 未读取、fixture 与选择器未生成。T-110 完成受控入口与脱敏契约后,T-103 重新取证;
还包括“免拼购买 / 单独购买 / 直接拼成”。这满足任务预设的 no-go 条件:第一趟不能点击进入下单流程 该边界调整不授权第一趟调整数量、进入确认页、点击“提交订单”或触碰任何支付控件。
的入口,因此本轮 XML 未读取、fixture 与选择器未生成,T-103 转 `BLOCKED`。只读取证脚手架保留用于
后续重新验证,但不能被解释为规格面板自动化可行。解除阻塞必须先完成新的架构决策和安全边界评审。
Windows 的标准入口是仓库根 `./init.ps1`。它要求 Go、两端目录及其哨兵文件存在;已有合规 Windows 的标准入口是仓库根 `./init.ps1`。它要求 Go、两端目录及其哨兵文件存在;已有合规
`client/.venv` 时,所有采购工具检查与 validator 都使用该解释器。只有 venv 不存在时,才从 `py -0p` `client/.venv` 时,所有采购工具检查与 validator 都使用该解释器。只有 venv 不存在时,才从 `py -0p`
+38 -14
View File
@@ -97,7 +97,7 @@
┌──────────────── 第一趟:试选 ────────────────┐ ┌──────────────── 第一趟:试选 ────────────────┐
│ 采购工具轮询领取 PENDING 任务 │ │ 采购工具轮询领取 PENDING 任务 │
│ 1. open_product(url) │ │ 1. open_product(url) │
│ 2. 打开规格面板 │ │ 2. 经版本绑定、精确唯一的受控入口打开规格面板 │
│ 3. 按维度精确勾选颜色分类、尺码 │ │ 3. 按维度精确勾选颜色分类、尺码 │
│ 4. 【闸门一】读该 SKU 单价,算合计 │ │ 4. 【闸门一】读该 SKU 单价,算合计 │
│ 5. 截图 │ │ 5. 截图 │
@@ -139,6 +139,25 @@
代价是同一商品走两遍,但第二趟很快,而且换来两个好处:手机可以在人思考时继续跑别的 代价是同一商品走两遍,但第二趟很快,而且换来两个好处:手机可以在人思考时继续跑别的
任务的试选;价格变动能被第二趟抓住。 任务的试选;价格变动能被第二趟抓住。
### 第一趟受控规格面板入口
T-103 的真机证据推翻了“商品详情页存在独立规格入口”的假设:拼多多 8.17.0、goods_id
`937122477375` 只能从“快要抢光”打开规格面板。项目所有者于 2026-08-04 批准把这一点击定义为
**可逆且能力受限的规格面板导航**,不把它当作下单授权,也不把购买语义文案整体加入白名单。
第一趟执行器只能持有以下 capability:
1. 打开 canonical 商品链接。
2. 点击与证据哈希、拼多多版本和页面状态绑定的精确唯一 `快要抢光` 入口。
3. 在已确认的维度容器中精确选择规格并读回选中态。
4. 从规格面板读取单价、生成脱敏派生证据、关闭面板并退出商品页。
第一趟 capability **不得包含**通用 `click`、数量增减、进入订单确认页、提交订单或付款能力。
“免拼购买 / 单独购买 / 直接拼成”等其他文案即使人工认为行为相同,也必须各自重新取证后才能评审;
入口缺失、重复、版本失配、打开后面板判据不唯一,或出现“提交订单”以外的未知终态按钮时立即停止。
第一趟的静态依赖检查必须证明 `set_quantity()`、`go_to_order_confirm()`、`submit_order()` 和任何
支付函数不可达。
### 三道价格闸门 ### 三道价格闸门
| 闸门 | 位置 | 作用 | 不通过时 | | 闸门 | 位置 | 作用 | 不通过时 |
@@ -175,7 +194,7 @@ V2 实现时仍遵守:**图搜的唯一产出是 goods_id**,不在搜索结
| 提交订单控件唯一 | 文本精确等于「提交订单」且可点击祖先唯一,否则停 | 点到未知控件 | | 提交订单控件唯一 | 文本精确等于「提交订单」且可点击祖先唯一,否则停 | 点到未知控件 |
| 数量必须复核 | 设置后读回确认精确等于要求值,否则停 | 买错数量 | | 数量必须复核 | 设置后读回确认精确等于要求值,否则停 | 买错数量 |
| 价格三道闸门 | 见第三节。任一道读不到或不通过即停,**不用其他位置的数字凑合** | 超预算采购 | | 价格三道闸门 | 见第三节。任一道读不到或不通过即停,**不用其他位置的数字凑合** | 超预算采购 |
| 第一趟不下单 | 试选阶段只勾选规格和读价,**绝不点击「现在买」或任何进入下单流程的入口** | 无授权下单 | | 第一趟不下单 | 只允许点击证据/版本绑定的精确唯一受控入口打开规格面板,当前仅为 `快要抢光`;随后只选规格、读价、脱敏取证和返回。数量、确认页、`提交订单`、付款与通用点击能力均不可达 | 无授权下单 |
| 外部支付页 | 检测到微信等外部支付交接立即停止、转人工、保留证据 | 凭据泄露 | | 外部支付页 | 检测到微信等外部支付交接立即停止、转人工、保留证据 | 凭据泄露 |
| 安全校验 | 检测到验证码、风控、人脸、短信校验立即停止,不尝试绕过 | 封号 / 违规 | | 安全校验 | 检测到验证码、风控、人脸、短信校验立即停止,不尝试绕过 | 封号 / 违规 |
| 敏感信息 | 只读非敏感摘要,不提取收货地址原文、手机号、支付凭据 | 隐私泄露 | | 敏感信息 | 只读非敏感摘要,不提取收货地址原文、手机号、支付凭据 | 隐私泄露 |
@@ -368,21 +387,25 @@ PENDING_RETRIAL ─────────────┴─claim→ CLAIMED
| 数据 | 位置 | 理由 | | 数据 | 位置 | 理由 |
| --- | --- | --- | | --- | --- | --- |
| 候选商品页 / 规格页截图 | 上传采购服务 | 管理员做授权决策必须看 | | 原始商品页 / 规格页 screenshot/XML | **仅采购工具本机隔离目录** | PDD 页面不可避免包含收货区域和掩码手机号;只允许确定性脱敏器读取,不供业务、agent、fixture 或上传消费 |
| 订单确认页截图 | 上传采购服务 | 授权后核对与审计必须留 | | 脱敏派生商品页 / 规格页截图 | 上传采购服务 | 管理员做授权决策必须看;服务端只接收派生哈希和 sanitizer 版本,原始/派生哈希映射仅留本机 manifest |
| 订单核对截图 | 上传采购服务 | 资金核对证据 | | 最小脱敏 XML fixture | 采购工具测试 / 可提交 Git | 只保留页面判据所需结构;自动复检无地址、手机号、支付凭据后才可发布 |
| 完整节点树 XML | **仅采购工具本地** | 体积大、含页面全文、只用于排障 | | 脱敏派生订单确认页截图 | 上传采购服务 | 授权后核对与审计必须留;原始物仍只在本机隔离目录 |
| 脱敏派生订单核对截图 | 上传采购服务 | 资金核对证据;原始物仍只在本机隔离目录 |
| AI 调用记录(P1) | **仅采购工具本地** | 含 prompt / 响应全文,脱敏成本高 | | AI 调用记录(P1) | **仅采购工具本地** | 含 prompt / 响应全文,脱敏成本高 |
| 失败现场快照 | 仅采购工具本地,可按需手工导出 | 同上 | | 失败现场快照 | 原始物仅采购工具本机;只能手工导出脱敏派生物 | 同上 |
上传前必须脱敏:**不上传含收货地址、手机号、支付凭据的截图区域或文本。** 原始目录不得被 HTTP sink、Vikunja 导出、日志或 fixture 构建器读取。脱敏器必须先验证设备分辨率、
页面/App 版本和预期隐私区域,再同时生成派生 screenshot/XML;派生 XML 仍命中手机号模式、截图隐私
区域无法确定、sanitizer 异常或任一哈希不一致时,不发布派生目录。上传端只接受 manifest 明确标记
`privacy_tier=SANITIZED` 的派生截图,**不上传含收货地址、手机号、支付凭据的区域或文本。**
## 六、关键技术难点 ## 六、关键技术难点
| 难点 | 说明 | 应对 | | 难点 | 说明 | 应对 |
| --- | --- | --- | | --- | --- | --- |
| 拼多多页面结构随版本变化 | 前序项目已观察到详情页无独立规格入口、价格节点拆分等变化 | **每条判据先做真机 spike 取证再写代码**;判据与 App 版本一并记录 | | 拼多多页面结构随版本变化 | 前序项目已观察到详情页无独立规格入口、价格节点拆分等变化 | **每条判据先做真机 spike 取证再写代码**;判据与 App 版本一并记录 |
| 规格面板安全入口 | T-103 已在拼多多 8.17.0 真机确认衣服商品只能通过“快要抢光 / 免拼购买 / 单独购买 / 直接拼成”等购买语义入口打开规格面板 | 触发 no-go,T-103 阻塞;第一趟不点击这些入口,不生成选择器。只有先完成架构决策和安全边界评审才能继续 | | 规格面板安全入口 | T-103 已在拼多多 8.17.0 真机确认衣服商品只能通过购买语义入口打开规格面板 | T-110 已批准仅使用当前证据证明的精确唯一 `快要抢光` 作为受控导航;其他文案不泛化,第一趟下单能力保持不可达 |
| 规格面板上的价格位置 | 选中 SKU 后价格显示在哪、是否含券后前缀,未取证 | **T-103 必须一并取证**,闸门一依赖它;读不到就转人工,不用详情页数字凑合 | | 规格面板上的价格位置 | 选中 SKU 后价格显示在哪、是否含券后前缀,未取证 | **T-103 必须一并取证**,闸门一依赖它;读不到就转人工,不用详情页数字凑合 |
| 同一商品两趟结果不一致 | 第二趟价格变了、规格选项变了或商品下架 | 闸门二拦截;一律转人工,不自动放弃也不自动继续 | | 同一商品两趟结果不一致 | 第二趟价格变了、规格选项变了或商品下架 | 闸门二拦截;一律转人工,不自动放弃也不自动继续 |
| 图搜结果含跨类目商品(V2) | 搜服装出现纸巾 | B 路径只产 goods_id 且限 5 个;后续用 VLM 看截图筛同款 | | 图搜结果含跨类目商品(V2) | 搜服装出现纸巾 | B 路径只产 goods_id 且限 5 个;后续用 VLM 看截图筛同款 |
@@ -396,8 +419,9 @@ PENDING_RETRIAL ─────────────┴─claim→ CLAIMED
## 七、推荐开发顺序 ## 七、推荐开发顺序
1. **Phase 0 地基**:两端骨架、测试命令、`init` 脚本可运行。 1. **Phase 0 地基**:两端骨架、测试命令、`init` 脚本可运行。
2. **Phase 1 真机取证**:WiFi ADB 连通;打开商品 → 打开规格面板 → 按维度精确勾选颜色 2. **Phase 1 真机取证**:WiFi ADB 连通;先验证第一趟的打开商品 → 受控打开规格面板 → 按维度
分类和尺码 → **读到该 SKU 单价** → 设数量 → 进订单确认页 → 读「实付款」。 精确勾选颜色分类和尺码 → **读到该 SKU 单价** → 脱敏取证 → 退出;再以独立的第二趟 spike
验证设数量 → 进订单确认页 → 读「实付款」。第一趟 capability 不含后三项。
**结论写入文档,判据带拼多多 App 版本。** **结论写入文档,判据带拼多多 App 版本。**
3. **Phase 2 采购服务核心**:数据模型与状态机、手工建单、任务查询、试选结果接收、 3. **Phase 2 采购服务核心**:数据模型与状态机、手工建单、任务查询、试选结果接收、
确认页与授权签发、**授权超时与放弃**。 确认页与授权签发、**授权超时与放弃**。
@@ -409,9 +433,9 @@ PENDING_RETRIAL ─────────────┴─claim→ CLAIMED
**不要在 Phase 1 结论出来之前写 Phase 2 的页面**——确认页要显示什么,取决于真机上 **不要在 Phase 1 结论出来之前写 Phase 2 的页面**——确认页要显示什么,取决于真机上
究竟能读到什么。尤其是闸门一的单价,如果规格面板上读不可靠,整个确认页的设计要改。 究竟能读到什么。尤其是闸门一的单价,如果规格面板上读不可靠,整个确认页的设计要改。
> 2026-08-04:Phase 1 已得到负面结论。拼多多 8.17.0 的已验证衣服商品没有独立安全规格入口, > 2026-08-04:Phase 1 证明已验证衣服商品没有独立规格入口。项目所有者随后批准 T-110 的受控入口
> 只能从购买语义按钮进入规格面板。按本节“第一趟不下单”边界,自动第一趟当前不可实现;Phase 2 > 方案:当前只允许证据绑定的精确唯一 `快要抢光` 打开规格面板,并以 capability 隔离保证数量、确认页、
> 保持冻结,直到项目所有者选择并评审新的架构方向。该结论不授权点击购买入口。 > 提交订单和付款在第一趟不可达。T-103 仍须先实现自动脱敏与新证据门禁,完成前 Phase 2 保持冻结。
## 八、项目结构 ## 八、项目结构
+11
View File
@@ -28,6 +28,11 @@
已消费。 已消费。
- **第一趟试选的代码路径不得引用 `go_to_order_confirm()` 与 `submit_order()`**, - **第一趟试选的代码路径不得引用 `go_to_order_confirm()` 与 `submit_order()`**,
必须有测试证明不可达。 必须有测试证明不可达。
- 第一趟只可通过独立的 `open_trial_sku_panel()` capability 点击本项目真机证据与 App 版本绑定的
精确唯一入口;当前仅允许拼多多 `8.17.0` 上已取证的 `快要抢光`。不得向第一趟暴露通用 `click`、
`set_quantity()`、订单确认、提交或付款能力,不得把其他购买文案作为包含/同义匹配兜底。
- 规格面板内即使可见“提交订单”、微信支付、先用后付或 0 元下单,第一趟也只能把它们作为硬拒绝
判据,绝不能返回可点击对象或尝试继续。
### 1.2 匹配纪律 ### 1.2 匹配纪律
@@ -51,11 +56,17 @@
- 检测到外部支付交接立即停止,**不读取、不保存、不输入任何凭据**。 - 检测到外部支付交接立即停止,**不读取、不保存、不输入任何凭据**。
- 只读非敏感摘要,**不提取收货地址原文、手机号、支付凭据**。 - 只读非敏感摘要,**不提取收货地址原文、手机号、支付凭据**。
- 上传服务端的证据必须先脱敏。 - 上传服务端的证据必须先脱敏。
- PDD 页面不可避免显示地址/掩码手机号时,原始 screenshot/XML 只允许写入采购工具本机隔离目录,
只由确定性脱敏器消费;业务代码、agent、fixture、日志和 HTTP sink 只能读取自动复检通过且 manifest
标记 `privacy_tier=SANITIZED` 的派生物。脱敏失败、分辨率/版本不符或派生 XML 仍命中手机号模式时
必须拒绝发布,不得用人工口头确认绕过。
### 1.5 页面判据 ### 1.5 页面判据
- **不得从前序项目、旧文档或推理直接写页面判据。** 必须有本项目的真机取证。 - **不得从前序项目、旧文档或推理直接写页面判据。** 必须有本项目的真机取证。
- 每条判据必须记录取证时的**拼多多 App 版本**。 - 每条判据必须记录取证时的**拼多多 App 版本**。
- 购买语义按钮不能按“作用相同”共享判据。`快要抢光`、`免拼购买`、`单独购买`、`直接拼成` 等
每个入口文案都必须分别取证;只允许精确唯一匹配,不允许包含、前缀、相似或坐标兜底。
- 判据失效时先重新取证,不要靠加兜底分支硬扛。 - 判据失效时先重新取证,不要靠加兜底分支硬扛。
> 这些红线不是建议。[`04-architecture.md`](04-architecture.md) 第四节列出的每一条都必须有 > 这些红线不是建议。[`04-architecture.md`](04-architecture.md) 第四节列出的每一条都必须有
+40 -15
View File
@@ -168,6 +168,27 @@
- 无可领任务返回 `200` 且 `task` 为 `null`,**不是 404**。 - 无可领任务返回 `200` 且 `task` 为 `null`,**不是 404**。
- 后续所有该任务的调用必须携带 `X-Claim-Token` 与匹配的 `claim_generation`。 - 后续所有该任务的调用必须携带 `X-Claim-Token` 与匹配的 `claim_generation`。
### `POST /api/v1/tasks/{id}/evidence`(只接收脱敏派生物)
规格面板和订单确认页可能固定展示地址与掩码手机号。采购工具必须先在本机隔离目录保存原始证据,
再由确定性脱敏器生成派生 screenshot/XML;本接口只接受派生截图及如下审计元数据:
```json
{
"kind": "SKU_PANEL_SCREENSHOT",
"privacy_tier": "SANITIZED",
"artifact_sha256": "<派生截图 SHA-256>",
"sanitizer_version": "sku-panel-pdd-8.17.0-v1"
}
```
- `privacy_tier` 必须精确为 `SANITIZED`;缺失、其他值或 sanitizer 元数据不完整均拒绝。
- 上传内容的 SHA-256 必须等于 `artifact_sha256`。服务端不接收原始文件、原始哈希、原始路径、
原始 XML、地址、手机号或支付凭据;原始/派生哈希映射只存在于采购工具本机 manifest。
- 原始目录不得被 `HttpResultSink` 或证据上传器枚举;调用方必须显式传入已原子发布的派生目录。
- 完整 XML 永不上传。经自动复检的最小脱敏 XML 只用于采购工具离线 fixture;仍命中手机号模式或
脱敏结果不确定时,客户端调用 `/needs-manual`,不得上传截图或继续试选。
### `POST /api/v1/tasks/{id}/spec-trial`(第一趟回传) ### `POST /api/v1/tasks/{id}/spec-trial`(第一趟回传)
```json ```json
@@ -187,7 +208,7 @@
- `unit_price` 来自闸门一(规格面板)。**读不到时不要发这个接口**,改发 - `unit_price` 来自闸门一(规格面板)。**读不到时不要发这个接口**,改发
`/needs-manual` 并带原因码 `UNIT_PRICE_UNREADABLE`。 `/needs-manual` 并带原因码 `UNIT_PRICE_UNREADABLE`。
- `total_price` = `unit_price` × 任务数量,服务端会重算校验。 - `total_price` = `unit_price` × 任务数量,服务端会重算校验。
- 证据须先经 `/evidence` 上传。 - 证据须先经 `/evidence` 上传,且对应资产必须为 `privacy_tier=SANITIZED`。
- 服务端接收后创建 `spec_trials` 记录,任务转 `WAITING_CONFIRMATION`。 - 服务端接收后创建 `spec_trials` 记录,任务转 `WAITING_CONFIRMATION`。
### dry-run 与真实提交协议 ### dry-run 与真实提交协议
@@ -282,25 +303,29 @@ class ResultSink(ABC):
### 真机流程模块 ### 真机流程模块
`client/src/android/pdd_flow.py` 的公开入口,每个都不得越界: `client/src/android/pdd_flow.py` 的公开入口按 capability 分离,每个都不得越界:
| 函数 | 输入 | 输出 | 副作用边界 | | 函数 | 可用趟次 | 输入 | 输出 | 副作用边界 |
| --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| `open_product(url)` | 商品 URL | 页面快照路径 | 只打开页面,不点击购买 | | `open_product(url)` | TRIAL / ORDER | 商品 URL | 页面快照路径 | 只打开页面,不点击控件 |
| `open_sku_panel()` | - | 面板快照 | 只点规格入口,不提交 | | `open_trial_sku_panel(evidence_key)` | **仅 TRIAL** | 版本与证据绑定键 | 面板快照 | 只点击精确唯一、已取证的受控入口;当前仅 `快要抢光`,无通用 click |
| `select_sku_options(items)` | `{维度: 值}` | 选中证据 | 按维度精确匹配,找不到抛错 | | `select_sku_options(items)` | TRIAL / ORDER | `{维度: 值}` | 选中证据 | 按维度精确匹配,找不到抛错 |
| `set_quantity(n)` | 数量 | 读回值 | 必须复核等于 n | | `sanitize_evidence(raw_manifest)` | TRIAL / ORDER | 本机隔离目录 manifest | 派生 manifest | 原子发布脱敏派生物;失败不发布,原始内容不进入日志/上传 |
| `read_sku_unit_price(xml)` | 规格面板 XML | 单价或 `None` | **闸门一**;读不到返回 `None`,不猜 | | `read_sku_unit_price(xml)` | TRIAL / ORDER | 脱敏规格面板 XML | 单价或 `None` | **闸门一 / 二**;读不到返回 `None`,不猜 |
| `leave_product()` | - | - | 第一趟结束时退出并释放手机 | | `leave_product()` | TRIAL / ORDER | - | - | 第一趟结束时退出并释放手机 |
| `go_to_order_confirm()` | - | 确认页摘要 | **可能创建订单**,需显式授权 | | `set_quantity(n)` | **仅 ORDER** | 数量 | 读回值 | 必须复核等于 n;TRIAL capability 不暴露 |
| `read_order_confirm_info(xml)` | 页面 XML | 非敏感摘要 | **闸门三**;不提取地址原文、手机号 | | `go_to_order_confirm()` | **仅 ORDER** | - | 确认页摘要 | 需显式授权;TRIAL capability 不暴露 |
| `submit_order(auth, submission)` | 授权 + 已建立的提交围栏 | 提交结果 | **唯一创建真实订单入口**,四条件与围栏全通过后只点一次 | | `read_order_confirm_info(xml)` | **仅 ORDER** | 脱敏页面 XML | 非敏感摘要 | **闸门三**;不提取地址原文、手机号 |
| `submit_order(auth, submission)` | **仅 ORDER** | 授权 + 已建立的提交围栏 | 提交结果 | **唯一创建真实订单入口**,四条件与围栏全通过后只点一次 |
两个不可逆入口: 能力隔离规则:
- `go_to_order_confirm()` 必须校验授权存在;`submit_order()` 还必须校验授权已由服务端围栏 - `go_to_order_confirm()` 必须校验授权存在;`submit_order()` 还必须校验授权已由服务端围栏
且 `submission` 与当前任务、命令、授权完全一致。 且 `submission` 与当前任务、命令、授权完全一致。
- **第一趟的代码路径不得引用这两个函数。** 必须有测试证明试选流程不可达它们。 - 第一趟只能拿到 `TrialSkuFlow` 窄接口,接口中不得出现通用 `click`、`set_quantity()`、
`go_to_order_confirm()`、`submit_order()` 或支付能力;静态依赖测试必须证明试选流程不可达它们。
- `open_trial_sku_panel()` 的点击是唯一批准的购买语义控件例外,只用于打开已取证规格面板;入口
缺失/重复、App 版本不符、面板判据不唯一或出现未知终态控件时停止。其他入口文案不得推断复用。
- `search_by_image()` 属 B 路径,V2 再实现。 - `search_by_image()` 属 B 路径,V2 再实现。
## 四、待实现时确认 ## 四、待实现时确认
+19 -18
View File
@@ -12,7 +12,7 @@
## 当前快照 ## 当前快照
- 日期:2026-08-04 - 日期:2026-08-04
- 阶段:**Phase 1 · 真机可行性(T-103 已在现有安全边界下判定 no-go,当前阻塞)** - 阶段:**Phase 1 · 真机可行性(T-110 已批准受控规格入口,T-103 重新执行)**
- MVP 形态:手工填链接建单 → 批量开始试选 → 定时轮询 → **第一趟试选** → 人工确认 → **第二趟下单** → 待付款 - MVP 形态:手工填链接建单 → 批量开始试选 → 定时轮询 → **第一趟试选** → 人工确认 → **第二趟下单** → 待付款
- 技术栈:已定。采购服务(`admin/`)使用 Go 1.23+ / gin / SQLite;采购工具(`client/`) - 技术栈:已定。采购服务(`admin/`)使用 Go 1.23+ / gin / SQLite;采购工具(`client/`)
使用 Python 3.11+ / uiautomator2 / PySide6。 使用 Python 3.11+ / uiautomator2 / PySide6。
@@ -29,17 +29,17 @@
并且不覆盖低版本环境;成功后打印真实启动命令。 并且不覆盖低版本环境;成功后打印真实启动命令。
- 标准验证路径:`./init.ps1` 已实际跑通 admin 的 mod download / test / vet / build、client 的 - 标准验证路径:`./init.ps1` 已实际跑通 admin 的 mod download / test / vet / build、client 的
editable install / 包导入 / unittest / compileall,以及仓库上下文校验。可单独运行两端命令诊断。 editable install / 包导入 / unittest / compileall,以及仓库上下文校验。可单独运行两端命令诊断。
- 当前 blocker:人工已确认拼多多 8.17.0 的衣服商品只能通过“快要抢光 / 免拼购买 / 单独购买 / - 当前设备门禁:人工已确认拼多多 8.17.0、goods_id `937122477375` 的衣服商品只能通过“快要抢光”
直接拼成”等购买语义入口打开规格面板;这触发 T-103 的显式 no-go 条件。第一趟不得点击进入下单 打开规格面板;T-110 已获项目所有者批准,只把该证据/版本绑定的精确唯一入口作为第一趟可逆导航,
流程的入口,因此不实现选择器、不读取本轮 XML,T-103 转 `BLOCKED`。解除阻塞需要项目所有者先 数量、确认页、提交订单、付款与通用点击能力仍不可达。T-103 下一步先实现原始证据本机隔离和自动
选择新的架构方向并更新安全边界;Phase 2 仍不能抢跑。 脱敏派生物,再重新采集三态证据;在此之前不写页面判据,Phase 2 仍不能抢跑。
## 当前目录要点 ## 当前目录要点
| 路径 | 状态 | 说明 | | 路径 | 状态 | 说明 |
| --- | --- | --- | | --- | --- | --- |
| `docs/` | 已有 | 项目规范化文档,本次已完整生成 | | `docs/` | 已有 | 项目规范化文档,本次已完整生成 |
| `docs/tasks/` | 已有(T-001~T-004、T-005~T-009、T-101~T-103) | T-001~T-004、T-101~T-102 已完成;T-103 因无安全规格入口而阻塞 | | `docs/tasks/` | 已有(T-001~T-004、T-005~T-009、T-101~T-110) | T-001~T-004、T-101~T-102、T-110 已完成;T-103 重新执行 |
| `docs/design/` | 已有(6 个原型) | web 登录 / 建单 / 工作台 / 详情,desk 采购执行 / 配置;均已人工确认 | | `docs/design/` | 已有(6 个原型) | web 登录 / 建单 / 工作台 / 详情,desk 采购执行 / 配置;均已人工确认 |
| `scripts/` | 已有 | 上下文门禁、Vikunja 单向导出与 MCP 启动包装 | | `scripts/` | 已有 | 上下文门禁、Vikunja 单向导出与 MCP 启动包装 |
| `admin/` | 已初始化 | Go 1.23+ / gin / SQLite,含核心模型、迁移与状态机;无真机采购执行 | | `admin/` | 已初始化 | Go 1.23+ / gin / SQLite,含核心模型、迁移与状态机;无真机采购执行 |
@@ -56,8 +56,9 @@
- 已完成:T-002(采购工具 Python 骨架)、T-003(双端统一初始化与验证入口)、 - 已完成:T-002(采购工具 Python 骨架)、T-003(双端统一初始化与验证入口)、
T-004(核心数据模型)、T-101(真机环境盘点与 USB/WiFi 双通道人工验收)、T-102(canonical T-004(核心数据模型)、T-101(真机环境盘点与 USB/WiFi 双通道人工验收)、T-102(canonical
链接打开与目标商品/隐私人工验收)。 链接打开与目标商品/隐私人工验收)。
- T-103 是当前最高优先级和 MVP 生死线,现已因规格面板只有购买语义入口而 `BLOCKED`。架构决策 - 已完成 T-110(第一趟受控规格入口与隐私脱敏边界)。T-103 是当前最高优先级和 MVP 生死线,
完成前不开发依赖真机可读字段的 Phase 2 生产页面。 已补充 T-110 依赖并恢复 `DOING`;自动脱敏派生证据和新真机验收完成前不开发依赖真机可读字段的
Phase 2 生产页面。
- 已确认原型继续只作信息架构依据;原型假数据不调用真实接口、不驱动真机。真机结论改变 - 已确认原型继续只作信息架构依据;原型假数据不调用真实接口、不驱动真机。真机结论改变
可读字段时必须先回修原型与交互清单。 可读字段时必须先回修原型与交互清单。
@@ -136,21 +137,21 @@ D:\Portable\adb\adb.exe devices -l
检查无地址、手机号、支付信息或其他无关隐私;只回报 manifest 路径及截图/XML SHA-256,原始证据 检查无地址、手机号、支付信息或其他无关隐私;只回报 manifest 路径及截图/XML SHA-256,原始证据
不得提交 Git。T-102 已由人确认 goods_id `958756616606` 的目标商品及截图/XML 隐私,并完成验收。 不得提交 Git。T-102 已由人确认 goods_id `958756616606` 的目标商品及截图/XML 隐私,并完成验收。
T-103 的规格面板只读取证命令要求人先在手机上打开**独立且安全的规格/已选入口**,并手工停在待采集 T-103 已确认当前衣服商品只能从精确文案“快要抢光”进入规格面板;T-110 只批准该证据/版本绑定入口,
状态。不得点击或借用「单独购买」「免拼购买」「直接拼成」「现在买」「先用后付」「0 元下单」等购买、 不授权“免拼购买 / 单独购买 / 直接拼成”等其他文案。现有只读取证脚本本身仍不打开面板、不点击或选择
下单或支付入口来打开规格面板;商品没有独立规格入口时必须报告 no-go,不得绕过。脚本本身不打开链接、 规格,也不读取价格;`--state` 只是人工声明,不能作为自动判据。T-103 将先把以下原始目录接入本机
不识别面板、不点击或选择规格,也不读取价格;`--state` 只是人工声明,不能作为自动判据: 确定性脱敏器,再使用派生证据:
```powershell ```powershell
# 仓库根目录;三次采集使用三个全新的 output-dir # 仓库根目录;三次采集使用三个全新的 output-dir
.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial <SERIAL> --url "https://mobile.yangkeduo.com/goods.html?goods_id=<GOODS_ID>" --state initial --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-initial-<GOODS_ID>" --timeout 10 --adb D:\Portable\adb\adb.exe .\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial <SERIAL> --url "https://mobile.yangkeduo.com/goods.html?goods_id=<GOODS_ID>" --state initial --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-initial-<GOODS_ID>\raw" --timeout 10 --adb D:\Portable\adb\adb.exe
.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial <SERIAL> --url "https://mobile.yangkeduo.com/goods.html?goods_id=<GOODS_ID>" --state one-dimension-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-one-dimension-<GOODS_ID>" --timeout 10 --adb D:\Portable\adb\adb.exe .\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial <SERIAL> --url "https://mobile.yangkeduo.com/goods.html?goods_id=<GOODS_ID>" --state one-dimension-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-one-dimension-<GOODS_ID>\raw" --timeout 10 --adb D:\Portable\adb\adb.exe
.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial <SERIAL> --url "https://mobile.yangkeduo.com/goods.html?goods_id=<GOODS_ID>" --state all-dimensions-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-all-dimensions-<GOODS_ID>" --timeout 10 --adb D:\Portable\adb\adb.exe .\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial <SERIAL> --url "https://mobile.yangkeduo.com/goods.html?goods_id=<GOODS_ID>" --state all-dimensions-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-all-dimensions-<GOODS_ID>\raw" --timeout 10 --adb D:\Portable\adb\adb.exe
``` ```
每次成功后,人必须本地核对截图确为所声明状态,并检查截图/XML 不含地址、手机号、支付信息或其他无关 原始 screenshot/XML 可能包含 PDD 固定展示的地址和掩码手机号,只能留在本机 `raw` 目录,不能由
隐私,再只回报三个 manifest 路径、人工选择的精确规格值及面板可见价格文本;原始证据不得提交 Git。 agent、fixture、业务或上传端消费。脱敏器在 sibling `derived` 目录原子发布 screenshot/XML 与 manifest,
三组证据均通过人工检查后,agent 才能读取它们并提取经脱敏的测试 fixture、编写页面判据与精确选择逻辑。 自动复检通过且人确认三态对应性后,agent 才能读取派生物并提取最小 fixture、编写判据。
## 关键背景 ## 关键背景
+41 -29
View File
@@ -2,8 +2,8 @@
id: T-103 id: T-103
title: 验证规格面板精确选择与 SKU 单价 title: 验证规格面板精确选择与 SKU 单价
phase: 1 phase: 1
deps: [T-102] deps: [T-102, T-110]
status: BLOCKED status: DOING
created: 2026-08-04 created: 2026-08-04
vikunja_task_id: 23 vikunja_task_id: 23
context_ref: 1dc8308 context_ref: 1dc8308
@@ -24,35 +24,38 @@ write_paths:
- docs/current-state.md - docs/current-state.md
--- ---
<!-- BEGIN VIKUNJA EXPORT id=23 synced=2026-08-04T02:42:15Z sha256=d9d51a844857a5a9ffecf79c70380a559e3058a8390e14eab653d79af8a4fe7a --> <!-- BEGIN VIKUNJA EXPORT id=23 synced=2026-08-04T02:56:52Z sha256=2f5ce314d8ae55d466abe28d5d3a4c36e235e008af3a4d251b4ea362a4de1314 -->
## 问题 / 背景 ## 问题 / 背景
T-102 已在 PKG110 / Android 16 / 拼多多 8.17.0 上证明 canonical 链接可进入 goods_id `958756616606` 的目标商品,并留下截图/XML。MVP 生死线是第一趟能否在不进入下单流程的前提下打开规格面板、按维度精确选择并从面板读取该 SKU 单价。T-102 截图当前可见底部“单独购买 / 免拼购买”和“先用后付 / 0元下单”文案,这些均属于本任务禁止触碰的购买或资金入口;当前截图视口没有证明存在独立安全规格入口,不能从旧项目或推理补选择器。 T-102 已证明 canonical 链接可进入目标商品。T-103 随后在 PKG110 / Android 16 / 拼多多 8.17.0、衣服商品 goods_id `937122477375` 上确认:规格面板只能从详情页右下角精确文案“快要抢光”进入,面板固定显示收货区域和掩码手机号。T-110 经项目所有者批准,将该已取证点击定义为可逆、能力受限的规格面板导航;这不是通用购买入口豁免,不授权其他文案、数量、确认页、提交订单或支付。
## 关联需求与交互 ## 关联需求与交互
- 功能:F-006 第一趟试选;只覆盖 `open_sku_panel()`、`select_sku_options()`、`read_sku_unit_price()` 的真机 spike。 - 功能:F-006 第一趟试选;覆盖自动脱敏、`open_trial_sku_panel()`、`select_sku_options()`、`read_sku_unit_price()` 的真机 spike。
- 用户故事:US-003、US-004、US-008;本任务无生产 GUI。 - 用户故事:US-003、US-004、US-008;本任务无生产 GUI。
- 架构 / API:`docs/04-architecture.md` 第三、四、六节;`docs/api.md` 第三节设备自动化边界;T-104、T-105 与 Phase 2 的前置。 - 架构 / API:`docs/04-architecture.md` 第三、四、5.4、六节;`docs/api.md` 证据上传和 `TrialSkuFlow`;T-104、T-105 与 Phase 2 的前置。
## 方案 ## 方案
1. 先执行证据门禁,后写页面判据。由人把手机停在同一商品的详情页,手工寻找并只通过独立的“规格 / 已选”等非购买入口打开规格面板;不得点击“单独购买”“免拼购买”“直接拼成”“现在买”“先用后付”“0元下单”或任何购买/下单入口。若拼多多 8.17.0 与当前商品没有独立安全规格入口,记录 no-go 并停止,不能为了跑通放宽第一趟边界。 1. 先实现本机确定性脱敏器,不先写页面判据。原始 screenshot/XML 只保存到 `%LOCALAPPDATA%\cmbuyer\artifacts\T-103\...\raw`,只允许脱敏器消费;agent、fixture、业务、日志、HTTP sink、Vikunja 与 Git 均不得读取/上传原始内容。
2. 人在规格面板初始态、手工选择一个维度后、全部维度选中后三个状态分别用现有只读取证能力保存 screenshot/XML;记录 goods_id、PKG110、Android 16、拼多多 8.17.0、路径与 SHA-256,并完成隐私检查。商品应具有 `颜色分类` 与 `尺码` 两个维度;当前商品不满足时由人另选 canonical 链接并记录。原始证据只留 `%LOCALAPPDATA%`。 2. 脱敏器绑定 PKG110 分辨率、拼多多 8.17.0、goods_id、人工声明状态和本项目证据配置,同时从 screenshot/XML 移除收货区域、地址与手机号内容,在 sibling `derived` 目录原子发布派生物。派生 XML 仍命中手机号模式、隐私区域无法确认、结构/分辨率/版本失配、哈希不一致或目标目录存在时 fail closed,不发布半成品。服务端只接收派生截图哈希和 sanitizer 版本,不接收原始文件/哈希/路径/XML。
3. 主 agent 只在上述证据完成且经人确认隐私后分析 XML,提取最小、脱敏 fixture,并把每条面板入口、维度容器、选项、选中态和价格判据绑定到证据哈希与 PDD 8.17.0;不得复用 cmroubao/cmpdd 的节点、Activity、文本常量或结论。 3. 由人运行脱敏器并本地确认派生 screenshot/XML 的 initial、one-dimension-selected、all-dimensions-selected 三态对应性;主 agent 只在派生 manifest 与人工确认齐全后读取派生证据,提取最小 fixture。首轮 `initial` 详情页截图与含隐私面板截图不得复用为 fixture。
4. 实现安全的规格面板边界:版本必须精确为 8.17.0;只允许点击证据证明的独立规格入口及规格面板内选项。按维度容器隔离候选,文本等值匹配并读回选中态;缺失、重复、禁用、维度不明或选中态不唯一均停止,不点击相近项。纯函数测试必须覆盖 `红`/`粉红`、`1`/`10` 等前缀碰撞,即使真实商品未恰好包含该组合。 4. 实现 `TrialSkuFlow` 窄 capability。`open_trial_sku_panel()` 只允许拼多多 8.17.0、goods_id `937122477375` 上证据绑定、精确唯一的 `快要抢光`;缺失、重复、版本失配或打开后面板判据不唯一时零后续点击。`免拼购买 / 单独购买 / 直接拼成` 等其他文案必须分别取证,不能包含、前缀、同义、OCR 或坐标兜底。
5. 单价只从规格面板证据确定的节点读取,以十进制字符串返回,禁止浮点。必须记录实际文本是否含“券后”、货币符号是否拆节点、是否同时出现原价/区间价;语义不唯一、节点缺失、多个候选冲突或只能从详情页读到时返回 unreadable 并转人工,不用其他数字补。 5. 第一趟 capability 只含打开商品、受控打开面板、在维度容器内精确选择、读面板单价、脱敏取证和返回。接口不得暴露通用 `click`、`set_quantity()`、`go_to_order_confirm()`、`submit_order()` 或支付能力;规格面板中的“提交订单”、微信支付、先用后付和 0 元下单只作为硬拒绝判据,静态调用链测试证明不可达。
6. 提供离线 mock/fixture 测试与受限真机 spike CLI。第一趟模块不得导入或引用数量、订单确认、提交订单、付款函数;测试证明找不到精确值时零点击、价格不可读时停止、购买/资金入口永不可达。由人最终执行真机脚本并确认实际选中颜色/尺码与面板单价、截图/XML 隐私;agent 始终保持 DOING。 6. 在脱敏派生 XML 上按维度容器隔离候选,文本等值匹配并读回选中态;缺失、重复、禁用、维度不明或选中态不唯一均停止。纯函数测试覆盖 `红`/`粉红`、`1`/`10` 等前缀碰撞。
7. 单价只从规格面板证据确定的唯一节点读取,以十进制字符串返回,禁止浮点。记录真实文本是否含优惠前缀、货币符号是否拆节点、是否并列原价/区间价;语义不唯一、节点缺失、候选冲突或只能从详情页读取时返回 unreadable。
8. 人最终在真机执行受控入口、精确选择和读价脚本,确认实际选择 `颜色分类=黑色 CHA(纯棉)`、`尺码=M(建议100-115)`(以派生 XML 精确文本为准)、面板单价语义、派生证据隐私与退出行为;agent 保持 DOING 直到人工验收。
## 验收要点 ## 验收要点
- 证据先行:任务执行记录先出现规格面板三态的设备/App/goods_id/路径/SHA-256 与人工隐私结论,之后才允许出现页面判据代码。 - 三组原始证据仅在本机 raw 目录;脱敏器离线测试覆盖地址/手机号移除、截图与 XML 同步处理、版本/分辨率/结构失配、手机号残留、原子性、异常脱敏和已有目录不覆盖。
- 拼多多 8.17.0 上仅通过独立安全规格入口打开面板;若只能通过购买入口打开,则明确判定 MVP 当前边界下不可行,不写兜底点击。 - 派生 manifest 记录 source/derived 本机哈希、sanitizer 版本、设备/App/goods_id/人工状态;原始页面正文、serial、地址和手机号不进入 manifest、日志、错误或上传。
- `颜色分类=X`、`尺码=Y` 在各自维度内精确唯一匹配并读回;前缀碰撞、缺失、重复、禁用和选中态不唯一均 fail closed。 - 只从人工验收通过的派生证据编写页面判据与最小 fixture;判据绑定拼多多 8.17.0 和证据哈希。
- 从规格面板可靠读取选中 SKU 单价并记录真实文本语义;无法区分券后价、原价、区间价或节点拆分时返回 unreadable。 - `快要抢光` 精确唯一时才打开面板;其他文案、入口缺失/重复、面板不唯一、规格缺失/碰撞/禁用、价格不唯一均 fail closed。
- 测试证明 T-103 路径不点击任何购买/下单/支付入口,不引用 `set_quantity()`、`go_to_order_confirm()`、`submit_order()` 或支付动作。 - 静态 API/导入测试证明 T-103 第一趟无通用点击、数量、确认页、提交订单或支付能力,“提交订单”及资金控件不可达。
- 从规格面板可靠读取选中 SKU 单价为十进制字符串;无法唯一解释优惠价/原价/区间价时返回 unreadable。
- client 全部单测、compileall、wheel metadata、上下文校验、完整 `init.ps1` 与 diff-check 通过。 - client 全部单测、compileall、wheel metadata、上下文校验、完整 `init.ps1` 与 diff-check 通过。
- `needs_device=true`:只有人完成安全入口、精确选择、单价读取、页面对应性和隐私验收后才能 DONE。 - `needs_device=true`:只有人完成受控入口、精确选择、单价读取、派生证据对应性/隐私和安全退出验收后才能 DONE。
## 执行记录 ## 执行记录
@@ -87,17 +90,21 @@ T-102 已在 PKG110 / Android 16 / 拼多多 8.17.0 上证明 canonical 链接
- 这直接触发任务方案与边界中的 no-go 条件:第一趟不得点击任何购买、下单、提交或资金入口,也不得把购买按钮包装成规格入口。 - 这直接触发任务方案与边界中的 no-go 条件:第一趟不得点击任何购买、下单、提交或资金入口,也不得把购买按钮包装成规格入口。
- 因此不读取本轮 XML、不提取 fixture、不实现选择器;已有截图仅用于判定入口不可行,原始证据不提交 Git。 - 因此不读取本轮 XML、不提取 fixture、不实现选择器;已有截图仅用于判定入口不可行,原始证据不提交 Git。
- 当前 MVP 的自动第一趟试选在现有安全边界下不可实现,T-103 转 BLOCKED。解除阻塞需要项目所有者选择新的架构方向,并先更新架构/任务边界;不得由 agent 擅自放宽。 - 当前 MVP 的自动第一趟试选在现有安全边界下不可实现,T-103 转 BLOCKED。解除阻塞需要项目所有者选择新的架构方向,并先更新架构/任务边界;不得由 agent 擅自放宽。
### 2026-08-04T02:56:36Z · ila
2026-08-04:T-110 已获项目所有者授权并同步架构契约。T-103 方案已重写为“先自动脱敏派生证据,再实现受控 `快要抢光` 入口与精确规格/价格判据”;T-110 完成并转 Done 后,本任务恢复 Doing。
<!-- END VIKUNJA EXPORT --> <!-- END VIKUNJA EXPORT -->
## 边界 ## 边界
- 任何规格面板入口、维度容器、选项、选中态和价格判据都必须来自本项目新采集且已由人完成 - 任何规格面板入口、维度容器、选项、选中态和价格判据都必须来自本项目新采集、自动复检通过的
隐私检查的拼多多 8.17.0 screenshot/XML;T-102 详情页证据只能证明已到目标商品,不能证明 拼多多 8.17.0 **脱敏派生** screenshot/XML;T-102 详情页证据只能证明已到目标商品,不能证明
规格面板结构。证据路径、SHA-256、goods_id、设备、Android 与 App 版本写入执行记录之前, 规格面板结构。派生证据路径、SHA-256、goods_id、设备、Android、App 与 sanitizer 版本写入
不得提交页面判据代码。 执行记录之前,不得提交页面判据代码。
- 第一趟绝不点击“单独购买”“免拼购买”“直接拼成”“现在买”“先用后付”“0元下单”或任何 - 第一趟只允许 T-110 批准的 `open_trial_sku_panel()` 窄能力点击证据/版本绑定、精确唯一的
购买、下单、提交、付款入口。只有真机证据证明存在独立的“规格 / 已选”等非购买入口时才允许 `快要抢光`;当前事实仅覆盖 goods_id `937122477375`、拼多多 `8.17.0`。不得把“免拼购买 /
自动打开面板;没有安全入口即判定 no-go 并停止,不能把购买按钮改名包装成规格入口。 单独购买 / 直接拼成”等其他文案加入包含、前缀、同义或坐标兜底,分别取证前一律拒绝。
- 规格选项只能在已确认的面板及对应维度容器内按文本精确唯一匹配;缺失、重复、禁用、维度不明、 - 规格选项只能在已确认的面板及对应维度容器内按文本精确唯一匹配;缺失、重复、禁用、维度不明、
选中态无法唯一读回或页面版本不符均 fail closed。不得前缀、包含、模糊、相似或跨维度匹配, 选中态无法唯一读回或页面版本不符均 fail closed。不得前缀、包含、模糊、相似或跨维度匹配,
不得用 OCR / 坐标兜底猜选项。 不得用 OCR / 坐标兜底猜选项。
@@ -105,10 +112,15 @@ T-102 已在 PKG110 / Android 16 / 拼多多 8.17.0 上证明 canonical 链接
搜索卡片或其他页面的数字补值。券后价、原价、区间价、货币符号拆分或多个候选的语义无法唯一 搜索卡片或其他页面的数字补值。券后价、原价、区间价、货币符号拆分或多个候选的语义无法唯一
证明时必须返回 unreadable 并转人工。 证明时必须返回 unreadable 并转人工。
- T-103 代码路径不得引用或实现 `set_quantity()`、`go_to_order_confirm()`、`submit_order()`、 - T-103 代码路径不得引用或实现 `set_quantity()`、`go_to_order_confirm()`、`submit_order()`、
创建订单、授权、提交围栏或任何支付能力;不得进入订单确认页,不得创建待付款订单。 通用 `click`、创建订单、授权、提交围栏或任何支付能力;不得进入订单确认页,不得创建待付款订单。
规格面板中的“提交订单”、微信支付、先用后付、0 元下单只可作为硬拒绝判据,不能返回可点击对象。
- 不把 `/mnt/d/chengma/cmroubao`、`/mnt/d/chengma/cmpdd` 或任何旧版本的节点、Activity、选择器、 - 不把 `/mnt/d/chengma/cmroubao`、`/mnt/d/chengma/cmpdd` 或任何旧版本的节点、Activity、选择器、
坐标、文本形态和页面结论当作事实;前序项目只可用于理解为什么必须 fail closed。 坐标、文本形态和页面结论当作事实;前序项目只可用于理解为什么必须 fail closed。
- 原始 screenshot/XML 只保存在 `%LOCALAPPDATA%\cmbuyer\artifacts\T-103`,不得提交 Git 或 Vikunja; - 原始 screenshot/XML 只保存在 `%LOCALAPPDATA%\cmbuyer\artifacts\T-103\...\raw`,只允许本机
只有最小脱敏 fixture、路径、SHA-256 与非敏感结论可入库。未由人确认隐私前 agent 不读取原始证据。 确定性脱敏器消费,不得由 agent、业务、fixture、HTTP sink、Vikunja 或 Git 读取/上传。脱敏器必须
校验设备分辨率、页面/App 版本和预期隐私区域,同时移除 screenshot/XML 中的地址与手机号内容;
派生 XML 仍命中手机号模式、结构/版本/分辨率失配或哈希不一致时不得发布 `derived`。
- 只有自动复检通过的最小脱敏 fixture、派生路径/哈希、sanitizer 版本与非敏感结论可入库;服务端
不接收原始文件、原始路径或原始哈希。
- `needs_device: true`:agent 只能完成离线实现并保持 `DOING`;只有人完成安全入口、精确规格选择、 - `needs_device: true`:agent 只能完成离线实现并保持 `DOING`;只有人完成安全入口、精确规格选择、
SKU 单价语义、页面对应性与隐私验收后才能标 `DONE`。 SKU 单价语义、页面对应性与派生证据验收后才能标 `DONE`。
+12 -2
View File
@@ -3,7 +3,7 @@ id: T-110
title: 调整第一趟受控规格入口与隐私脱敏边界 title: 调整第一趟受控规格入口与隐私脱敏边界
phase: 1 phase: 1
deps: [T-102] deps: [T-102]
status: DOING status: DONE
created: 2026-08-04 created: 2026-08-04
vikunja_task_id: 24 vikunja_task_id: 24
context_ref: abeefbb context_ref: abeefbb
@@ -21,7 +21,7 @@ write_paths:
- docs/current-state.md - docs/current-state.md
--- ---
<!-- BEGIN VIKUNJA EXPORT id=24 synced=2026-08-04T02:49:01Z sha256=11514e934382208eaf97934c91f0820427db8a87fddd4eb31c15c8b3b6fe4695 --> <!-- BEGIN VIKUNJA EXPORT id=24 synced=2026-08-04T02:58:59Z sha256=8145a304e810ace55879b5053b8730a512ef13dcb8d85a727e86dd94e461bdae -->
## 问题 / 背景 ## 问题 / 背景
T-103 在 PKG110 / Android 16 / 拼多多 8.17.0 真机确认:衣服商品 goods_id `937122477375` 的规格面板只能从详情页右下角“快要抢光”等购买语义按钮进入,不存在原架构假设的独立“规格 / 已选”入口。与此同时,规格面板固定展示收货区域与掩码手机号。项目所有者已批准调整第一趟入口边界,但“不付款、第一趟不可达提交订单、价格只从规格面板读取、敏感信息不进入业务数据/日志/上传/Git”等边界不变。 T-103 在 PKG110 / Android 16 / 拼多多 8.17.0 真机确认:衣服商品 goods_id `937122477375` 的规格面板只能从详情页右下角“快要抢光”等购买语义按钮进入,不存在原架构假设的独立“规格 / 已选”入口。与此同时,规格面板固定展示收货区域与掩码手机号。项目所有者已批准调整第一趟入口边界,但“不付款、第一趟不可达提交订单、价格只从规格面板读取、敏感信息不进入业务数据/日志/上传/Git”等边界不变。
@@ -54,6 +54,16 @@ T-103 在 PKG110 / Android 16 / 拼多多 8.17.0 真机确认:衣服商品 goo
### 2026-08-04T02:48:25Z · ila ### 2026-08-04T02:48:25Z · ila
2026-08-04:项目所有者明确批准受控规格面板入口方案;PDD 页面不可避免显示地址/手机号的事实被接受,但系统仍按本机原始证据隔离、自动脱敏派生物消费的方式收紧传播边界。任务已认领,分支 `task/t-110-trial-sku-boundary`,基线 `abeefbb`。 2026-08-04:项目所有者明确批准受控规格面板入口方案;PDD 页面不可避免显示地址/手机号的事实被接受,但系统仍按本机原始证据隔离、自动脱敏派生物消费的方式收紧传播边界。任务已认领,分支 `task/t-110-trial-sku-boundary`,基线 `abeefbb`。
### 2026-08-04T02:58:44Z · ila
2026-08-04 完成记录:
- 已同步 `docs/02-requirements.md`、`03-tech-stack.md`、`04-architecture.md`、`05-coding-rules.md`、`api.md`、`current-state.md` 与 T-103。
- 第一趟只批准证据/版本绑定、精确唯一的 `快要抢光`;其他购买文案不泛化。`TrialSkuFlow` 不暴露通用点击、数量、确认页、提交订单或支付能力。
- 原始 screenshot/XML 只留本机隔离目录;服务端只接收自动复检通过的派生截图哈希与 sanitizer 版本,不接收原始文件、哈希、路径或 XML。
- Phase 1 已拆分第一趟规格 spike 与第二趟数量/确认页 spike;T-103 已增加 T-110 依赖并按新边界恢复 DOING。
- `validate_agent_context.py` 与 `git diff --check` 通过;本任务没有实现或运行任何真机点击代码。
<!-- END VIKUNJA EXPORT --> <!-- END VIKUNJA EXPORT -->
## 边界 ## 边界