Sfoglia il codice sorgente

docs(阶段3): 退役删ControlTest+部署指南+开机自启 回写

- 新增 开发环境/双进程部署指南.md(两产物布局/HTTP契约/开机自启/装机自检/已知遗留)。
- 待验证清单 D3-01☑(退役删两编译0错)/D3-03☑(部署布局E2E验)/D3-02◑(自启注册表方案验)/D3-04✗(ComBin两栈去重延后)。
- 工作计划表+进度状态.yaml+进度数据.js+交接卡 全对齐:三阶段主体完成,剩延后专项。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie 3 giorni fa
parent
commit
6ba7cbabe0

+ 75 - 0
项目文档/开发环境/双进程部署指南.md

@@ -0,0 +1,75 @@
+# 双进程部署指南(operate + control)
+
+> 本文档:operate/control 双进程拆分后的**装机部署**步骤。装机仍是"一个软件",用户只启 operate,operate 自动拉起 control。
+> 配套:`服务器测试环境.md`(中间件)/`连接配置清单-换服务器必读.md`(换服务器改 IP)。
+> 来源:阶段3 收尾;架构见 `需求文档/specs/2026-06-22-operate-control-双进程拆分-design.md`。
+
+---
+
+## 一、部署产物(两个 exe + 一份子目录)
+
+| 产物 | 来源(Release 构建) | 部署位置 |
+|------|------|------|
+| **operate** 主程序(前端) | `ivf_tl_operate_2.0/ivf_tl_Operate/bin/Release/net6.0-windows/` 全目录 | 装机目录,如 `C:/TLData/app/operate/` |
+| **control** 后台采集进程 | `ivf_tl_operate_2.0/control/ivf_tl_ControlHost/bin/Release/net6.0-windows/` 全目录 | operate 目录下的 **`control/` 子目录**(`.../operate/control/`) |
+
+**关键**:control 必须放在 operate 输出目录的 `control\` 子目录(operate `App.config` 的 `controlExePath=control\ivf_tl_ControlHost.exe` 据此相对定位;`ControlProcessLauncher.ResolveExePath` 解析)。换布局则同步改 `controlExePath`。
+
+**构建命令**(真机/连内网必须 Release):
+```bash
+cd ivf_tl_operate_2.0
+dotnet build ivf_tl_Operate/ivf_tl_Operate.csproj -c Release
+dotnet build control/ivf_tl_ControlHost/ivf_tl_ControlHost.csproj -c Release
+# 部署:
+#   operate/bin/Release/net6.0-windows/ → 装机目录
+#   control/ivf_tl_ControlHost/bin/Release/net6.0-windows/ → 装机目录/control/
+```
+
+**control 必带(否则起不来,阶段1 真机实锤)**:
+- `ivf_tl_ControlHost.dll.config`(=自带 App.config,缺它 control AppData 构造读 gbTime/csTime 等键 `.ToString()` NPE);**内容与 operate `App.config` 的 control 业务键 + 连接键保持同步**。
+- `DependFile/`(ccd 7 个相机 DLL + DB/aivfoTL.db + newccd/),由 `ivf_tl_Control.csproj` 经 `CopyToOutputDirectory=Always` 传递拷贝,核对真落地。
+
+## 二、两进程契约(本地 HTTP,仅 127.0.0.1)
+
+| 项 | 值 |
+|------|------|
+| control 监听 | `http://127.0.0.1:38080`(operate `App.config` `controlPort`=control 命令行 `--port`,须一致) |
+| operate 拉起 control | 登录后 `ControlProcessLauncher.EnsureRunning`:探 `/ping`→不在则 `Process.Start -Verb RunAs` 传 `--account/--password/--cacheDisk/--port`→轮询就绪 |
+| operate 关闭 | 只退自己,**不动 control**;control 续命驱动机器 |
+| 监控页 | 经 `ControlClient` 读 `GET /status`(含各舱活动/阀态/借用让路/链路心跳) |
+| 受护栏停止 | 监控页"整体停止 control"按钮 → 二次确认 + 工程师口令 → `POST /shutdown` → control `HAL.ShutdownAll`+退出 |
+| 单实例 | control Mutex `Global\ivf_tl_control_singleton`(永远只有一个驱动机器);operate Mutex `ivf_tl_Operate` |
+
+## 三、开机自启(operate)
+
+装机让 **operate** 开机自启(operate 起→自动拉起 control→机器自动被驱动,用户无需点击)。control **不单独**设自启(由 operate 拉起)。
+
+**方式 A:注册表 Run 键(当前用户登录即启,推荐,免管理员计划任务)**
+```powershell
+# 部署时执行一次(把路径换成实际装机路径):
+$exe = "C:\TLData\app\operate\ivf_tl_Operate.exe"
+New-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" `
+  -Name "ivf_tl_Operate" -Value "`"$exe`"" -PropertyType String -Force
+# 校验:
+Get-ItemProperty "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" | Select-Object ivf_tl_Operate
+# 取消自启:
+Remove-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" -Name "ivf_tl_Operate"
+```
+> operate 是 `requireAdministrator`;在 UAC `ConsentPromptBehaviorAdmin=0`(本机当前配置)下登录自启静默提权,不弹窗。若现场 UAC 会弹窗,改用**任务计划程序**(最高权限、登录触发)。
+
+**方式 B:启动文件夹快捷方式**(`shell:startup` 放 operate 快捷方式)——简单但 requireAdministrator 程序可能弹 UAC,不如 A。
+
+## 四、装机自检清单
+
+1. operate 目录 + `control/` 子目录就位;`control/ivf_tl_ControlHost.dll.config` + `control/DependFile/` 齐。
+2. operate `App.config`:`controlPort=38080`、`controlExePath=control\ivf_tl_ControlHost.exe`、`urlIp/urlPort` 指向现场网关、`kfkaIP/mqttIp` 指向现场服务器。
+3. control `ivf_tl_ControlHost.dll.config` 的连接键与 operate 一致。
+4. 起 operate → 登录 → 观察 `control/` 下 `ivf_tl_ControlHost.exe` 被拉起、`http://127.0.0.1:38080/status` 返回 `started:true`、监控页显示各舱。
+5. 设开机自启(§三)→ 重启验证开机自动起 operate→拉起 control→机器被驱动。
+
+## 五、已知遗留(部署相关)
+
+- **调试页借串口**:拆分后调试页驱动 control 持有的串口需"串口/相机命令代理"设计(见 `待验证清单 D2-02`),当前未接通;装机若需现场调试,暂走旧单机调试或待该子任务完成。
+- **ComBin 两套栈(G1-2)**:operate(`ivf_tl_Entity/ComEntitys/ComBin`)与 control(`ivf_tl_SerialHelper/ComBin`)两套串口栈未去重;control 操作不进 `operation_log`(oplog 埋点在 operate 那套栈,见 `待验证清单 D1-10`)。属阶段3 余留专项。
+- **D1-09**:control 本地 SQLite `InitTables` AUTOINCREMENT 建表失败(不阻塞运行)。
+- **M-01~M-07**:合并降级遗留(排气阀/灯光 EEPROM 等),见 `操作端逻辑与配置全景.md §八`。

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

