1255 Commits
Author SHA1 Message Date
shy3130 7a7252a744 chore(release): 发布 v0.3.26 并同步版本号
Signed-off-by: shy3130 <shy3130@qq.com>
v0.3.26
2026-11-02 00:27:50 +08:00
shy3130 babcc502d6 test: 对齐异动统计用例的北京交易日期
测试中的当日快照使用 cn_today,与业务日期一致,修复 UTC 16 点后跨日导致的 CI 误报。UTC 与 Asia/Shanghai 时区下相关 24 项测试均通过。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-02 00:27:50 +08:00
shy3130 8796f2cd7c fix(tdxquant): 区分除权空结果与服务端失败
在 SDK 丢失错误前检查原生除权响应,保留脱敏错误与重试语义;正常无事件返回空结果。事件或配价失败时中止同步并保留旧因子文件,避免被报告为成功的零行结果。补充 SDK 离线回放、数值与落盘回归测试。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-02 00:23:15 +08:00
shy3130 7bd290289a perf: 优化扩展查询、概览并发与 ETF 历史读取
按需裁剪 Parquet 列,合并概览并发构建并防止旧结果回填。为 ETF 历史输入增加有界缓存,按容器内存预算进行任务准入及批次控制,保留原计算口径。补充回归测试与可复现性能基准。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-02 00:23:06 +08:00
shy3130 ab2b82da37 perf: 收窄缓存失效并优化异步任务与首屏加载
按 enriched 写入最早影响日期维护有界区间版本,保留全局发布一致性校验,使历史读取与回测缓存复用不受较晚行情更新影响;历史修订和未知范围变更仍失效。

将扩展数据解析、落盘与备份/策略导入移出事件循环;串行限制扩展数据写入,并在请求取消后保持执行中的写入限额及临时文件清理。

拆分 11 个扩展页面为轻量注册清单和按需页面,助手抽屉首次使用时加载;并发获取扩展后按固定顺序注册,为运行时脚本增加超时隔离。保持金融计算、业务数据格式与扩展 v1 契约不变。

验证:隔离全量后端 3923 项通过、7 项跳过、1 项预期失败;前端 447 项通过,TypeScript 与生产构建通过。Ruff 无新增告警,git diff --check 通过。浏览器验证 11 个扩展路由与脚本超时隔离。

性能:1000 标的、120 天、12 万行、30 次更新,历史面板读取中位数 7.19ms -> 0.14ms,计算 31 -> 1 次,结果一致。注入 250ms 解析耗时的心跳间隔中位最大值 269ms -> 11.3ms。启动必需 JS 2.33MB -> 0.65MB;10Mbps/40ms 网络与固定 API 响应下,登录页 3 次冷启动中位数 3.15s -> 1.12s。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-01 22:32:34 +08:00
shy3130 f443627377 fix(assistant): 保留跨轮推理上下文并兼容旧会话
保留最终回答和工具前正文段的推理字段,通过已有会话存储保存并在追问时回传;按供应商、协议、接口与模型隔离上下文。兼容 DeepSeek 旧会话缺失字段,推理内容计入每轮输入预算。

验证:隔离全量后端测试 3898 项通过、13 项跳过、1 项预期失败;前端会话相关 7 项测试与生产构建通过。DeepSeek 使用协议模拟验证,未进行真实接口联调。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-01 21:06:22 +08:00
shy3130 89e646abdd fix(backtest): 使历史涨跌停修复自动失效旧矩阵缓存
矩阵缓存版本由 4 升为 5,避免升级后继续命中保存了旧涨跌停比例与封板标记的 mmap。新增真实旧版缓存升级回归,并让缓存清理断言适配版本变化。价格和矩阵相关 111 项测试通过。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-01 21:02:25 +08:00
shy3130 229cac649a Merge pull request #529 from kevin9327/fix/gem-pre-registration-limit
Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-01 20:43:12 +08:00
shy3130 ff91295387 Merge pull request #525 from kevin9327/fix/deepseek-reasoning-content
Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-01 20:43:12 +08:00
shy3130 e60c438328 fix(mining): 修复 Windows 挖掘锁状态误报
锁诊断优先使用当前后端实际持锁对象确认自身归属,避免 Windows 排他锁阻止二次读取文件时误报未知持有者。真实外部占用仍按陈旧判定处理,并拒绝终止当前持锁后端。

