Files
cmbuyer/docs/00-ai-start-here.md
T

206 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AI 开发入口
> 给 AI coding agent 的项目入口。这里负责导航和流程,硬性编码规则见
> [`05-coding-rules.md`](05-coding-rules.md)。
## 一句话定位
cmbuyer 是一个自动化采购系统:**采购服务**(网页端,`admin/`)负责建单与人工决策,
**采购工具**(桌面端,`client/`)驱动 Android 手机在拼多多完成找货和下单,
**付款始终由人完成**。
第一版 MVP 只做**任务自带商品链接**的情形。创建任务不授权;管理员勾选 `DRAFT` 并点击
“开始采购(只创建待付款订单)”后,服务端锁定商品、规格、数量和最高总价并签发一次性授权。
采购工具领取后在**同一趟**完成精确选规格、三道价格闸门、数量复核、确认页、提交围栏和唯一一次
“提交订单”点击。中间不等待人工确认;订单创建后转待付款,由人核对和付款。
## 上下文读取
首次接入、[`agent-context.json`](agent-context.json) 缺失或校验失败时,按顺序建立上下文:
1. [`01-vision.md`](01-vision.md):为什么做、为谁做、什么不做。
2. [`02-requirements.md`](02-requirements.md):MVP 要什么、怎么算达成。
3. [`03-tech-stack.md`](03-tech-stack.md):两端各自的技术选型与验证矩阵。
4. [`04-architecture.md`](04-architecture.md):双端职责、**单趟执行**、**三道价格闸门**、安全边界、数据模型。
5. [`05-coding-rules.md`](05-coding-rules.md):写代码前必须遵守的规则。
6. [`06-tasks.md`](06-tasks.md):阶段路线图与建议拆分。
7. [`tasks/README.md`](tasks/README.md):任务文件约定。
8. [`current-state.md`](current-state.md):当前代码现实、可运行命令、下一步任务。
涉及页面或桌面界面时,还必须读 [`07-user-stories.md`](07-user-stories.md)、
[`08-interaction-checklist.md`](08-interaction-checklist.md) 和 [`routes.md`](routes.md)。
日常会话按 [`agent-context.json`](agent-context.json) 的最小路径读取,不机械重读全部文档。
## 固定开工流程
1. `pwd`:确认在 `cmbuyer` 仓库根目录。
2. 读 [`current-state.md`](current-state.md) 和 `docs/tasks/` 中的活跃任务,恢复已验证状态、
下一步和当前 blocker。
3. `git log --oneline -5`:看清最近发生了什么。
4. 运行 `./init.ps1`(或 `./init.sh`):安装、验证、打印启动命令。
5. 跑一条基础 smoke,确认基线没坏。
6. **基线已坏就先修基线**,不要在坏的起点上叠新功能。
7. 基线绿了,再从 `docs/tasks/` 领取唯一任务。
## 本项目的四条特有纪律
这四条比通用流程更重要,违反会直接造成资金损失或重蹈前序项目覆辙。
### 1. 涉及真机页面判据的任务,先取证再写代码
拼多多 App 会随版本改变页面结构。前序项目已观察到详情页没有独立规格入口、价格文本被
拆成多个节点等变化。
**不得从前序项目的结论、旧文档或推理直接写判据。** 必须先在真机上 dump 页面取证,
把证据(截图路径、XML 路径、**拼多多 App 版本**)写进任务文件,再写代码。
### 2. 安全边界只能收紧,不能放宽
[`04-architecture.md`](04-architecture.md) 第四节的硬约束(不付款、提交订单四条件与服务端围栏、
规格精确匹配、提交控件唯一、数量必须复核、三道价格闸门、隔离能力不越界、外部支付停止、
安全校验停止、敏感信息不提取、授权一次性)**不得在任务中顺手放宽**。
确需变更时先改架构文档并说明理由,再动代码。任何「为了让流程跑通先放宽一下」的改动
一律拒绝。
### 3. 价格只在两个地方读
**规格面板**(闸门一 / 二)和**订单确认页**(闸门三)。
**不从商品详情页正文、搜索结果卡片或任何其他位置读价格。** 那些位置的价格文本被拆成
多个节点、带「券后」前缀、实付价与原价混在一起,前序项目在这里耗掉大量时间且无可靠
结论。读不到就转人工,**不用别处的数字凑合**。
理由与三道闸门的定义见 [`04-architecture.md`](04-architecture.md) 第三节。
### 4. 真机能力逐段取证、隔离开放
T-103 的 `SkuSelectionFlow` 只允许证据绑定的受控入口、精确选择、读价和安全退出;不得引用
数量、确认页、提交围栏、提交或付款能力。T-105~T-107 分别取证后才可组合。生产单趟只有在全部
能力均获证据、三道闸门通过且服务端围栏明确许可后才能点击一次;支付能力永不开放。
## 当前阶段
**Phase 1 · 真机可行性,并行启动采购服务基础能力。** 两端骨架与核心数据模型已完成,T-103
仍是当前真机关键路径;与真机可读字段无关的采购服务能力不再空等。
执行按任务依赖驱动,**不按 Phase 整段串行等待**。当前优先路径:
1. 完成 **T-103 人工真机验收**,再按依赖推进 T-104 → T-107 的分段安全判据。
2. admin agent 在 T-107 后推进 T-210 → T-205 → T-206 → T-207 → T-208,冻结三闸门证据、
attempt 事件、围栏、一次性结果与人工调和。
3. client agent 先做当前可领取的 T-303,再推进 T-304 / T-306 / T-307 / T-308;与 admin 写路径
不重叠的任务继续并行。
4. T-305 完成围栏前真机 dry-run;T-400 只用 fixture/fake port 建立离线一次性提交安全闭包。
5. T-403 → T-402 先准备围栏后调和与人工付款事实记录;T-401 才在新真实单趟中首次点击一次,
点击后固定报 `UNKNOWN` 并由人调和,绝不付款。
6. T-405 生成可核验 Windows 包,T-404 对同一候选 commit 与产物做最终只读验收;V2 能力继续后置。
> **M2 是本项目的生死线**:真机能按链接打开商品、精确勾选颜色分类和尺码、
> **读到该 SKU 的单价**(T-103)。前序项目正是卡在选规格和读价。
> M2 不通过之前不要写**依赖真机可读字段的生产执行逻辑**;管理会话、`DRAFT` 建单和只锁定
> 已有任务字段的服务端授权事务可以并行。实际可读字段仍以真机证据为准。
## 领取任务规则
- 每个 agent 只领取一个 frontmatter `status: TODO` 且依赖均 `DONE` 的任务文件,取编号
最靠前的。
- `docs/tasks/` 暂无可领任务时,先按 [`06-tasks.md`](06-tasks.md) 把下一个建议任务落成
任务文件,再领取。
- 开始前在独立分支 / worktree 把 frontmatter `status` 改为 `DOING`。
- 本轮只完成这一个任务;验收通过后改为 `DONE`。
- **执行记录写进该任务文件的 `## 执行记录`**。
- 项目现实变化(启动 / 验证路径、目录结构、blocker)时覆盖更新
[`current-state.md`](current-state.md)。
- 结束前过一遍 [`clean-state-checklist.md`](clean-state-checklist.md)。
- 做完即停,汇报验证结果,等待下一步指令。
**需要真机验收的任务,agent 不得自行标 `DONE`。** 保持 `DOING` 并写明等待人工验收的
具体事项。
只做:
- **手工填链接**建单、任务查询、勾选待开始任务后批量“开始采购”
- 点击开始采购即签发锁定商品、规格、数量和最高总价的一次性授权
- 桌面端定时轮询只领取已授权任务,在同一趟精确选规格、两次读价、复核数量和确认页金额
- 围栏前失败/过期可人工回到待开始;围栏后只能调和
- 三道闸门全过、服务端围栏明确许可后提交订单一次
- 真实点击前服务端原子建立提交围栏;围栏失败不点击,围栏后只调和同一提交记录
- 待付款展示订单截图,人核对付款后手工标记完成
- 失败分类与转人工
不做(推到 V2 或永不做):
- **自动付款(任何版本都不做)**
- **图片搜索**(B 路径)与多候选对照台
- **Excel 导入**、**ERP 建单**(均被待确认字段契约阻塞)
- 订单自动回读核对
- 已开始任务的批量排序、暂停 / 继续和运行中人工接管
- 绕过验证码、风控、人脸、短信校验
- 拼多多以外的平台
- 多设备并行、审批链、退款、财务对账
- **AI 辅助**
## 事实来源
项目事实只信:
- 本目录下的文档(架构、API、需求、交互)
- 数据库迁移文件与 `admin/internal/domain/` 中的实体定义
- 真机取证产物(截图、页面 XML)及其记录的 App 版本
- 当前仓库代码
**不要当事实来源**:
- 前序项目 `cmroubao` / `cmpdd` 的代码与文档——它们是**设计依据**,结论必须在本项目
重新验证。
- 历史备份、旧导出、临时实验目录。
- 未被任务或需求引用的草稿。
## 常见任务该看哪里
| 做什么 | 读什么 |
| --- | --- |
| 采购服务页面 | `02-requirements.md` 验收 → `07-user-stories.md` → `08-interaction-checklist.md` → `routes.md` → `04-architecture.md` |
| 采购工具界面 | 同上,`routes.md` 看第三节桌面端结构 |
| 设备侧 API | `api.md` → `04-architecture.md` 数据模型与鉴权边界 |
| 真机自动化 | `04-architecture.md` 第三节单趟执行与三道闸门 → 第四节边界 → `api.md` 第三节模块合约 → **先真机取证** |
| 数据模型 | `04-architecture.md` 第五节;schema 变化必须同步 `api.md` 和 `current-state.md` |
| 部署 / 运行 | `03-tech-stack.md` → `current-state.md` |
## 验证命令
> Windows 标准入口 `./init.ps1` 已由 T-003 实际验证。它优先使用合规的既有 venv(本机实际为
> Python 3.12),仅在 venv 缺失时才从 Python Launcher 自动选择最高的 Python 3.11+,避免回退到
> 默认 Python 3.10;通过后会输出两端真实启动命令。
```powershell
# Windows 统一安装、离线验证与启动命令提示
.\init.ps1
# 以下为诊断或单独验证时使用的等价命令
# 采购服务 admin/(改了 Go 代码后)
cd admin
go test ./...
go vet ./...
go build ./...
# 采购工具 client/(由 init.ps1 创建的 Python 3.11+ 虚拟环境)
cd client
.\.venv\Scripts\python.exe -m unittest discover -s tests -t .
.\.venv\Scripts\python.exe -m compileall -q src tests scripts
$wheelDir = Join-Path $env:TEMP ('cmbuyer-client-wheel-' + [guid]::NewGuid())
New-Item -ItemType Directory -Path $wheelDir | Out-Null
.\.venv\Scripts\python.exe -m pip wheel --no-deps . --wheel-dir $wheelDir
.\.venv\Scripts\python.exe scripts/verify_wheel_metadata.py (Get-ChildItem $wheelDir -Filter '*.whl').FullName
# 跨端契约改动:两端全跑
```
验证层级何时触发见 [`03-tech-stack.md`](03-tech-stack.md) 第六节验证矩阵。
`requirements.txt` 是采购工具唯一的运行时依赖来源,`pyproject.toml` 动态读取它写入 wheel
元数据。规范安装是 Python 3.11+ 虚拟环境中的 `python -m pip install -e .`,已由 Python 3.12
验证通过;桌面 GUI 和真机流程不属于本次验收。`init.ps1` 使用合规既有 venv,或在缺失时自动选择
Python 3.11+ 创建它;本机现有 venv 实际验证为 3.12。若命令当前不可运行,必须在回复里如实说明原因。