将 web/services/runtime.py 拆为 runtime/ 子模块并保持门面兼容;补齐 ESS 文档、门面/契约/TF_DF 测试与 CODE_REVIEW Approve。 Co-authored-by: Cursor <cursoragent@cursor.com>
75 lines
3.3 KiB
Markdown
75 lines
3.3 KiB
Markdown
# CODE_REVIEW — ECR-002
|
||
|
||
**Role:** REVIEWER
|
||
**Date:** 2026-08-06
|
||
**Scope:** 工作区未提交实现(相对 `HEAD`/`9f1e736`);包 `web/services/runtime/` + 测试 + ESS 文档
|
||
**Decision:** Approve
|
||
|
||
## Evidence loaded
|
||
|
||
- `docs/ECR/ECR-002-runtime-split.md`
|
||
- `docs/ENGINEERING_SPEC/ECR-002-runtime-split.md`
|
||
- `docs/IMPLEMENTATION_REPORT/ECR-002.md`
|
||
- `docs/TEST_REPORT/ECR-002.md`
|
||
- `docs/HANDOFF/ECR-002-engineer-to-reviewer.md`
|
||
- 包源码:`web/services/runtime/{__init__,state,timeframes,market_data,indicators,analyze,serialize}.py`
|
||
- Diff:删除 `web/services/runtime.py`;新增包与测试
|
||
|
||
## Acceptance ↔ Evidence
|
||
|
||
| Acceptance | Verdict | Evidence |
|
||
|------------|---------|----------|
|
||
| runtime 门面公开符号兼容(含历史 `import *` 漏出) | PASS | 手工核对 api 所需符号;`timezone`/`OrderedDict`/`np`/`StructureZone*`/`ThreadPoolExecutor` 等在门面;`test_runtime_facade` |
|
||
| Golden 通过 | PASS | 复跑 `tests/test_golden_pipeline.py` |
|
||
| Analyze 契约加深 | PASS | `test_analyze_contract`:键清单 + analyze_chan 键集 + serialize JSON + mock HTTP |
|
||
| TF_DF 全量 init 冒烟 | PASS | `tests/test_tf_df_init.py`(`interval=1`) |
|
||
| config/strategies 无交易逻辑 diff | PASS | 工作区无 `config/`/`strategies/` 变更 |
|
||
| IMPL / TEST / CHANGELOG / TRACEABILITY | PASS | docs 已落盘 |
|
||
| CODE_REVIEW Approve | PASS | 本文件 |
|
||
|
||
## 复跑结果(Reviewer)
|
||
|
||
```text
|
||
PYTHONPATH=.:web python -m pytest \
|
||
tests/test_golden_pipeline.py \
|
||
tests/test_tf_df_init.py \
|
||
web/tests/test_runtime_facade.py \
|
||
web/tests/test_analyze_contract.py -q
|
||
→ 13 passed
|
||
```
|
||
|
||
算法冻结抽查:`analyze.py` 仍为 `cal_bi_zs(seg_list)` + `_last_chan_macd` 复用;未改笔段中枢语义。
|
||
|
||
## Findings
|
||
|
||
### Non-blocking(不挡 Approve)
|
||
|
||
1. **门面标量同步只做一次** — `__init__` 在首次 `refresh` 后把 `DATA_SERVICE_AVAILABLE` / `macd_*` 写入模块 dict;之后 `refresh_data_service_metadata` 只改 `state.*`。通过 `R.DATA_SERVICE_AVAILABLE` 读取可能与 state 短期不一致;`from services.runtime import *` 的 bool 拷贝问题在 monolith 时代已存在。建议后续 L1:在 `refresh` 末尾同步写回门面模块,或让标量只经 `state`/`__getattr__` 暴露。
|
||
2. **`__getattr__` 对已绑定名无效** — 与上条相关;属清理项。
|
||
3. **`chart_tv.js` 拆分未做** — ECR 明确可选;继续记入 backlog。
|
||
4. **契约测试仍无「固定 JSON 快照文件」** — 已有 mock HTTP + 键集,比 ECR-001 深;完整响应快照可另开 L1/ECR。
|
||
5. **`web/tests/test_cn_stock_data_fetch.py` 仍因旧 `user_data.Chan...` 路径无法收集** — 既有问题,非本 ECR 引入。
|
||
|
||
### No blockers
|
||
|
||
未发现违反「算法语义冻结 / API 可增不可删 / 无 Vite-React / 未动 strategies·config / 未引主站 WS」的证据。
|
||
|
||
## Decision
|
||
|
||
**Approve**
|
||
|
||
- ECR-002 可标 Done(Reviewed);不强制新 system tag(仍为 `v1.0.0` Unreleased 文档变更)。
|
||
- 非阻断项进 backlog;不阻塞合并本实现。
|
||
|
||
## Next owner
|
||
|
||
`engineer` / Human — 提交合并;若要发版再交 `release_manager`(本 ECR 未要求 bump tag)。
|
||
|
||
## Traceability
|
||
|
||
| Item | Updated |
|
||
|------|---------|
|
||
| Acceptance mapping | 本文件 |
|
||
| STATE.owner | → idle / merge |
|
||
| ECR Status | → Done (Reviewed) |
|