Ver código fonte

docs(house-fault): Task7 真机核心验证回写——基线无回归+告警闭环落库+短信通知派发(18223210384)

H-04基线/H-05 alarm表落库/H-06阿里云短信派发,残留H-07物理拔相机。测试数据已清理。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie 1 dia atrás
pai
commit
9358366e3e

+ 17 - 0
项目文档/进度/交接卡.md

@@ -485,3 +485,20 @@
   - ② 半坏舱注入:**物理拔某舱相机USB → 软件无法做(拔USB只能人手)**。待与用户对齐:人配合拔一下 / 软件模拟注入 / 暂缓。
   - ③ 待确认点:被排除舱可能没写入 house 表,报警链按houseSn查house/tlSetting可能查不到→alarm能否落库需真机验,查不到补一步。
 - **诚实边界**:本轮纯代码+单测,真机一步未跑(Task7 待开)。
+
+---
+
+## 2026-06-24 · 舱室故障隔离 Task7 真机:基线无回归 + 告警闭环落库 + 短信通知链路打通(用户要求发到手机)
+
+- **目标**:跑 Task7 我能自主做的两项(基线/闭环),并按用户要求让报警真发短信到手机 18223210384 验证能否收到。
+- **起停**:旧 control 15840(昨日旧码)经 `/shutdown`(token tl13579)干净停(无看门狗);编 Release(先停旧实例解 DLL 锁)→ 提权起新 control pid10360(`ivf_tl_ControlHost/bin/Release/net6.0-windows/`,参数 `--account=admin --password=123456 --cacheDisk=C --port=38080`,`..\tl-shared.config` 在 bin/Release)。无活体培养(空闲监测),重启安全。
+- **H-04 基线 ✅**:新 control `/status` = started:true、新增 `Faults:[]`(空)、好舱 2/4/6/7/8/9 照常连接≈37℃、ServerUrl 127.0.0.1:10010。**改造零回归**。
+- **告警通道核实(关键,纠正了原计划)**:经 codegraph + JDBC 查实——
+  - 闭环 = `SerialBinController.ReportAlarmController(tlSn,houseSn,houseState,comState,photoState,wellSn,airSwapState)` → `/reportAlarm` → 报警责任链(HousePort/Photo/温度/气压/舱门/排气 handler)→ `aivfo_tl_setting.alarm` 表 → front 报警列表 + operate"系统异常(N)" + **短信/电话**(AlarmSchedule 每 1min 扫在报→getPersonList→aivfo-service 阿里云短信)+ muteAlarm 静音 + 恢复 stopAlarm 消警。
+  - 状态码:`AlarmDTO` 接口 **0正常/1异常/-1跳过**;HousePort/Photo handler 均 `if(SKIP==state)return`(SKIP=-1)。
+  - `reportCloudAlarm` 实测只 `monitorRequest.sendGroupMessage` 发 IM 群消息、**不入 alarm 表**——已全弃用(用户也明确"群消息不要,短信电话要")。
+- **H-05 闭环落库 ✅**:POST `/reportAlarm` 舱2 `photoState=1`(=ReportStartupFaults 对相机坏舱发的)→ `alarm` 表落 `id=6 house_sn=2 PHOTO_STATE_ALARM type=0(在报)`,`sms_map` 已填。证实被排除舱(配置舱1-10均在 house 表)能正常落库——原"排除舱不在house表"担心不成立。
+- **H-06 短信通知 ✅(已派发)**:`alarm_personnel` 原空→插测试联系人(name=测试-Claude验证, phone=18223210384, sms=1, state=1)→ 触发新告警(舱4 photoState=1,continueTime=0 命中 `determineNotifyWay`==0 发短信窗口)→ 约 1min 后 `alarm_send_info` 落 2 条(舱2/舱4,alarm_model=0 短信,`alarm_respond=发送成功!`=SendResultEnums.SUCCESS)。短信走阿里云(凭据硬编码在 `AliConstant`:signName=艾伟孚科技,appKey=LTAI5t...)。**系统侧已成功派发;是否真到手机由阿里云决定(模板审批/余额),用户自查 18223210384**。按用户要求未等阿里云回执。
+- **清理**:测试假告警(PHOTO×2)、`alarm_send_info` 测试记录、测试联系人**全部删除核零**。新 control pid10360 **保留运行**(健康、无回归;本特性分支构建,未并 main)。
+- **H-07 残留**:启动期**物理拔相机USB**制造半坏舱→看 SerialBin 实产 CcdSnMissing+排除——软件拔不了 USB,需物理动作;但剔除决策已单测(StartupFaultPolicy 6 绿)、登记点镜像现有 errorlist 错误位、基线+闭环已真机验,残留仅"硬件真故障→Faults 填充"这一物理环节。
+- **下一步**:第一阶段收尾(本回写)→ 可并 main。后续阶段:operate 监控页"舱故障"区(读 /status Faults)/ 运行期按需补去抖 / H-07 物理注入(人配合或软件模拟)。