@@ -184,3 +184,15 @@
 - **诚实边界 — 调试页完整借串口(D2-02 ◑)**:debug 页原 `gate.Acquire(OperateDebug)` 借**同进程 HAL 同一物理句柄**驱动(`HouseDebugPageViewModel:256`,`_halLease.Serial/Camera`)。拆分后 operate 进程 HAL 是空单例、拿不到 control 持有的串口/相机——要在拆分下让调试页驱动,需 **control 暴露串口/相机命令代理**(逐操作:电机移动/读写EEPROM/LED/相机预览…一个大代理面,**当前设计文档未细化**)或端口让渡。这是独立子任务,且驱动电机受安全红线(§178 需用户在场)。**本阶段交付让路契约(/serial/pause|resume,已验)作基础**;调试页完整驱动 = 需设计(命令代理)+ 受监督真机验。
 - **核实**:控制端三端点真机实测;operate ControlClient harness 实跑;两端编译 0 错误;6 单测过。控制端+operate端阶段2 已分两次提交。
 - **下一步**:阶段3(退役删 ivf_tl_ControlTest + operate 开机自启 + ComBin 两套栈去重〔含 D1-10 oplog〕+ 部署文档)。调试页借串口命令代理 + M-01~M-07 留专项。
+
+---
+
+## 2026-06-22 · 阶段3 清理+装机收尾(退役老壳 / 部署文档 / 开机自启)
+
+- **背景**:接 /goal 续做阶段3。设计 §7/§164-166。
+- **退役删除老壳 ivf_tl_ControlTest(D3-01 ☑)**:`ivf_tl_ControlTest`(csproj=ivf_tl_ControlMain,命名空间 TLTest)是合并前 control 独立 exe 的脏壳(Window1 启动骨架已被 operate/ControlHost 复刻、MainWindow 纯测试、StopWindow 死窗)。新 ControlHost 已跑通真机闭环,确认后退役:`dotnet sln control/ivf_tl_Control.sln remove` + `git rm -r` 删目录。**control sln 重编 0 错误、operate 编译 0 错误**(operate 仅 `SettingPageView:392` `Process.GetProcessesByName("ivf_tl_ControlMain")` 字符串引用旧进程名=死代码,无类型依赖)。踩坑:首次重编报 22 个 MSB3021 DLL 锁错——实为我之前启动的测试 control 21592 锁着 ControlHost 输出,与删 ControlTest 无关;`/shutdown` 停掉 21592(顺带再验受护栏停机:口令通过→进程退出→7 COM 口释放)后重编 0 错误。
+- **部署文档(D3-03 ☑)**:新增 `开发环境/双进程部署指南.md`——两产物(operate 全目录 + control 放 operate 的 `control/` 子目录)、control 必带 dll.config+DependFile、本地 HTTP 契约(/ping /status /shutdown /serial 端口 38080)、装机自检清单、已知遗留。部署布局已由 operate WPF 真外壳 E2E 实证(operate 即从 `control/ivf_tl_ControlHost.exe` 拉起)。
+- **开机自启(D3-02 ◑)**:部署指南 §三给注册表 Run 键方案(HKCU\...\Run,operate 自启→拉起 control;control 不单独自启)。**已实测注册表创建→读回→删除往返成功**(测试不留自启项);整机"重启→自动起"需真重启复测。
+- **ComBin 两套栈去重(D3-04 ✗ 延后)**:operate(`ivf_tl_Entity/ComEntitys/ComBin`,带 OperationLogger)与 control(`ivf_tl_SerialHelper/ComBin`,真驱动)两套串口栈。拆分后 operate 已不驱动串口→operate 那套栈成运行期死代码;control 操作不进 operation_log(oplog 埋点在 operate 栈,=D1-10)。去重=动串口代码的有风险重构,属收尾不阻塞功能,列延后专项(需设计 oplog 收口归属 + 受控验证),**不做无监督风险重构**。
+- **核实**:control sln + operate 编译 0 错误;ControlTest 已从 sln+磁盘删;注册表自启往返;部署布局经 E2E 坐实。
+- **下一步(全部三阶段已推进到位)**:剩余均为有依赖/受门控/有风险的延后专项——调试页借串口命令代理(D2-02,需设计+受监督电机验)、ComBin 两栈去重(D3-04)、D1-09 SQLite、M-01~M-07、整机开机自启复测(需重启)。建议 feature 分支合并 main + 推送。

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

