docs: import wiki at afc651f75a3a
+568
@@ -0,0 +1,568 @@
|
||||
<!-- docs-wiki-sync:docs/current-state.md@afc651f75a3abc2676bb13aa8a80f6aa6a25a72e -->
|
||||
> 同步来源:[`docs/current-state.md`](/chengma/mroubao/src/commit/afc651f75a3abc2676bb13aa8a80f6aa6a25a72e/docs/current-state.md) · commit `afc651f75a3a`
|
||||
|
||||
# 当前实现状态
|
||||
|
||||
> 可覆盖的项目级快照。任务执行日志写入对应任务文件。
|
||||
|
||||
## 当前快照
|
||||
|
||||
- 日期:2026-08-01
|
||||
- 阶段:T-256、T-257、T-258、T-259、T-260、T-261、T-262、T-263、T-264、
|
||||
T-265、T-268、T-269、T-270、T-271、T-272 DOING,T-266、T-267 DONE;T-257 Android 代码已加入规格价格形状计数、候选
|
||||
队列原因码、无预算组合价未确认候选放行和卡片价格观察隔离;T-258 后端已只放宽
|
||||
`collection_complete=true` 的候选下限,单个带 `match_type` 的候选可进入确认流程,
|
||||
原数量上限、轮次、互斥、证据和商品身份校验保持不变。T-259 允许安全停止且 session
|
||||
有效时在冷启动执行一次既有 outbox HTTP 补传,随后仍返回 `STOP`;不续租、不重新领取、
|
||||
不触发拼多多 dry-run、提交或支付。自动化校验已通过,最终真机 outbox 收敛和 Admin
|
||||
确认区仍待验证。T-260 已完成设备本地操作停顿与三轮浏览预算配置代码,默认
|
||||
`1000 / 3000 / 100000 / 100000 / 45000` 不变;失败动作同样停顿,配置需同时通过
|
||||
单候选可行性和授权窗口 60% 校验,后台 payload 不能覆盖。五条 Android Gradle 验证
|
||||
已通过,最终慢档真机执行与 Admin 诊断键核对待验证。T-261 已实现仅限技术失败的
|
||||
有界现场清理、规格读取失败细分和四个追加诊断计数;任何安全停止或清理途中出现
|
||||
风控/支付边界均不再点击,清理失败不覆盖原失败码。Debug/Release 各 282 项单测、
|
||||
lint 与两个 APK 构建通过;最终真机残留现场恢复和 Admin 细分码核对待验证。
|
||||
T-262 已在 `PinduoduoPageClassifier` 判定不变的前提下,为 `PAYMENT_BOUNDARY`
|
||||
追加 `payCheckoutRoot`/`payMarkerIndex`/`payMarkerHits`/`payClickable`/
|
||||
`payExact` 五个归因诊断键(未触发时取默认值 `0/-1/0/0/0`),并让归因经
|
||||
`AutomationResult.Blocked`/`WorkflowReport` 透传,使阻塞发生在
|
||||
`pdd_open_app` 等任意工作流步骤时都能带出;Debug/Release 各 299 项单测、
|
||||
lint 与两个 APK 构建通过;真机复现 `PAYMENT_BOUNDARY` 阻塞与真实订单确认页
|
||||
对照采样待人工验证。
|
||||
T-263 已在 `paymentMarkers`/`hasCheckoutRoot`/`containsAny` 逐字节不变、
|
||||
登录/验证码/风控优先级不变的前提下,追加占满屏 WebView + 语义文本数不超
|
||||
阈值、须连续 3 次快照确认的结构判据(新主判据),并让文本判据仅在页面未被
|
||||
正面识别为商品详情/规格弹层/搜索结果/图片搜索结果/首页时才强制停止(放行时
|
||||
计数不停止);`CandidateSearchDiagnostics` 追加 `payStructureHit`/
|
||||
`payStructureStreak`/`payTextSuppressed` 三个尾部诊断键。已用 T-262 记录的
|
||||
四个真机样本构造夹具验证:首页、优惠券页不判,商品规格弹层误报被修复为不判,
|
||||
结算页结构连续 3 次后判定;另覆盖连续 1/2 次不判、结构中断清零、
|
||||
`hasCheckoutRoot` 单独命中仍判定、`UNKNOWN` 页面文本命中仍强制停止。
|
||||
Debug/Release 各 313 项单测、lint 与两个 APK 构建通过;真机复跑候选任务
|
||||
确认不再卡在 `pdd_open_app`,以及从 Admin 核对 `payTextSuppressed` 合理性
|
||||
待人工验证。
|
||||
T-264 已移除 `openPinduoduoSpecifications()` 中「找不到安全入口就点击
|
||||
『免拼购买』」的兜底分支,找不到唯一安全入口时改为返回 `ENTRY_ABSENT` 并
|
||||
新增 `specEntryAbsent` 诊断计数;`hasOrderConfirmation` 追加原生订单确认页
|
||||
判据(掩码手机号 + `已选` 摘要 + 数量/运费语义同时成立,既有三个判据不变),
|
||||
用于解决无规格商品被兜底点击后误入订单确认页却无法识别、只能卡死的问题;
|
||||
`PaymentBoundaryAttribution`/`CandidateSearchDiagnostics` 追加 `payPage`
|
||||
页面分类名称归因(未触发时为 `NONE`)。T-263 结构判据、`hasCheckoutRoot`、
|
||||
`paymentMarkers` 及抑制规则、登录/验证码/风控优先级均未改动。
|
||||
Debug/Release 各 329 项单测、lint 与两个 APK 构建通过;真机复跑无规格商品
|
||||
采购任务确认不再卡在订单确认页,以及从 Admin 核对 `specEntryAbsent`/
|
||||
`payPage` 待人工验证。
|
||||
T-265 根据真机详情页无独立规格入口的证据,恢复唯一「免拼购买」次优先入口;
|
||||
安全入口仍优先,其它购买语义仍拒绝。落到订单确认页时只执行既有返回动作并跳过
|
||||
当前候选,返回失败仍阻塞在支付边界;诊断尾部追加 `specEntryViaPurchase`/
|
||||
`specLandedOnCheckout`。Debug/Release 各 336 项单测、`lintDebug` 和两个 APK
|
||||
构建通过;T-265 Debug APK 已覆盖安装到 PKG110,采购无障碍、悬浮窗、通知和
|
||||
Shizuku 权限保持启用,真机重跑和 Admin 计数核对待完成。
|
||||
T-266 将新签发 BUYER 设备 Bearer token 的绝对有效期改为固定30天
|
||||
(`2592000` 秒),不滚动续期;禁用、撤销和绑定检查仍立即生效。既有 token
|
||||
不迁移,后端重启后设备重新登录一次才取得新期限。
|
||||
T-267 已把新创建 ADMIN Web Session 的固定绝对有效期从8小时改为30天,并保持
|
||||
Cookie `Expires`/`Max-Age` 与服务端到期时间一致;既有 session 不迁移,CSRF Cookie
|
||||
和 BUYER token 不受影响。Go 全量测试和根 `init.ps1` 已通过。
|
||||
T-268 已在 `ProcurementExecutionCycle`(接入点不变)为 `shouldRunOrderDryRun`
|
||||
九个子条件与 `canStartProbe` 四个子条件新增 `ORDER_DRY_RUN_GATE` 逐条件观测
|
||||
事件、为 `shouldRunOrderSubmission` 新增 `ORDER_SUBMISSION_GATE` 观测事件,
|
||||
经 T-207 既有 outbox 上报;取值不变不重复写,10 分钟保底写一条,写入用
|
||||
`runCatching` 包裹不阻塞循环;两个既有门控属性、`canStartProbe`/`blockers`
|
||||
计算方式、短路顺序、`runOnce()` 调用条件与既有 `onFailure` 日志全部保持原样
|
||||
(回归测试覆盖);`DeviceObservationStore` 更新时机和 `loginBlocker` 粘滞行为
|
||||
未动,只让其结果可见。message 只含布尔量、计数与自有 ASCII 大写枚举名,单测
|
||||
证明不含任何页面原文。Debug/Release 各 392 项单测、`lintDebug`、
|
||||
`assembleDebug`、`assembleRelease` 全部通过;真机复现 dry-run 卡在
|
||||
`PREPARING` 并从 Admin 核对具体是哪一个子条件为 0 待完成,任务保持 DOING。
|
||||
T-269 已修正真机任务 `54ee4d8a-41a8-4a63-bba2-a7b77162f27d` 三轮全部卡在
|
||||
`pdd_open_app` 的根因:`hasDetailBack` 原要求返回元素自身可点,真机商品
|
||||
详情页的「返回」contentDescription 挂在不可点子节点上(真正可点的是祖先
|
||||
容器,与 T-262 `payClickable` 恒为 0 同一模式),导致该页被误判 `UNKNOWN`
|
||||
并被文本判据强制 `PAYMENT_BOUNDARY`。改为「自身或有界祖先可点」(复用
|
||||
`BuyerAccessibilityService.clickableNodeOrAncestor()` 模式与
|
||||
`MAX_CLICK_ANCESTORS` 上限,在 `uiElement()` 采集侧预先算好布尔量随
|
||||
`PinduoduoUiElement` 带出,分类器不遍历树),`detailMarkerCount>=2` 与返回
|
||||
语义文本匹配规则不变;新增 `PinduoduoHomeRecoveryPolicy`,只在『纯文本命中
|
||||
且无任何结算迹象的 UNKNOWN 页面』上于 `AndroidPinduoduoImageSearchDriver
|
||||
.openApp()` 执行最多 `MAX_HOME_RECOVERY_STEPS`(3) 次系统返回、每步前复查
|
||||
`hasCheckoutRoot`/T-263 结构判据/`ORDER_CONFIRMATION`/登录验证码风控,
|
||||
命中任一立即停止且不归位;归位只调用系统返回,不点击任何控件。
|
||||
`CandidateSearchDiagnostics` 尾部追加 `homeRecoverySteps`/`homeRecovered`
|
||||
两个键;`paymentMarkers`/`hasCheckoutRoot`/`containsAny`/T-263 结构判据与
|
||||
抑制名单/T-264 原生订单确认页判据/T-265 落到结算页跳过逻辑/T-268 门控
|
||||
诊断均未改动。已用真机商品详情页特征构造夹具验证识别修复,并回归覆盖
|
||||
搜索结果页/首页/规格弹层/订单确认页不因本次放宽被误判为商品详情页。
|
||||
Debug/Release 各 412 项单测、`lintDebug`、`assembleDebug`、
|
||||
`assembleRelease` 全部通过;真机故意停在商品详情页复跑并从 Admin 核对
|
||||
`payPage`/`homeRecoverySteps`/`homeRecovered` 待人工验证,任务保持 DOING。
|
||||
T-270 已从已持久化的候选等待确认、pending `FAIL`、授权结束、人工对账和订单已核对
|
||||
五类阶段派生前台返回目标;进程共享协调器先持久化最多 32 条
|
||||
`SHA-256(executionId + phase)` 幂等 receipt,再发布可点击结果通知并用显式 Intent
|
||||
请求返回 Roubao 采购任务页。Activity 与前台 Service 同时观察但同阶段只消费一次,
|
||||
中间搜索/回传/下单状态不触发,后台拉起失败不改变业务状态。Debug/Release 各 417 项
|
||||
单测、`lintDebug` 和两个 APK 构建通过;1.4.18 (23) 已覆盖安装到 PKG110,并验证从
|
||||
拼多多 8.17.0 显式返回 Roubao。真实候选封板/订单核对自动触发和系统拦截后的通知降级
|
||||
待真机验收,任务保持 DOING。
|
||||
T-271 已解决真机三轮 `CANDIDATE_RESULTS_NOT_READY`、`cards=0` 的根因:候选卡片
|
||||
过滤的第六项 `hasImage` 判据在图片尚未加载完成时否决了本应通过的真实商品卡;
|
||||
现移除 `hasImage` 的否决权,其余七项(className/宽度/高度/可见面积/语义文本数/
|
||||
价格语义/安全点击目标/稳定签名)判定逻辑、阈值常量与先后顺序全部不变。为此把
|
||||
候选容器的八项判定抽成不依赖 `AccessibilityNodeInfo` 的纯函数
|
||||
`PinduoduoCandidateContainerFilter.evaluate()`(新文件),
|
||||
`BuyerAccessibilityService.candidateNodes()` 只负责把无障碍树读出的原始度量
|
||||
喂给它、再把结果落回既有诊断计数,判定本身未改一行;纯函数可直接用真机
|
||||
dump 数值构造夹具做 JVM 单测。`PinduoduoCandidateCard.hasImage` 如实记录该卡
|
||||
当时是否已有可见图片。**诊断口径变更**:`rejectedImage`(`rejImage`)不再是
|
||||
否决计数,语义改为「已被接受为候选但当时缺图」的观测计数,不再计入
|
||||
`PinduoduoCandidateCardRead` 的容器恒等式;新恒等式为
|
||||
`containers - (rejClass+rejWidth+rejHeight+rejVisible+rejTexts+rejPrice+
|
||||
rejClick+rejSignature) = 返回卡片数`,由该类 `init` 块强制校验并有单测覆盖。
|
||||
`candidateReadyPollLimit`/轮询间隔、颜色尺码硬约束、商品身份解析、双证据、
|
||||
支付边界/订单确认页/登录/验证码/风控判定、T-265 规格入口与跳过逻辑、T-268
|
||||
门控诊断、T-269 详情页识别与归位策略均未改动。已用真机图搜结果页 dump(8 个
|
||||
子节点:4 张 535×764 真实商品卡、2 个 535×182 矮容器、1 个 LinearLayout、1 个
|
||||
RecyclerView)构造夹具验证:4 张真实卡在图片未 visible/enabled 时仍被接受,
|
||||
矮容器仍因高度被拒,非卡片容器仍因 className 被拒;并逐项回归宽度过窄/过宽、
|
||||
可见面积不足、文本不足、缺价格、缺点击目标、缺签名的拒绝行为不变。
|
||||
T-272 已修正规格文字子节点因祖先可点/祖先 selected 或 checked 而被漏读、误判未选中
|
||||
的确定性缺口;自动领取会按 Roubao 本机安全 VLM 配置固定 execution 模式,Admin 不
|
||||
代理模型。前两轮候选在规则无法定位或点击后无法确认时,最多使用两次严格 node-ID
|
||||
定位和一次同帧双规格视觉复核;节点/截图受限脱敏,模型返回后重读 path + fingerprint,
|
||||
页面变化和安全停止均拒绝点击。最终 `selection_proof` 与保存的规格截图 hash 绑定,
|
||||
进度快照可恢复但不伪造节点 selected。诊断尾部追加四个 `specVlm*` 聚合键;第三轮、
|
||||
订单 dry-run、Admin/Go API/数据库均未改变。Debug/Release 各 442 项单测、lint 和两种
|
||||
APK 构建通过;真机颜色/尺码缺失样本与 Admin 诊断核对待完成,任务保持 DOING。
|
||||
T-276 已将候选搜索改为两轮:第一轮最多检查 6 个并保存最多 5 个严格候选,第二轮
|
||||
最多检查并保存 2 个保底候选;新上传契约只接受 `search_round=1..2`,历史第三轮数据库
|
||||
记录保持可读。
|
||||
T-277 已扩展 T-272 最终规格复核:本机 VLM 只选择当前颜色、尺码和价格节点,App
|
||||
复核快照后自行解析 SKU 摘要及拆分价格;候选会显式回传规格/价格验证状态和值来源。
|
||||
T-278 已修复任务价格为空时的授权策略:候选展示价不再作为等值门槛,后台在人工确认时
|
||||
冻结任务最高总预算或默认 200 元低价总额上限,App 和后台都按实际所选规格总价复核。
|
||||
T-279 已收口 Admin 确认后的真实执行链路:App 定向打开授权商品后,以当前 goods_id、
|
||||
授权详情指纹或受限分享解析严格复核身份;规则无法唯一读取颜色、尺码或价格时复用 Roubao
|
||||
本机模型,最多调用三次并由代码复核 node ID、结构和金额。瞬时自动化只重试一次;终态
|
||||
失败先加密保存再幂等回传后台并切回 Roubao,成功则继续既有单次提交围栏和待支付对账。
|
||||
T-280 已修复过期安全停止任务无法确认 Admin 取消的问题:显式控制面同步允许发送后端
|
||||
已支持的 `SAFE_STOPPED` heartbeat,但不延长 claim 或恢复自动化;收到取消请求后使用
|
||||
原 execution 幂等确认并清理本地状态。任务页恢复及十秒轮询会自动执行该同步。
|
||||
T-253 已完成;PDD `ps` 分享链接的小体积重定向
|
||||
响应可从受信 `Location` 解析 `goods_id`,不再被 Android 误判为网络失败
|
||||
- Git:当前分支为 `main`;T-001 至 T-004、T-101 至 T-104、T-201 至 T-219
|
||||
均按文档提交、实现提交的顺序纳入历史
|
||||
- 生产代码:`android-buyer/` 已接入 Roubao Android 源码
|
||||
- Android:固定 `main@c8a6d7f03422eb01744b01f3ee77bf7757741f7e`;MIT 许可证已保留
|
||||
|
||||
- 后端:Go 1.23.0 + Gin 1.11.0 + SQLite + Goose 3.26.0;已实现图片/任务业务、
|
||||
SSR 管理 Web、ADMIN/BUYER 联合认证、设备 readiness、原子 claim、租约状态机、
|
||||
task-scoped 参考图和 `authctl`
|
||||
- ERP 货运:Go 后端以受锁内存 ERP 会话直连按完整单号或创建日期同步;v12 保存
|
||||
同步记录、货运头和全部明细,canonical hash 控制 revision,Admin 已有 `/freight`、
|
||||
`/freight/import`、`/freight/{id}` 与对应 JSON API。T-237 已将完整单号改为 55 秒
|
||||
同步响应,成功后直接进入可见货运列表;超时/取消使用独立 cleanup context 写
|
||||
`FAILED`,日期范围仍后台异步。HTTP `WriteTimeout` 为 70 秒。T-238 已兼容真实详情
|
||||
`created` 的分钟精度,仍按 Asia/Shanghai 严格解析并转 UTC。T-239 至 T-241 已保存
|
||||
`productSpec`、TWD 原始单价和数字图片引用,以有界并发缓存归一化 JPEG,并在鉴权
|
||||
本地路由、货运列表和详情中显示图片、状态与采购字段。T-244 对缺失 `Content-Type`
|
||||
或通用二进制的 ERP 图片使用 512 字节受控嗅探,完整解码和 20 MB 限制不变。
|
||||
T-242/T-243 允许 ADMIN 从
|
||||
详情页删除本地货运快照、缓存图以及无参考图/任务的采购需求草稿;已绑定参考图或已生成
|
||||
采购任务时分别原子拒绝,不修改 ERP、同步运行历史或增量水位,完整订单号可重新导入。
|
||||
- ERP Go 迁移:T-225 已用脱敏 fixture 固定 `internal/platform/shunyunbao` 的 header、
|
||||
单号/日期查询、分页、详情批量和字段 allowlist,并使货运用例依赖来源中立错误。T-226
|
||||
已增加受锁保护的 Go 内存 Cookie jar、验证码 ticket、登录和用户校验,以及 ADMIN 的
|
||||
`/erp` 页面/API;账号密码可由 `backend-api/.env` 的受控 `CMROUBAO_SHUNYUNBAO_*`
|
||||
回退提供,进程环境变量优先。T-230 改为导入前由受控 `CMROUBAO_OCR_API_URL` 获取验证码
|
||||
文字并建立内存会话,人工 `/erp` 模块已删除。T-227 已将其作为 `FreightSource`,
|
||||
查询先校验会话、再执行有界分页/详情
|
||||
批量并返回 allowlist;T-228 已删除旧 Python Connector、loopback 端口和共享 API Key;
|
||||
T-236 在 ERP 明确拒绝验证码时额外重试 6 次,每次重新取图和 OCR,单次认证最多
|
||||
7 次登录并受 20 秒总预算限制;不对账号密码、OCR、网络或协议错误重试。未访问真实 ERP。
|
||||
- ERP 增量同步:v14 支持 Asia/Shanghai 创建日期闭区间和“同步至现在”,source 单窗
|
||||
最多 7 天,后端对较长水位范围切窗并从成功水位前 10 分钟所在自然日回看。
|
||||
货运落库、同步成功和水位推进同事务完成;失败与较旧范围成功不推进水位。Admin
|
||||
可查看查询范围、计数、稳定错误码和最近成功水位。
|
||||
- 采购需求:v13 按货运商品 revision 保存可复核快照;ADMIN 显式确认采购、上传参考
|
||||
图后生成不可变 PENDING 任务。T-245 在当前商品有 `READY` 本地 ERP 缓存图时,将其
|
||||
重新校验并复制为独立 `TASK_REFERENCE`,需求直接进入 `READY`;v17 记录
|
||||
`ERP_FREIGHT_IMAGE`/`MANUAL_UPLOAD` 来源。无图仍进入 `NEEDS_IMAGE`,既有需求可在
|
||||
图片恢复后显式升级;任务生成前可人工替换并清理旧自动副本。来源变化不会改写任务,
|
||||
Roubao 继续使用原 `image_asset_id` 和 claim 流程。
|
||||
- 采购重试:v20 保留 `(freight_order_item_id, source_revision)` 的单一采购需求和
|
||||
原任务 ID;仅允许没有任何下单信号的 `FAILED/CANCELED` 任务带原因重新排入
|
||||
`PENDING`。重试事务记录操作人、原状态、原因和事件;存在 execution outcome 或
|
||||
order submission 下单信号时 fail-closed,禁止重复采购。
|
||||
- 本机 Android 工具:JDK 17.0.13、Command-line Tools 22.0、SDK 34、
|
||||
Build Tools 34.0.0、Platform Tools/ADB 37.0.0;用户级 SDK 环境变量已设置
|
||||
- Android Studio:未安装;`winget` 静默安装卡住后已终止,不阻塞命令行构建
|
||||
- 测试:T-248 Android Debug/Release 单元测试与构建通过
|
||||
- T-250:Android Debug/Release 单测、lint、Debug/Release 构建和根 `init.ps1`
|
||||
通过;Debug APK `1.4.16 (21)` 已覆盖安装到 PKG110,手机 APK 哈希与本地构建一致,
|
||||
安装后 Roubao 保持停止,尚未启动拼多多
|
||||
- T-251:Android Debug/Release 单测、lint、Debug/Release 构建和根 `init.ps1`
|
||||
通过;覆盖延迟/空候选卡、SKU 不匹配、身份未解析、三轮门禁与终态恢复。新 Debug
|
||||
APK 已覆盖安装到 PKG110,手机和本地 APK SHA-256 一致,无障碍仍启用;启动 Roubao
|
||||
后 ADB 断开且后端 TLS 握手超时,现场 execution 的终态收敛待连接恢复后复验
|
||||
- T-256:Android 端将候选采集的“至少一个已解析身份”与“达到目标或三轮耗尽后收尾”
|
||||
分离;不足目标但有有效候选时继续执行剩余轮次,收尾审计沿用 T-254 诊断 message
|
||||
并记录累计实际候选数。`testDebugUnitTest`、`testReleaseUnitTest`、`lintDebug`、
|
||||
`assembleDebug`、`assembleRelease` 均通过;最终真机/Admin 候选确认区验收待执行
|
||||
- T-259:安全停止后的运行同步先用有效 session 有界 flush 已收集 outbox,再无条件
|
||||
返回 `STOP`;冷启动只在仍有实际待传项时启动一次服务。执行页只显示待传数量或已
|
||||
回传完成,不展示候选字段。Debug/Release 各 262 项单测、`lintDebug` 和 Debug/Release
|
||||
APK 构建通过;单测证明 flush 成功、失败、session 失效、`RECONCILED`、
|
||||
`reconciliationPending` 和拼多多协调器零调用边界
|
||||
- 后端测试:T-226 至 T-245 已运行 `go test ./...`、`go test -race ./...`、`go vet ./...`
|
||||
和三个 Go 入口构建;T-227 增加 Go source 的伪 ERP 会话预检、完整单号、日期分页去重、
|
||||
详情 allowlist 和稳定错误码覆盖;根 `init.ps1` 的 Android 测试/Debug APK 与 Go 标准
|
||||
验证也通过,均未访问真实 ERP;
|
||||
T-248 再次通过上述 Go 全量检查和三个入口构建,并覆盖候选增量快照、最终状态切换及
|
||||
完成后旧快照拒绝;T-249 同样通过 Go 全量检查和三个入口构建,并覆盖安全重试、
|
||||
幂等重放、下单信号阻断、审计历史和 v20 上下迁移;
|
||||
T-258 通过 `GOTOOLCHAIN=local go test ./...` 和根 `init.ps1`,覆盖单个
|
||||
`EXACT_MATCH`/`FALLBACK` 完成快照,并回归候选数量上限、轮次归属、混合互斥和
|
||||
`goods_id` 去重;既有设备结果流继续覆盖证据 hash 冲突和最终状态切换;
|
||||
覆盖 v14 上下迁移、7 天切窗、水位重叠、中途失败、空窗口、重复页、来源 revision、
|
||||
水位事务/不回退、Admin API/SSR 和 Go source 严格响应窗口;未访问真实 ERP
|
||||
- 原型:4 个管理 Web 页面和 7 个 Android 页面均可离线独立打开;Playwright
|
||||
以 1440×900、390×844、360×800 验证 36 个页面/视口组合,无页面横向溢出、
|
||||
脚本错误或外部请求,Android 可见交互控件均不小于 44px
|
||||
- 管理 Web:真实 Gin/SQLite 流程已完成图片上传、任务创建、列表、详情参考图和
|
||||
非终态取消;执行中只显示“请求安全停止”,ADMIN 登录/退出和安全返回路径已接入,
|
||||
货运列表/导入/详情在 1440×900、390×844、360×800 无横向溢出或页头重叠
|
||||
- 货运管理展示:列表按外部商品 ID 确定性展示第一条当前商品的 56px 代表图、标题和
|
||||
总项数;详情展示 84px/移动端 72px 本地图片、单一规格 SKU、数量、TWD 原始单价、
|
||||
图片状态和采购操作。Playwright 已在 1440、768、390、375 四档宽度验证无横向溢出、
|
||||
破图、遮挡和控制台错误。ERP 缺失图片媒体类型时,JPEG/PNG 使用标准嗅探,WebP 使用
|
||||
严格文件签名,再由 asset store 完整验证并保存为本地归一化 JPEG。
|
||||
- 货运本地删除:详情页二次确认后调用 CSRF 保护的 SSR POST,JSON API 提供幂等 DELETE;
|
||||
删除事务覆盖全部历史商品并清理无引用的 `BLOCKED`、`NEEDS_IMAGE`、`SOURCE_CHANGED`
|
||||
采购草稿;已绑定参考图或采购任务分别返回稳定冲突,任务优先。提交后以有界预算清理
|
||||
缓存 JPEG。真实隔离服务已验证草稿随货运单删除后列表为空;顺运宝 ERP 未被调用。
|
||||
- 鉴权:bcrypt 密码、30天管理 session、30天 App access token 和设备 secret
|
||||
均不明文落库;设备首次绑定原子化,禁用/过期/撤销每次请求重新检查;管理/App
|
||||
登录各自按来源地址执行内存有界限流,账号和设备支持 `authctl` 启停
|
||||
- 生命周期:设备 heartbeat 记录三个版本、两个就绪位和服务端活跃任务;claim 使用
|
||||
client-generated 256 bit token + 独立幂等 key、SQLite immediate transaction、
|
||||
10 分钟 CLAIMED/默认 30 分钟运行授权和 2 分钟 readiness TTL。start/heartbeat/release/
|
||||
cancel-ack、过期回收、跨连接并发唯一领取、管理安全停止与 task-scoped 参考图均
|
||||
已实现;运行授权允许配置 5-120 分钟并显式返回截止时间,过期状态同步不延长旧
|
||||
授权;原 claim token/hash 不进入响应或日志
|
||||
- Android 后台采购:新增独立“任务”入口、BUYER/设备登录、Keystore-backed 加密
|
||||
状态、严格 HTTPS/Debug loopback 地址策略、`HttpTaskSource`、参考图校验、手动领取、
|
||||
预览/start 二次确认、release、30 秒前台 heartbeat、有限离线、`SAFE_STOPPED`、
|
||||
取消确认和进程恢复;后台任务不读取或覆盖本地 VLM provider
|
||||
- 登录重试:采购登录失败、本地校验失败或网络失败时保留当前页面输入,只有成功才清理
|
||||
Compose 内存中的密码和设备密钥;敏感值不新增持久化或日志路径
|
||||
- T-207 结果闭环:`execution_events`、受控截图、候选批次、模型出处、人工结论与
|
||||
失败记录均按 execution 存储;Android 使用加密 outbox 按事件、截图、候选和终态
|
||||
顺序回传,授权到期补报单独审计,所有终态固定 `order_submitted=false`。管理任务
|
||||
详情展示模型/候选/人工理由/事件/证据摘要,不保存 VLM Key、完整 endpoint 或原始响应。
|
||||
- T-208 决策数据:候选批次同事务规范化为 search run、原始 observation、逐项
|
||||
model evaluation 和确定性 recommendation;模型拒绝项不再被过滤或重排。App 在
|
||||
COMPLETE 前提交幂等 HUMAN_REVIEW,接受项和其余拒绝项均有结构化理由;修订按
|
||||
supersedes/version 追加。Admin/API 分区显示 observation、prediction、
|
||||
recommendation 和完整人工 review 历史。
|
||||
- T-211 图片检索:后台任务固定使用经 SHA-256 校验的参考 JPEG,经一次性 MediaStore
|
||||
图片进入拼多多拍照搜索;App 本地从 SKU 唯一提取颜色和尺码,schema v3 逐项返回
|
||||
`MATCH/MISMATCH/UNKNOWN`。实际曝光的 `0..5` 项全部按原 ordinal 回传;只有两项
|
||||
均匹配且分数/置信度不低于 `0.75` 的候选能成为确定性 recommendation。
|
||||
- T-213 规格核验:`DISCOVERY_INSPECT` 可从唯一“免拼购买”进入规格弹层,按任务
|
||||
SKU 唯一选择颜色/尺码并复核 selected/已选摘要,最多滚动 2 次;严格保存单一
|
||||
人民币组合价和详情/规格双证据,并允许明确的“首件¥金额”当前单件价。区间、
|
||||
券后、对照促销、冲突或缺失价格降级 `UNKNOWN`,直达订单确认页只系统返回。候选
|
||||
探查不能加入购物车、提交订单或触发支付。
|
||||
- T-214 候选身份:App 回传卡片/详情语义签名和详情/规格双证据 hash;后端逐一核对
|
||||
已上传 asset 后,在 v7 表中生成 execution-scoped `candidate_key`。Admin API/Web
|
||||
展示 key、指纹、原始 observation、模型/人工结论和截图;缺少真实平台 URL 时保持
|
||||
空值,后端不请求第三方 URL。
|
||||
- T-215 下单授权:非空候选回传原子进入 `WAITING_CONFIRMATION`;Admin 按
|
||||
candidate key 选择并为全部候选填写结构化理由,服务端在同一事务追加人工 review、
|
||||
不可变授权快照、事件和幂等记录。领取前可按版本改选,已投递后禁改;页面明确仅
|
||||
授权创建设备端待付款订单,不授权付款。
|
||||
- T-216 设备命令:App 在 heartbeat 后主动拉取同一条不可变授权,严格校验跨端
|
||||
canonical hash、任务内容和候选四组指纹,先写 Keystore-backed 状态再幂等 ACK。
|
||||
网络响应丢失和进程重启复用同一 ACK key;后台候选不再允许手机本地选择或重复
|
||||
采集。本任务只同步授权,未打开拼多多或执行下单。
|
||||
- T-217 订单 dry-run:App 自动用参考图重新搜索并以旧 card/detail 指纹、标题、
|
||||
唯一颜色/尺码、数量和预算重新核验 Admin 选择;确认页 WebView 折叠时使用端上
|
||||
中文 OCR 做只读 fail-closed 证据提取。后端保存 v10 READY、截图、SKU、数量、
|
||||
单价/总额和事件;无障碍动作集中不含订单提交或支付。
|
||||
- T-218 单次提交:后端先创建唯一 submission fence,App 点击前持久化
|
||||
`CLICK_ASSUMED`,最多点击一次精确“提交订单”;进程/网络不确定和租约到期后只
|
||||
回读待付款订单或转人工,绝不重复提交或点击支付。v11 保存围栏、幂等操作、订单号/
|
||||
时间、证据和审计事件,唯一对账后才写 `order_submitted=true`。
|
||||
- T-219 待付款提醒:Admin API/SSR 按任务鉴权读取 submission,区分围栏中、人工
|
||||
对账和唯一对账成功;成功态展示完整订单号、平台时间、授权 SKU/数量/金额及受控
|
||||
证据,只提醒采购员打开拼多多人工核对付款。Roubao 显示相同终态;Web/App 均没有
|
||||
付款、重复提交或自动支付动作。隔离数据库真实 SSR 已通过三个响应式视口验收。
|
||||
- T-220 至 T-228 ERP 来源:字段契约已固定 stock/detail/item 外部身份、PII 最小化和
|
||||
缺图边界;Go API 以受锁内存会话完成受控验证码登录,并直接按完整单号或日期范围查询
|
||||
allowlist schema。T-229 仅允许 API 从当前目录 `.env` 回退读取三个 ERP 配置,且不会
|
||||
改写进程环境或加载其他配置。旧 Python Connector、8091 端口和共享服务密钥已删除;
|
||||
未访问线上 ERP。
|
||||
- Workflow:纯 Kotlin runner 已支持步骤 timeout、最多 3 次 retry、安全阻塞、
|
||||
用户停止和单 runner 并发拒绝;T-102 已接入搜索加有界候选采集五步
|
||||
- TaskSource:严格 CLI 已生成并验证真实私有 ProbeTask;默认 APK 不含私有 fixture
|
||||
- VLM:需求提取与候选评估均使用严格 schema、0.75 阈值、受控证据源、安全端点和
|
||||
单次调用边界;候选最多 5 个并按 ordinal 串行评估,本地产生建议并停在人工确认,
|
||||
SKU/数量由本地原值回填,颜色/尺码硬约束由本地生成,预算保持空,订单提交状态固定
|
||||
为 false
|
||||
- VLM 部署决策:手机本地调用已配置的 OpenAI 兼容 provider;管理后端只负责身份、
|
||||
任务控制和结果审计,不保存/代理模型。T-207 保留 Roubao 独立模式并把端上 Key
|
||||
迁移到 Keystore-backed 加密存储
|
||||
- 离线执行:默认 30 分钟有限授权和 30 秒 best-effort heartbeat 已实现;PKG110
|
||||
真机断开临时后端 95 秒后保持同一 execution,重连后滑动续期;到期持久安全停止,
|
||||
RUNNING 不自动重新分配
|
||||
- 测试设备:OnePlus PKG110,Android 16/API 36;已安装包含 T-253 的肉包
|
||||
`1.4.18 (23)` Debug APK;拼多多 `8.17.0 (81700)`。覆盖安装后已正常启动,
|
||||
采购无障碍、悬浮窗、通知和 Shizuku 权限均保持启用
|
||||
- 设备就绪:拼多多首页、文字/图片搜索、双列候选卡、详情截图和返回均已通过 8.17.0
|
||||
真机验证;ColorOS 在 T-246 覆盖安装时曾移除肉包采购无障碍,T-251 覆盖后授权仍
|
||||
启用,因此每次覆盖安装后都必须复核该系统授权
|
||||
- 拼多多 8.17 兼容:结果页可识别新版显示查询词的文本搜索栏和“推荐、手机、女装”等
|
||||
分类栏,也保留旧版“综合、销量、价格、筛选”识别;长任务搜索词的拼多多省略显示须
|
||||
至少两个按序片段对应原词才通过。每次候选探针会重写本次搜索词,不复用已有结果页。
|
||||
PKG110 真机已验证确认结果页完成、5 份候选证据采集、详情截图及返回结果页;未进入
|
||||
下单或支付页面。
|
||||
- 版本控制内测试数据:仅有脱敏、运行时生成的单元测试 fixture;没有真实订单内容
|
||||
- 本地私有样本:仓库根目录存在一组未跟踪、已本地排除的同名蝦皮文本/JPEG;
|
||||
已用 CLI 真实导入并逐字段/图片哈希验证,生成物位于被忽略的 `.local/`
|
||||
- 标准启动路径:`$env:RUN_START_COMMAND="1"; .\init.ps1`
|
||||
- 标准验证路径:`.\init.ps1`
|
||||
- 当前 blocker:当前真机确认页缺少已配置收货地址且显示
|
||||
“立即支付/先用后付”,T-218 已按合约证明不创建围栏、不点击。不能为测试自动添加
|
||||
地址或跨过付款边界。真实 VLM 服务地址、模型、
|
||||
设备级测试凭证、成本上限和数据留存尚未确认;当前只支持单 SKU/JPEG;候选探针
|
||||
截图要求 Android 11/API 30+。T-258/T-259 仍需在测试设备验证 execution
|
||||
`9c634321-7f77-49d9-9444-3ccd2104c104` 的既有 outbox 自动上传后进入
|
||||
`WAITING_CONFIRMATION`,并确认候选出现在 Admin 确认区且事件标注为授权到期后补报
|
||||
|
||||
## 当前目录
|
||||
|
||||
| 路径 | 状态 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `AGENTS.md` | 已有 | agent 权威入口 |
|
||||
| `docs/` | 已有 | Harness Coding 文档 |
|
||||
| `docs/tasks/T-001.md` | DONE | Android 可构建、可安装、可启动基线 |
|
||||
| `docs/tasks/T-002.md` | DONE | 设备版本、无障碍、前台和登录阻塞就绪检查 |
|
||||
| `docs/tasks/T-003.md` | DONE | 可注入 Fake automation 的受限 workflow runner |
|
||||
| `docs/tasks/T-004.md` | DONE | 私有蝦皮文本/JPEG 严格导入和 Debug TaskSource |
|
||||
| `docs/tasks/T-101.md` | DONE | 固定脱敏词拼多多搜索和结果页真机验证 |
|
||||
| `docs/tasks/T-102.md` | DONE | 最多 5 个候选详情截图、证据 manifest 和结果页返回 |
|
||||
| `docs/tasks/T-103.md` | DONE | 私有任务需求 schema、硬约束、隐私边界和 VLM 适配器 |
|
||||
| `docs/tasks/T-104.md` | DONE | 动态搜索、候选严格评估、本地建议和人工确认点 |
|
||||
| `docs/tasks/T-201.md` | DONE | Go-Gin、SQLite、Goose migration 和健康检查骨架 |
|
||||
| `docs/tasks/T-202.md` | DONE | 生成并确认 P0 Web/App 低保真原型 |
|
||||
| `docs/tasks/T-203.md` | DONE | 图片/任务 API、SQLite 业务层和 SSR 管理 Web |
|
||||
| `docs/tasks/T-204.md` | DONE | 用户、管理会话和预授权设备联合身份 |
|
||||
| `docs/tasks/T-205.md` | DONE | 原子 claim、租约、execution 和取消安全确认 |
|
||||
| `docs/tasks/T-206.md` | DONE | App 领取、默认 30 分钟有限离线执行、恢复和安全停止 |
|
||||
| `docs/tasks/T-207.md` | DONE | App 本地 VLM、Key 加密、候选、事件、截图和结果回传 |
|
||||
| `docs/tasks/T-209.md` | DONE | 登录失败保留采购员和设备输入以便直接重试 |
|
||||
| `docs/tasks/T-210.md` | DONE | 兼容拼多多 8.17 搜索结果页与长词省略显示 |
|
||||
| `docs/tasks/T-211.md` | DONE | 参考图召回、SKU 颜色尺码硬匹配与 0..5 候选回传 |
|
||||
| `docs/tasks/T-212.md` | DONE | 修复重排候选、推荐、证据与人工接受的身份映射 |
|
||||
| `docs/tasks/T-213.md` | DONE | 真机选择目标 SKU、读取组合价并安全返回 |
|
||||
| `docs/tasks/T-208.md` | DONE | 归一化候选决策数据并增加结构化人工 review |
|
||||
| `docs/tasks/T-214.md` | DONE | 建立 execution-scoped candidate key 与设备采集指纹 |
|
||||
| `docs/tasks/T-215.md` | DONE | Admin 按 candidate key 选择并创建不可变待投递授权 |
|
||||
| `docs/tasks/T-216.md` | DONE | App 主动拉取并先加密落盘再确认同一条下单命令 |
|
||||
| `docs/tasks/T-217.md` | DONE | 重新核对已授权商品并选择 SKU/数量,停在最终提交前 |
|
||||
| `docs/tasks/T-218.md` | DONE | 单次提交围栏、最多一次提交动作和待付款订单唯一对账 |
|
||||
| `docs/tasks/T-219.md` | DONE | Admin 待付款提醒、Roubao 终态和跨端闭环验收 |
|
||||
| `docs/tasks/T-220.md` | DONE | 顺运宝 ERP 字段契约与凭证安全基线 |
|
||||
| `docs/tasks/T-221.md` | DONE | 顺运宝精确单号 Connector |
|
||||
| `docs/tasks/T-222.md` | DONE | 货运信息存储、API 与 Admin 页面 |
|
||||
| `docs/tasks/T-223.md` | DONE | 待采购需求提取与任务生成 |
|
||||
| `docs/tasks/T-224.md` | DONE | ERP 日期增量同步 |
|
||||
| `docs/tasks/T-225.md` | DONE | 冻结 Go 直连 ERP 协议与安全边界 |
|
||||
| `docs/tasks/T-226.md` | DONE | Go ERP 会话、验证码登录与 Admin 连接页 |
|
||||
| `docs/tasks/T-227.md` | DONE | Go 直连顺运宝查询接入货运同步 |
|
||||
| `docs/tasks/T-228.md` | DONE | 移除 Python Connector 并完成 Go 切换 |
|
||||
| `docs/tasks/T-229.md` | DONE | 从受控 `.env` 加载 ERP 凭证 |
|
||||
| `docs/tasks/T-230.md` | DONE | OCR 自动登录并移除人工 ERP 连接页 |
|
||||
| `docs/tasks/T-231.md` | DONE | 显示 ERP/OCR 导入预检稳定错误 |
|
||||
| `docs/tasks/T-232.md` | DONE | 记录 ERP/OCR 导入预检安全诊断日志 |
|
||||
| `docs/tasks/T-233.md` | DONE | 修复预检错误映射并增加受控 ERP 诊断日志 |
|
||||
| `docs/tasks/T-234.md` | DONE | 在受控诊断模式输出 OCR 验证码文本 |
|
||||
| `docs/tasks/T-235.md` | DONE | 修复顺运宝登录后用户会话校验协议 |
|
||||
| `docs/tasks/T-236.md` | DONE | 验证码错误时重新取图和 OCR,最多额外重试 6 次 |
|
||||
| `docs/tasks/T-237.md` | DONE | 完整单号在 55 秒预算内同步导入并可靠收敛终态 |
|
||||
| `docs/tasks/T-238.md` | DONE | 兼容顺运宝详情分钟精度时间 |
|
||||
| `docs/tasks/T-239.md` | DONE | 冻结货运规格 SKU、TWD 原始单价和图片引用契约 |
|
||||
| `docs/tasks/T-240.md` | DONE | 后端受控缓存并鉴权提供货运商品图片 |
|
||||
| `docs/tasks/T-241.md` | DONE | 优化货运列表代表图与商品采购信息展示 |
|
||||
| `docs/tasks/T-242.md` | DONE | 受约束删除本地货运快照并保护采购审计 |
|
||||
| `docs/tasks/T-247.md` | DONE | 修复图片搜索循环并完成两个 SKU 候选回传 |
|
||||
| `docs/tasks/T-248.md` | DONE | 增量回传准确候选并增加第三轮保底搜索 |
|
||||
| `docs/tasks/T-249.md` | DONE | 保留原任务身份并为未下单的终态任务提供安全重试 |
|
||||
| `docs/tasks/T-250.md` | DONE | 缩短三轮图片搜索预算并移除重复内层重试 |
|
||||
| `docs/tasks/T-251.md` | DONE | 修复候选结果页早判与三轮耗尽后执行不终止 |
|
||||
| `docs/tasks/T-252.md` | DONE | 修复 Android 16 商品链接读取并回传身份未解析候选 |
|
||||
| `docs/tasks/T-253.md` | DONE | 修复 PDD ps 分享链接重定向被误判为网络失败 |
|
||||
| `docs/tasks/T-255.md` | DOING | 候选卡片九条件拒绝归因与 recycler 可见性观测已实现;最终真机复跑待采购人员执行 |
|
||||
| `docs/tasks/T-256.md` | DOING | 允许少于目标数量的有效候选进入人工确认 |
|
||||
| `docs/tasks/T-259.md` | DOING | 安全停止后仅补传既有 outbox,自动化继续保持停止;待真机验证 |
|
||||
| `docs/tasks/T-260.md` | DOING | 设备本地操作节奏和三轮预算已实现;待慢档真机与 Admin 诊断验收 |
|
||||
| `docs/tasks/T-261.md` | DOING | 技术失败有界清理与规格读取细分已实现;待真机残留现场和 Admin 诊断验收 |
|
||||
| `docs/tasks/T-262.md` | DOING | 支付边界命中归因五键已实现,判定逻辑不变;待真机复现阻塞与订单确认页对照采样 |
|
||||
| `docs/tasks/T-263.md` | DOING | 结构判据与文本判据按页面类型收敛已实现,`paymentMarkers`/`hasCheckoutRoot` 不变;待真机复跑与 Admin 诊断验收 |
|
||||
| `docs/tasks/T-264.md` | DOING | 移除免拼购买兜底、原生订单确认页识别与 `payPage` 归因已实现;待真机验证与 Admin 诊断核对 |
|
||||
| `docs/tasks/T-265.md` | DOING | T-265 APK 已安装;待真机重跑与 Admin 两个计数核对 |
|
||||
| `docs/tasks/T-266.md` | DONE | 将新签发设备 Bearer token 固定有效期延长为30天 |
|
||||
| `docs/tasks/T-269.md` | DOING | 商品详情页返回祖先可点识别修复与开 App 有界归位已实现;待真机停在详情页复跑与 Admin 诊断验收 |
|
||||
| `docs/tasks/T-270.md` | DOING | 状态派生、一次性切回与通知降级已实现并完成显式返回 smoke;待真实终态自动触发验收 |
|
||||
| `docs/tasks/T-271.md` | DOING | 移除候选卡片过滤 hasImage 否决权,`rejImage` 改为观测计数,其余七项判定不变;待真机验证与 Admin 计数核对 |
|
||||
| `docs/tasks/T-272.md` | DOING | 规则优先并使用 Roubao 本地 VLM 有界兜底选择、最终同时复核颜色和尺码 |
|
||||
| `docs/tasks/T-273.md` | DONE | 设置页用固定测试图单次验证本机模型配置并显示稳定失败分类 |
|
||||
| `docs/tasks/T-274.md` | DONE | 临时候选 locator 唯一消歧重复标题签名并细分节点打开失败 |
|
||||
| `docs/tasks/T-275.md` | DONE | 拆分超长候选事件、修复旧 outbox,并正确处理不可重试的后台拒绝 |
|
||||
| `docs/tasks/T-276.md` | DONE | 将候选图片搜索收敛为两轮:第一轮检查 6 个,第二轮检查 2 个并保底 |
|
||||
| `docs/tasks/T-277.md` | DONE | 使用裁剪节点 JSON 和本机 VLM 兜底规格选择、SKU 摘要及拆分价格 |
|
||||
| `docs/tasks/T-278.md` | DONE | 任务价格为空时使用后端冻结的低价总额上限,并按实际规格价格复核 |
|
||||
| `docs/tasks/T-279.md` | DONE | 跑通 Admin 确认商品后的身份复核、规格/价格兜底和待支付下单 |
|
||||
| `docs/tasks/T-280.md` | DONE | 安全停止后通过控制面心跳确认后台取消并清理本地任务 |
|
||||
| `docs/tasks/T-281.md` | DONE | 修复首轮规格 AI 兜底、空价格调用和带标签价格解析,并写入本地采购诊断记录 |
|
||||
| `docs/design/` | 已确认 | T-202 原型索引、4 个管理页和 7 个 Android 页面 |
|
||||
| `deepseek总结.txt` | 已有 | 历史讨论摘要,不是正式需求权威 |
|
||||
| `android-buyer/` | 已有 | Roubao `main` 固定 commit 的 Android 基线 |
|
||||
| `android-buyer/task-contract/` | 已有 | Android/CLI 共享 ProbeTask 与 TaskSource |
|
||||
| `android-buyer/tools/shopee-importer/` | 已有 | 开发机私有 fixture 导入 CLI |
|
||||
| `backend-api/` | 已有 | Go-Gin 任务 API、SQLite、图片存储、管理 Web 和 migration |
|
||||
| `init.ps1` / `init.sh` | 已验证/待跨平台 | Windows 同时验证 Android/Go;Unix 入口待 Linux/WSL 复核 |
|
||||
|
||||
## 任务摘要
|
||||
|
||||
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-219。
|
||||
- 已完成:另含 T-220 至 T-242 ERP 契约、货运存储、采购需求生成、日期增量同步、Go
|
||||
直连协议、OCR 会话预检、稳定预检错误、安全诊断日志、直连 `FreightSource`、旧 Connector
|
||||
清理、受控本地凭证加载、同步单号导入、分钟时间兼容、货运商品元数据契约、本地图片缓存、
|
||||
货运管理展示优化和受约束本地删除。
|
||||
- 已完成:T-247/T-248 图片搜索状态机、execution-scoped 三阶段门禁、SKU 硬匹配、
|
||||
准确候选增量快照、第三轮两个默认结果保底、受限分享链接解析和 1 至 3 秒动作停顿。
|
||||
- 已完成:T-249 保留同一 ERP 商品 revision 的单一采购需求/任务身份,为未触发下单
|
||||
围栏的 `FAILED/CANCELED` 任务增加带原因、审计和幂等保护的安全重新执行;任何下单
|
||||
状态不确定的任务继续禁止重试。
|
||||
- 已完成:T-250 将前两轮图片搜索限制为每轮 150 秒、第三轮 95 秒,配套收紧候选
|
||||
检查和滚动数量并移除候选步骤内部重复重试;三轮步骤预算合计 395 秒。
|
||||
- 已完成:T-251 在结果页外壳出现后最多等待 10 秒候选卡稳定,细分无卡片、SKU
|
||||
不匹配、身份未解析和未找到目标,并在第三轮耗尽后复用终态 outbox 结束 execution;
|
||||
升级前已耗尽状态也能幂等恢复。
|
||||
- 已完成:T-252 使用内部 `exported=false` 前台 Activity 读取 PDD 复制链接,按
|
||||
分享、复制、前台中继、剪贴板权限、链接格式/网络和身份冲突细分失败;规格已核验
|
||||
但身份未解析的商品最多保留两个诊断观察,终态前与 resolved 前缀一并回传但不能
|
||||
授权下单。确定性的剪贴板基础设施故障首轮终止,不再重复三轮。
|
||||
- 已完成:T-253 将跳转响应改为优先验证 `Location` 且不读取正文,并把普通响应
|
||||
正文改为最多读取 64 KiB;`goods2.html?ps=<opaque-token>` 的小体积 `307` 可直接
|
||||
解析下一跳 `goods_id`,不会因固定长度正文读取抛 `EOFException`。Debug/Release
|
||||
各 235 项 App 单测、lint、APK 构建和根 `init.ps1` 均通过。
|
||||
- 已完成:T-266 将新签发设备 Bearer token 改为固定30天绝对有效期,API 返回
|
||||
`expires_in=2592000`;不迁移既有 token,不滚动续期,禁用和撤销立即生效。
|
||||
- 当前 DOING:T-259 已实现安全停止后一次性补传既有 outbox,并保持同步决策为
|
||||
`STOP`;最终需在测试设备冷启动 Roubao,验证既有 execution 收敛到
|
||||
`WAITING_CONFIRMATION` 且不发生任何拼多多动作。T-260 已实现设备本地节奏设置、
|
||||
成败动作同停顿、轮次预算联动、可行性/60% 授权窗口校验和数值诊断;Debug/Release
|
||||
各 272 项单测、lint 和两个 APK 构建通过,最终慢档真机执行仍待采购人员完成。
|
||||
T-261 已实现技术失败后的关闭规格弹层/返回结果页清理、规格读取失败细分和追加诊断;
|
||||
安全停止零清理,清理中遇风控或支付边界立即中止,原技术失败码不变。Debug/Release
|
||||
各 282 项单测、lint 和两个 APK 构建通过,最终真机复现与 Admin 诊断核对待完成。
|
||||
T-265 已恢复安全入口之后的唯一「免拼购买」入口,订单确认页只允许返回并跳过当前
|
||||
候选,新增两个尾部诊断计数;Debug/Release 各 336 项单测、`lintDebug` 和两个 APK
|
||||
构建通过,待设备连接后完成真机与 Admin 验收。
|
||||
|
||||
## 当前可运行内容
|
||||
|
||||
```powershell
|
||||
.\init.ps1
|
||||
|
||||
$env:RUN_START_COMMAND = "1"
|
||||
.\init.ps1
|
||||
|
||||
Set-Location backend-api
|
||||
$env:GOTOOLCHAIN = "local"
|
||||
go run ./cmd/migrate up
|
||||
$env:CMROUBAO_AUTH_PASSWORD = "至少 5 个 UTF-8 字节"
|
||||
go run ./cmd/authctl create-user ADMIN admin
|
||||
Remove-Item Env:CMROUBAO_AUTH_PASSWORD
|
||||
$env:CMROUBAO_AUTH_PASSWORD = "账号新密码,至少 5 个 UTF-8 字节"
|
||||
go run ./cmd/authctl reset-password admin
|
||||
Remove-Item Env:CMROUBAO_AUTH_PASSWORD
|
||||
go run ./cmd/api
|
||||
```
|
||||
|
||||
2026-07-25 已在 PKG110、Android 16/API 36、拼多多 8.17.0 上完成 Debug APK
|
||||
固定词搜索和 5 个候选采集。默认首屏为候选探针,用户点击后五步全部完成,5 张
|
||||
匿名 PNG 与 manifest 哈希一致并返回结果页;logcat 无崩溃或 ANR。
|
||||
|
||||
同日用显式私有 fixture 和一次性本机 OpenAI 兼容 mock 完成 T-103 Android smoke:
|
||||
只发出 1 次 POST 和 1 张 JPEG data URL,请求不含订单/店铺字段或数量键;严格响应
|
||||
进入 READY,UI 保留原 SKU/数量、空预算和警告。恢复无密钥 provider 后失败状态会
|
||||
清空旧结果;设备原 API provider 设置已恢复。该 smoke 只证明集成与隐私边界,不
|
||||
代表真实 VLM 提取质量;真实凭证调用未执行。
|
||||
|
||||
同日完成 T-104 真机 smoke:结构化需求搜索词驱动拼多多搜索并采集 5 份候选证据,
|
||||
本机 mock 精确收到 5 次按 ordinal 排序的单图 POST;请求未包含订单、店铺、本机
|
||||
路径或数量字段。严格评估进入“等待人工确认”,人员可标记建议候选可用或拒绝,
|
||||
`order_submitted` 始终为 false;日志敏感词、Base64、原始响应和 schema/prompt
|
||||
命中均为 0。该结果不代表真实模型的商品匹配质量。
|
||||
|
||||
2026-07-27 完成 T-211 真机 smoke:PKG110 上从后台任务下载并校验参考 JPEG,写入
|
||||
一次性匿名 MediaStore 图片后进入拼多多拍照搜索并选择该图。App 完成 4 个有界候选
|
||||
详情和证据采集并以 `PDD_IMAGE_SEARCH` 回传后台;不足 5 个未凑数,临时图库图片在
|
||||
流程结束后删除。验证期间修复相机自动结果页竞态和 MediaStore volume URI 差异;
|
||||
测试任务随后取消,全程未进入购物车、订单或支付。真实 VLM provider 尚未参与本次
|
||||
smoke,当前结论只覆盖图片召回、严格契约和回传链路。
|
||||
|
||||
同日完成 T-201 后端 smoke:本机迁移执行 `status -> up -> up -> down -> up`,
|
||||
第二次 `up` 应用数为 0;API 真实进程的 `GET /healthz` 返回 `200` 和稳定 JSON,
|
||||
未知路由返回 `404`,错误方法返回 `405`,无默认 CORS,stdout/stderr 均为空。
|
||||
`http.Server.Shutdown` 由集成测试验证在 1 秒预算内结束。当前 Windows 没有可用 WSL
|
||||
发行版,因此 `init.sh` 未实际运行;Windows 标准入口已验证。
|
||||
|
||||
2026-07-26 完成 T-203:新增两条业务 migration、图片规范化存储、任务领域/用例/
|
||||
SQLite 仓储、管理 API 和 SSR Web。创建/上传幂等,列表稳定分页,详情可读取同源
|
||||
规范化参考图,只有 `PENDING` 可取消。T-204 前业务路由仅限 loopback,Web 写操作
|
||||
使用双提交 CSRF;这不是正式鉴权。真实 HTTP/Playwright 和 migration CLI smoke、
|
||||
99 个 Go 测试、全包 race/vet、Windows 构建与根 `init.ps1` 全部通过。
|
||||
|
||||
2026-07-26 完成 T-204:新增 users/devices/admin_sessions/access_tokens 与任务 actor
|
||||
migration、bcrypt 密码、opaque 凭证、`authctl`、管理登录/退出和 App 联合认证。
|
||||
ADMIN Cookie 与 BUYER 设备 Bearer token 完全隔离;非 loopback 监听必须配置内建
|
||||
TLS。真实 SQLite/Gin smoke 验证 migration up/down/up、账号/设备预置、App token、
|
||||
管理登录、任务创建 actor 和退出;Playwright 在 1440×900、390×844、360×800
|
||||
验证无横向溢出,发现并修复退出路由漏装配及 T-203 旧 CSRF Cookie 路径兼容问题。
|
||||
142 个 Go 测试、全包 race/vet、Windows 三入口构建与根 `init.ps1` 均通过。
|
||||
|
||||
2026-07-26 完成 T-205:新增设备 readiness、claim/execution/lifecycle migration,
|
||||
实现 client-generated claim token 安全重放、跨连接原子领取、CLAIMED/运行租约、
|
||||
start/heartbeat/release、管理取消请求、App cancel-ack 和当前 claim 参考图授权。
|
||||
真实 TCP 并发测试验证同设备同时 claim 只有一个成功;迁移 CLI 完成
|
||||
`status/up/up/down/up`。Playwright 连接真实服务验证管理任务详情在 1440×900、
|
||||
390×844、360×800 无横向溢出、破图或取消弹窗重叠;执行中安全停止文案由 SSR
|
||||
测试覆盖。192 个 Go 测试、全包 race/vet、Windows 三入口构建和根 `init.ps1`
|
||||
全部通过。
|
||||
|
||||
2026-07-29 完成 T-246 代码:App 登录且 readiness 通过后每 10 秒自动检查任务,
|
||||
自动 claim、等待参考图稳定窗口并 start;本地 VLM 配置完整时串联需求提取、图片搜索
|
||||
和候选评估,否则使用确定性 SKU 硬约束。候选只在语义或本地 OCR 得到唯一
|
||||
`goods_id` 后回传,后台保存规范 PDD URL、标题、SKU、价格及两张本地证据图。
|
||||
Admin 选中后,schema v2 命令把商品 ID/URL 纳入不可变授权和 SHA-256,App 定向打开
|
||||
该商品并复核后沿用 T-218 一次提交围栏和待付款订单对账。后台 heartbeat 可原子清理
|
||||
已请求取消且租约过期的旧任务。`go test ./...`、race、vet、三个 Go 入口构建、
|
||||
Android 单测、Debug/Release 构建均通过;Debug APK 已覆盖安装到 PKG110。为避免在
|
||||
服务端应用 v18 前触发真实采购,本次未自动启动 App,真实 PDD 页面 smoke 待启动后
|
||||
执行。
|
||||
|
||||
## 维护规则
|
||||
|
||||
发生以下变化时覆盖更新本文:
|
||||
|
||||
- 初始化 Git 或接入上游代码。
|
||||
- 获得首个可复现 Android 构建、安装或启动命令。
|
||||
- 建立后端和真实测试命令。
|
||||
- 设备、拼多多和 VLM 基线确定。
|
||||
- 项目阶段、目录或 blocker 变化。
|
||||
|
||||
任务的详细状态、验证和决策写入 `docs/tasks/T-<编号>.md`,本文只保留快照。
|
||||
Reference in New Issue
Block a user