# CODE_REVIEW — ECR-004 **Role:** REVIEWER **Date:** 2026-08-06 **Scope:** `d3188ca`(相对 ECR-003)威科夫硬化 **Decision:** Approve ## Evidence loaded - Diff `d3188ca`:`range.py` / `events.py` / `analyze.py` / `chart_tv.js` / tests / ESS - 复跑:`tests/test_wyckoff.py` + golden + analyze contract → **14 passed** - 合成夹具抽查:`abs_start_idx=20`,low/high≈40.1/59.9(相对 003 的 bar0 已修好) ## Acceptance ↔ Evidence | Acceptance | Verdict | Evidence | |------------|---------|----------| | TR 不吞明显前置趋势;边界近箱体 | PASS | 评分选段;单测 low/high 带 + `abs_start≥12` + start 时间容差 | | VP series 减负 | PASS | Top-8 + 填充 3 + POC/VAH/VAL;API bins≤24 | | 阶段最小跨度 / 不重合 | PASS | 链式 cursor;unique (start,end) 断言 | | elements_only 门闩 | PASS | `include_wyckoff and not elements_only` + 契约测试 | | golden 不变 / 无策略改动 / 无币种表 | PASS | golden 绿;diff 无 config/strategies | ## Findings ### Medium(不挡 Approve) 1. **同分 tie-break 偏向更长窗口** 循环从长到短,`score <= best_score` 时保留已有(更长)。多数情况分数拉开;若实盘出现「长窗与短窗同分」,仍可能略偏长。可选:同分取更短,或加 `1/length` 微项。 2. **阶段常截断为 A–C** Spring/SOS 落在尾部时 D/E 因 `min_span` 被吃掉——与 ENG「空间不足截断」一致,但 UI 勾选「阶段」时用户可能期望总见 D/E。属产品预期,非缺陷;可在 UI/文档标明「尾部不足则省略」。 ### Low 3. **`abs_start_idx >= 12` 弱于「箱体起点」** —— 主测已用时间容差;该断言可再收紧到 `>= 16` 一类。 4. **VP Top-N 无自动化 series 计数** —— 靠代码审查 + ENG 约定。 5. 事件 marker 仍一律 `arrowUp`(003 遗留)。 6. 失败路径仍回传 `wyckoff.error` 字符串。 ### No blockers 未发现契约删键、缠论语义改动、策略改动、或回归红灯。 ## Decision **Approve** ECR-004 可维持 Done (Reviewed)。Medium 项进 backlog,不必立刻新 ECR,除非实盘 TR 仍偏长。 ## Next owner Human — 主站 BTC 勾选威科夫目测;无发版要求则保持 `v1.0.0` Unreleased 累计。