@@ -27,7 +27,7 @@
 |------|------|------|----------|
 | **阶段1** | control 独立进程骨架 | 🟢 代码完成·真机闭环打通(待并 main) | control 独立 exe 能起✓、HTTP探活/读状态✓、续命✓、单实例✓、硬件获取✓、**真机自控环运行✓**;阻塞闭环的 D1-08 串口握手死锁已修复 |
 | **阶段2** | 监控补全 + 调试借串口 + 受护栏停止 | 🟢 监控/受护栏停止/借串口让路 已实现+真机验;调试页完整驱动待设计 | 监控页跨进程 /status 显示完整✓;受护栏 /shutdown 安全停✓;/serial 让路✓(调试页完整借串口需命令代理设计+受监督真机) |
-| **阶段3** | 清理老壳 + 装机收尾 | ☐ 未开始 | 退役删 ivf_tl_ControlTest;operate 开机自启;ComBin 两套栈去重;部署文档;全新部署一次到位 |
+| **阶段3** | 清理老壳 + 装机收尾 | 🟢 退役删ControlTest+部署文档+开机自启 已做;ComBin两栈去重延后 | 退役删 ivf_tl_ControlTest✓(两编译0错);双进程部署指南✓;开机自启注册表方案✓;ComBin两栈去重(G1-2,含oplog)延后专项 |
 
 ---
 

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