验证:83 项相关 pytest 通过,Ruff 和 git diff --check 通过。原生 Windows 安装包仍待实机复验。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-01 20:02:10 +08:00
shy3130 ffe1ff0d3e feat(import): 统一导入备份入口并支持后端扩展包
集中处理策略与定义、配置备份、数据源和页面插件导入,保留旧入口跳转。新增可信后端及前后端完整包的预检、暂存、重启生效、失败回退和版本管理。

验证:扩展、资源、备份与页面定向 pytest 通过,前端 41 项测试及生产构建通过,并完成桌面、窄屏和明暗主题联调。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-01 20:01:59 +08:00
shy3130 316ae2954a feat(backtest): 增加未来数据检查与数据版本追溯
Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-01 17:20:55 +08:00
kevinandGitHub 5694252475 fix(价格限制): 创业板 2020-08-24 注册制改革前按 ±10% (ST ±5%) 计算涨跌停
Signed-off-by: kevin9327 <5299031+kevin9327@users.noreply.github.com>
2026-11-01 18:01:30 +09:00
shy3130 ef6980d996 docs(backtest): 添加历史回测不代表未来收益的提示
Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-01 12:33:42 +08:00
shy3130 e798c49571 chore(release): 发布 v0.3.25 并同步版本号
同步前后端版本、运行时回退版本和锁文件。版本、桌面启动、打包及升级保护 41 项测试与前端构建通过。

Signed-off-by: shy3130 <shy3130@qq.com>
v0.3.25
2026-11-01 11:00:32 +08:00
shy3130 762e04ab88 feat(data-sources): 支持外部插件安装与版本管理
Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-01 10:47:19 +08:00
shy3130 ba27fc932b fix(regime): 优化市场环境布局并修正统计范围和图表状态
Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-01 10:47:02 +08:00
shy3130 8385810e50 fix(backup): 修复 API Key 备份遗漏并明确导出范围
Signed-off-by: shy3130 <shy3130@qq.com>
2026-11-01 10:32:58 +08:00
shy3130 864bbc49d8 fix(minute): 完善弹窗适配、批量补齐及停牌体检
拆分同步获取和数据体检页签,固定弹窗头尾并改善窄屏布局。
复用现有同步任务定向批量补拉缺口,刷新跨页面分钟缓存。
结合日线单独统计整日零成交记录,避免停牌残留反复报缺口。

验证:独立暂存快照中后端 185 项、前端 16 项测试通过;
前端构建成功,Ruff 无新增问题,git diff --check 通过。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-31 21:29:17 +08:00
kevin9327 f9c4a0ac96 fix(assistant): 上游返回空串 reasoning_content 时也保留该字段
按字段存在性 (is not None) 判断, 区分"上游未返回"与"返回空串";
流式 round_end、chat_service 下一轮请求、非流式工具循环三处均补齐, 并加回归用例。

Signed-off-by: kevin9327 <5299031+kevin9327@users.noreply.github.com>
2026-10-31 22:01:16 +09:00
kevin9327 7a712fe258 fix(assistant): DeepSeek 思考模式下工具轮回传 reasoning_content, 不再 400
Closes #524

Signed-off-by: kevin9327 <5299031+kevin9327@users.noreply.github.com>
2026-10-31 22:01:16 +09:00
shy3130 39c9ab7319 feat(paper): 通过扩展实现策略买卖点跟单与回测参数对齐
新增策略参数快照、逐股信号跟单、持久化去重与保护性风控,复用原模拟仓下单、撮合及账务。

前端增加参数预览、绑定、暂停恢复和执行记录,保留旧事件规则与账户兼容;核心代码和五档委托保持未改动。

验证:后端 3763 passed、7 skipped、1 xfailed;前端 397 passed;构建、Ruff、diff-check 通过,并完成隔离联调及窄屏、深色模式检查。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-31 18:24:23 +08:00
shy3130 c63ee7648c refactor(resources): 清理导入导出残留并合并包处理逻辑
移除无调用的前端策略包接口封装和类型,将依赖收集、ZIP 打包与安全检查、资源预检统一到 resource_bundle,strategy_bundle 仅保留兼容入口。

保留旧包和旧接口的逐文件导入语义,以及当前资源导入的整批预检和回滚;补充新旧导出格式互通、本机依赖解析、逐文件失败报告和 ZIP 安全回归测试。

