# 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) |