diff --git a/docs/03-tech-stack.md b/docs/03-tech-stack.md index 48a8903..fcd8365 100644 --- a/docs/03-tech-stack.md +++ b/docs/03-tech-stack.md @@ -129,20 +129,24 @@ D:\Portable\adb\adb.exe devices -l `client/scripts/capture_sku_panel_spike.py` 只采集人已在手机上准备好的规格面板截图和完整 XML。 它不打开链接或规格面板,不识别面板,不点击、滑动、输入或选择规格,也不读取价格;接口只暴露 -`app_info`、`app_current` 和两个只读 JSON-RPC 方法。`initial`、`one-dimension-selected`、 -`all-dimensions-selected` 三种值写入 manifest 的字段名是 `human_declared_state`,明确表示人工声明, -不得将其当作自动识别结果。运行拼多多版本必须精确为 `8.17.0`,前台 package 必须是拼多多,否则 -fail closed;目标目录已存在、截图/XML 无效或超时均不得覆盖已有内容或发布半成品。 +`app_info`、`app_current` 和两个只读 JSON-RPC 方法。`panel-opened-target-preselected`、 +`alternate-all-dimensions-selected`、`target-selection-restored` 三种值写入 manifest 的字段名是 +`human_declared_state`,明确表示人工声明,不得将其当作自动识别结果。旧的“未选 / 单维度 / 全选” +状态假设已被真机事实推翻,旧枚举会被采集器和脱敏器明确拒绝。运行拼多多版本必须精确为 `8.17.0`, +前台 package 必须是拼多多,否则 fail closed;目标目录已存在、截图/XML 无效或超时均不得覆盖已有内容 +或发布半成品。 T-103 已证明当前衣服商品没有独立「规格/已选」入口。T-110 只批准拼多多 `8.17.0`、goods_id `937122477375` 上经真机确认的精确唯一 `快要抢光` 作为可逆的受控规格面板入口;“免拼购买 / 单独购买 / -直接拼成”等其他文案不能凭人工经验复用,必须分别重新取证。只读取证 CLI 本身仍不执行点击;三种状态 +直接拼成”等其他文案不能凭人工经验复用,必须分别重新取证。项目所有者已确认面板刚打开时目标颜色 +“黑色CHA(纯棉)”和尺码“M(建议100-115)”均已自动选中;取证不强行取消选择,而是记录刚打开状态、 +人工把两个维度都改成非目标值、再恢复目标值三个真实状态。只读取证 CLI 本身仍不执行点击;三种状态 分别使用一个全新原始证据目录: ```powershell -.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial --url "https://mobile.yangkeduo.com/goods.html?goods_id=" --state initial --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-initial-\raw" --timeout 10 --adb D:\Portable\adb\adb.exe -.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial --url "https://mobile.yangkeduo.com/goods.html?goods_id=" --state one-dimension-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-one-dimension-\raw" --timeout 10 --adb D:\Portable\adb\adb.exe -.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial --url "https://mobile.yangkeduo.com/goods.html?goods_id=" --state all-dimensions-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-all-dimensions-\raw" --timeout 10 --adb D:\Portable\adb\adb.exe +.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial --url "https://mobile.yangkeduo.com/goods.html?goods_id=" --state panel-opened-target-preselected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-opened-target--v2\raw" --timeout 10 --adb D:\Portable\adb\adb.exe +.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial --url "https://mobile.yangkeduo.com/goods.html?goods_id=" --state alternate-all-dimensions-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-alternate--v2\raw" --timeout 10 --adb D:\Portable\adb\adb.exe +.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial --url "https://mobile.yangkeduo.com/goods.html?goods_id=" --state target-selection-restored --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-target-restored--v2\raw" --timeout 10 --adb D:\Portable\adb\adb.exe ``` PDD 规格面板不可避免显示收货区域和掩码手机号。原始截图/XML 只能留在 @@ -163,7 +167,7 @@ PKG110 / Android 16 / 拼多多 8.17.0 / goods_id `937122477375` / 1080×2400, `privacy_tier=SANITIZED`、sanitizer 版本、清理计数及本机 source/derived 哈希,不记录原始路径、serial 或页面正文。只有自动复检通过并经人确认状态对应性的派生物,agent 才能读取并提取最小 fixture、编写判据。 -2026-08-04 的首轮证据只用于确认上述入口事实;其中 `initial` 不是规格面板,另两张原始截图含隐私 +2026-08-04 的首轮旧证据只用于确认上述入口事实;其中旧 `initial` 不是规格面板,另两张原始截图含隐私 区域,因此 XML 未读取、fixture 与选择器未生成。T-110 完成受控入口与脱敏契约后,T-103 重新取证; 该边界调整不授权第一趟调整数量、进入确认页、点击“提交订单”或触碰任何支付控件。 diff --git a/docs/current-state.md b/docs/current-state.md index 57b00e2..afdf1a2 100644 --- a/docs/current-state.md +++ b/docs/current-state.md @@ -21,7 +21,7 @@ `client/` 已有 Python 包、PySide6 最小入口、运行目录与日志脱敏策略,以及显式 serial 的 ADB 连接边界、本地基线取证 CLI、受限商品链接打开取证 CLI、人工声明规格面板状态的只读取证 CLI, 以及绑定 PKG110 / Android 16 / 拼多多 8.17.0 的规格证据确定性脱敏 CLI;尚无规格选择、价格读取或下单流程 -- 测试:采购服务已覆盖健康检查、核心模型、迁移与状态机等离线包级测试;采购工具 66 项离线单元测试 +- 测试:采购服务已覆盖健康检查、核心模型、迁移与状态机等离线包级测试;采购工具 67 项离线单元测试 (全部 mock,不连接真机) - 数据:SQLite 核心表与迁移已落成;无业务实例数据 - 标准启动路径:Windows PowerShell 运行 `./init.ps1`,Unix shell 运行 `./init.sh`。Windows 入口 @@ -32,8 +32,9 @@ - 当前设备门禁:人工已确认拼多多 8.17.0、goods_id `937122477375` 的衣服商品只能通过“快要抢光” 打开规格面板;T-110 已获项目所有者批准,只把该证据/版本绑定的精确唯一入口作为第一趟可逆导航, 数量、确认页、提交订单、付款与通用点击能力仍不可达。T-103 的原始证据本机隔离与确定性脱敏器 - 已完成离线实现;下一步重新采集三态 raw 并由人只核对 derived。在派生证据验收前不写页面判据, - Phase 2 仍不能抢跑。 + 已完成离线实现;人工确认面板刚打开时目标颜色和尺码已经自动选中,取证三态已据此修正。下一步 + 采集“刚打开目标预选 / 两维度改为非目标 / 两维度恢复目标”的 raw 并由人只核对 derived。在派生 + 证据验收前不写页面判据,Phase 2 仍不能抢跑。 ## 当前目录要点 @@ -140,28 +141,30 @@ D:\Portable\adb\adb.exe devices -l T-103 已确认当前衣服商品只能从精确文案“快要抢光”进入规格面板;T-110 只批准该证据/版本绑定入口, 不授权“免拼购买 / 单独购买 / 直接拼成”等其他文案。现有只读取证脚本本身仍不打开面板、不点击或选择 -规格,也不读取价格;`--state` 只是人工声明,不能作为自动判据。人先手工通过精确“快要抢光”进入 -面板并准备对应状态,再把三组原始证据采集到全新 `raw` 目录: +规格,也不读取价格;`--state` 只是人工声明,不能作为自动判据。面板刚打开时目标颜色 +“黑色CHA(纯棉)”与尺码“M(建议100-115)”已经自动选中,不强行取消。人依次准备刚打开目标预选、 +颜色和尺码均为非目标值、再恢复目标值三个状态,并分别采集到全新 `raw` 目录: ```powershell # 仓库根目录;三次采集使用三个全新的 output-dir -.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial --url "https://mobile.yangkeduo.com/goods.html?goods_id=" --state initial --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-initial-\raw" --timeout 10 --adb D:\Portable\adb\adb.exe -.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial --url "https://mobile.yangkeduo.com/goods.html?goods_id=" --state one-dimension-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-one-dimension-\raw" --timeout 10 --adb D:\Portable\adb\adb.exe -.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial --url "https://mobile.yangkeduo.com/goods.html?goods_id=" --state all-dimensions-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-all-dimensions-\raw" --timeout 10 --adb D:\Portable\adb\adb.exe +.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial --url "https://mobile.yangkeduo.com/goods.html?goods_id=" --state panel-opened-target-preselected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-opened-target--v2\raw" --timeout 10 --adb D:\Portable\adb\adb.exe +.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial --url "https://mobile.yangkeduo.com/goods.html?goods_id=" --state alternate-all-dimensions-selected --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-alternate--v2\raw" --timeout 10 --adb D:\Portable\adb\adb.exe +.\client\.venv\Scripts\python.exe client\scripts\capture_sku_panel_spike.py --serial --url "https://mobile.yangkeduo.com/goods.html?goods_id=" --state target-selection-restored --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-target-restored--v2\raw" --timeout 10 --adb D:\Portable\adb\adb.exe ``` 每组 raw 采集成功后分别运行离线脱敏器;`derived` 必须尚不存在: ```powershell -.\client\.venv\Scripts\python.exe client\scripts\sanitize_sku_panel_evidence.py --raw-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-initial-\raw" --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-initial-\derived" -.\client\.venv\Scripts\python.exe client\scripts\sanitize_sku_panel_evidence.py --raw-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-one-dimension-\raw" --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-one-dimension-\derived" -.\client\.venv\Scripts\python.exe client\scripts\sanitize_sku_panel_evidence.py --raw-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-all-dimensions-\raw" --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-all-dimensions-\derived" +.\client\.venv\Scripts\python.exe client\scripts\sanitize_sku_panel_evidence.py --raw-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-opened-target--v2\raw" --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-opened-target--v2\derived" +.\client\.venv\Scripts\python.exe client\scripts\sanitize_sku_panel_evidence.py --raw-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-alternate--v2\raw" --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-alternate--v2\derived" +.\client\.venv\Scripts\python.exe client\scripts\sanitize_sku_panel_evidence.py --raw-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-target-restored--v2\raw" --output-dir "$env:LOCALAPPDATA\cmbuyer\artifacts\T-103\sku-panel-target-restored--v2\derived" ``` 原始 screenshot/XML 可能包含 PDD 固定展示的地址和掩码手机号,只能留在本机 `raw` 目录,不能由 agent、fixture、业务或上传端消费。脱敏器会校验源哈希、设备/App/商品/分辨率与隐私结构,在 sibling `derived` 目录原子发布 screenshot/XML 与 manifest;任何不匹配、手机号残留或已有目标均拒绝发布。 自动复检通过且人确认三态对应性后,agent 才能读取派生物并提取最小 fixture、编写判据。 +人工确认中还必须记录中间态实际选择的非目标颜色和尺码,不能只写“已切换”。 ## 关键背景 diff --git a/docs/tasks/T-103.md b/docs/tasks/T-103.md index 995ffdc..9fe558c 100644 --- a/docs/tasks/T-103.md +++ b/docs/tasks/T-103.md @@ -25,7 +25,7 @@ write_paths: - docs/current-state.md --- - + ## 问题 / 背景 T-102 已证明 canonical 链接可进入目标商品。T-103 随后在 PKG110 / Android 16 / 拼多多 8.17.0、衣服商品 goods_id `937122477375` 上确认:规格面板只能从详情页右下角精确文案“快要抢光”进入,面板固定显示收货区域和掩码手机号。T-110 经项目所有者批准,将该已取证点击定义为可逆、能力受限的规格面板导航;这不是通用购买入口豁免,不授权其他文案、数量、确认页、提交订单或支付。 项目所有者随后确认,面板刚打开时已自动选中目标颜色“黑色CHA(纯棉)”和尺码“M(建议100-115)”;因此本任务不再假设存在“未选择”或“只选择一个维度”的初始状态。 @@ -111,6 +111,10 @@ T-102 已证明 canonical 链接可进入目标商品。T-103 随后在 PKG110 / ### 2026-08-04T03:34:47Z · ila 项目所有者确认:规格面板刚打开时已自动选中目标颜色“黑色CHA(纯棉)”与尺码“M(建议100-115)”。旧的未选择/单维度/全选三态假设失效;T-103 改为记录刚打开目标预选、两个维度改为非目标值、两个维度恢复目标值三态。修改 CLI 状态枚举与测试前不再采集旧状态。 + +### 2026-08-04T03:40:39Z · ila + +T-103 新三态离线实现与主审:提交 dbb69a7 将人工声明状态集中到 sku_panel_state.py,采集器和脱敏器仅接受 panel-opened-target-preselected、alternate-all-dimensions-selected、target-selection-restored;旧 initial / one-dimension-selected / all-dimensions-selected 与未知值均 fail closed。主 agent 独立复跑 67 项 client 单测、compileall、两个 CLI help、静态禁用能力检索与完整 init.ps1,全部通过。过程未连接设备、未读取真实 raw、未新增页面判据或点击/数量/确认/提交/付款能力。T-103 保持 DOING,等待新三态 derived 人工验收。 ## 边界