验证:相关后端回归 106 项、后端完整测试 3726 项、前端测试 389 项通过;前端构建、Ruff 与 git diff --check 通过。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-30 22:29:44 +08:00
shy3130 5a4702edcb fix(tdxquant): 修复分钟同步时区与失败状态
在 SDK 清理响应前保留并脱敏服务端错误,明确的鉴权拒绝立即停止请求并触发熔断。历史分钟同步显式传递数据源失败,避免任务显示成功但落盘为零行。

将带时区的请求窗口归一为北京墙钟,补充鉴权、任务失败、UTC/北京时间窗口及 Parquet 落盘回归测试,并更新插件契约文档。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-30 22:29:34 +08:00
shy3130 c54efda2e1 chore(release): 发布 v0.3.24 并同步前后端版本
- 前端 package.json、后端 pyproject/锁文件、VERSION 与运行时回退版本统一为 0.3.24
- 本版包含资源传输与策略池优化、日K自检精准修补、Codex 助手工具调用
- 同时包含桌面启动、Fuyao 缓存、回测成交与缓存一致性、龙虎榜空代码及旧挖掘锁修复

验证:版本/桌面启动/打包/升级保护 33 项测试通过;前端构建、uv 冻结锁文件与版本一致性校验通过。

Signed-off-by: shy3130 <shy3130@qq.com>
v0.3.24
2026-10-30 21:31:44 +08:00
shy3130 5c09ddc087 fix(fuyao): 日K缓存覆盖不足时刷新近端数据
- 近端日K dump 未覆盖请求区间时重新检查最新 release
- 同时失效内存帧与路径缓存,避免再次读回旧磁盘数据并持续降级逐票请求
- 对短窗口查询和长历史尾段补齐使用同一刷新逻辑

补充常驻进程跨交易日、短查询及长历史尾段的缓存刷新回归测试。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-30 20:43:31 +08:00
shy3130 a1301e239a fix(desktop): 修复单实例锁、窗口显示与重复启动
- 使用系统文件锁替代 PID 存活判断,崩溃后由系统释放锁并避免删除重建竞态
- 将早期预检异常统一交给启动错误提示,保证退出时释放已取得的锁
- GUI 就绪后显式显示主窗口,避免继承隐藏启动状态
- 移除安装包中重复的安装后启动条目

补充跨进程单实例锁、模拟 Windows 锁异常、早期启动失败、窗口显示与安装配置测试。
Windows 真机安装与窗口行为未在本机验证。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-30 20:43:06 +08:00
shy3130 3f8c0b169e feat(assistant): 支持 Codex CLI 工具调用与超时提示
- 使用结构化输出适配现有助手工具循环,保留完整工具调用历史
- 严格验证工具名和参数,沿用现有动作确认和错误终态
- 旧 CLI 不支持结构化输出时给出升级提示
- 单独展示 Codex 生成超时,记录耗时与重试信号并避免输出提示词内容

补充结构化响应、工具循环、确认流程、非法输出及超时分类回归测试。
前端全量 389 项及构建通过,后端执行完整回归。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-30 20:42:57 +08:00
shy3130 8fb23fcf09 feat(data): 新增日K自检、精准修补及数据版本管理
- 数据页提供股票、ETF、指数历史日K自检与报告,区分已确认异常和待核实缺口
- 按异常股票和日期暂存校验、备份并修补,使用完整原始历史重算受影响指标
- 跨重启保留异常与待重算状态,失败或取消后可继续处理
- 修补完成后更新行情、指标、矩阵、策略和前端查询缓存,重算市场环境与主线
- 对已知异常阻止相关计算,提示历史回测和优化结果的数据版本过期
- 复用插件日K取数,修正 ETF 历史回补起点及任务阶段进度重置

补充自检 API、精准修补、失败恢复、资产隔离、缓存失效及前端交互测试。
前端全量 389 项及构建通过,后端执行完整回归。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-30 20:42:48 +08:00
shy3130 ea24378033 feat(resources): 完善资源传输兼容性与策略池交互
- 策略、因子与信号页各使用一个小盒子入口,在当前页面预览并导入导出
- 支持多选 ZIP 批量导出,自动携带因子、信号、调参与策略辅助代码
- 保留单文件导入并兼容无清单 ZIP、外层分享目录及 macOS 附加文件
- 预检依赖与同 ID 冲突,按选择计算依赖闭包,写入失败整批回滚
- 修正矩阵原生策略生成信号被误判为外部依赖的问题
- 重排策略池布局,支持搜索、来源/周期筛选、排序和撤销清空
- 单策略导出入口收纳到配置对话框顶部,支持旧排名策略导入路径

