diff --git a/docs/superpowers/specs/2026-10-03-monitoring-design.md b/docs/superpowers/specs/2026-10-03-monitoring-design.md new file mode 100644 index 00000000..fa3701c0 --- /dev/null +++ b/docs/superpowers/specs/2026-10-03-monitoring-design.md @@ -0,0 +1,267 @@ +# 监控体系总设计(monitoring-design · 唯一活文档) + +> **建档 2026-10-03(用户令:监控设计散落多处→统一本档;框架=infra,内容=各域自填,细节级,从需求到实现到坑全收)** +> **本档为 repo 监控设计唯一权威源**。此前散落:fusion spec §20.15(数据面)/vps-runbook 监控注记两段(runbook:85-92)/strategy-ops-monitor plan 档/QMT 哨兵案卷(memory)。各域填毕后原文档相应节收编加指针(§0.4)。 + +--- + +## §0 治理 + +### §0.1 本档地位与更新义务(档随码走,所有 session 必读) +- **任何监控组件的设计变更,同一 push 必须更新本档**;纯实现/修 bug 打 `[no-doc]` 豁免 +- 监控代码触面:`scripts/strategy_monitor/*`、`scripts/data_platform/data_monitor.py`、`sanguo_data/monitor_*`(registry/checks/alerts_store)、`scripts/qmt_relogin/*`(哨兵链)、`scripts/ci/vps_count_engines.py`、NAS `monitor_nas` 副本、监控相关 wrapper/register ps1 +- **写本档的颗粒度铁律**(用户 2026-10-03 原话:「从需求到实现方案细节」「各种坑」「尽量细节不要大概」)——每个检查项/组件必须含五件套:**①需求由来(为什么有它/事故或拍板)②语义与判据(怎么判)③阈值与参数(现值+校准史)④实现坐标(file:line)⑤坑史与判别法**。缺一即不合格。 + +### §0.2 Owner 分工(各域填各节,勿越界代写;跨域改动先在 §11 挂条) +| 节 | Owner | 状态 | +|---|---|---| +| §1 需求与拍板史 / §2 全景 / §6.4 / §7 横切语义学 / §8 调度部署 / §9.C / §10 值班手册 / §11 台账 / §12 索引 | infra | ✅ 10-03 已填 | +| §3 QMT 三层防御链 / §4 策略面监控(§4.x 全部)/ §9.A 坑-策略桥 | stratergy | 🔴 待填(锚点已备 §4.9) | +| §5 数据面监控 / §6 告警通道(§6.1-6.3)/ §9.B 坑-数据 | data | 🔴 待填(锚点=自身源码) | +| §6.4 前端消费页 | infra(api/前端面) | 🔴 待填 | + +### §0.3 迭代地图(改什么→进哪节,防乱) +- 加/改**检查项** → 对应组件节(§3/§4/§5)检查表 + §12 索引行 +- **阈值校准** → 组件节该检的「③」小节记一行(日期/旧值→新值/依据) +- 踩**新坑** → §9 对应小节加条(现象/根因/判别法/修法坐标) +- **值班预期**变化(假日窗/新假黄族) → §10 表加行 +- **设计拍板**(用户裁决) → §1 时间线加行 + 相关节落变更 +- 新**已知缝/backlog** → §11 挂条(编号 MON-yyymm-nn) +- 新**组件**(新 monitor) → §2 加行 + 新开组件节(编号顺延) + +### §0.4 收编指针(各域填毕后由 infra 执行) +- fusion spec §20.15 → 头部加「数据面监控设计已收编至 monitoring-design §5」横幅(调度权威表仍留 fusion) +- vps-runbook:90/92 两段巨型注记 → 压缩为调度事实+指向本档 +- strategy-ops-monitor plan 档(2026-09-28)→ 加收编标注 +- 本档挂入项目 CLAUDE.md 参考文档区(三域 session 统一入口) + +--- + +## §1 需求与拍板史(infra 维护) + +> 事故驱动型体系:每层监控都对应真实事故/缺口。正序时间线: + +| 日期 | 事件 → 监控产物 | +|---|---| +| 08-17 | 开盘零成交事故(重启丢任务)→ 引擎进程面监控需求起点 | +| 08-19 | value 假熊市清仓事故 → 三态守卫定型(数据断供≠合法空名单),09-19 #66 全策略普查补种 value、10-03 语义终裁=§94 宪法「清仓只能人拍」 | +| 08-20 | bs-eod/bs-fund 撞点事故 → sanguo-bs-daily 18:05 串行重组(监控相关:rc 语义族 §7.6) | +| 09-25 | **用户拍板「监控内容越多越好」+ 告警通道=vnpy 前端运维告警页** → fusion spec §20.15 数据面监控体系立项(注册表 42 项四层证据链+alerts.db+两班) | +| 09-25 | 中秋休市被误判源故障折腾全天(手动补拉/双守望)→ **假案升红规则**(三源同缺=休市嫌疑;单源缺+他源在=源故障)+ 09-29 日历「确认集∪假定集」设计(循环依赖治理) | +| 09-26 | 断路器案 → 断路器态监控+share_capital/pledge_ratio open red 实例(§6.3) | +| 09-28 | 策略面监控 v1 立项(`docs/superpowers/plans/2026-09-28-strategy-ops-monitor.md`,照数据轨三件套)+ NAS monitor v2(scp inbox 摄取)+ 09-28 核批 eve 班错峰无碰撞 | +| 09-29 | QMT 事故(0929 案卷)→ 哨兵链强化复盘;09-29 日历首战立功(0928 ETF 缺写被确认集规则抓红) | +| 10-01 | v1.2/v1.3:fills_vs_paper 逐对账重设计(P1-3)+ engines_no_restart 盘窗口径重设计(P2-3)+ data_monitor_alive 互为外盯(P1-10)+ logs_stale 补盯 shadow_*(09-30)+ setpoint 7→3(_ex 退役配套) | +| 10-03 | 三域联合报警甄别(真故障 0,全假日假黄/常态误读)→ **用户令建本档统一监控设计**;同日假黄休市表 b24f905 落地+国庆日历勘正(**10-08 周四复市**,非 10-09) | + +--- + +## §2 体系全景(infra 维护) + +| # | 组件 | 机器 | 形态 | 产物 | owner | +|---|---|---|---|---|---| +| 1 | QMT 三层防御链(relogin 07:50 / 哨兵 30min / 盘前探针 09:15) | VPS+QMT 机 | schtask 链 | gate 日志(哨兵连续巡查) | stratergy/桥 | +| 2 | strategy-monitor morn/eve | VPS | schtask→python | `data/monitor/health_strategy_*_{shift}.json`+`health_strategy_latest.json`;alerts.db(source=strategy) | stratergy | +| 3 | data-monitor morn/eve | VPS | schtask→python | `data/monitor/health_*_{morning,evening}.json`+`health_latest.json`;alerts.db(source=data) | data | +| 4 | NAS monitor v2 | NAS | 宿主脚本(挂 sanguo-vps-mirror 16:00 班尾) | 事件 JSON scp→`data/monitor/inbox/`→VPS 两班摄取落库(host=nas,green_keys 回传 resolve) | data | +| 5 | alerts 通道+前端 /ops-alerts 页 | VPS | sqlite+API | `data/alerts.db` 三域同库;`GET /api/v1/alerts`;四类 tab+ack | data(store)/infra(前端) | +| 6 | CI nas-verify | Gitea runner | CI push 链 | CI run 状态(login+strategy/list+dbbardata 秒级 gate) | infra | +| 7 | 在岗互盯层 | VPS | data-monitor 内 SCHTASKS 自检(19 项)+ strategy 侧 data_monitor_alive 反盯 | 假阴性兜底 | infra 设计/data,stratergy 执行 | + +**数据流**(文字版):三域检查器(2/3/4)各自只读体检 → 事件 upsert 进同一 alerts.db(幂等键=check_key+日期)→ 前端 /ops-alerts 消费;health JSON 供晨检 agent(08:10 infra 首读 health_latest.json)与值班人直读。CI(6) 独立链路护部署面。互盯层(7)防「监控自身死亡全链静默」。 + +--- + +## §3 QMT 三层防御链(owner: stratergy)🔴 待填 + +### §3.1 需求由来(RED 链事故史+09-11 收官 275s 实测)→ 待填 +### §3.2 relogin(07:50)→ 待填(语义/登录态校验/退出码/坐标 scripts/qmt_relogin/qmt_relogin.py:行) +### §3.3 哨兵(30min 巡查)→ 待填(巡查面/五探针清单/gate 日志语义/已知缝=竞价段日切自愈遗留) +### §3.4 盘前探针(09:15,probe0915)→ 待填(510050×100@0.01 never-fill 即撤设计/0915=调度时刻非日期/假期 rc=1 预期/10-08 绿=桥复市金标准) +### §3.5 坑史(§9.A 详表锚点)→ 待填 + +--- + +## §4 策略面监控 strategy-monitor v1.3(owner: stratergy)🔴 待填 + +> **infra 预置骨架+事实锚点(infra 10-03 读码所得,stratergy 核对后展开成五件套颗粒度):** + +### §4.0 组件概述 +- 三件套:`strategy_monitor.py`(153 行主入口) + `strategy_registry.py`(58 行 v1.3 十一检) + `strategy_checks.py`(368 行检查实现);wrapper=`strategy_monitor_wrapper.ps1`(恒 exit 0 纪律);注册=`register_strategy_monitor_schtasks.ps1`(promote 后 infra 执行一次工法) +- 班次:morn 08:05(盘前,relogin 07:50 后 15min)/ eve 21:30(盘后,错峰 20:45 日报+21:00 xt_eod 之后 23:50 data-eve 之前,09-28 核批)/ noon 按需不注册 +- 产物:`data/monitor/health_strategy_{date}_{shift}.json` + `health_strategy_latest.json`(**health_latest.json 是数据域的,永不写**);alerts 写同库 `source="strategy"`;退出码 0=绿黄/3=红(wrapper 恒转 0) +- 只读纪律:不修数据;探测器自身抛错=单检降黄不阻断全班(strategy_monitor.py:48-56) + +### §4.1 十一检注册表(infra 抄录自 strategy_registry.py:13-58,2026-10-03 时点) +| key | fn | 班次 | severity | 闸门 | 关键参数 | +|---|---|---|---|---|---| +| strategy.engines_expected | engines_expected | morn/noon | red | — | expected=3(10-01 _ex 退役 setpoint 7→3,现役 58/59/63) | +| strategy.engines_actual | engines_actual | morn/noon | red | — | wmic needle=`sanguo_trader.shadow --account`(自匹配免疫)vs DB running(排 live 桌 mode='live') | +| strategy.engines_no_restart | engines_no_restart | morn/noon | red | — | 近 3 确认交易日 09:15-15:30 盘窗出生=违例(§11.0;10-01 P2-3 重设计,旧「当日 00:00 起」双失效已废) | +| strategy.logs_error_storm | logs_error_storm | morn/noon | yellow | — | live_*+shadow_* 26h 窗 ERROR/Traceback ≤20 | +| strategy.logs_stale | logs_stale | morn | yellow | weekday | live_*+shadow_* mtime ≤4d(09-30 修订:修前只盯 live_*=双失明) | +| strategy.is_report_ran | is_report_ran | eve | yellow | trading_day | is_daily 当日行存在(20:45 后) | +| strategy.is_identity_resid | is_identity_resid | eve | red | trading_day | 当日行 \|identity_resid\|≤1e-4;无行=绿(缺失归 is_report_ran) | +| strategy.orders_leftover | orders_leftover | eve | red | trading_day | 重放当日无 open/ack/partial 残留(expire=终态不算) | +| strategy.fills_vs_paper | fills_vs_paper | eve | red | trading_day | live↔shadow 逐对账:笔数相等+金额±0.01;无 running live=n/a 绿(10-01 P1-3 逐对重设计,全表总量口径已废);柜台↔台账恒等式仍归 15:10 仪式(infra) | +| strategy.weekly_ran | weekly_ran | eve | yellow | trading_day | strategy_weekly 本 ISO 周行存在 | +| strategy.data_monitor_alive | data_monitor_alive | morn/eve | red | — | data 域 health_latest.json mtime ≤26h(P1-10 互为外盯;文件缺失亦红) | + +### §4.2 各检判据实现细节(stratergy 按 strategy_checks.py 逐检展开五件套)→ 待填 +### §4.3 日历/降级语义(引用 §7,域内特殊处理另记)→ 待填 +### §4.4 setpoint 翻转史(7→3 工序与有界预期窗)→ 待填 +### §4.5 坑史(→§9.A)→ 待填 +### §4.9 事实锚点(infra 备查,填毕可删) +- 主循环班次过滤/trading_day 不评不消解/未确认降黄:strategy_monitor.py:109-121 +- 日历逐字镜像 data_monitor(确认集 dbbardata 000300∪近 15 工作日假定):strategy_monitor.py:88-98、strategy_checks.py:65-80(**ro uri 连接**) +- wmic CSV 解析(rpartition 处 cmdline 含逗号):strategy_checks.py:38-57;needle 免疫::22,60-62 +- running 计数排 live 桌:strategy_checks.py:87-98;双轨配对(instance_id 精确→strategies 首名回退)::112-138;逐对账取数(live_trades traded_at 前缀/paper_trades rejected=0)::141-158 +- alert_id 形如 `{key}-{yyyymmdd}`、绿班 resolve_passed 消解:strategy_monitor.py:125-134 + +--- + +## §5 数据面监控 data-monitor + NAS v2(owner: data)🔴 待填 + +> **骨架(data 展开成与 §4 同构五件套):** +### §5.0 组件概述(data_monitor.py 535 行;注册表 monitor_registry 42 项——§18.8/§20 调度表为权威源不自行维护清单)→ 待填 +### §5.1 注册表 42 项全表(key/kind/expected 语义/容差/row-band 值——含 per_date/dir_mtime/year_file/weekly_friday/month_bucket/static_exists/vintage_json 各 kind 语义)→ 待填 +### §5.2 四层证据链与分类学(fusion §20.15.2 迁入)→ 待填 +### §5.3 两班调度与产物(morning 08:06 全量+前夜自愈回看+NAS inbox 摄取 / evening 23:50)→ 待填 +### §5.4 NAS monitor v2(宿主生效位 scp 纪律/事件 JSON/green_keys 回传 resolve 语义)→ 待填 +### §5.5 假黄休市表 EXCHANGE_HOLIDAYS(b24f905:年度表/表缺年黄照旧/CI 年更闸/2026 表国庆 1001~1007 休 10-08[周四]复市)→ 待填 +### §5.6 row-band 滚动分位带(P1~P99 窗口 30 prior/非 0<10 回退静态/floor 永不下调/三次手动校准史)→ 待填 +### §5.7 坑史(→§9.B)→ 待填 + +--- + +## §6 共享告警通道(owner: data §6.1-6.3 / infra §6.4)🔴 待填 + +### §6.1 alerts.db 表结构与事件模型(alerts_store.py 159 行:schema/source 分域/severity/alert_id 幂等键/upsert/resolve_passed/purge)→ data 待填 +### §6.2 三域写入契约(source=data/strategy/nas;同库单写者纪律)→ data 待填 +### §6.3 已知设计缝(open red 无年龄上限永不 purge——MON 挂账;09-26 断路器案 2 条 open red 实例)→ data 待填 +### §6.4 前端 /ops-alerts 消费页(infra)✅ +- 入口=前端「运维告警」页 `/ops-alerts`(四类 tab 按 source 分域[数据/策略/nas/infra]+ack 确认操作);API=`GET /api/v1/alerts`(routes_alerts,读缺省 `data/alerts.db`=与三写方同一文件,10-03 路径闭环等价验证) +- 消费失败分诊:UI 空≠库空——先 `dir data\alerts.db`(应为数万字节级+当日班次 mtime)再查 API;**用 bare sqlite3.connect 探候选路径会造 0B 残骸误导后来人**(§9.C-5 坑) + +--- + +## §7 横切语义学(owner: infra,两域对齐引用)✅ infra 已填 + +### §7.1 交易日历(两 monitor 逐字同款,strategy_monitor.py:88-98 / data_monitor 同构) +- **日历 = 确认集 ∪ 假定集**:确认集=dbbardata `000300.SSE interval='d'` 实证日期(近 50 交易日查库,ro 连接);假定集=近 15 日工作日(含今日,纯 weekday<5 启发) +- **设计动机(09-25 实案,循环依赖治理)**:dbbardata 晚间源滞后/漏日时,若日历只信 dbbardata 会把全体检查判错(数据源坏→日历塌→监控整体失真);假定集兜住「今天该不该有数据」的期望面 +- **10-03 起(b24f905)**:假定集剔除 `EXCHANGE_HOLIDAYS` 休市表日(细节 §5.5,data 域) +- 判别:今日 ∈ 确认集=确认交易日;∈ 并集-确认集=未确认工作日(走 §7.2);∉ 并集=周末/连休(trading_day 检整体不评) + +### §7.2 三态容忍(未确认降级) +- 未确认工作日上的**红级**违例 → 降**黄**,`evidence.unconfirmed_day=True`(strategy_monitor.py:117-120) +- 覆盖三场景:节假日、合并窗、确认源自身滞后 +- 纪律:只降红→黄,**不消解、不静默转绿** + +### §7.3 trading_day vs weekday 闸门 +- `trading_day=True`:今日 ∉ 并集 → 该检整体**不评**(不误开告警,也不消解已开告警——周五开的假警周一不会自动消) +- `weekday=True`:纯周末不看(与日历无关,如 logs_stale 只在工作日班评) + +### §7.4 过程日志窗 26h +- 两个 monitor 日志类检查共用 26h 回看窗(防旧失败每日重炒进窗);strategy logs_error_storm 与 data 域 _LOG_WINDOW_H 同值 + +### §7.5 在岗互盯(防「监控自身死亡全链静默」结构洞) +- 正向:data-monitor 每班跑 SCHTASKS 自检(19 项在岗名单=075052d 17→19 含 data-monitor 两班;1010 补 strategy-monitor morn/eve)——schtask 死/被禁用即黄(**主动禁用 Disabled 跳过**不误红,qmt-relogin 0929/30 检修实案) +- 反向:strategy-monitor 两班跑 `data_monitor_alive`(data 域 health_latest.json mtime>26h=红,文件缺失亦红)——data-monitor 两班全死且其 SCHTASKS 自检自身也死时兜底 +- **残余盲区(MON-202610-02)**:strategy morn+eve 双班全死时反向互盯无人评——待三机互盯或外部心跳 +- 双 monitor wrapper 互不依赖,单班机械故障由对班+互盯盖 + +### §7.6 wrapper 退出码纪律与 rc 语义族(调度层判读必读) +- **监控 wrapper 恒 exit 0**:红态由 alerts/health JSON 承载——防污染 schtask Last Result 判读(python 侧 3=红,wrapper 转 0) +- **例外=xt-daily rc=1 抬码**(09-29 起):桥板块接口死时 ETF 清单空若仍 rc=0 会静默漏采(0928 全 ETF 停 0924 实案)→ ETF 清单空=仍写北交所但 rc=1,分诊信号=last_result=1+日志「FATAL ETF/基金 universe EMPTY」 +- **bs-daily rc=2 = graceful 自愈**:baostock 登录失败 3 重试(120s/300s backoff)后退出 2(bs_eod.py:625),次日 LOOKBACK=7 自愈;**连两日 rc=2 才升级**(10-02 假期实案:10002007 网络接收错误) +- **0x41301=运行中 / 0x41303=从未跑 / 0x41306=被终止**:schtasks Last Result 三态非错误码,值班勿当报警(ak-weekly 28h 长跑常现 41301) + +--- + +## §8 调度与部署(owner: infra)✅ infra 已填 + +### §8.1 监控相关 schtask 全表(VPS,2026-10-03 时点) +| 任务 | 时刻 | 内容 | owner | +|---|---|---|---| +| sanguo-qmt-relogin | 07:50 MON-FRI | 大QMT 登录态保活(三层防御第一层) | stratergy/桥 | +| sanguo-qmt-sentinel | 每 30min | 哨兵巡查(第二层;主动禁用=Disabled 跳过不误红) | stratergy/桥 | +| sanguo-qmt-probe0915 | 09:15 MON-FRI | 盘前主动探针(第三层,会话当日金标准;假期 rc=1 预期) | stratergy/桥 | +| sanguo-strategy-monitor-morn | 08:05 | 策略面盘前班(relogin 后 15min) | stratergy | +| sanguo-strategy-monitor-eve | 21:30 | 策略面盘后班(20:45 日报+21:00 xt_eod 后、23:50 data-eve 前,09-28 核批无碰撞) | stratergy | +| sanguo-data-monitor-morn | 08:05 | 数据面晨班(全量+前夜自愈回看+NAS inbox 摄取;08:10 晨检 agent 首读产物) | data | +| sanguo-data-monitor-eve | 23:50 | 数据面终检班 | data | +| (data-monitor 内含)SCHTASKS 自检 | 随班 | 19 项在岗名单互盯(§7.5) | infra 设计 | +| NAS sanguo-vps-mirror 班尾 | 16:00 | NAS monitor v2 挂班尾→事件 JSON scp 至 VPS `data/monitor/inbox/` | data | + +### §8.2 注册与部署工法 +- strategy-monitor schtask 注册=`register_strategy_monitor_schtasks.ps1`(**promote 上 VPS 后 infra 手动执行一次**,工法照 factor_monthly register 先例——schtask 不随代码自动更新) +- data-monitor wrapper=`data_monitor_wrapper.ps1 -Shift {morning,evening}`(参数化班次) +- **NAS monitor v2 生效位纪律**:runner 属宿主文件(`/volume1/stock/monitor_nas/`),**CI 不覆盖——改 repo 副本后须 `scp -O` 同步生效位**(09-28 先例) +- **QMT 哨兵链生效位**:`C:\sanguo_bigqmt\`(手工位,不走 promote;源码已回库 `scripts/qmt_relogin/`=dbf57f2 灾备,改代码后手动同步+重注册) + +### §8.3 产物路径约定(两域共同遵守) +- 数据域:`data/monitor/health_{date}_{morning,evening}.json` + `health_latest.json` +- 策略域:`data/monitor/health_strategy_{date}_{morn,eve}.json` + `health_strategy_latest.json` +- **铁律:health_latest.json 是数据域的,策略域永不写**(文件名即所有权) +- 告警库正主:`C:\sanguo_vnpy_v2\data\alerts.db`(default=`data/alerts.db` 相对 cwd=仓根;run_api.ps1 Set-Location 同解析;10-03 实证 77,824B 三域在写) + +--- + +## §9 坑全集(分域小节,条目格式=现象/根因/判别法/修法坐标) + +### §9.A 策略与桥(stratergy 待填) +(已知坑名预列:wmic 自匹配史→needle 口径 / logs_stale 只盯 live_* 双失明 09-30 / no_restart 旧口径双失效 10-01 / setpoint 翻换间隙红窗预期 / 假日桥 rpc timeout storm 10-03 / probe0915 假期 rc=1 …) +### §9.B 数据面(data 待填) +(已知坑名预列:DONE 行无日期永剩 start / dmsk mtime 80h 季频假黄 / row-band 静态上限被扩容涨破×3 / schtask weekday 72h 跨度 / 周五晚→周一晚跨度 / 0925 中秋休市误判全天 / EXCHANGE_HOLIDAYS 年更义务 / bare sqlite3.connect 探路径造 0B 残骸(10-03 alerts.db 误诊案) …) +### §9.C 基建(infra)✅ +1. **cmd `2>nul | pipe` 组合重定向失效**:`dir X 2>nul | findstr Y` 的 stderr 照样冒出「系统找不到指定的路径」,与真缺文件不可辨;`&` 链里更乱。→ 判别法/正解:远端 Windows 存在性/属性探查一律 `powershell Test-Path`/`Get-Item`(10-03 报警甄别实案)。 +2. **schtasks zh-CN locale 三坑**:`/d SAT` 周英文无效(静态表季频案);日期格式随 locale(/sd 用 `2026/10/04` 式);`/create` 传中文参数须 UTF-16。→ 注册脚本一律 ASCII+locale 中性格式。 +3. **交易所日历旧误记**:2026 国庆全员旧记「10-09 开盘」,交易所官方公告实为 1001~1007 休、**10-08[周四]复市**(b24f905 勘正;中秋段 dbbardata 实证背书)。→ 判别法:开市日以休市表/交易所公告为准,勿沿用惯性记忆。 +4. **Mac crontab 写两坑**:管道式 `… | crontab -` 本机 stdin 收不到 EOF 挂死 120s;写 `/usr/lib/cron/tabs/` 被 TCC 拦(node 责任进程,FDA 加白随 node 升级失效)。→ 上膛工法=Write 全量文件到 /tmp+`crontab /tmp/x.tmp` 单命令。 +5. **bare `sqlite3.connect()` 探候选路径=自己造库**:连不存在文件 connect 即建 0B 残骸,后来者连到残骸误判「空库」(10-03 alerts.db 误诊案:data 10-02 探针残骸→infra 误报真 bug→翻案)。→ 探针一律 `connect('file:...?mode=ro', uri=True)` 或先 Test-Path;探完即清。 +6. **VPS schtask XML 无 `` 元素=默认启用**:/create 重建的精简 XML 不显式写 Enabled,grep `'Enabled>true'` 计 0 勿误判禁用;判启用用 CSV「下次运行时间」非空或 State=Ready(10-03 baseline 重挂实案)。 + +--- + +## §10 值班手册(infra 汇总;一行=形态/含义/动作)✅ infra 已填(各域供条目持续并入) + +| 值班形态 | 含义 | 动作 | +|---|---|---| +| 连休窗 dbbardata/valuation 黄 | 休市无新数据,expected 日历旧把假日当交易日 | **b24f905 休市表已根治**——若再出现=休市表缺该假日,data 域补表(勿手工消警) | +| logs_stale 长假第 5 日起黄 | 4d 带只免周末,长假陈旧=诚实信号 | 确认引擎进程在即可,开市自愈,勿处置 | +| error_storm 假日窗黄(rpc timeout 族) | 桥离线+引擎轮询超时 | 开市日验证自愈;复市日仍黄才升级 | +| probe0915 假期 rc=1 | 柜台非交易日不给初始化 | 无动作;**复市日 09:15 转绿=桥复市金标准**(2026-10-08) | +| bs-daily rc=2 单日 | baostock 登录失败 graceful | 次日 LOOKBACK 自愈;**连两日 rc=2 才升级查** | +| xt-daily rc=1 | ETF 清单空抬码(防静默漏采) | 查日志「FATAL ETF/基金 universe EMPTY」+桥接口状态 | +| row-band 连黄数日~数周(两融扩容类) | 公告驱动缓涨在窗口吸收期 | 按公告核对后可容忍,勿当故障 | +| schtask 0x41301/0x41303/0x41306 | 运行中/从未跑/被终止(非错误码) | 勿报警;从未跑看是否有首跑排期 | +| setpoint 翻换间隙 engines_expected 红 | 部署到停退之间的有界预期窗 | 等工序走完次日双绿 | +| baseline one-shot 当晨 rc 非零 | 一次性任务失败=真报警 | stratergy 认领分诊 | +| 三源同缺一日 | 休市嫌疑(0925 中秋教训) | 先查交易日历再动源;单源缺+他源在才是源故障 | + +--- + +## §11 演进台账(MON-编号挂账,infra 维护) + +| 编号 | 条目 | 状态 | +|---|---|---| +| MON-202610-01 | open red 无年龄上限永不 purge(alerts_store) | 候选小改,data 认领 | +| MON-202610-02 | 双班全死盲区(strategy morn+eve 全死时 data_monitor_alive 无人评) | 待设计(三机互盯或外部心跳) | +| MON-202610-03 | 哨兵第六探针候选=dsa port 探针 | 用户 dsa 保留拍板后挂起 | + +--- + +## §12 实现坐标索引(各域各自维护自己节,file:line 快查)🟡 骨架 + +| 组件 | 主文件 | 行数 | 关键坐标 | +|---|---|---|---| +| strategy-monitor | scripts/strategy_monitor/strategy_monitor.py | 153 | 主循环 :109-149 | +| strategy registry v1.3 | scripts/strategy_monitor/strategy_registry.py | 58 | 十一检 :13-58 | +| strategy checks | scripts/strategy_monitor/strategy_checks.py | 368 | CHECK_FNS :356-368 | +| data-monitor | scripts/data_platform/data_monitor.py | 535 | (data 补) | +| alerts_store | sanguo_data/alerts_store.py | 159 | (data 补) | +| QMT 哨兵链 | scripts/qmt_relogin/(回库 dbf57f2) | — | sentinel 188/probe 209/gate_common 179/relogin 243 | + +--- +*建档 infra 2026-10-03;框架版首 commit 待各域认领填充(§0.2 表)。*