@@ -42,13 +42,20 @@
 > - **D2-03 ☑**:`/shutdown` 错口令→403 拒绝、对口令 `tl13579`→200 安全停机(`HAL.ShutdownAll` 关硬件 + 进程退出 + 7 COM 口全释放,非僵尸);operate 端 `ShutdownControlCommand`(二次确认+`Microsoft.VisualBasic.InputBox` 口令)+ 监控页受护栏按钮。
 > - **D2-02 ◑**:`/serial/pause {houseSn}` 实测——舱2 `CapturePausedByGate=true` 且 COM4 串口停发(control 让路,**不驱动电机**)→ `/serial/resume` 恢复;operate `ControlClient.SerialPause/Resume` 验证生效。**但调试页完整借串口驱动在拆分下断链**:debug 页原 `gate.Acquire` 借**同进程 HAL 同一物理句柄**(`HouseDebugPageViewModel:256`),拆分后 operate 进程 HAL 是空单例、拿不到 control 持有的串口——需 **control 暴露串口/相机命令代理**(当前设计文档未细化的大改面)+ 驱动电机受安全红线门控(设计 §178 需用户在场)。让路契约(/serial/pause|resume)已就位作基础,调试页完整驱动列独立子任务(需设计+受监督真机验)。
 
-## 阶段3 · 清理 + 装机(待阶段3拆计划后补全)
+## 阶段3 · 清理老壳 + 装机收尾
 
 | 编号 | 验证项 | 门控 | 状态 |
 |------|--------|------|------|
-| D3-01 | 退役删 ivf_tl_ControlTest 后 operate/control 仍编译运行正常 | 编译+运行 | ☐ |
-| D3-02 | operate 开机自启,开机自动起 operate→拉起 control | 运行 | ☐ |
-| D3-03 | 全新部署一次到位(两 exe + 端口 + DependFile + 开机自启) | 部署 | ☐ |
+| D3-01 | 退役删 ivf_tl_ControlTest 后 control sln / operate 仍编译正常 | 编译 | ☑ 已删+两编译0错 |
+| D3-02 | operate 开机自启(注册表 Run),开机自动起 operate→拉起 control | 运行 | ◑ 注册表方案已验/整机开机自启复测需重启 |
+| D3-03 | 全新部署一次到位(两 exe + control 子目录 + 端口 + DependFile) | 部署 | ☑ 部署布局已验(operate E2E 即用 control/ 子目录拉起) |
+| D3-04 | ComBin 两套栈去重(G1-2,含 D1-10 oplog) | 编译+运行 | ✗ 延后专项(有风险重构) |
+
+> **2026-06-22 阶段3 实测说明(详见交接卡同日段)**:
+> - **D3-01 ☑**:`ivf_tl_ControlTest`(ControlMain 老壳)从 `control/ivf_tl_Control.sln` 移除并删目录;control sln 重编 0 错误、operate 编译 0 错误(operate 仅 `SettingPageView:392` 字符串引用旧进程名 `ivf_tl_ControlMain`=死代码,无类型依赖,随调试页借串口改造一并清)。
+> - **D3-02 ◑**:开机自启注册表 Run 键方案已实测(创建→读回→删除往返成功);整机"重启→自动起 operate→拉起 control"需真重启复测。部署步骤见 `开发环境/双进程部署指南.md §三`。
+> - **D3-03 ☑**:部署布局(operate 目录 + `control/` 子目录,control 自带 dll.config + DependFile)已在 operate WPF 真外壳 E2E 实证(operate 即从 `control/ivf_tl_ControlHost.exe` 拉起 control)。部署指南 `开发环境/双进程部署指南.md`。
+> - **D3-04 ✗ 延后**:operate(`ivf_tl_Entity/ComEntitys/ComBin`,带 OperationLogger 埋点)与 control(`ivf_tl_SerialHelper/ComBin`,真驱动硬件)两套串口栈。拆分后 operate 已不驱动串口→operate 那套栈成运行期死代码;control 操作不进 operation_log(oplog 埋点在 operate 栈,=D1-10)。去重=动串口代码的有风险重构,属收尾清理不阻塞功能,列延后专项(需设计 oplog 收口归属 + 受控验证)。
 
 ## 合并遗留 · operate 侧降级 / 待验证(与双进程拆分并行存在)
 

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