验证:资源传输/策略包/配置备份 95 项后端测试通过;前端全量 389 项及构建通过。
两个真实 25 策略 ZIP 已在隔离目录验证识别、导入、加载和再次导出。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-30 20:42:27 +08:00
shy3130 2d629197c1 fix(backtest,services,frontend): 回测成交口径/任务注册表并发/查询键一批正确性修复
回测成交口径:
- close_t 按收盘价成交的建仓日: 当日 high 发生在建仓之前, 不得进入移动止损
  峰值 (峰值虚高会把风控线上移、退出提前) — 矩阵独立/矩阵组合/legacy 三条
  路径同口径; 新增回归测试锁定 open_t+1 对照组不被误伤
- 矩阵路径补收盘封死跌停拦截 (含一字), 经 pending_exit 递延到下一可卖日,
  与独立/legacy 路径同口径 (此前尾盘封板股按跌停价"卖出"低估亏损)
- #388 当日指标纪律同口径: 盘中成交不可知当日收盘, 代数剔除当日 enriched
- 分钟回放: 入场价用前复权口径 (与日线出场同尺度); 除权日涨停参考价按
  ex_factor 还原 (直接用 raw_prev 会把涨停价算高, 除权日封板拒买漏检)
- 指标管线: 涨停参考价除权口径修正 + 夏普用样本标准差 (ddof=1, 与 engine 一致)
- 回测任务: _acquire_or_evict_job 收口同 key 复用/强制重建 (参数不同先取消
  旧任务, 避免旧任务占着重任务槽跑完)

服务与并发:
- task_registry 读-改-写加锁: 两个前端 fire-and-forget 并发上报时后写者
  覆盖先写者 (丢终态翻转或整条记录); 文件写入本身原子, 锁只护 RMW 段
- quote_service 生命周期锁串行化 start/stop/enable 的 check-then-act (双标签页
  并发开关会起两条轮询线程 → 双倍拉取配额 + 重复 SSE 广播)
- 系统通知投递移入专用单线程池: notify_adapter 底层 subprocess 逐条最长 5s,
  在 _poll_loop 同步执行会让告警风暴阻塞一轮监控评估, 拖慢行情拉取与推送
- sector_monitor / minute_refresh / wecom_bot: 同类单实例与停止时序加固
- ai_provider: 401 识别加词边界 (避免模型正文含 401 数字串误判鉴权失败并
  附出不相关指引); 自定义可执行路径校验可执行位
