docs: align Gate2 with quantity total evidence

This commit is contained in:
QiuSW
2026-08-06 09:13:13 +08:00
parent e18f7983fd
commit 1d726dd364
12 changed files with 115 additions and 56 deletions
+17 -11
View File
@@ -81,9 +81,9 @@ MVP 只做任务自带商品链接的 A 路径。创建任务与开始采购分
│ 3. 按维度精确选择并读回颜色、尺码
│ 4. 【闸门一】读 SKU 单价;单价×数量不得超过最高总价
│ 5. 设置数量并精确读回
│ 6. 【闸门二】重读规格与单价;规格不变且价格等于闸门一
│ 6. 【闸门二】重读规格、数量与面板总额;总额不超最高总价
│ 7. 进入订单确认页
│ 8. 【闸门三】规格/数量一致,应付总额不超最高总价
│ 8. 【闸门三】规格/数量一致,应付总额等于闸门二且不超最高总价
│ 9. 上传验证摘要并申请服务端提交围栏
│ 10. 仅在 click_permitted=true 且提交控件唯一时点击一次
│ 11. 回传观察结果;不确定时只调和,不重试
@@ -135,14 +135,20 @@ T-103 最新真机证据表明:拼多多 `8.17.0`、goods_id `937122477375`、
| 闸门 | 当前页面 | 判据 | 拒绝条件 |
| --- | --- | --- | --- |
| 一 | 规格面板,选中目标规格后 | 单价唯一可读;`单价 × 授权数量 <= 最高总价` | 不可读、有歧义或超上限 |
| 二 | 规格面板,数量读回后 | 颜色、尺码仍正确;重读单价与闸门一完全相等 | 规格漂移或价格变化 |
| 三 | 订单确认页 | 规格、数量正确;应付总额唯一可读且不超最高总价 | 任一不一致、不可读或超上限 |
| 二 | 规格面板,数量读回后 | 颜色、尺码仍正确;目标数量面板总额唯一可读且不超最高总价 | 规格/数量漂移、总额不可读/有歧义或超上限 |
| 三 | 订单确认页 | 规格、数量正确;应付总额唯一可读、严格等于闸门二且不超最高总价 | 任一不一致、不可读、有歧义或超上限 |
金额一律使用十进制字符串和十进制定点运算,不用浮点数。价格只从规格面板和订单确认页读取;
详情正文、搜索卡片、底部购买/提交按钮的数字不作为价格来源。
闸门一与闸门二发生在同一设备会话中。它们用于发现选择或设置数量造成的页面变化,不需要管理员
在中间确认。旧截图、缓存值和发布前 dry-run 都不能替代这次实时读取。
2026-08-06 的拼多多 `8.17.0` 真机证据证明同一规格的多件优惠是非线性的:数量 1 时规格面板顶部
当前金额为 `12.88`,数量 2 时变为 `32.76`,而不是 `12.88 × 2`。因此闸门一仍是设置数量前的单价
预检,闸门二必须读取设置后的**面板总额** `gate2_panel_total_price` 并直接比较最高总价;不得把
Gate1 乘数量、不得要求 Gate2 等于 Gate1,也不得把底部“提交订单 ¥...”金额作为价格候选或兜底。
Gate3 再要求确认页应付总额与 Gate2 面板总额严格相等,这比只检查上限多一道跨页防漂移约束。
闸门一与闸门二发生在同一设备会话中,不需要管理员在中间确认。旧截图、缓存值和发布前 dry-run
都不能替代这次实时读取。
### B 路径(V2)
@@ -176,8 +182,8 @@ T-103 最新真机证据表明:拼多多 `8.17.0`、goods_id `937122477375`、
1. **一次性授权有效且服务端提交围栏已建立**:围栏把授权、任务、领取和本次验证摘要原子绑定到
唯一 `order_submission`;明确响应包含 `click_permitted=true`。
2. **闸门二通过**:目标规格未漂移,第二次规格面板单价等于第一次。
3. **闸门三通过**:确认页规格、数量正确,应付总额不超过授权最高总价。
2. **闸门二通过**:目标规格和数量未漂移,目标数量面板总额唯一可读且不超过授权最高总价。
3. **闸门三通过**:确认页规格、数量正确,应付总额严格等于闸门二面板总额,且不超过授权最高总价。
4. **提交控件唯一**:文本精确等于“提交订单”,可点击祖先唯一。
围栏请求超时、断网、冲突或响应不明时不得点击。围栏建立后:
@@ -246,7 +252,7 @@ CREATE TABLE purchase_attempts (
claim_generation INTEGER NOT NULL,
status TEXT NOT NULL,
gate1_unit_price TEXT,
gate2_unit_price TEXT,
gate2_panel_total_price TEXT,
quantity_read INTEGER,
confirm_amount TEXT,
failure_code TEXT,
@@ -296,7 +302,7 @@ CREATE TABLE order_submissions (
attempt_id TEXT NOT NULL REFERENCES purchase_attempts(id),
status TEXT NOT NULL, -- FENCED | SUBMITTED | RECONCILIATION_REQUIRED | MANUAL_RESOLVED
gate1_unit_price TEXT NOT NULL,
gate2_unit_price TEXT NOT NULL,
gate2_panel_total_price TEXT NOT NULL,
quantity_read INTEGER NOT NULL,
confirm_amount TEXT NOT NULL,
created_at TEXT NOT NULL,
@@ -458,7 +464,7 @@ DRAFT / PENDING / NEEDS_MANUAL ─管理员取消(围栏前)→ CANCELED
| 页面结构随版本变化 | 旧选择器误点新页面 | 每条判据先真机取证,记录 App 版本、截图、XML、goods_id |
| 购买语义入口才打开面板 | 能力范围易扩散 | 只批准证据绑定的精确唯一入口;每种文案单独取证 |
| 当前价与原价/按钮价混杂 | 读错价格 | 限定已取证结构和语义;价格只在面板/确认页读,歧义即停 |
| 单趟页面状态变化 | 数量或促销导致价格变化 | 同一趟两次读规格面板价,再以确认页总额兜底 |
| 单趟页面状态变化 | 数量或促销导致金额非线性变化 | 同一趟读 Gate1 单价与 Gate2 面板总额,再要求确认页总额与 Gate2 严格相等 |
| WiFi ADB / 双通道 | 断连或操作错设备 | serial 必填;USB/WiFi 同设备或身份不明时 fail closed |
| 不可逆动作超时 | 可能已创建订单 | 服务端围栏 + 点击一次 + 只调和,不重试 |
| 双端契约漂移 | 静默不兼容 | [api.md](api.md) 唯一权威;契约改动跑完整双端门禁 |