+ 7 - 7
项目文档/进度/工作计划表.md

@@ -63,10 +63,10 @@
 - 真机踩坑均已解(僵尸不挡 control / 登录真因=测试目录缺 tl-shared.config 致 BaseUrl 坏 / auth 库本零用户已插 admin/123456 可逆)。
 - 第二阶段(MJPEG 出图)、第三阶段(operate 接入 + V-012 电机真机走位)待拆。
 
-### 新加固专项 · 舱室故障隔离 + 双端故障提示 = 🟢 第一阶段代码完成 · ☐ 待 Task7 真机验收
-- spec + 实现计划 + **方案修正**(复用现有 `reportAlarm` 报警闭环,弃用群消息 reportCloudAlarm)均已落盘;分支 `feature/house-fault-isolation`(8 commit)。
-- **结论**:运行期单舱坏已隔离 ✓ 且已接现有报警闭环;**启动期缺口已修** ✓——舱"半坏"只排除该舱、好舱继续培养、零可跑才中止
-- **目标**:① 启动期按舱容错 ② 双端明确提示(复用现有 alarm 表→front 报警列表 + operate"系统异常" + 短信/电话 + 可消警)。
-- **第一阶段代码 Task1-6 全完成**(37 单测绿、control sln 0 错):HouseFault/StartupFaultPolicy(纯TDD)→ SerialBin 6处登记结构化坏舱 → InitTL 零可跑才中止+坏舱存AppData → InitHouse 逐舱 try-catch → AppData 快照透出 Faults + ReportStartupFaults(走 `ReportAlarmController` 闭环,相机坏photoState=1/串口坏comState=1/其余-1跳过)
-- **剩 Task7 真机拔插验收**:基线(全好舱无回归)可自主;半坏舱注入需物理拔相机USB(只能人做)→待对齐。待确认:排除舱未写house表时 alarm 能否落库
-- **后续阶段**:运行期已接闭环(按需补去抖)/ operate 监控页"舱故障"区(读 /status Faults)/ front 复用现有报警列表 —— 真机门控
+### 新加固专项 · 舱室故障隔离 + 双端故障提示 = 🟢 第一阶段代码完成 · ☑ 真机核心验证过(残留 H-07 物理注入)
+- spec + 实现计划 + **方案修正**(复用现有 `reportAlarm` 报警闭环,弃用群消息 reportCloudAlarm)均已落盘;分支 `feature/house-fault-isolation`(代码+文档 commit)。
+- **结论**:运行期单舱坏已隔离 ✓ 且已接现有报警闭环;**启动期缺口已修** ✓(只排坏舱、好舱继续、零可跑才中止)
+- **代码 Task1-6 全完成**(37 单测绿):HouseFault/StartupFaultPolicy(纯TDD)→ SerialBin 6处登记 → InitTL 零可跑才中止 → InitHouse 逐舱兜底 → AppData 快照透出 Faults + ReportStartupFaults(走 `ReportAlarmController` 闭环)。
+- **真机核心验证过(2026-06-24,无活体培养)**:H-04 基线新 control(pid10360)无回归(`/status` Faults 空、好舱齐、started);H-05 reportAlarm 相机异常→`alarm` 表落 `PHOTO_STATE_ALARM`(闭环+排除舱能落库);H-06 插联系人→定时任务→阿里云短信,`alarm_send_info` 记"发送成功!"派发至 18223210384(到达由阿里云,用户自查)。测试数据已清理
+- **残留 H-07**:物理拔相机USB 制造半坏舱(软件做不到,需物理/模拟);剔除决策已单测、登记点镜像现有错误位、基线+闭环已真机验
+- **可并 main**。后续阶段:operate 监控页"舱故障"区(读 /status Faults)/ 运行期按需补去抖 / front 复用现有报警列表(H-05/06 已通)