- api/data: 清空数据期间暂停全量分钟增量线程 (否则"清完又被写回部分今日
  数据"); 状态接口偏好/能力探测异常降级而不是 500
- api/kline: 失效内存 enriched 快照 (非空缓存不校验 generation, 只刷 DuckDB
  视图会让重建结果对自选/筛选/监控不可见直到进程重启)
- api/position_policies: 非法 ID 纵深防御按不存在处理

前端:
- assistant store: 生成终态 (中断提示/流式收敛) 钉在发起会话, 切换或删除会话
  不再把"已中断"写进无关新会话
- backtestTask: 键上挂着旧任务且新参数不同 (不同 job_key) 时先取消旧任务,
  避免其占着重任务槽跑到自然结束; 同参重跑跳过取消 (后端按同 key 复用 /
  force 重建已完成任务)
- 查询键集中与正确性: QK.instrumentNames (排序去重, 同一集合不同来源顺序
  复用缓存)、QK.kline 滚动窗口空串边界 (useQuoteStream 焦点股增量合并可
  修补)、regimeHistory 用实际请求三元组 + 裸前缀失效全部变体
- Data 页 / Regime / SectorRotationCard / RuleEditor / monitor / lots /
  stock-analysis 接入集中键, useQuoteStream 对齐

验证: 后端全量 3546 passed (含 close_t 峰值/分钟回测/跌停递延/并发上报等
新增用例); 前端 49 文件 348 用例 + pnpm build 通过; ruff 改动文件零新增
(141 vs 基线 142)。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-30 00:20:52 +08:00
shy3130 e2c84dbeca fix(dragon-tiger): thscode 为 null 的退市/B股标的归一化, 修复龙虎榜崩溃
用户反馈: 展开复盘页龙虎榜 (2026-10-29 榜单 72 条) 前端崩溃。
根因: fuyao 对退市整理期股/B股返回 thscode=null (ticker 有值) — 今天
首次上榜的萃华退(002731)/宁通信B(200468)/动力B股(900920) 3 条 null
thscode 被后端原样透传, 违反前端 DragonTigerStockItem.thscode: string
契约 (下游按 string 使用, 收到 null 即崩)。

- dragon_tiger 服务新增归一化 (新拉取 + 历史缓存读回共用):
  thscode 缺失时由 ticker 推导市场后缀 (6xx/900→SH, 0xx/3xx/200→SZ,
  4xx/8xx→BJ), 两者都不可用则丢弃并告警; 游资席位嵌套 rows 同样处理
- 前端: 类型放宽为 string | null (如实反映数据源现实), 榜单卡片统一走
  _dtCode/_dtLabel 兜底 (旧缓存/异常数据源也不再崩), 无代码行不触发
  onOpenStock
- 实测真实数据: 72 条归一后 0 条 null; 三条退市/B股 →
  002731.SZ / 200468.SZ / 900920.SH; 席位嵌套 rows 同样干净

验证: 后端新增 6 条归一化用例 (ticker 推导/不可识别丢弃/嵌套 rows/
缓存读回/端到端); 前端新增龙虎榜卡片回归 2 条 (展开 72 条不崩 + 点击
null 行以 ticker 兜底回调); 后端全量 3546 passed; 前端 49 文件 348
用例 + build 通过; ruff 零新增。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 22:35:30 +08:00
shy3130 b8f1ebaaf0 fix(mining): 旧格式锁也能定位持有者并强制释放, 不再永久卡挖掘
用户反馈: 挖掘工作台一直提示「挖掘锁被其他进程占用 — 锁文件为旧格式,
无法定位持有进程」(v0.3.17+ fail-closed 设计)。根因: 锁内容是 v0.2 时代
写入的 b"0" (无 pid), 持有者为升级前启动、仍在运行的旧版后端残留进程;
flock 是 OS 级锁, 进程存活即一直占用, 旧版本无法被识别 → 强制释放按钮
永不出现, 用户只能去任务管理器逐个猜进程。

- mining_process_lock: 新增 locate_lock_holder_pid — 锁内容不可读时用
  lsof (POSIX) / psutil (跨平台兜底) 反查打开锁文件的进程; 只认本产品
  形态 (python/uvicorn/desktop/tickflow), 且连续两次扫描命中才采信,
  避免误杀瞬时探测或无关进程 (误杀是破坏性操作, 宁可定位失败)
- mining_lock_admin.lock_status: 旧格式锁 → OS 反查持有者, 继续走既有
  fail-closed 判定 (无进行中挖掘 + 存储静默 >=600s 才允许释放);
  状态新增 holder_source 字段
- 前端横幅: 展示「已通过系统扫描定位」并出现既有「强制停止并接管」按钮;
  定位失败时保留手动指引
- 设计纪律不变: 仍只提供人工确认的强制释放, 不做启动自动 kill

验证: 新增 4 条用例 (旧格式持锁进程定位 / 强制释放完整接管 / 挖掘活跃时
仍拒绝 fail-closed / 锁空闲不误报); 撤销集成时 3 条红, 恢复后绿;
后端全量 3540 passed; 前端 build + tsc 通过。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 21:21:13 +08:00
shy3130 02712af01b chore(release): v0.3.23 版本号同步
- 修复 #514 漏接 failed_out 参数导致「数据修正/自检修复」路径同步必炸 (b590e5ad)
- 迁移 skip 分支补捞 preferences.json, 防升级后引导重弹 (5ff6e159)
- 数据源偏好回退 tickflow 留痕告警 (3c0ad017)
- 回测页 busy 期统计为 null 不再误判缺数据 (9659237a)
- 数据页 busy 降级 storage=null 崩溃修复 (da4ed647)
- 模拟盘台账补品种名称 (f3ff1d5e); 回测强制重跑按钮 (939149e8)
- 消除 "获取数据" 误弹 (dd589733/e975f782 已随 0.3.21)

Signed-off-by: shy3130 <shy3130@qq.com>
v0.3.23
2026-10-29 18:52:20 +08:00
shy3130 3d89e8a126 test: 宿主状态隔离补齐 + Codex env_key 正向覆盖 + node:test 转 vitest
- test_assistant_actions: auto_approve_enabled 直读宿主 preferences.json,
  本机开「动作免确认」时 4 条门控用例全红 (审批拒绝后动作仍执行 ==
  测试环境失真, 非产品 bug); _run_chat 统一 patch 免确认关闭
- test_ai_provider: secrets 排除断言隔离宿主 ~/.codex/config.toml
  (宿主配 env_key provider 时随机翻红); 补 env_key 正向注入与非法名
  拒绝 2 条用例
- neighborPrefetch / DimensionMembersDialog 测试由 node:test 转 vitest
  (文件名 *.test.ts 本就在 vitest 收集范围, 此前每次 vitest run 恒报
  2 个收集失败掩盖真失败); 转换后 5 条用例全过

前端 vitest 48 文件 346 用例全绿; 后端全量 3536 passed。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 18:39:40 +08:00
shy3130 5ff6e15995 fix(desktop): 迁移 skip 分支补捞 preferences.json
_migrate_legacy_data_dir 的 has_new_data skip 分支此前只捞 secrets.json
(0669204c), preferences.json 不捞 — 偏好丢失会让 onboarding_completed
回落默认 False, 升级后全屏引导重弹, 表现为「昨天同步过数据, 升级后
又被要求获取数据」(用户反馈链路)。函数泛化为 _rescue_legacy_user_data:
secrets.json + preferences.json 逐项捞回, 旧有新无才拷, 异常只告警。

验证: 新增 preferences 捞回/不覆盖 2 条用例; 原有 secrets 捞回 3 条
语义不变全绿。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 18:39:40 +08:00
shy3130 3c0ad0179c feat(data): 数据源偏好回退 tickflow 时告警留痕
7 个 provider getter (daily/adj_factor/minute/full_minute/depth5/
realtime/financial) 白名单不命中时一律静默回退 tickflow — 配置的源
失效后行为悄悄变免费档, 用户与排查者均无感知 (fuyao 事件定位难点)。
统一走 _validated_provider: 回退即 logger.warning 带偏好键/原值/可用列表。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 18:39:40 +08:00
shy3130 b590e5ada3 fix(data): sync_and_persist_daily_batch 补接 failed_out 参数
#514 (285dd9b7) 在 daily_pipeline 修复/定向分支传了 failed_out, 但函数
签名漏接 → TypeError: sync_and_persist_daily_batch() got an unexpected
keyword argument 'failed_out' — v0.3.21/22 所有走「数据修正/boot 自检
修复/实时 gate 修复」路径的同步必炸 (用户截图实锤), 恰好是用户恢复数据
的路径; 普通增量分支不传该参所以未暴露。

签名补 failed_out 出参, _finalize 统一透出内部分块拉取失败清单, 对齐
#514 意图 (单票失败上浮 stage_errors 而非静默当成功)。

验证: 新增回归测试 2 条 (修复前红 — 复现截图 TypeError; 修复后绿);
bare_symbols/fuyao 流式同步 14 个相关用例无回归; 后端全量 3536 passed。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 18:39:40 +08:00
shy3130 9659237a15 fix(backtest): 预热/同步期间统计为 null 不再误判缺数据禁用回测
backtestDataUnavailable 原判定 dataStatus.isSuccess && !earliestDate 在
busy 降级期间 (预热 indicators_ready=false / 同步修复 stats_pending=true,
enriched 统计为 null 是未知态) 恒为 true — 回测按钮被禁 + 常驻"缺少指标
数据, 请先同步"横幅, 与 Dashboard 已修的 warmup 误判同族 (stats_pending
契约: 空值不代表无数据)。补 statsPending 放行分支, 真实统计就绪且确无
数据时行为不变。

