@mzzsfy/dsh-stock-assistant 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -7
- package/package.json +5 -2
- package/src/application.mjs +34 -15
- package/src/catalog.mjs +60 -31
- package/src/client.js +1288 -190
- package/src/collector.mjs +16 -6
- package/src/market-model.mjs +39 -11
- package/src/providers/eastmoney.mjs +51 -16
- package/src/providers/sina.mjs +121 -98
- package/src/providers/tencent.mjs +23 -14
- package/src/providers/tushare.mjs +1 -1
- package/src/providers/xueqiu.mjs +81 -0
- package/src/schemas.mjs +32 -9
- package/src/service.mjs +17 -6
- package/vendor/lightweight-charts.standalone.production.js +7 -0
- package//345/205/274/345/256/271/346/200/247/346/265/213/350/257/225.md +101 -2
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
| L3 生命周期 | 通过已测部分 | 隔离夹具详情中输入未保存别名→隐藏工具→模拟会话通知→重开,详情/草稿保留;Node实际factory测试覆盖无session绑定、反复入口、卸载 |
|
|
21
21
|
| L3 存储 | 通过 | 真实DomainFacility打开独立stock_sidebar(验收时域名,2026-10-30 已随包改名 stock_assistant);写偏好→关闭→重开,revision与偏好回读;域表仅control/cache,未写默认settings |
|
|
22
22
|
| L3 真实账户 | 未验证 | 本机与用户级环境均无`DSH_STOCK_TUSHARE_TOKEN`;授权后执行`node scripts/stock-probe.mjs`即可完成该项(约3次请求)。无凭据HTTPS协议与AUTH映射已验 |
|
|
23
|
-
| DSH版本 | rc.2/rc.3兼容 | rc.2与rc.3隔离真宿主均完成:导航入口、main页面、data-plugin样式、snapshot 200、WS ready→invalidate;rc.3另验证无凭据AUTH
|
|
23
|
+
| DSH版本 | rc.2/rc.3兼容(2026-10-30 当时记录) | rc.2与rc.3隔离真宿主均完成:导航入口、main页面、data-plugin样式、snapshot 200、WS ready→invalidate;rc.3另验证无凭据AUTH检查拒绝与保存守卫。当时 manifest 登记两版本 compatible;当前 manifest 已增至 rc.2/rc.3/rc.5/0.2.2-rc.1 四个 compatible,以 manifest 为准 |
|
|
24
24
|
|
|
25
25
|
## 自动化验证
|
|
26
26
|
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
- BDD缺口:routing.test扩展P12驻留期内切回被拒并验证epoch推进;新增bdd-gaps.test.mjs覆盖U09(无目录/搜索来源时CATALOG_NOT_READY)、C05(真实执行器预算包装下手动刷新429+等待时间)、C06(部分缺行成功且保旧值)、C07(Retry-After约束下轮时间)。
|
|
38
38
|
- rc.3多版本:pnpm安装0.2.1-rc.3到独立home(需仓库`scripts/compat/lib.mjs`同款`allowBuilds`清单,否则`ERR_PNPM_IGNORED_BUILDS`);junction挂载工作副本,`dsh web`正常启动。有头dev-browser验证:导航入口存在、点击后main工具页渲染(heading"股票")、1份data-plugin样式、snapshot 200、WS订阅ready→写偏好→invalidate回包。无凭据下provider-check返回AUTH denied,configuration被CHECK_REQUIRED守卫拒绝(符合规格:检查失败不能启用能力)。Tushare适配器在rc.3闭包下经真实执行器触达`api.tushare.pro`并完成40101→AUTH映射。
|
|
39
39
|
- 真实账户探针工具:新增`scripts/stock-probe.mjs`(仓库根执行,`node scripts/stock-probe.mjs [XSHG|XSHE]`),读`DSH_STOCK_TUSHARE_TOKEN`,按quotes/catalog/calendar各1次最小只读请求输出JSON结果;无凭据时明确退出码2。本机与用户级环境实测均无该变量,真实账户行为待授权执行,工具已就绪。
|
|
40
|
-
- manifest `dsh.compatibility.dshReleases
|
|
40
|
+
- manifest `dsh.compatibility.dshReleases` 当时登记 `0.2.1-rc.2`/`0.2.1-rc.3` 为 `compatible`(依据上述隔离宿主接入证据);当前已增至 rc.2/rc.3/rc.5/0.2.2-rc.1 四个 compatible,以 manifest 为准。
|
|
41
41
|
|
|
42
42
|
## 2026-10-30 公开行情适配器
|
|
43
43
|
|
|
@@ -137,7 +137,106 @@
|
|
|
137
137
|
|
|
138
138
|
测试基线 123→**131**(K4-K8+routes 错误映射+市场面合同两用例);全量两连绿确认(曾现一例 K5 计时 flaky,夹具 retryAfterMs 300ms→20ms 消除)。
|
|
139
139
|
|
|
140
|
+
## 2026-11-07 悬浮盯盘与指标线(代码审查整改轮)
|
|
141
|
+
|
|
142
|
+
三轮子代理对抗审查外加一次收窄的修复验证:第一轮 5 个阻断,第二轮 3 个新阻断(其一为第一轮修复引入),第三轮 2 个阻断;末轮修复后经窄范围复审确认无阻断。
|
|
143
|
+
|
|
144
|
+
| 项 | 现象 | 处置 |
|
|
145
|
+
| --- | --- | --- |
|
|
146
|
+
| 分时成交量单位 | 沪深分时 `volume` 未按手换算,图例比日K/详情小 100 倍 | `trend()` 改走 `sharesFromLots`;`public-providers.test.mjs` 补 `11523 手 → 1152300 股` 断言;宿主重启后实测末条 `2988207 → 298820700` |
|
|
147
|
+
| 切标的残留 | 图模式切标的后新请求返回前仍显示上一只价格 | `trend` 改为 `{securityId, data}` 绑定;实测从智谱切上证,30ms 内读 DOM 为 `—\|—`,2.6s 后为 `3649.18/-1.10%` |
|
|
148
|
+
| 详情入口分裂 | 悬浮窗「打开详情」不清成本草稿(会串写到别的股票),面板不在前台时无反应 | 新增 `runtime.openDetail` 收口(`layout.selectPanel` + 详情加载交给挂载 effect),草稿清理下沉到 `updateView` 的 `detailId` 变更处,五条打开路径共用;实测在插件面板点 ⤢ 正确切回并打开详情 |
|
|
149
|
+
| K 线与图例双源 | 手动刷新后图例/辅助线/指标更新而蜡烛不动;快速切周期旧结果覆盖新结果 | effect 拆成「加载」与「灌图」两条,`maybeFill` 增加 `fit` 参数,`loadKline` 成功与失败分支都校验 `klineKey`,`getKlineResult` 与图例同样按 key 取数;↻ 未做端到端实测 |
|
|
150
|
+
| 空壳灌图 | 切周期当帧 state.kline 是上一轮的空壳,直接灌会把分时的 `09:30` 交给 Candlestick 触发 vendor 抛 Invalid date;空壳又会被误当成"已铺满" | 灌图 effect 先校验 key;空壳只清屏且不推进 `shippedKeyRef`(空数据上 fitContent 是 no-op),`applyIndicators` 收到空数组时清掉指标线 |
|
|
151
|
+
| 别名被清空 | 从浏览市场/搜索打开"已在自选"的标的时 `view.alias` 为空,未改动直接点保存会写回空串,抹掉已存别名 | 别名回填下沉到 `updateView` 的 `detailId` 变更处,五条打开路径不再各自内联;`openDetail` 不预载 K 线(与挂载 effect 重复) |
|
|
152
|
+
| 浮窗配色 | 独立 root 缺 `ssb-green-up`,绿涨红跌用户在浮窗看到反色 | `.ssb-float` 按 `preferences.colorMode` 拼类名;实测切到 green-up 后面板与浮窗同时变为跌红涨绿,切回 red-up 复原 |
|
|
153
|
+
| 全部取消勾选 | `ids` 清空后又回退到自选前五只,"一只都不盯"无法表达 | `ids` 为 `null` 才是"没勾过",空数组表示明确不盯;实测取消全部勾选后显示"盯盘 0 / 未选择标的",不再自动加回 |
|
|
154
|
+
| 图表配色越界 | 均线/布林/BBI 的色在 JS 与 CSS 各写裸 hex,MA60 与布林上下轨饱和度仅两成 | 改为包局部 token `--ssb-chart-*`,饱和度统一七成以上;实测图例色与 token 一致,宿主切配色后蜡烛与均线一并重涂 |
|
|
155
|
+
| 指标无测试 | `seriesMA/EMA/Boll/BBI` 纯函数零覆盖 | 新增 `test/indicators.test.mjs` 8 例:前导 null、滑动和、EMA 的 k 与种子、BOLL 中轨=MA 与上下轨对称、BBI 24 根门槛、空序列与短序列边界;`__testing` 导出四个函数 |
|
|
156
|
+
| 暗色下可辨 | 图表色只有一套固定值,暗底上深色线条溶进背景;亮色侧有四个取值本身对比度不到 2.5(MA5 2.06、MA60 2.32、BOLL 上轨 2.43、BBI 2.43),色差一项旧值本就合格(最小 18.98) | 按宿主 `body[data-ds-dark-theme]` 给出两套值,明暗标记不在 `.ssb-root` 上,重涂 observer 单开一路监听 body;新增 `test/chart-colors.test.mjs` 解析 token 直接算对比度(≥2.5)与两两 CIELAB 色差(≥12),把旧亮色值整段回退后对比度用例变红、色差用例仍绿 |
|
|
157
|
+
| 缺失值当 0 | `Number(null)` 得到真实的 0,区间最高/最低与迷你图被压到地板上,成本盈亏在缺收盘价时算出 −100% | 新增 `finiteOr`(null/空串给 NaN),区间高低、迷你图、成本盈亏四处改用它 |
|
|
158
|
+
| 成交量 0 | `formatAmount` 把 0 与 null 一样显示成破折号,掩盖了「真的没成交」 | 增加 `zeroIsMissing` 开关,成交额仍按缺失呈现,成交量与图例的量传 `false` |
|
|
159
|
+
| 浮窗状态 | 拉取失败仍显示「监听中」,未勾选标的时也照旧 | 三态:未选择 / 更新失败(悬停给原因、warn 配色)/ 监听中 |
|
|
160
|
+
| 并发代际 | 同一标的连点刷新会并发两个同 key 请求,先发后到的响应盖掉新数据 | `loadKline` 增加 `klineSeq`,成功与失败分支都要求代际匹配;补测试并回退验证会变红 |
|
|
161
|
+
| 拖动与触摸 | 右键也会触发拖动;`.ssb-float` 的 `touch-action:none` 让列表与勾选区无法触摸滚动;`dragging` 类名挂在 ref 上不会触发重渲染,从未生效 | 只认左键;列表与勾选区改 `touch-action:pan-y`;删掉失效类名 |
|
|
162
|
+
| 本地偏好无守卫 | 收尾时把 `localStorage` 的断言整条删了,等于放行任意本地写入 | 改为收窄:只允许 `readPref`/`writePref` 两处调用,key 集合固定为 `ssb-floating`/`ssb-guides` |
|
|
163
|
+
| 重涂从未生效 | 建图与重涂回调跑在空依赖 effect 里,闭包中的 `kline` 与 `colorMode` 停在首帧,重涂时读到空数据直接早退;`applyIndicators` 同理 | 新增 `liveRef` 每帧写入 `{ candles, colorMode, indicators }`,回调与 `themeOf` 一律现取;实测切周K→日K 指标线不丢 |
|
|
164
|
+
| 暗色露白块 | 图表背景写死 `transparent`,而 `.ssb-kline-holder` 自身无底色,canvas 留白在暗色下是白色 | 背景改取 `--ssb-bg`;实测给 body 打暗色标记并覆盖 `--dsw-*` 后,图表背景随面板变深,蜡烛/成交量/均线一并重涂 |
|
|
165
|
+
| 休市降频是死代码 | 读 `quotes[id].sessionState`,实际在 `quotes[id].quote` 里,`allClosed` 恒 false;且 `allClosed` 时提前 return 会让低频拍空转 | 改读 `quote.sessionState`,去掉提前 return 只保留降频;实测全部休市时 22 秒内零次 `/refresh`(15 秒间隔时应有 1 次) |
|
|
166
|
+
| 代际失败路径 | 被淘汰的旧请求失败后仍走错误写入,覆盖新请求已落地的数据 | 失败分支先按代际退出;补「后发成功、先发失败」用例,破坏代际可复现变红 |
|
|
167
|
+
| 触摸滚不动列表 | `touch-action` 取触摸路径上的交集,父级 `.ssb-float` 的 `none` 把子元素设的 `pan-y` 一起废掉,列表在触屏上无法滚动 | 容器改 `pan-y`、标题条 `none`,拖动起点收到标题条;实测头部拖动位置与落点都变、列表上拖动位置不变 |
|
|
168
|
+
| 格式化无单测 | `finiteOr` 与 `formatAmount` 决定界面怎么区分「没有数据」与「真的是 0」,零覆盖 | 提到模块级并 `__testing` 导出,新增 `formatters.test.mjs`:缺失值/空串一律 NaN、真实 0 保留、成交额 0 按缺省、成交量显式关开关、万/亿缩写与负数取量级 |
|
|
169
|
+
| 分时曲线不重涂 | 重涂只按蜡烛的键名下发布,而分时面积序列用的是 `lineColor`/`topColor`/`bottomColor`,两组键名互不相通,切主题后只有背景变了 | 抽 `seriesPaintPlan` 按已建形态选键名,测试断言两套键名不重叠 |
|
|
170
|
+
| 悬浮窗把缺失当 0 | 调用方先 `Number(close)`/`Number(preClose)` 再交给已用 `finiteOr` 的迷你图,`null` 变 0:基准画在 0、价格显示「0」 | 调用方改用 `finiteOr`,显示判 `Number.isFinite` |
|
|
171
|
+
| 首帧闭包 | 建图 effect 空依赖,捕获的是首帧那份 `maybeFill`,建图窗口内切的周期/开关/成本全用旧值 | 改用 `fillRef` 转发最新渲染;`setKlineError` 取 `liveRef` 的当前周期 |
|
|
172
|
+
| 休市仍打上游 | 降频只降了频率,`/refresh` 走手动通道,休市时每分钟仍是一次真实请求 | 决策收进 `pollPlan` 纯函数:安静档(收盘+午休)列表九拍只读快照、图形九拍完全不发请求,两者第十拍各做一次真刷新——只读快照回放缓存、不重算交易时段,单靠它永远发现不了开市 |
|
|
173
|
+
| 图形模式白烧额度 | 上一版把「休市停打」只修在列表分支;后来改成收市档拉快照,但 `/snapshot` 走 `collector.entries()` 缓存克隆、不重算 `sessionState`,探针被「已知收市」门控而自锁,第 10 拍仍落 `trend`(该端点不进缓存,每拍都是真上游) | 图形模式整十拍无条件先真刷新,`quiet` 才翻得过来;`stateOf` 按 `receivedAt` 在两份报价间择优,不再无条件偏爱自己那份 |
|
|
174
|
+
| 本地存储守卫形同虚设 | 只数 `localStorage.getItem\|setItem` 两个字符串,`clear()`/`removeItem`/属性访问/`sessionStorage` 都能绕过 | 连属性访问一起数并与白名单逐条比对,另禁 `sessionStorage`/`indexedDB`;六种绕过实测均被识别 |
|
|
175
|
+
|
|
176
|
+
测试基线 204→**256**。分时量单位、切标的残留、详情入口、分时→日K 不崩、浮窗配色、全部取消勾选、图表配色、暗色双套取值、暗色重涂、休市降频、悬浮窗拖动与列表手势、分组切面与整组勾选、浮窗三态、拆分后的悬浮窗、自选列表分组常显与全局排序保留分区、顶部刷新按钮无错误条、周期切换后指标线回归、图形模式收市停打 trend 共十八项有真机验证记录;手动刷新(↻)端到端仍是代码路径确认。配色可辨性另外由 `chart-colors.test.mjs` 以对比度、色差与饱和度量化,不再依赖肉眼。
|
|
177
|
+
|
|
178
|
+
以下为**已确认但当前不可达**的限制,记录以免将来误判为回归:
|
|
179
|
+
|
|
180
|
+
- 分时横轴在缺少行情自带时间戳时,退回「当天 UTC 零点 + 分钟偏移」。对非 UTC 市场会整体偏时区(实测美股偏约 11 小时、A 股偏 1.5 小时)。东财分时恒给时间戳,该路径当前不可达;一旦上游改口径会立刻显现,届时需按市场时区取当天零点。
|
|
181
|
+
- 四秒退避的代际检查没有自动化用例:需要真实计时,靠代码路径确认。
|
|
182
|
+
- 悬浮窗的轮询状态机没有端到端用例:`pollPlan` 各分支已由纯函数用例锁定,但从「面板报价冻结」到「状态翻回」的整链只在真机上确认过。
|
|
183
|
+
- 开市发现延迟:安静档最快一分钟一拍,第十拍才真刷新,所以收盘后开市最多要等十拍(默认间隔下约十分钟)才恢复实时。
|
|
184
|
+
|
|
140
185
|
## 宿主升级回归项(本包相关)
|
|
141
186
|
|
|
142
187
|
- **插件 client bundle 缓存失效缺陷(DASH 本体)**:`/plugins/??...&rev=` 聚合 bundle 的 rev 不包含第三方插件 client 内容(多次宿主重启 rev 恒为 a8db260a2844),插件升级后浏览器按 URL 命中磁盘缓存继续执行旧 client;服务端 bundle 内容已更新(fetch no-store 可取到新代码)。用户侧需强刷或等 rev 变化;宿主修复 rev 内容寻址后,本包 client 级 UX 修复(内联一键开启、RATE_LIMIT 自动重试)需在真机回归一遍运行时表现(测试已覆盖逻辑,运行时验证被该缺陷阻断)。
|
|
143
188
|
|
|
189
|
+
## 兼容性维度适用表
|
|
190
|
+
|
|
191
|
+
标记:M 手工必测 / A 自动化覆盖 / C 条件必测 / N 不适用。维度定义与判定口径见 [兼容性检查总纲](../../docs/兼容性测试/兼容性检查总纲.md)。
|
|
192
|
+
|
|
193
|
+
| 维度 | 标记 | 本包落点(检查点/证据) |
|
|
194
|
+
|---|---|---|
|
|
195
|
+
| D01 宿主代际与 API 契约 | M | 不使用 DSH 默认 settings(无 `Config`),经 `storageDomain` 自有域;`slots/locale/layout` client 注入;`storageDomain.open` 缺失时干净禁用;宿主 client bundle rev 缺陷见「宿主升级回归项」 |
|
|
196
|
+
| D02 运行平台与架构 | C | 无平台分支;触发条件 = 跨平台路径/编码/时区。落点:自有数据目录、K 线缓存文件、Windows 大小写;macOS 未验证(登记) |
|
|
197
|
+
| D03 Web 客户端形态 | M | 左侧「股票」独立主页面、K 线(lightweight-charts)、悬浮盯盘、分组/搜索/排序、窄屏与缩放、亮暗主题、图表色对比 |
|
|
198
|
+
| D04 宿主部署与配置形态 | M | 八个市场的外部行情源可达性、代理/TLS/限流、Tushare token(`DSH_STOCK_TUSHARE_TOKEN`)、vendor 静态资源路由;离线时降级到可用源或提示 |
|
|
199
|
+
| D05 插件互操作与组合 | M | `common-tools` 总线/toast;vendor 路由不与宿主/他包前缀冲突;其他主页面插件共存;全家桶 |
|
|
200
|
+
| D06 生命周期 | M | 采集暂停/恢复、页面切换/关闭会话保持状态、重启恢复自选与设置草稿、K 线缓存重建、HMR 后定时器不叠加 |
|
|
201
|
+
| D07 多实例与并发 | M | 多市场并发采集、预算/限流、多窗口/多标签共享、悬浮窗与列表同源分区、重复请求合并 |
|
|
202
|
+
| D08 持久化代际与迁移 | M | `stock_assistant` 数据域 version=1/layout=single;旧域 `stock_sidebar` 改名(生产未挂载旧域,无迁移面);域打开失败降级;缓存文件格式 |
|
|
203
|
+
| D09 数据规模与异常数据 | M | 空自选/空市场、休市快照、坏行情数据、超大 K 线序列、重复/缺失字段、时区与交易时段 |
|
|
204
|
+
| D10 配置读写与默认值 | M | 自有设置存储(数据源/能力路由/刷新间隔/别名/分组/置顶);默认值、非法值、保存失败回读;无宿主 settings 迁移 |
|
|
205
|
+
| D11 降级与错误路径 | M | 行情源超时/限流/格式变化/停服、无 token、市场不可用;切换备用源或明确错误,不空白不崩 |
|
|
206
|
+
| D12 安全边界与信任 | C | 触发条件 = 路由对外。落点:`/api/stock-assistant/*` 同源、vendor 静态资源路径不越界、不设自有认证层;Tushare token 不落日志 |
|
|
207
|
+
| D13 性能与资源 | M | 悬浮盯盘轮询/刷新间隔、采集预算、K 线缓存上限、图表渲染点数、页面切走暂停;无请求风暴 |
|
|
208
|
+
| D14 呈现与可访问性 | M | 无 locale 词典:语言切换不崩、中文文案可读;亮暗/图表色、窄屏、悬浮窗遮挡、键盘可达;对比度 |
|
|
209
|
+
| D15 观测与判定面 | M | activation live/findings 0/console 0;采集状态与错误可观测;L3 证据含页面截图与网络记录 |
|
|
210
|
+
|
|
211
|
+
## 维度检查点(补充)
|
|
212
|
+
|
|
213
|
+
1. **数据源矩阵**:八个市场各至少一次列表/详情/K 线;单一数据源失败时路由到备用源或给出可读错误,不整页空。
|
|
214
|
+
2. **交易时段**:休市快照冻结、当日/分时口径、时区与跨日;不得把休市当故障。
|
|
215
|
+
3. **预算与限流**:高频刷新触发限流时退避;多市场并发不超预算;页面切走/悬浮隐藏时降低采集。
|
|
216
|
+
4. **持久化代际**:`stock_assistant` v1 读写;旧域不存在时新建;域打开失败降级后操作按调用失败而非崩溃。
|
|
217
|
+
5. **token 边界**:无 Tushare token 时该源不可用且提示;token 不出现在日志/错误文本/前端可读位置。
|
|
218
|
+
6. **图表规模**:长 K 线/多指标开关不卡死主线程;缩放/拖拽/悬浮读数正确。
|
|
219
|
+
|
|
220
|
+
## 判据补充
|
|
221
|
+
|
|
222
|
+
上表 D01/D03/D04/D08/D11/D13 的检查点全部通过才可宣称本窗口兼容;外部行情源不可达时,D04/D11 记 E 并写明已排除项,不得以静态数据代替真实链路。
|
|
223
|
+
|
|
224
|
+
## 本包验证点(最小判定)
|
|
225
|
+
|
|
226
|
+
| 维度 | 验证点(操作→预期) | 证据 | 级别 |
|
|
227
|
+
|---|---|---|---|
|
|
228
|
+
| D01 | 隔离宿主启动 → 左侧「股票」入口出现、点开后 main 页(空态/工具页)渲染、`snapshot` 200、恰一份归属完整包名的 style;`storageDomain.open` 缺失 → 干净禁用不崩 | 页面截图、HTTP 状态码、`data-plugin` style 计数、console | B |
|
|
229
|
+
| D02 | 触发 = 跨平台路径/编码/时区。Windows 上以自有数据目录与 K 线缓存文件启动并切换时区 → 路径与缓存可读写、大小写不误判、时区展示正确;macOS 未验证登记 | 目录列表、K 线截图、boot.log | C |
|
|
230
|
+
| D03 | 添加自选后看行情行 → 价格/涨跌/来源/未知延迟呈现;打开详情 K 线 → 蜡烛+MA 三线+量副图+昨收虚线;1280px 双栏、768/360px 单栏,document 与工具 root 均无横向溢出 | 截图、`scrollWidth`/`clientWidth` 回读、K 线截图 | B |
|
|
231
|
+
| D04 | 默认六路由开箱 → 检查(search/quotes ready)→ 保存成功;`/api/bus/ws` 订阅股票空间 → ready → 写偏好 → 收到 invalidate(带 serverEpoch/snapshotSeq);`/plugins-vendor/dsh-stock-assistant` 200 | WS 消息字段、provider-check 结果、HTTP 状态码、网络记录 | B |
|
|
232
|
+
| D05 | 同装 `common-tools` 与全家桶 → 总线/toast 通道可用、vendor 路由不与宿主或他包前缀冲突、主页面与其他主页面插件共存,页面无 `Failed to load plugins` | toast 截图、vendor 请求状态码、页面横幅检查 | B |
|
|
233
|
+
| D06 | 停用/启用面板与插件、HMR 一次 → 入口与采集/轮询随启停,无重复定时器;重启后自选与设置恢复 | 入口截图、定时器计数、回读值 | B |
|
|
234
|
+
| D07 | 两个标签同开面板并同时触发采集/改偏好 → 多窗口共享、重复请求合并、预算/限流生效、悬浮窗与列表同源分区,不互相覆盖 | 双窗截图、snapshot 序列、请求计数 | B |
|
|
235
|
+
| D08 | 重启后重开面板 → 自选与设置从 `stock_assistant` 域回读(version=1/layout=single),偏好与别名一致;域表仅 control/cache,未写宿主默认 settings | 域快照回读值、重开前后 UI 值、settings 未写入核对 | B |
|
|
236
|
+
| D09 | 停牌源返回 `"-"` → 不伪造价格而显示缺省;某证券缺行/坏行 → 记 NO_DATA 且不瘫痪同批其他证券;重复身份/冲突 → BAD_PAYLOAD;空目录合法,仅无有效缓存记录才 CATALOG_NOT_READY | 行内显示回读、错误码、console | B |
|
|
237
|
+
| D10 | 设置页「检查→保存」流 → 空 checkIds 直提交被 `CHECK_REQUIRED` 拒绝,检查通过后保存成功且回读一致;改默认数据源/刷新间隔/别名后回读同值;检查失败的能力不可启用 | HTTP 错误码、配置回读值、UI 提示截图 | B |
|
|
238
|
+
| D11 | 无 `DSH_STOCK_TUSHARE_TOKEN` → provider-check 返 AUTH denied(40101→AUTH 映射)、保存守卫拒启用;`NO_ROUTE`/`CATALOG_NOT_READY` → 错误条内嵌引导按钮;`RATE_LIMIT` → 退避 max(4s, retryAfterMs) 后自动重试一次不无限重试 | HTTP 状态码/错误码、notice 与错误条截图、请求计数 | B |
|
|
239
|
+
| D12 | 触发条件 = `/api/stock-assistant/*` 路由对外可达。跨源访问该路由 → 同源比对拒绝(无自设认证层);`/plugins-vendor/` 路径不越界;日志与错误文本不出现 Tushare token | HTTP 状态码、越界探测响应、日志检索结果 | C |
|
|
240
|
+
| D13 | 全部休市 → 15 秒刷新间隔下 22 秒窗口内 `/refresh` 计数为 0(走只读快照);长空闲基线 snapshot 计数不增长;面板隐藏/切走后采集暂停 | 请求计数、snapshot 计数、日志 | B |
|
|
241
|
+
| D14 | 亮色/暗色各视口截图 → 图表色取自宿主语义 token,暗色下图表背景随面板变深、蜡烛/成交量/均线一并重涂;窄屏隐藏来源辅助列,详情宽窄屏均有「返回自选」;对比度 ≥2.5、两两色差 ≥12 | 截图、`--ssb-chart-*` token 回读、`chart-colors.test.mjs` 输出 | B |
|
|
242
|
+
| D15 | boot → activation live、findings 0、console 0;浮窗三态(未选择/更新失败/监听中)可观测;L3 证据含页面截图与网络记录 | activation/findings、console、截图与网络记录路径 | B |
|