+ 13 - 6
项目文档/进度/待验证清单.md

@@ -125,13 +125,20 @@
 > **真机踩坑(均已解,记录备查)**:① 僵尸 operate 20268 杀不掉(需真重启,但不占串口/Mutex,不挡 control)。② control 登录卡点真因=从原始构建目录跑、`..\tl-shared.config` 缺失致 BaseUrl 拼坏(**非凭据**);修=copy `tl-shared.config` 到 `bin/Release/`。③ auth 库本零用户,按用户要求插 `admin/123456`(`md5(盐+pwd+盐)`,`deleted='2017-01-01'` 哨兵,JDBC 直插,可逆),直连登录接口验 success+token。
 > **第二阶段(MJPEG 出图)/第三阶段(operate 接入 + V-012 电机真机走位)仍待做**——电机真机走位(红线两轴守安全区间)、operate 崩溃后 control 自动回收恢复采集,放第三阶段。
 
-## 加固专项 · 舱室故障隔离 + 双端故障提示 — 2026-06-23 设计完成待实现
+## 加固专项 · 舱室故障隔离 + 双端故障提示 — 2026-06-24 第一阶段代码完成 + 真机核心验证
 
-> spec `需求文档/specs/2026-06-23-舱室故障隔离与双端故障提示-design.md`。源码逐行核实结论 + 用户硬约束
+> spec + 实现计划 + 方案修正(复用现有 reportAlarm 报警闭环)。第一阶段代码 Task1-6 全完成(8 commit 在 `feature/house-fault-isolation`,37 单测绿)。真机已验基线+闭环,详见交接卡 2026-06-24
 
 | 编号 | 验证项 | 门控 | 状态 |
 |------|--------|------|------|
-| H-01 | **现状**:运行期单舱坏已隔离(每舱独立线程+循环try-catch,别舱无感) | 分析 | ☑ 源码核实(StartMain/BufferBottleBin/ComBin) |
-| H-02 | **缺口**:启动期舱"半坏"(串口活相机坏/编号冲突)进 errorlist→InitTL 整体中止,好舱也起不来 | 分析 | ☑ 源码核实(StartMain.cs:89 / SerialBin.cs:252/212/260) |
-| H-03 | 改:启动期按舱容错——单舱任何阶段坏只排除该舱,好舱继续 StartAsync | **真机** | ☐ 待实现(拔相机/串口验好舱不中断) |
-| H-04 | **硬约束**:舱任何异常(启动排除/运行突发)→ operate 监控页 + front 都明确提示哪个舱/什么故障/时间 | **真机** | ☐ 待实现(复用 alarm_data+MQTT 管道) |
+| H-01 | **现状**:运行期单舱坏已隔离(每舱独立线程+循环try-catch,别舱无感) | 分析 | ☑ 源码核实 |
+| H-02 | **缺口**:启动期舱"半坏"进 errorlist→InitTL 整体中止,好舱也起不来 | 分析 | ☑ 源码核实(StartMain.cs:89 等) |
+| H-03 | 坏舱剔除/致命判定纯逻辑 + 6 处结构化登记 + InitHouse 逐舱兜底 | 单测 | ☑ 37 单测全绿 |
+| H-04 | **基线(无回归)**:新代码真机起 control→`/status` 新增 `Faults` 字段为空、好舱 2/4/6/7/8/9 照常连接≈37℃、started=true | **真机** | ☑ 2026-06-24(pid10360) |
+| H-05 | **告警闭环落库**:`reportAlarm`(相机异常 photoState=1,即 ReportStartupFaults 发的)→报警链→`alarm` 表落 `PHOTO_STATE_ALARM`(舱2/舱4)。证实复用现有闭环、被排除舱(配置舱1-10)能落库 | **真机** | ☑ 2026-06-24 |
+| H-06 | **通知触发(短信)**:插联系人→1min 定时任务对在报告警→`getPersonList`→调阿里云短信→`alarm_send_info` 记 `发送成功!`(短信 alarm_model=0,号 18223210384)。短信电话通知链路打通(走 reportAlarm 闭环内置) | **真机** | ☑ 已派发(到达由阿里云,用户自查手机) |
+| H-07 | 启动期**物理半坏舱**(拔相机USB)→SerialBin 实产 CcdSnMissing→该舱排除、好舱继续 | **真机** | ☐ 残留(需物理拔相机,软件做不到;剔除决策已单测+登记点镜像现有错误位) |
+| H-08 | 双端展示:operate 监控页"舱故障"区(读 /status Faults)/ front 报警列表(读 alarm 表) | **真机** | ☐ 后续阶段(operate 区新增;front 复用现有报警列表已通 H-05/06) |
+
+> **真机环境(2026-06-24)**:旧 control 15840 经 `/shutdown`(tl13579)干净停;新建 Release 起 pid10360(从 `ivf_tl_ControlHost/bin/Release/net6.0-windows/`,`..\tl-shared.config` 在 bin/Release);无活体培养(空闲监测),重启安全。测试数据(假 PHOTO 告警×2 / 发送记录 / 测试联系人)**已全部清理**。新 control 保留运行(健康、无回归;本特性分支构建未并 main)。
+> **告警通道核实结论**:`reportAlarm`→报警责任链→`alarm` 表→front 报警列表 + operate"系统异常(N)" + **短信/电话通知**(报警链内置 getNotifier)+ 静音/消警 = 完整闭环;状态码 0正常/1异常/-1跳过。**弃用** `reportCloudAlarm`(只发 IM 群消息、不入闭环)及新建告警类型——无 Java 字典登记依赖。