验证: StrategyBacktest.status.test 2 条 (busy 期无横幅 + 渲染无 TypeError;
就绪确无数据仍提示并禁用 — 修复前红/修复后绿); 全量 vitest 340 passed;
pnpm build 通过。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 13:17:39 +08:00
shy3130 c249c6b5b1 chore: ignore relicensing/ 协议变更工作文档
含贡献者联系清单等个人信息, 文档自述不入库 (CONTRIBUTING §8/§14.4),
此前持续出现在 git status 有误提交风险。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 13:17:39 +08:00
shy3130 da4ed64707 fix(data): busy 降级期间 storage 为 null 不再使数据页整页崩溃
用户反馈桌面客户端数据页 "Unexpected Application Error! Cannot read
properties of null (reading 'total_size_mb')"。根因: /api/data/status 在
预热/同步/修复期间 (busy) 不重算存储统计, 冷启动缓存从未热过时
_get_storage 返回 None — 前端存储卡片 s.storage.total_size_mb 只判了 s
没判 s.storage, 6 处访问全部抛 TypeError, 整页被错误边界接管。与此前
"立即获取数据"误判同族 (busy 降级契约: 空值不代表无数据)。

- DataStatus.storage 类型改为 {...} | null 诚实反映降级契约, 编译期
  强制所有消费点判空
