fix(screening): 最新 K 线成交量缺失时不再把前一日量比当作今日 - #138
Conversation
helsome
left a comment
There was a problem hiding this comment.
核心 screening 修复和回归用例与 #135 完全匹配,head 2c82edc 的 PR checks 也已 success;当前不能直接合并的原因是 实际 Git 冲突。请更新到当前 main 1c1f6cd 后解决即可。特别是 experiment-service.ts 的 runtimeUnusable: false 已经在当前 main 中存在,这个为旧 baseline 解锁而带入的附带 hunk 现在应自然消失/不要重复保留;最终 PR 只需保留 strategies.ts + 对应测试的实际增量。解决冲突后重跑 screening focused tests + typecheck/基本 CI 即可,不需要扩大验证范围。
high-volume 先用 toFiniteNumber 过滤掉缺失成交量再做切片,索引会整体前移: 当最后一根(当日)K 线成交量缺失时,today 实际取到的是前一日成交量, baseline 窗口也一并错位,于是把昨日的量比标成"今日"并触发候选。 现在按时间戳锚定最新一根 K 线:其成交量未知时直接放弃 kline 量比(返回 undefined,不猜测),基准窗口要求完整的 20 根有效成交量。CalcIndex volumeRatio 优先路径与同币种正常路径均不变。 新增回归测试覆盖"昨日放量、今日成交量 NaN"场景,修复前该测试失败。
2c82edc to
92ed248
Compare
|
已按 review 意见 rebase 到当前 当前 head
advisory 失败项与基线说明advisory 作业(run
报错一致: 这两项与本次 screening 改动无关,在干净 根因是 因此本 PR 不夹带该项修复,保持「一个根因一个 PR」。 |
ResearchService 测试里的 waitForTerminal 用固定 100 次 × 5ms 的轮询预算, 实际只有约 500–700ms 墙钟时间;而 run 本身需要落盘后再轮询回读,在慢机器或 满载 CI 上完整跑完所需时间会超过这个预算,于是健康的 run 被判定为 "did not reach a terminal status"。 - waitForTerminal 改为基于墙钟 deadline(TERMINAL_WAIT_MS = 5000ms)轮询 - 新增回归用例:模拟 800ms 后才收敛的流水线,旧实现必然超时失败 影响:消除 Full unit tests (advisory) 因该等待窗口过短产生的偶发红灯 (如 PR #138 的 advisory 作业 106589165526,2 fail / 1605 pass)。 范围:仅测试辅助函数与新增用例,无生产代码改动。 Co-authored-by: wangzhenjia <wangzhenjia@ehz.cn>
问题与修复
high-volume 在缺少 CalcIndex.volumeRatio 时用日 K 成交量推算今日量比。原实现先过滤掉未知成交量再取切片,索引会整体前移:最新一根(当日)K 线成交量缺失时,
today取到的是前一日成交量,基准窗口也错位一格,于是把昨日放量标成"今日"并产出候选。现在按时间戳锚定最新一根 K 线:
今日成交量未知时量比保持未知(不猜测、不误报),基准要求完整的 20 根有效成交量。CalcIndex.volumeRatio 优先路径与正常路径行为不变。
Closes #135
不改动其他 market-movers 策略、评分曲线、理由文案与 UI。
可复现测试报告
Windows 11 / Bun 1.4.2 (744846f84),基于 main ff3ed3d,分支
codex/fix-high-volume-stale-volume(c5ab6d9)。bun test packages/shared/src/screening/strategies.test.ts:新增回归测试(昨日放量 400000、今日成交量NaN)修复前 25 pass / 1 fail;修复后 26 pass / 0 fail。bun test packages/shared/src/screening:40 pass / 0 fail。bun test packages/shared --isolate:993 pass / 3 fail;3 项(ResearchService > runs a report end-to-end、ResearchService > plans from the strategy…、langfuse backend > does not throw when Langfuse is down)已在干净 main(ff3ed3d)上复现为 17 pass / 3 fail,属基线失败,与本改动无关。bun run typecheck:core/uiExited with code 0;shared/i18n/electron 报 main 现有src/evaluation/experiment-service.ts(534,7) TS2741(同样在 main 上复现,PR fix(eval): separate live execution validity from quality and propagat… #122 已包含补全),本 PR 不涉及该文件。git diff --check:通过。未运行桌面端 E2E 与全仓
bun test(仅 shared 工作区),不声称全仓类型检查通过。UI 变化
无可见 UI 变化:只调整后台筛选策略的量比推算,不涉及页面、弹窗、表格样式或文案。
2026-09-20 类型检查修复复验
补齐 experiment-service.ts 配置应用失败返回值的 runtimeUnusable: false。此时尚未启动运行任务,因此不应标记运行时不可用。该主分支遗漏也是旧版 CI 的 TS2741 根因。本 PR 增加此最小修复以解除检查阻塞(与在审 #122 对此字段的修正一致,无需引入其余改动)。无可见 UI 变化。
环境:Windows / Bun 1.4.2。实际执行:
996 pass
0 fail
3939 expect() calls
Ran 996 tests across 91 files. [22.84s]
上述结果替代此前测试报告中类型检查失败的状态;远端检查以本次提交的 CI 为准。未额外运行桌面 E2E。
首次工作区测试为 995 pass / 1 fail,失败是 ResearchService 的 waitForTerminal 在等待约 0.8 秒后超时。未改代码,单独执行 bun test packages/shared/src/research/service.test.ts 为 7 pass / 0 fail;工作区复跑为 996 pass / 0 fail。旧 CI 的两项失败也在相同辅助函数超时,尚未证明在 main 上稳定复现,保留为测试时序不稳定风险。
2026-09-20 检查状态复核
三项阻塞检查 Typecheck / Focused tests / Secret scan 均为 success。Full unit tests (advisory) 仍显示 failure,但两次独立尝试证明它是 CI 环境的时序抖动,与本 PR 的文件改动无关:
298d630):packages/shared/src/research/recovery.test.ts的settled辅助函数超出自身 400 × 5ms = 2s 轮询预算(error: Run did not settle,用例耗时 2209ms),1 fail;整套 1521 个用例耗时 13.93s。7fa112c,与上一轮 tree 完全相同的空提交):packages/shared/src/evaluation/experiment-service.test.ts整文件按 5s 超时挂起(27 fail,均为this test timed out after 5000ms);整套耗时 148.20s,同一份代码同一套用例比上一轮慢 10.6 倍。bun test packages/shared/src/research/recovery.test.ts连跑 3 次为 961ms / 983ms / 1264ms,15 pass / 0 fail;bun test packages/shared --isolate为 996 pass / 0 fail。fork 作者对上游没有写权限,
POST /repos/helsome/folio/actions/runs/{id}/rerun-failed-jobs返回 403,无法重跑失败 job;因此推送空提交7fa112c(tree 与298d630相同、无文件改动)重建检查套件。按仓库 workflow 注释,全仓测试在 PR 中仅作提示、只在 main 上是硬门禁,该项不阻塞合并;如需绿色提示,需重建一套检查(见下节),因为同一 sha 上旧的失败 check run 会持续把 rollup 拉成 FAILURE。无可见 UI 变化。
2026-09-20 重试结果:advisory 已转绿
同一 tree 重试后,
Full unit tests (advisory)恢复正常;head2c82edc上四项检查全部为绿:mergeable_state由unstable变为clean(advisory 25s,对比退化轮的 148–160s)。做法:fork 作者对上游没有 job 重跑权限(
rerun-failed-jobs返回 403),而上一轮7fa112c的失败 check run 会把同一 sha 的 rollup 一直拖成 FAILURE,因此推了第二个空提交2c82edc(tree 仍为0942dca,changed_files仍为 3,无任何代码改动)重建检查套件。重试前先探测了仓库近期 advisory 耗时(其他运行稳定在 18–26s),确认退化窗口已过再操作。结论:此前的红灯确认为 CI runner 环境抖动,与 #138 的筛选策略修复无关。
无可见 UI 变化。