+ 4 - 4
项目文档/进度/进度数据.js

@@ -1,10 +1,10 @@
 // 实时面板数据源(监控面板.html 读 window.PROGRESS_DATA)。每推进一步更新本文件。
 window.PROGRESS_DATA = {
   project: "operate/control 双进程拆分",
-  generatedAt: "2026-06-24 00:30",
-  phase: "三阶段主体完成;M区全闭合;D2-02 第一阶段 control 后端【代码+真机全过】;新加固专项 舱室故障隔离 第一阶段【代码全完成 Task1-6,37单测绿】待真机验收",
-  currentTask: "舱室故障隔离专项 第一阶段代码全完成(8 commit 在 feature/house-fault-isolation):HouseFault/StartupFaultPolicy(纯TDD)→ SerialBin 6处登记结构化坏舱 → InitTL 零可跑才中止+坏舱存AppData → InitHouse 逐舱try-catch → AppData 快照透出Faults+ReportStartupFaults。37单测绿、control sln 0错。【关键方案修正】核实系统已有完整舱室报警闭环=ReportAlarmController→/reportAlarm→报警责任链→alarm表→front/operate列表+短信电话+消警;故弃用reportCloudAlarm(只发IM群消息不入闭环)及新建告警类型,启动排除舱改走ReportAlarmController(相机坏photoState=1/串口坏comState=1/其余-1跳过)。下一步Task7真机拔插:基线可自主;物理拔相机需对齐。",
-  note: "状态码语义0正常/1异常/-1跳过(HousePort/Photo handler对-1跳过已实读确认)。短信电话报警=reportAlarm闭环内置,保留并复用;群消息(reportCloudAlarm)不用。代码改面:SerialBin(+Faults6处)/StartupFaultPolicy(新)/HouseFault(新,路径control/ivf_tl_Entity/)/StartMain(InitTL剔除+InitHouse逐舱兜底+StartRun报完整清单)/AppData(StartupFaults+快照+ReportStartupFaults)/MonitorSnapshot(+Faults)。Task7待确认:排除舱未写house表时alarm能否落库。分支从 feature/d2-02-debug-command-proxy 切(测试工程在该分支,main落后16commit)。",
+  generatedAt: "2026-06-24 01:10",
+  phase: "三阶段主体完成;M区全闭合;D2-02 第一阶段【代码+真机全过】;舱室故障隔离 第一阶段【代码完成+真机核心验证过】(37单测绿+基线无回归+告警闭环落库+短信通知派发)",
+  currentTask: "舱室故障隔离专项 第一阶段=代码完成+真机核心验证过(8 commit, feature/house-fault-isolation)。真机(无活体培养):H-04基线新control(pid10360)无回归(/status新增Faults字段空、好舱2/4/6/7/8/9≈37℃、started);H-05 reportAlarm相机异常→alarm表落PHOTO_STATE_ALARM(证实复用现有闭环+排除舱能落库);H-06插联系人→1min定时任务→阿里云短信,alarm_send_info记'发送成功!'派发至18223210384(到达由阿里云,用户自查)。测试数据已清理。残留H-07物理拔相机(软件做不到)。下一步:可并main。",
+  note: "告警闭环=ReportAlarmController→/reportAlarm→报警责任链→alarm表→front报警列表+operate系统异常(N)+短信电话(每1min定时任务getPersonList→aivfo-service阿里云短信)+静音/消警。状态码0正常/1异常/-1跳过。阿里云凭据硬编码AliConstant(signName=艾伟孚科技)。reportCloudAlarm只发IM群消息不入闭环=弃用;短信电话保留并复用。改面:SerialBin/StartupFaultPolicy/HouseFault/StartMain/AppData/MonitorSnapshot。新control保留运行。",
   milestones: [
     { name: "阶段1 · control 独立进程骨架(完成)", tasks: [
       { id: "Task1-7", name: "全过+D1-08死锁修复+operate真外壳E2E+数据入库DB铁证", status: "☑" }

+ 11 - 11
项目文档/进度/进度状态.yaml

@@ -1,16 +1,16 @@
 # 续接断点状态(机器可解析)。换会话/换电脑后首先读它定位。
 # 状态取值: 未开始 / 进行中 / 完成 / 代码完成待验证
 # 纪律:本字段只存【当前断点】,历史细节进 交接卡.md(见 CLAUDE.md 第三节)。
-更新时间: 2026-06-23 舱室故障隔离专项 第一阶段【代码全完成】Task1-6(6 commit + 2 docs commit 在 feature/house-fault-isolation),37 单测全绿、control sln 0 错;方案已修正为复用现有 reportAlarm 报警闭环(非群消息)。剩 Task7 真机拔插验收
+更新时间: 2026-06-24 舱室故障隔离专项 第一阶段【代码完成+真机核心验证过】:Task1-6(8 commit, feature/house-fault-isolation),37单测绿;真机基线无回归(新control pid10360 /status Faults空+好舱齐)+ 告警闭环落库(reportAlarm→alarm表)+ 短信通知链路打通(已派发至18223210384,到达由阿里云)。残留 H-07 物理拔相机注入(软件做不到)
 当前任务: >
-  【舱室故障隔离专项 第一阶段 = 代码全完成,待 Task7 真机拔插验收】(分支 feature/house-fault-isolation,从 feature/d2-02-debug-command-proxy 切)
-  · 代码 Task1-6 全落地:HouseFault/StartupFaultPolicy(纯TDD)→ SerialBin 6处登记结构化坏舱 → InitTL 零可跑才中止+坏舱存AppData → InitHouse 逐舱 try-catch → AppData 快照透出 Faults + ReportStartupFaults(走 reportAlarm 闭环)。37 单测绿、0 错。
-  · **重要方案修正(本轮)**:核实发现系统已有完整舱室报警闭环 = `ReportAlarmController`→`/reportAlarm`→报警责任链→`alarm`表→front/operate报警列表+短信电话+静音/消警;运行期串口/相机异常本就接此闭环。故**弃用** reportCloudAlarm(只发IM群消息、不入闭环)及新建 alarmTypeKey;启动排除舱改走 ReportAlarmController(相机坏photoState=1/串口坏comState=1/其余-1跳过)。状态码 0正常/1异常/-1跳过(已验 HousePort/Photo handler 对-1跳过)。
-  · 下一步:Task7 真机拔插验收——①基线(全好舱:/status Faults空+started+无回归,可自主)②制造半坏舱→排除/其余正常/alarm落库(**需物理拔相机USB=只能人做**)。**待与用户对齐物理注入怎么弄**。
+  【舱室故障隔离专项 第一阶段 = 代码完成 + 真机核心验证过,可收尾并 main】(分支 feature/house-fault-isolation)
+  · 代码 Task1-6 全落地、37 单测绿;方案已修正为复用现有 reportAlarm 报警闭环(非群消息,短信电话保留并复用)。
+  · 真机(2026-06-24,无活体培养):H-04 基线新 control 无回归(Faults 字段空、好舱2/4/6/7/8/9≈37℃、started);H-05 reportAlarm 相机异常→alarm 表落 PHOTO_STATE_ALARM(证实闭环+排除舱能落库);H-06 插联系人→定时任务→阿里云短信 alarm_send_info 记"发送成功!"派发至 18223210384(到达由阿里云,用户自查)。测试数据已清理,新 control pid10360 保留运行。
+  · 残留 H-07:物理拔相机USB制造半坏舱(软件拔不了,需物理/模拟);剔除决策已单测、登记点镜像现有错误位、基线+闭环已验。
+  · 下一步:第一阶段可并 main(finishing-a-development-branch)。后续阶段:operate 监控页"舱故障"区/运行期按需补/H-07 物理注入。
 说明: >
-  代码改面:control/ivf_tl_Com/SerialBin.cs(+Faults登记6处)、ivf_tl_Control/StartupFaultPolicy.cs(新)、IvfTl.Control.Entity/InitEntitys/HouseFault.cs(新,路径修正=control/ivf_tl_Entity/)、StartMain.cs(InitTL剔除坏舱+InitHouse逐舱兜底+StartRun报完整清单)、AppData.cs(StartupFaults+快照透出+ReportStartupFaults)、MonitorSnapshot.cs(+Faults/HouseFaultRow)。8 commit。
-  决策规则:坏舱=故障清单HouseSn>0;可跑舱=发现−坏舱;致命=零可跑才中止(单舱/部分舱坏绝不中止)。短信电话报警保留并复用(报警链内置)。
-  Task7 真机待确认点:①被排除舱可能未写入house表→报警链按houseSn查house/tlSetting可能查不到→alarm能否落库需真机验,查不到补一步;②物理拔相机USB我做不了(软件无法拔USB),需人配合或软件模拟,待对齐。
+  告警闭环(核实):ReportAlarmController→/reportAlarm→报警责任链→aivfo_tl_setting.alarm 表→front报警列表+operate"系统异常(N)"+短信电话(AlarmSchedule每1min扫在报→getPersonList→aivfo-service阿里云短信)+muteAlarm静音+恢复stopAlarm消警。状态码0正常/1异常/-1跳过。阿里云凭据硬编码 AliConstant(signName=艾伟孚科技)。reportCloudAlarm 只发IM群消息不入闭环=已弃用。
+  代码改面:SerialBin(+Faults6处)/StartupFaultPolicy(新)/HouseFault(新,control/ivf_tl_Entity/)/StartMain(InitTL剔除+InitHouse逐舱兜底+StartRun报完整清单)/AppData(StartupFaults+快照+ReportStartupFaults走ReportAlarmController)/MonitorSnapshot(+Faults)。分支从 feature/d2-02-debug-command-proxy 切(测试工程在该分支,main落后)。
   环境:僵尸 operate 20268 仍需真重启清(不占串口不挡 control);admin/123456 已留库可逆;后端 108+网关10010 在线。
 阶段概览:
   - id: 阶段1
@@ -31,6 +31,6 @@
     备注: "Task0-9 全落地,27单测绿(含C-1非零起点红线回归)。真机完整冒烟过(借真实舱/读温/越界实拒/超时回收)。第二(MJPEG)/三(operate接入V-012)阶段待拆。"
   - id: 加固-舱室故障隔离
     名称: 舱室故障隔离 + 双端故障提示(新专项)
-    状态: 第一阶段代码完成·待Task7真机验收
-    备注: "spec+计划已落盘+方案修正(复用现有reportAlarm报警闭环,非群消息)。第一阶段代码 Task1-6 全完成(8 commit 在 feature/house-fault-isolation):坏舱剔除+逐舱兜底+快照透出+经闭环上报,37单测绿、0错。剩 Task7 真机拔插(基线可自主;物理拔相机需对齐)。后续阶段:运行期已接闭环按需补/operate监控页/front复用现有列表。"
-下一步: Task7 真机拔插验收——基线(全好舱无回归)可自主跑;制造半坏舱需物理拔相机USB(只能人做),待与用户对齐怎么注入。本专项分支 + D2-02 分支均待并 main。
+    状态: 第一阶段代码完成·真机核心验证过(残留H-07物理注入)
+    备注: "spec+计划+方案修正(复用reportAlarm闭环)。代码 Task1-6 全完成(8 commit, feature/house-fault-isolation),37单测绿。真机:H-04基线无回归(新control pid10360 Faults空+好舱齐)/H-05 reportAlarm→alarm表落库/H-06 短信通知派发至18223210384(到达由阿里云)。残留H-07物理拔相机(软件做不到)。可并main。"
+下一步: 第一阶段可并 main(finishing-a-development-branch);残留 H-07 物理拔相机注入待人配合或软件模拟。后续阶段:operate 监控页"舱故障"区/运行期按需补去抖/front 复用现有报警列表。D2-02 分支亦待并 main。