@@ -1,21 +1,24 @@
 // 实时面板数据源(监控面板.html 读 window.PROGRESS_DATA)。每推进一步更新本文件。
 window.PROGRESS_DATA = {
   project: "operate/control 双进程拆分",
-  generatedAt: "2026-06-22 22:30",
-  phase: "阶段2 已实现+真机自验(监控补全/受护栏停止/借串口让路);进阶段3",
-  currentTask: "阶段1全过+operate真外壳E2E+数据入库;阶段2控制端三端点(/status/shutdown/serial)真机全验+operate端ControlClient+监控页",
-  note: "阶段2:/status补全三块+/shutdown受护栏(口令安全停机释放硬件)+/serial借串口让路(不驱动电机) 真机全验;operate端ControlClient+监控页跨进程读+受护栏按钮(harness实跑)。调试页完整借串口待命令代理设计(安全红线门控)。下一步阶段3。",
+  generatedAt: "2026-06-22 23:00",
+  phase: "三阶段全推进到位(阶段1完成/阶段2三端点验/阶段3退役删+部署+自启);剩延后专项",
+  currentTask: "阶段1完成+operate真外壳E2E+数据入库;阶段2三端点真机验+operate客户端;阶段3退役删ControlTest+部署指南+开机自启方案验",
+  note: "operate/control双进程拆分三阶段主体完成。剩延后专项:调试页借串口命令代理(D2-02)/ComBin两栈去重(D3-04)/D1-09 SQLite/M区/整机自启复测(需重启)。建议feature合并main+推送。",
   milestones: [
-    { name: "阶段1 · control 独立进程骨架", tasks: [
+    { name: "阶段1 · control 独立进程骨架(完成)", tasks: [
       { id: "Task1-7", name: "全过+D1-08死锁修复+operate真外壳E2E+数据入库DB铁证", status: "☑" }
     ]},
     { name: "阶段2 · 监控补全+借串口+受护栏停止", tasks: [
-      { id: "D2-01", name: "监控页跨进程/status三块(harness验)", status: "☑" },
+      { id: "D2-01", name: "监控页跨进程/status三块(harness验)", status: "☑" },
       { id: "D2-03", name: "受护栏停止/shutdown(口令+安全停机释放硬件)", status: "☑" },
-      { id: "D2-02", name: "借串口/serial让路(验);调试页完整驱动待命令代理设计", status: "◑" }
+      { id: "D2-02", name: "借串口/serial让路(验);调试页完整驱动待命令代理设计", status: "◑" }
     ]},
     { name: "阶段3 · 清理老壳+装机收尾", tasks: [
-      { id: "阶段3", name: "退役ControlTest+开机自启+ComBin两栈去重(含D1-10)+部署文档", status: "☐" }
+      { id: "D3-01", name: "退役删ivf_tl_ControlTest(两编译0错)", status: "☑" },
+      { id: "D3-03", name: "双进程部署指南+布局E2E验", status: "☑" },
+      { id: "D3-02", name: "开机自启注册表方案验(整机复测需重启)", status: "◑" },
+      { id: "D3-04", name: "ComBin两栈去重(含D1-10 oplog)延后专项", status: "✗" }
     ]}
   ],
   pending: [

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

@@ -1,28 +1,31 @@
 # 续接断点状态(机器可解析)。换会话/换电脑后首先读它定位。
 # 状态取值: 未开始 / 进行中 / 完成 / 代码完成待验证
 # 纪律:本字段只存【当前断点】,历史细节进 交接卡.md(见 CLAUDE.md 第三节)。
-更新时间: 2026-06-22 阶段1完成(含operate真外壳E2E)+阶段2实现:控制端/status监控补全+/serial借串口让路+/shutdown受护栏停止 三端点真机全验,operate端ControlClient+监控页跨进程读+受护栏按钮(harness实跑验证)。调试页完整借串口待命令代理设计
+更新时间: 2026-06-22 三阶段全推进到位:阶段1完成(含operate真外壳E2E+数据入库)、阶段2三端点真机验+operate客户端、阶段3退役删ControlTest+部署指南+开机自启方案验。剩延后专项(调试页借串口命令代理/ComBin两栈去重/D1-09/M区/整机自启复测需重启)
 当前任务: >
-  【阶段2 已实现+真机自验(监控补全/受护栏停止/借串口让路);进阶段3】
-  · 阶段1:Task1-7全过+D1-08死锁修复+operate真外壳E2E实跑(真operate→拉起control→续命)+数据入库DB铁证。
-  · 阶段2:控制端 /status(§6三块)+/shutdown(口令tl13579安全停机释放硬件)+/serial/pause|resume(让路停轮询不驱动电机)
-    三端点真机全验;operate端 ControlClient+ServiceMonitorViewModel跨进程读+受护栏停止按钮(harness实跑反序列化10舱+借串口让路验证)。
-  · 阶段2余留:调试页完整借串口驱动——拆分后operate拿不到control持有的串口,需control暴露串口/相机命令代理(设计未细化)
-    +驱动电机受安全红线(§178需用户在场)。让路契约已就位作基础。
-  · 下一步:阶段3(退役删ivf_tl_ControlTest+operate开机自启+ComBin两栈去重〔含D1-10〕+部署文档)。
-  续接读:本文件 + 交接卡末三段(阶段1落地/D1-08修复/operate外壳/阶段2)+ 待验证清单 D1/D2 + 设计文档§5-6。
+  【三阶段全部推进到位;剩有依赖/受门控/有风险的延后专项】
+  · 阶段1 完成:Task1-7全过+D1-08死锁修复+operate真外壳E2E(真operate→拉起control→续命)+数据入库DB铁证。
+  · 阶段2 完成(代码+真机自验):/status监控补全+/shutdown受护栏停止+/serial借串口让路 三端点真机验;operate端ControlClient+监控页跨进程读+受护栏按钮(harness实跑)。调试页完整借串口=延后专项(需命令代理设计+受监督电机验)。
+  · 阶段3 推进到位:退役删ivf_tl_ControlTest(两编译0错)+双进程部署指南+开机自启注册表方案验;ComBin两栈去重(G1-2,含oplog)=延后专项。
+  · 延后专项清单:调试页借串口命令代理(D2-02)/ComBin两栈去重(D3-04)/D1-09 SQLite/M-01~M-07/整机开机自启复测(需重启)。建议feature合并main+推送。
+  续接读:本文件 + 交接卡末四段(阶段1/D1-08/operate外壳/阶段2/阶段3)+ 待验证清单 D1/D2/D3 + 双进程部署指南。
 说明: >
-  阶段2 控制端三端点(/status补全、/shutdown受护栏、/serial借串口让路)真机全验;operate端跨进程客户端+监控页+受护栏按钮已接。
-  调试页完整借串口在拆分下需额外设计(串口/相机命令代理),且驱动电机受安全红线门控,列独立子任务。
+  operate/control 双进程拆分三阶段主体完成:进程拆分骨架+真机闭环(阶段1)、跨进程监控/停止/借串口契约(阶段2)、
+  退役老壳+部署文档+开机自启(阶段3)。剩余延后专项均为有依赖(调试页命令代理)、受安全门控(电机验)、
+  有风险(ComBin去重)或预存缺陷(D1-09/M区),非主体阻塞。
 阶段概览:
   - id: 阶段1
-    名称: control 独立进程骨架(能起/能连/operate关了续命)
+    名称: control 独立进程骨架
     状态: 完成
-    备注: "Task1-7全过+D1-08死锁修复+operate真外壳E2E实跑+数据入库DB铁证。剩D1-09 SQLite/M-01~M-07专项。"
+    备注: "Task1-7全过+D1-08死锁修复+operate真外壳E2E+数据入库DB铁证。"
   - id: 阶段2
     名称: 监控补全 + 调试借串口 + 受护栏停止
     状态: 代码完成待验证
-    备注: "控制端/status补全+/shutdown受护栏+/serial让路 三端点真机全验;operate端ControlClient+监控页跨进程读+受护栏按钮(harness验证)。调试页完整借串口待命令代理设计+受监督真机。"
+    备注: "三端点真机验+operate客户端+监控页+受护栏按钮;调试页完整借串口延后(命令代理设计+电机验门控)。"
+  - id: 阶段3
+    名称: 清理老壳 + 装机收尾
+    状态: 代码完成待验证
+    备注: "退役删ControlTest(两编译0错)+部署指南+开机自启方案验;ComBin两栈去重延后专项。"
   - id: 阶段2
     名称: 监控补全 + 调试借串口 + 受护栏停止
     状态: 未开始
@@ -31,4 +34,4 @@
     名称: 清理老壳 + 装机收尾
     状态: 未开始
     备注: "退役删ivf_tl_ControlTest脏壳 + operate开机自启 + ComBin两套栈去重(G1-2) + 部署文档。待阶段2完成后拆计划"
-下一步: 阶段3(退役删ivf_tl_ControlTest+operate开机自启+ComBin两栈去重〔含D1-10 oplog〕+部署文档);调试页借串口命令代理+M-01~M-07+D1-09 留专项;建议feature合并main+推送
+下一步: 延后专项(调试页借串口命令代理/ComBin两栈去重D3-04/D1-09 SQLite/M-01~M-07/整机开机自启复测需重启);建议feature合并main+推送