docs(phase3a): Web API 完整化完成报告(8 task, 44+74 passed, NAS smoke 6/6, 已合并 master)

This commit is contained in:
2026-07-06 20:22:54 +08:00
parent 1a05086aab
commit b2c2a1305b
@@ -0,0 +1,76 @@
# Phase 3a Web API 完整化 — 完成报告
> **日期**: 2026-07-06
> **分支**: `feat/web-api`(已 push giteab3cb6fd..472355411 commits
> **前置**: Phase 1 数据层 + Phase 2 因子/回测层(已 DONE
> **spec**: `docs/superpowers/specs/2026-07-06-phase3a-web-api-design.md`
> **plan**: `docs/superpowers/plans/2026-07-06-phase3a-web-api.md`8 task
## 一句话结论
Phase 3a 后端完整化全部完成:8 task 通过 subagent-driven(每 task fresh implementer + review),74 容器测试 + 44 本地测试全绿,覆盖率 81%,NAS 容器冒烟 6/6 PASS,三向一致性检查通过,成果物已 push gitea。
## 业务目标达成(spec §0 五项)
| # | 目标 | 体验意义 | 实现 | 状态 |
|---|------|---------|------|------|
| ① | 回测异步化 | 提交回测立即返回、后台跑,不卡主进程 | T3 pool(spawn PPE) + T4 runner async submit + wrap_future bridge | ✅ |
| ② | WS 阶段进度推送 | 实时看任务跑到哪步(排队/回测中/完成) | T2 ConnectionManager + T5 app `_on_stage` broadcast + WS route | ✅ |
| ③ | JWT 单用户登录 | 账号密码登录拿 token,业务接口鉴权 | T1 auth.pybcrypt 直调)+ T5 routes `Depends(verify_token)` + login | ✅ |
| ④ | alpha tears 完整化 | 因子分析出完整 alphalens 报告(IC/分层) | T6 compute_factors + T7 tears pipelinereal alphalens API | ✅ |
| ⑤ | optimize/factor 路由补完 | optimize/factor 接口真正调 orchestrator | T5 async routes await orchestrator | ✅ |
不做清单遵守:✅ 不引 Qlib/Celery;✅ 不做组合回测/多用户/Vue 前端(留 Phase 3b/4)。
## 任务清单(subagent-driven,每 task implementer + reviewer
| Task | 内容 | Commit | Review |
|------|------|--------|--------|
| T1 | config + auth.pyJWT 单用户) | 2227a91 | Approved1 Minor |
| T2 | ws.pyWS 连接池 ConnectionManager | 48a9058 | Approved1 Minor |
| T3 | pool.py 异步化(spawn PPE + stage | 66aa27e | Approved1 Minor — submit_work task_id 暂未用) |
| T4 | runner.py async submit + on_stage | f5a69b3 | ApprovedMinors — stage 文案/type hints/docstring |
| T5 | routes.py 完整(login+JWT+optimize/factor+WS route | efaac41 | Approvedfastapi-reviewer1 Minor |
| T6 | alpha_lab compute_factors | 8972d10 | Approved2 Minor — 缓存无界/test polars top-import |
| T7 | analyzer tears pipeline | ff0d535 + 30897aafix | Needs fixes→修复后 Approvedcumsum 警告 + report_paths dict + 异常类型) |
| T8 | 端到端冒烟 + multiprocessing guard + 覆盖率 | effd3ca | — |
| follow-up | auth passlib→bcrypt 直调(修容器登录) | 4723554 | — |
关键修复:
- **T7 review fix**cumsum 兜底价格改为显式 `warnings.warn` + ic_summary 标记 `warning_unreliable_prices``report_path`(单值)→ `report_paths`per-factor dict);异常类型记入 ic_summary。
- **T8 multiprocessing**vnpy.alpha `AlphaDataset.prepare_data()``multiprocessing.Pool`,直接脚本调用需 `if __name__=='__main__'` guard。smoke 脚本加 guard 后真实 tears 端到端跑通。
- **auth bcrypt**passlib 1.7.4 probe `bcrypt.__about__.__version__`(新版 bcrypt 已移除)→ 容器登录失败。改 auth.py 直接用 `bcrypt.hashpw/checkpw`,本地+容器均工作。
## 测试
| 环境 | 范围 | 结果 |
|------|------|------|
| 本地 Mac Python 3.14 | tests/api + tests/orchestratormock,无 polars/alphalens | **44 passed**, 81% coverageapi 94%/auth 92%/routes 76%/ws 89%orchestrator pool+task 100%/runner 64% |
| NAS 容器 Python 3.10 | tests/api + tests/orchestrator + tests/factor + tests/backtest(真实 polars/alphalens/vnpy_ctastrategy | **74 passed** |
| NAS 容器 smoke | `scripts/smoke_phase3a.py`sys.path/login/protected/orchestrator async/WS wiring/真实 tears | **6/6 PASS** |
容器需 `pytest-asyncio`async 测试用),已 `pip install` 于容器内(生产运行用 smoke 脚本 asyncio.run,不依赖 pytest-asyncio)。
## 三向一致性检查(需求 ↔ 设计 ↔ 编码)
5 个业务目标 spec → design 组件 → code 实现 全对齐,无 CONSISTENCY_ISSUE。详见 progress.md。
## 部署冒烟(NAS
- rsync 本机 → `/volume1/homes/admin/.sanguo_projects/sanguo_vnpy_v2`(容器 /app
- 容器 `sanguo_vnpy_v2` 全量测试 74 passed + smoke 6/6 PASS(含真实 factor tears 端到端 + JWT login
- 未改动容器端口/反向代理(https://vnpy.mysanguo.top 外网链路保持)
## 已知限制(deferred Minors,不阻塞)
- factor tears 的 `ic_summary` 仅记 status/report,未提取真实 IC 数值(alphalens merged_data 含 IC,留后续细化)
- forward-return `periods=(1,5,10)` 硬编码(未配参)
- `_loaded_bars` 缓存无界(单用户内部工具,规模小)
- `submit_work(task_id, ...)` 的 task_id 暂未用(预留 logging
- 短 JWT test key 警告(仅测试,生产用长 secret)
## 下一步
- **merge feat/web-api → master**:待用户确认(Phase 2 时用户选「先 merge」)
- **Phase 3b**Vue 前端(未规划)
- **Phase 4**:组合回测(未规划)