- 数据页取安全别名 const storage = s?.storage, 总大小与表统计/扩展数据
  全部 storage?. 判空, 缺值降级显示 — 或 0
- 后端补契约测试: 冷启动 busy 且缓存未热时 _get_storage 返回 None
  (原测试只覆盖缓存热过后清空仍留 stale 的路径)

验证: Data.status.test 修复前红 (错误与用户截图逐字一致) 修复后绿;
后端 test_data_status_busy 10 passed; 全量 vitest 338 passed; pnpm build。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 13:09:56 +08:00
shy3130 939149e8a0 feat(backtest): 强制重跑 — force 绕过同参数任务结果缓存; 修 cancel key 对齐
策略回测按全参数 md5 作 job_key, 已完成任务结果保留 5 分钟 — 同参数再次
运行直接命中缓存返回旧结果 (重连/切页恢复设计的副产物), 用户改完数据后
重跑拿到的仍是旧行为产物, 此前没有绕过手段。

- startBacktest/strategy_stream 新增 force: 掺入 job_key 使其不命中缓存
  必然重算; 不动任务复用/并发语义, 重连与取消按同一 qs 重算 key 天然对齐
- 运行回测旁新增「强制重跑」按钮 (RefreshCw, 次要样式, 悬停说明语义),
  disabled 条件与主按钮一致
- 补算环境并继续改为 handleRun(true): 已失败任务的 error 同样被任务缓存
  保留, 补算成功后自动重跑不带 force 会命中同参数旧 job 直接重放补算前的
  报错 — 用户实测补算完成后仍提示"缺少前一交易日环境 2019-10-22 等 112 天"
  即此因 (实测数据已补齐: 2019-10-22~2026-10-29 共 1703 行无缺口)
- 修预存 bug: /strategy/cancel 重算 job_key 漏了 minute_fill 与
  regime_filter — 开了分钟K精确回测或市场环境过滤的任务停止按钮失效

