QiuSWandClaude Opus 5 3c458bcf5b fix(tasks): make status git-authoritative, not Vikunja
修掉一处会让并行保护失效的设计缺口:AGENTS.md 声明「状态」权威在 Vikunja,
但离线门禁的检查 1 读的是 frontmatter 的 status,两者之间没有任何同步。
有人在看板上拖了卡片,frontmatter 不变,门禁就用过期数据放行了。

status 的权威定为 git frontmatter,理由与 write_paths 相同:它是判定
「两个活跃任务不得写同一路径」的输入,而门禁必须离线可跑;status 变更
决定谁能碰哪些文件,本来就该产生 commit。

- AGENTS.md:把 status 从 Vikunja 权威列表移入 git 原生表,并说明 bucket
  与 done 仅为人类视图,不一致时以 git 为准
- agent-context.json:tracker.git_native_fields 增加 status
- validate_agent_context.py:强制 git_native_fields 必须含 status,
  已用反例验证缺失时报错
- vikunja_export.py:新增只读漂移检测,导出时比对 frontmatter status 与
  Vikunja done,不一致则提示;只提示不修正,不反向写回
- docs/tasks/README.md、T-008 方案第 1/2 节:同步口径

顺带解决了窄 token 时期的 bucket 401 遗留问题——status 权威在 git,
agent 不再依赖 bucket 移动来表达状态。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 17:17:35 +08:00

cmbuyer

自动化采购系统。采购服务(网页端,admin/)负责建单与人工决策,采购工具 (Windows 桌面端,client/)驱动 Android 手机在拼多多完成选规格和下单。

系统只创建待付款订单,任何情况下都不自动付款。

它做什么

一笔外部订单进来,采购人员需要去拼多多找到同款、选对颜色尺码、下单、把订单号抄回系统。 cmbuyer 把这个过程自动化,人只在两个点介入:机器选对了吗和付不付款。

手工填链接(MVP)  /  Excel · ERP(V2)
            │
            v
 采购服务(admin/,Go)  建单 · 试选确认 · 下单授权 · 审计
            │  HTTP
            v
采购工具(client/,Python)  领任务 · 跑流程 · 回传
            │  ADB(USB / WiFi)
            v
   Android 手机(拼多多 App)

两趟执行

MVP 只做任务自带商品链接的情形,分两趟跑完:

趟次 做什么
第一趟 · 试选 开商品 → 精确勾选颜色分类和尺码 → 读单价 → 截图 → 退出释放手机 → 回传
人工确认 人在网页端看「机器选对了吗」→ 确认并锁定单价
第二趟 · 下单 重新开商品 → 重新选同一规格 → 三道价格闸门 → 提交订单一次 → 转「待付款」

为什么分两趟:一台手机是瓶颈,不能停在规格面板上等人。代价是走两遍,换来手机不空闲, 且第二趟能抓住价格变动。

三道价格闸门:① 第一趟规格面板读价 ② 第二趟重读必须与授权价一致 ③ 订单确认页「实付款」不超上限。任一道读不到或不通过即停,转人工。

价格只在规格面板和订单确认页读——别处的价格文本被拆成多个节点、带券后前缀、 实付价与原价混在一起,不可靠。

现在处于什么阶段

Phase 0 · 地基。仓库目前只有文档,尚未开始编码。

下一步:T-005(网页端 MVP 原型)与 T-006(桌面端 MVP 原型)的文件和自动检查已完成, 请先人工确认 6 个 HTML 原型,再进入 T-001 / T-002 骨架和生产实现。 详见 docs/current-state.md。

生死线是 M2:真机能按链接打开商品、精确勾选颜色分类和尺码、读到该 SKU 单价。 前序项目正是卡在这里,M2 不通过之前不要写页面。

从哪读起

你是 读这个
AI coding agent AGENTS.md → docs/00-ai-start-here.md
Claude Code CLAUDE.md
想了解业务 docs/01-vision.md → docs/02-requirements.md
想了解技术结构 docs/04-architecture.md
全部文档 docs/README.md

十一条安全边界

以下每条都必须有单元测试证明,不得在任务中放宽:

  1. 不点击任何支付、免密支付、先用后付或扣款控件
  2. 提交订单四条件:授权未消费且服务端提交围栏已建立 + 闸门二通过 + 闸门三通过 + 控件唯一,只点一次;围栏后只调和,不释放、不重试
  3. 订单确认页上除提交与返回外零点击
  4. 规格按维度精确匹配,防前缀碰撞,找不到即停
  5. 数量设置后必须读回复核
  6. 三道价格闸门,任一道读不到或不通过即停
  7. 第一趟绝不下单——试选路径不得引用下单函数
  8. 检测到外部支付交接立即停止,不读取不保存凭据
  9. 检测到验证码 / 风控 / 人脸 / 短信校验立即停止,不绕过
  10. 只读非敏感摘要,不提取收货地址原文、手机号、支付凭据
  11. 授权一次性,重复提交幂等;点击后无论结果一律不重试

完整说明见 docs/04-architecture.md 第四节。

与前序项目的关系

cmbuyer 是 cmroubao(Go 后端 + Android AccessibilityService)与 cmpdd (Python + uiautomator2)的合并重启,取各自已验证的一半:

  • 保留 cmroubao 的后端任务生命周期、设备侧 API 形状、下单授权状态机、ERP 对接、管理 Web
  • 保留 cmpdd 的 uiautomator2 真机自动化、按维度精确选规格、订单确认页读取、付款闸门
  • 丢弃自研 Android APK 与 AccessibilityService 感知层

前序项目是设计依据,不是事实来源。 其中的页面判据必须在本项目用真机重新验证。

技术栈

端 栈
web Go 1.23+ / gin / html/template / SQLite / goose
desk Python 3.11+ / uiautomator2 / PySide6 / Pillow
设备 Android 手机 + 拼多多 App,ADB over USB 或 WiFi

详见 docs/03-tech-stack.md。

S
Description
No description provided
Readme
4.5 MiB
Languages
Python 66.4%
Go 29.4%
HTML 2.1%
JavaScript 1.3%
PowerShell 0.4%
Other 0.4%