Files
one_divine_lot/docs/04-迭代记录/19-指示灯状态自适应探测/迭代复盘.md
T

46 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 迭代复盘:19-指示灯状态自适应探测
## 结论
达成(R-022 + R-023 全范围):会话头部两只「连接类」指示灯(QMT连接 / MCP)统一改为
**结果驱动自适应探测**——健康/已连接维持 5 分钟稳态(原设计不变),异常/未知每 10 秒快速重试;
QMT Bridge 与其 MCP 服务启动/恢复后两灯 ≤20s 自动回绿,不再等满 5 分钟 / 不再永不恢复。
前端指示灯与 sync-status / qmt-health / mcp-status 端点零改动(读缓存秒回语义不变)。
## 事实记录
### R-022 QMT 健康灯(src/data-source/QmtHealthMonitor.js
- 根因(已证实):健康缓存固定 5 分钟探测一次激活 /health;其余三灯有高频自愈回路
(持仓 10s / 行情 5s / MCP 客户端重连)。Bridge 在两次探测间启动/恢复时缓存停留在上次失败结果。
- 变更:setInterval(5min) → setTimeout 自适应链(_nextDelay/_scheduleNext,结果驱动);
HEALTH_RETRY_MS=10s;构造注入 { intervalMs, retryMs }resolveActiveBaseUrl 移入 try
(解析失败也落 healthy:false 走快速重试,原实现该场景灯灰且不自动重试);_inFlight 防并发保留。
### R-023 MCP 状态灯(src/mcp/QmtMcpManager.js
- 根因(已证实):状态缓存只在 挂载/切换/手动探测 时刷新,无定时回路;dsh-mcp-client 自带 reconnect
只恢复真实连接(fiber 层),不刷新插件状态缓存。
- 变更:probe() 结果写缓存后 _scheduleNext()PROBE_RETRY_MS=10s;构造注入 { intervalMs, retryMs }
无激活连接早退置 disabled 并取消定时器;unmount()/dispose() 停止调度;_probing 防并发;
探测本体与挂载/重连逻辑零改动。
### 验证
- scripts/test-health-monitor.mjs 10/10 绿;scripts/test-mcp-status.mjs 12/12 绿(调度机制守护);
- pnpm typecheck 0 错;pnpm build 通过(lib 两文件均含自适应逻辑);
- 存量回归 test-quote-sync / test-position-sync 均 0 退出。
## 待老师确认事项
1. R-022 / R-023 定稿确认(边界:健康/已连接稳态 5 分钟不变 / 异常 10s 重试 / 不新增配置 / API 前端零改动);
2. 真实环境人工验收(验收标准.md 第 8 条):停/启 QMT Bridge → QMT 灯与 MCP 灯 ≤20s 自动回绿、
点击仍即时探测、插件重载后缓存秒回。
## 经验沉淀(候选)
- 定时轮询类功能的恢复感知要与故障探测解耦:固定低频定时器做稳态,异常态必须用快速重试把「恢复」
也纳入自愈回路——灯类状态"看起来没生效"的根因通常是恢复路径的响应时延,而不是探测本身失效。
- 「外层有自管重连」不等于「状态缓存会自愈」:重连只恢复真实连接,展示层缓存若无自己的刷新回路,
必须单独加状态自适应探测(R-023 教训)。