验证: test_backtest_stream_force 3 passed (force 改 key 且幂等; cancel 带
force/minute_fill/regime_filter 的 qs 能取消到、缺参取消不到 — 走真实
qs→key 解析路径不启动回测线程); ruff 与 HEAD 对照零新增; pnpm build 通过。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 13:09:50 +08:00
shy3130 f3ff1d5e1b feat(paper): 模拟盘订单/成交台账就地显示标的名称
用户反馈订单和成交台账只有代码没有名称。复用账户面板既有的
instrumentNames 批量名称查询 (#454 同模式), 名称查询集合在持仓+回合
基础上并入订单与成交的标的 (已清仓标的的名称也能查到), 持仓/回合的
「代码+灰色小字名称」展示模式对齐到两处行内; 名称缺失时不渲染不留空洞。
变量 holdingSymbols 更名 nameSymbols 以符合扩充后的语义。

验证: pnpm build 通过。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 13:09:43 +08:00
shy3130 9cd8792c9e chore(release): v0.3.22 版本号同步
Signed-off-by: shy3130 <shy3130@qq.com>
v0.3.22
2026-10-29 11:10:34 +08:00
shy3130 0669204cfb fix(desktop): macOS 升级跳过整体迁移时单独捞回 secrets.json
用户反馈 (v0.3.20): 升级后有数据却无法开启实时行情 (fuyao 源)。根因链:
fuyao 插件注册要求 API Key 可见 (secrets.json 优先), macOS ≤0.3.6 用户
升级后先跑过新版 (新 data 已有行情), 再从废纸篓恢复旧包数据时, has_new_data
守卫跳过整目录搬迁, secrets.json 未随行 — Key 读不到 → 插件不注册 →
realtime_data_provider 偏好静默回退 tickflow → 免费档无实时权限 → 开启被拒。

修复: 守卫跳过整体搬迁时, 单独捞回新目录缺失的 user_data/secrets.json
(AI/数据源密钥, 用户重配成本最高的文件)。新目录已有则绝不覆盖 (尊重
用户重配); JSON 非法/为空跳过不制造坏文件; copy2 保留 0600 权限位;
任何异常只记警告绝不影响启动。整体搬迁分支 (新目录基本为空) 原本就
逐项搬 user_data, 两条路径均已覆盖。

验证: test_macos_data_dir 12 passed (存量 9 + 新增 捞回/已有不覆盖/
非法跳过 3 条); 守卫语义不变 (旧目录整体保留、新目录已有行情不被覆盖)。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 11:10:09 +08:00
shy3130 2fb2fa1537 fix(ai): Codex 401/超时附登录指引 + macOS PATH 兜底 + 陈旧运行目录清扫
继 2c0141f3 (草稿模型探测 + env_key 鉴权) 后的 Codex CLI 体验第二批:

- 401/超时错误附登录指引 (_codex_missing_auth_hint): 新版 Codex 凭证可存
  系统钥匙串 (不落 auth.json), 隔离 CODEX_HOME 复制不到, 用户面对裸
  401/长时间挂起无从下手 — 现在直接提示 codex login 命令
- macOS GUI 启动只继承最小 PATH, npm/brew/ChatGPT.app 内置的 codex 均
  找不到 — 与 Windows Desktop 兜底对称, 显式探测常见落位
- _sweep_stale_codex_run_dirs: 进程退出中断 finally 清理时残留的临时
  运行目录按 mtime 兜底清扫 (每进程一次)

验证: test_ai_provider/test_ai_probe 合计 70 passed (401 带/不带指引、
超时附指引、macOS 三种落位、清扫只删陈旧+进程内一次、探测透传失败信息);
test_ai_probe 既有用例补 sweep 打桩 (与实现同批提交, 拆开 CI 不稳)。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 11:10:06 +08:00
shy3130 d7a5edd730 fix(signals): 数字右值条件不再整页崩溃 — 修复"扩展 official.signals 暂时不可用"
用户反馈信号库/模拟盘页显示"扩展 official.signals 暂时不可用" — 错误边界
兜底, 真实错误是渲染期 TypeError。根因: 残月策略的两个迁移信号
(canyue_long_enter/exit) 条件右值为 number (0.6/0.2, 迁移时 Python float
直接进 JSON), 后端 isinstance(int,float) 一直合法, 但前端两处
right.startsWith('field:') 假设恒为字符串, 数字右值直接抛
"startsWith is not a function", 整页渲染崩。崩点代码 v0.3.6 即有,
系数据侧新出现数字右值触发, 非本版回归。

修复: 信号库列表渲染与条件编辑器 (ConditionEditor, 多处共享) 均加
typeof 守卫, 数字常量正常显示与回填; CustomSignalCondition.right 类型
放宽为 string | number 诚实反映运行时, 编译期逼出并修复编辑器一处
隐藏收窄问题。

验证: Signals.numeric-right.test.tsx 2 条回归 (真实数据形态 + 错误边界
断言, 修复前 2 failed 复现线上错误 → 修复后 passed); 全量 vitest
337 passed; pnpm build 通过。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 11:09:06 +08:00
shy3130 e6fc60078f chore(release): v0.3.21 版本号同步
Signed-off-by: shy3130 <shy3130@qq.com>
v0.3.21
2026-10-29 10:39:58 +08:00
shy3130 2c0141f3eb fix(ai): 修复 Codex 连接测试与自定义源鉴权
使用草稿模型执行连接探测,并向自定义 provider 传递其声明的鉴权环境变量。认证续期仍需单独处理。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 10:38:03 +08:00
shy3130 1c57c54bad fix(ui): 切换 fuyao 后刷新实时行情权限
Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 10:25:40 +08:00