Repository navigation
Releases
v1.25.0 — 匿名链路冷启动加固 + CI 门禁适配 dsh 0.2.x
匿名链路冷启动加固(当日实测事故驱动)
部分网络 IP 被雪球边缘节点(TencentEdgeOne)拦截后,种子 URL 全候选 HTTP 5xx 且不发 set-cookie——活进程靠内存 cookie 存活、冷启动即死板。三层加固:
- 匿名 cookie 落盘复用:播种成功后持久化到
$DSH_HOME/dsh-xueqiu/.xueqiu-anon.json,进程重启/新会话免播种直接出数;失效自动重播种自愈并覆盖 - 播种指纹硬化:种子请求补浏览器导航头 +
--compressed,单种子超时 12s→8s(不再撞穿 30s 看门狗) - seed_blocked 快速失败:播种被拦 + 上游 400016 时不再空转 3 轮,直接给出可操作指引(面板右上登录粘贴 Cookie 解锁);
debugRPC 新增 50 条环形事件流
架构与测试
- 传输接缝替代文本 codegen:client 传输/样式注入改运行时判定(
typeof host/typeof styles),gen-static.py撤销全部文本替换;接缝守卫防同名全局函数误入动态分支 - 测试 455→517 断言(11 套件):新增
client-pure(61:纯逻辑 +makeIndexPoll/makeUiStore工厂注入)、cache(16:时钟注入直测 TTL 过期/FIFO/24h 清扫)、client-bundle(13:生成物伪浏览器求值 + 接缝三环境路由)
CI 门禁适配 dsh 0.2.x(token 单次消费/合并式资源服务)
- smoke:token 双路径就绪探测、cookie-jar 取页面/资源、boot 清单 manifest
url为权威 bundle 路径、数据关卡分级SMOKE_LIVE=strict|warn(数据中心 IP 恒被上游拦截,真实数据验证回归发版人本地) - e2e:
E2E_TOKEN传递接线补齐、rpc 改页内同源 fetch(借浏览器 cookie)、agent-browser 锁定 0.2.x 验证过的版本 + 全调用 60s(-k) 超时、boot 改 env 文件产物 +bash -xtrace + 300s 硬超时、setsid→nohup - 新增每日
seed-probe观测 job(播种链路纵向取证);CI 真连雪球 live 步骤移至每日定时
其它
watchlist.pull消除双倍上游请求;xqIso(null)不再渲染 1970-01-01;fmtFullDay/pad2重复合并;契约测试 UA 单一真源;test:offline聚合脚本 +engines字段;FAQ 状态文件路径修正- 全量验证:11 离线套件 517 断言 + tag CI 三关全绿(含真实 Chromium 浏览器 e2e)+ dsh 0.2.1 本地全流程彩排
v1.22.13
修复
A股成交量显示虚高 100 倍 + 港/美单位错
雪球 volume 字段全市场均为股(实证 amount/volume ≈ price,quote/kline/minute 三接口、A/港/美/ETF/指数一致),而前端一律按"手"格式化:茅台 145 万股显示成 "145.05万手"(实为 1.45 万手)。现按市场感知:
- A股(SH/SZ/BJ 前缀,含 ETF/指数/北交所)÷100 换算成手
- 港/美维持股(万股/亿股)
自选"死条目"凭空消失
批量行情会整只丢弃无效/退市代码——添加 SH999999 提示成功,但列表里永远看不到,无任何反馈。现在补占位行(现价/涨跌全 --、名称回退显示代码、仍可删除/查详情),价格闪烁逻辑对 null 现价免疫。
kline 垃圾周期静默空数据
上游对未知 period(如模型手滑传 1h)返回 200 + 0 根,无任何错误。host 侧加白名单兜底为 day。
CI 午休/午后时段必红(v1.22.11 修复的延伸)
live 分时点数下限按"9:30 至今分钟数"线性外推,但 A 股午休(11:30-13:00)分时停在 ~121 点、午后从 13:00 重新累计——11:44 触发的 CI 实际 121 点 vs 下限 132 必红。改为两段交易时段感知(早盘线性 / 午休恒 118 / 午后 121+线性封顶 238 / 盘外 200),全天 1440 分钟边界模拟通过。
其他
工具描述补充 volume 单位为股(A股 1手=100股),防模型侧误读换算。
测试
新增 qa/vol-units.mjs 26 例(从 client 源码提取 fmtVol 独立求值 + host 周期白名单),并入 check:fast(现 92 例离线秒级)。全套:edge 254 / unit 39 / fence 18 / regress 21 / persist 16 / state-paths 11 / vol-units 26 / live 51。
注意:host 与 client 改动均需重启 dsh web 后生效。
v1.22.12 — 状态文件稳定目录 + 拖拽方向文案 + 光标反馈 + ::1 白名单
修复
- 状态文件跟启动目录漂移:自选/登录/界面状态原先落在 dsh web 启动目录——换目录启动就换一套状态。现在优先写
$DSH_HOME/dsh-xueqiu/(自动建目录);沙箱拒绝工作区外写入时透明回退旧行为;存量数据在首次保存时无缝迁移。新增 qa/state-paths.mjs(11 例)覆盖稳定/迁移/回退/首启四种模式。 - K线提示文案方向写反(v1.22.0 起):"左拖加载更早"实为右拖(klinecharts 内容跟手)。client 6 处 + README 3 处已正。
::1裸 IPv6 回环白名单死代码:端口剥离正则误剥:1,已修,fence xfail 转正。
新增
- K线/分时拖拽光标反馈:悬停小手、按住抓手、松手复位。
注意:host 侧改动需重启 dsh web 生效;状态迁移发生在重启后首次写入。
v1.22.11 — 打开面板状态落盘
修复
打开面板的 open=true 从未持久化——刷新必丢(v1.22.10 的姊妹问题)。ui.set({open:true}) 发生在面板组件订阅建立之前(订阅在挂载后才生效),若无人续触发 ui.set,saveUi 永不执行。现在 open 翻转在 ui.set 内直接触发落盘。
闭环实测:开面板 → host 状态 open:true → 刷新页面 → 面板自动恢复打开。
v1.22.10 — 全量测试修复:面板状态恢复/周期切换/浅色可读性/主题联动/水合竞态
修复(5 类)
- 刷新后面板开合状态不恢复(1.22.8 回归):
ui.get中open: s.open !== false被上一行行尾注释吞掉,客户端 hydrate 拿不到该字段。由新增 254 例边界套件捕获。 - 切 K 线周期闪整屏 + 连点丢按钮:周期在详情 effect 依赖中,切一次周期清空整个详情重拉 5 个接口,周期丸消失 100-300ms。现在只清图表数据、只发 1 个 kline 请求。
- 浅色主题图表文字几乎不可读:
cssVarColor在<html>读主题令牌而令牌定义在<body>,永远用回退#8a8f98(白底 1.8:1)。改读 body 后浅色用真实令牌#61666b(5.8:1)。 - 主题切换图表不换色:GUI 跟随系统配色时 DOM 属性不变,MutationObserver 永不触发;补
matchMediachange 监听。 - 刚加载就点开面板被水合打回:hydrate 回填 open/tab 前检查用户是否已交互。
加固与测试
- KlineChart hasRows 门控(空挂载安全)
- 新增 4 套离线测试资产:qa/edge.mjs(254 例)、qa/fence.mjs(18 例)、qa/regress-v1228.mjs(21 例)、qa/persist-upgrade.mjs(16 例);check:fast 保持 1.8s
- 补记 1.22.8/1.22.9 更新日志
v1.22.9
改进
- K线 OHLC 图例常显:进入详情即可见最新一根的 开/高/低/收/量,不再需要悬停十字光标才出现;悬停时仍跟随十字光标对应根,MA 彩色数值行维持悬停显示。
- 背景:v1.22.3 改为悬停触发,是因为当时默认英文两行图例压住蜡烛;v1.22.5 起图例已是紧凑中文单行(字号 10),实测图例带内 0 蜡烛像素,无遮挡。
- 分时图不受影响(canvas 图例整体关闭,悬停信息由 .xq-tip 卡片承担)。
v1.22.8
修复
高
- 分时图竞态挂载 → 永久空白:详情页渐进渲染中(quote+K线先上屏、minute 数据后合并)抢点「分时」,图表以空 items 挂载后 effect(
[]) 永不刷新,只能切走再切回恢复。修复:空数据不挂图表(显示「分时数据加载中…」),数据到达后重建图表。竞态路径实测墨迹值 306(纯坐标轴)→ 8475(正常渲染)。
中
/xq-rpc对无 Origin 请求放行:本机任意进程裸 POST 可调用全部 20 个 action。修复:Origin 必须存在且同源(浏览器对同源 POST 必带 Origin,curl 裸调全拒)。- curl 失败错误回显完整内部命令行:bash 语法错误信息包含完整 shell 命令,信息泄露。修复:错误只返回退出码。
- 热榜/搜索竞态 ×2:快速切换市场无防护(慢响应覆盖新结果,高亮与内容不一致);轮询闭包捕获 stale
hotMarket(盘中切美股 60 秒后被拽回 A股)。修复:响应序号防护 + hotMarketRef。 K.dispose(boxRef.current)stale ref:卸载清理时 ref 已置 null → 图表实例静默泄漏(与 dblclick 监听同类历史坑)。修复:闭包捕获节点。
低
ui.get损坏状态文件非法 tab(如{"tab":999})类型穿透 → 白名单回退market- Agent 工具层
execute(null)抛 TypeError → 注册时统一包装args || {} - 云自选同步空结果不落
lastSyncAt→ cookie 半失效时节流失效、每 20-60s 重复打上游 2 个请求 → 空结果也推进时间戳 cloudWatchAdd/Delete无 catch → 断网时 unhandled rejection- 徽章包裹
style: {contents:'display'}键值写反 →display:'contents' - 快讯
created_at脏值渲染「NaN月NaN日」→ 跳过分组头
测试
- live 51/51、单测 39/39、mock 黑盒(tab 穿透/execute(null)/错误回显)3/3
- 浏览器回归:竞态分时 ✅、K线/分时切换 ✅、热榜快速切换 ✅、console 零错误
v1.22.7
修复
- 切换股票后分时图压成直线:xq-minute 指标全局只注册一次,calc 闭包捕获首次挂载实例的 baseRef,第二只股票分时复用旧 calc、挂上前任的昨收(宁德挂茅台昨收 1304,y 轴 404
1229,价格 378388 压成直线)。修复:每次挂载 overrideIndicator 重绑当前 baseRef 的 calc。三股连环切换实测通过(茅台 1304.66 → 宁德 387.89 → 京东方 5.75)。
v1.22.6
修复 / 新增
- 分时悬停信息双份叠加:分时面积图 OHLC 同值冗余 + 指标图例与 .xq-tip 重复 → 分时彻底关闭 canvas 图例
- K线悬停显示 MA5/10/30/60 数值(follow_cross 第二行彩色,单行不折行),对齐雪球
回归:K线↔分时 4 轮切换、双击回最新、收起/徽章重开/再进详情、月K悬停单行,全程 0 报错。
v1.22.5
修复
- 悬停 OHLC 图例折成两行压图(1.22.3 遗留):
follow_cross后默认英文标题过长,悬停时图例折两行盖住蜡烛。改为紧凑中文单行(开 高 低 收 量,字号 10)+ 隐藏 ticker 标题。实测悬停图例单行 10px 高、占宽 45%。