docs: 实施计划(loop 模式 + 八阶段验收标准)

- loop 机制:取任务 → 实现 → 验证 → 记录 → 提交 → 报告;遇设计空白停车问作者
- 八阶段:数据层与密钥 → key 管理 → 管理面其余 → 同步引擎 → 查看面数据面 → /usage-log 前端 → 管理面前端 → 收尾
- 前提已定:Docker 本地 PG · 真实 key 联调 · loop 内直接提交(作者授权)
This commit is contained in:
2026-09-15 00:03:46 +08:00
parent 138a1b7685
commit 30e71beb09
2 changed files with 58 additions and 0 deletions
+1
View File
@@ -21,6 +21,7 @@
| [`docs/design/交互设计.md`](docs/design/交互设计.md) | 界面设计:方向层 + 细节层(跨页共性、逐页细节、状态与文案) | 定稿(2026-09-13) |
| [`docs/design/API契约.md`](docs/design/API契约.md) | 前端 ↔ 服务端接口契约:约定层 + 逐页端点(前端实现看这篇) | 定稿(2026-09-13) |
| [`docs/design/同步引擎设计.md`](docs/design/同步引擎设计.md) | 采集侧引擎:调度、每轮动作、失败处理、可观测、部署初始化(后端实现看这篇) | 定稿(2026-09-13) |
| [`docs/design/实施计划.md`](docs/design/实施计划.md) | 开发推进方案:loop 模式 + 八阶段验收标准 + 进度表 | 定稿(2026-09-14;进度随 loop 更新) |
| [`docs/upstream/NewAPI-sk-key接口文档.md`](docs/upstream/NewAPI-sk-key接口文档.md) | 查 sk-key 可用接口的字段级事实(源码实证,430 行) | 事实依据 |
| [`docs/upstream/NewAPI-接口范围.md`](docs/upstream/NewAPI-接口范围.md) | 本项目对接的接口范围(9 个接口的用途与鉴权) | 事实依据 |
+57
View File
@@ -0,0 +1,57 @@
# 实施计划
> 开发过程的推进方案:**loop 模式**(每轮一个可验证批次)+ 八个阶段的验收标准。任务口径全部指向 `docs/design/` 的设计文档;本文件只回答「先做什么、怎样算做完、下一步做什么」。
| 项目 | 内容 |
|------|------|
| 状态 | 定稿(2026-09-14;**进度表随 loop 持续更新**) |
| 关联 | `docs/design/API契约.md` · `docs/design/同步引擎设计.md` · `docs/design/交互设计.md` · 四张表字段设计 · `AGENTS.md`(命令) |
| 范围 | 阶段划分、每批验收标准、loop 机制与停车规则;技术细节一律以设计文档为准 |
| 当前进度 | 阶段 0 已完成;下一批:**阶段 1**(数据层与密钥) |
---
## 1. loop 机制(每轮固定动作)
1. **取任务**:计划表(§3)中当前批次的第一项
2. **实现**:以设计文档为准,不自由发挥
3. **验证**:跑该批次的验收命令(type-check / 单测 / 实测 curl / 浏览器走查)
4. **记录**:勾选进度表(日期 + 验证方式)
5. **提交**:一个逻辑单元一个 commit(**作者已授权 loop 内直接提交**,dev 分支;`git push` 永远由作者手工)
6. **报告**:一句话——做了什么 / 验证结果 / 下一项
7. **停车规则**:遇设计文档未覆盖的问题 → **停下问作者**,不猜着往下写(已知的待定问题见 §4)
## 2. 前提(2026-09-14 定)
- **开发库**:Docker 本地 PostgreSQL(`docker-compose.yml` 随阶段 1 落地;连接串走 `.env`,不入库)
- **上游联调**:真实 sk-key(作者提供,放 `.env`;文件不入库)——阶段 2 / 4 依赖它
- **提交**:loop 内直接提交已授权;push 由作者手工(仓库有两个远端)
## 3. 阶段与验收标准
| 批次 | 内容 | 验收标准 | 状态 |
|------|------|---------|------|
| 0 | 脚手架 + 契约类型 + 501 骨架 | 命令链全绿(type-check / test / build) | ✅ 2026-09-14 |
| 1 | **数据层与密钥**:crypto(HKDF 派生 / HMAC-SHA256 / AES-256-GCM)· 时间工具(+08:00 序列化、UTC 秒转换)· `docker-compose.yml` · 建表 | 单测:哈希确定性 + 加解密往返;`db:push` 后四张表在库 | ☐ |
| 2 | **上游客户端 + key 管理**(`GET` / `POST` / `PATCH` 三端点) | curl 实测:登记 → 清单 → 停用/启用;三类错误码分支正确(`key_rejected` / `already_registered` / `upstream_unavailable`) | ☐ |
| 3 | **管理面其余**:purchases 五端点 + qpu 一端点 | curl 实测:CRUD 全流程 + 观测聚合(`matched_purchase_id` 判定正确) | ☐ |
| 4 | **同步引擎**:tick(5 分钟 + 防重入 + 启动即跑)· 日志整批事务入库 · 额度采集 · QPU 采样 · 401 状态机(N=3) | 库中出现真实数据;`[sync]` 日志符合引擎设计;连续 401 触发摘除且 `disabled_source = auto_401` | ☐ |
| 5 | **查看面数据面**:`logs/query` + `summary` + 折算链(按购买期间分段取尺) | curl 实测:字段齐全、`meta.data_until` 取最慢、金额按购买分段累加正确 | ☐ |
| 6 | **前端 `/usage-log`**:筛选区(key 标签 + datetimerange + 快捷项)· 卡片 · 表格 + 展开行 · 分页器 · 六种状态模式 | 浏览器实测:真实数据走一遍;六态逐一可见(加载 / 初始 / 未收录 / 无记录 / 同步中 / 失败) | ☐ |
| 7 | **前端管理面**:口令门帘 + 侧边栏 + 三页(key 管理 / 购买记录含核对提示与补录 / 换算参数) | 浏览器实测:登记、启停、CRUD、补录、时间线全操作 | ☐ |
| 8 | **收尾**:部署文档(`docs/delivery/`)· 端到端走查 · 文档状态更新(设计文档 → 已实现) | 一条命令链可部署(前后端独立 + 后端单实例注记);走查无阻 | ☐ |
## 4. 实现中的待定问题(遇到即停车问作者)
| # | 问题 | 归属批次 |
|---|------|---------|
| 1 | `amount_rmb` 在「日志无归属购买记录」时取什么值(0 / 退化为额度美元 / 前端显示「—」) | 5 |
| 2 | 充值(`wallet`)路径的折算近似(设计文档标「后议」) | 5(遇到再说) |
| 3 | `dedupe_key` 内容指纹的拼接细节(`request_id` 为空时) | 4 |
| 4 | 上游对同账号请求的态度(限流 / 并发被拒时的表现) | 4(遇到再说) |
## 5. 风险
- 真实上游联调依赖作者提供的 key 与网络可达;不可用时临时以假上游过渡(不改变验收口径)
- 折算链(阶段 5)依赖已登记的购买记录——无记录时的退化行为即待定问题 #1
- **后端必须单实例**(同步引擎前提):部署文档(阶段 8)必须写明;本地开发也不要起两个后端