Преглед изворни кода

docs(d2-02): 第三阶段设计补决策3——进调试前培养态确认框(详版含胚胎枚数)

判据用control现成HouseBin.Dish(StartDish赋/StopDish置null),acquire响应回带cultivating+embryoCount;在培养舱点初始化先探后弹确认(暂停换气/控温/拍照告知代价),确定才进/取消即release;空舱不打扰。配套更新§4a交互/§5a control回带/§6.1业务风险/§7单测/§9落地步骤
huangjie пре 3 дана
родитељ
комит
5e3307d9f4

+ 31 - 4
项目文档/需求文档/specs/2026-06-24-D2-02-第三阶段-operate调试页接入-design.md

@@ -37,12 +37,31 @@ D2-02 总设计把恢复方案拆成三段:
 
 ---
 
-## 3. 个实现期决策(已与用户确认)
+## 3. 个实现期决策(已与用户确认)
 
 | # | 决策 | 选定 | 理由 |
 |---|---|---|---|
 | 1 | 相机抓图链是否本阶段接 | **否,分阶段** | 实时看画面已由 MJPEG 预览覆盖;抓图存证含跨进程落盘/取回,独立成块降风险 |
 | 2 | 【初始化】那一串动作在哪端跑 | **operate 逐步发 command(总设计方案B)** | 编排逻辑+配置(孔位/清晰位/motorDelay)本就在 operate;control 零新增业务逻辑、只用已有命令分发,回归风险最低;本机回环多几趟往返无感;红线钳位已在 control 分发器逐条生效 |
+| 3 | 借走"正在培养"的舱是否提示 | **加详版确认框(含胚胎枚数)** | 时差培养箱养活体胚胎,借走在培养的舱会停其换气/控温/拍照;给工程师一道带业务现实的确认,避免误停胚胎培养。详见 §4a |
+
+### 4a. 进调试前的业务确认提示(决策3 落地)
+
+> 解决 §6.1 的核心业务风险:别让工程师在不知情下停掉某舱正在进行的胚胎培养。
+
+**判据来自 control,不靠 operate 猜**:control 进程内 `HouseBin.Dish` 字段即真相——`StartDish` 时赋值、`StopDish` 时置 null。`Dish != null` = 该舱正在培养;胚胎枚数从 `Dish`(StartDish 传入,带 wellSn/胚胎信息)取。control 只读这个现成字段,**采集/培养逻辑零改动**。
+
+**触发时点**:工程师点【初始化】、采集即将被暂停的前一刻(= acquire 这一步)。选舱、看页面阶段不碰硬件、不提示。
+
+**交互(探-确认两步,不是单纯弹字)**:
+1. operate 点【初始化】→ 先向 control 取该舱培养态(`/debug/acquire` 响应顺带返回 `cultivating` + `embryoCount`,见 §5;**这一步本身不暂停采集——见下方"先探后停"说明**)。
+2. control 回 `cultivating=true` → operate **先不进调试**,弹确认框:
+   > ⚠ 舱 6 正在培养胚胎(共 N 枚)。进入调试会**暂停该舱的换气、控温和拍照**,直到点【卸载】退出,期间胚胎培养中断。确定继续吗?
+   >  [确定,进入调试]  [取消]
+3. 点【确定】→ 正式进入调试(暂停采集);点【取消】→ 立即 `release` 还回(采集恢复,等于没借)。
+4. `cultivating=false`(空舱)→ 跳过确认,直接进调试,不打扰。
+
+**"先探后停"取舍**:acquire 本身会触发该舱采集暂停(语义不变)。为避免"探一下就停了采集、用户却点取消"的副作用,operate 在收到 `cultivating=true` 且用户点【取消】时**立即 `release`**——采集只是暂停一瞬即恢复,业务可接受;实现期若要更干净,可让 control 新增轻量只读 `/debug/precheck`(只查 `Dish`,不 Acquire 不暂停),writing-plans 阶段二选一定夺(默认先用 acquire+取消即 release 的简路径,改面更小)。
 
 ---
 
@@ -87,13 +106,20 @@ D2-02 总设计把恢复方案拆成三段:
 - **原则**:只在分发表新增 case,不动 `ISerialChannel`/`ComBin` 底层(底层方法已存在);control 业务逻辑零改动。
 - 这些 op 也要纳入 control 端纯逻辑单测(假 lease 验证路由到正确底层方法)。
 
+### 5a. acquire 响应回带培养态(决策3 配套)
+
+`DebugSessionManager.Acquire` 成功后,在返回体里顺带 `cultivating`(该舱 `HouseBin.Dish != null`)+ `embryoCount`(从 `Dish` 取,取不到回 0)。
+- **只读现成字段**,不改采集/培养逻辑。
+- 取舱的 `HouseBin` 经现有 `gateOf(houseSn)` 或 control `AppData` 已有的舱索引拿(实现期核实最干净的取法,优先复用 `/status` 构造 `BuildStatus` 已用的同一来源,不新开数据通道)。
+- 字段加在 `DebugCommandResult.Result` 或 acquire 专用返回体里(实现期定,保持 JSON 风格)。
+
 ---
 
 ## 6. 业务风险与影响面(时差培养箱视角 · 执行期重点盯)
 
 > 本章是用户硬要求:做的过程中结合培养箱业务特点审流程、算业务闭环与对其他功能的影响。
 
-1. **借用 = 该舱采集让路(养胚胎舱被借走的代价)**:`Acquire(OperateDebug)` 触发该舱 `MarkPause`,期间换气/控温/拍照/对焦全停。时差培养箱养活体胚胎——某舱正培养时被借去长时间调试,该舱胚胎停止培养直到 release。这是调试功能**固有语义**(合并前老系统、合并后单进程都如此),双进程仅跨进程化、行为一致。总设计 §2.3 决策不加硬护栏,靠监控页可见。**执行期落实**:真机验证监控页 `/status` 能显示该舱"调试中/借用中",确保旁人不误判该舱"坏了"也不误以为在正常培养。
+1. **借用 = 该舱采集让路(养胚胎舱被借走的代价)**:`Acquire(OperateDebug)` 触发该舱 `MarkPause`,期间换气/控温/拍照/对焦全停。时差培养箱养活体胚胎——某舱正培养时被借去长时间调试,该舱胚胎停止培养直到 release。这是调试功能**固有语义**(合并前老系统、合并后单进程都如此),双进程仅跨进程化、行为一致。**本阶段在此基础上加一道业务确认(§4a)**:借走"正在培养"的舱时,弹含胚胎枚数的确认框告知代价,工程师确认才进、取消即还。**执行期落实**:真机验证 ① 在培养舱点【初始化】真弹确认框且枚数准;② 取消后采集恢复(没真停);③ 空舱不弹;④ 监控页 `/status` 能显示该舱"调试中/借用中",旁人不误判。
 2. **崩溃/失联必须能恢复采集(安全闭环)**:operate 崩了若采集永久卡死 = 该舱胚胎永久停培养。control 看门狗 TTL 自动回收 + 预览 TCP 断快信号兜底(第一阶段已实现)。**本阶段把 operate 心跳接上才真正闭环**;真机务必验"杀 operate → 采集恢复"。
 3. **A 舱预览 + B 舱采集共用一把全进程相机锁**:互等串行(总设计 §9 认定可接受)。风险是预览持续占锁时 B 舱拍照排队。真机观察体感,卡顿再议(不在本阶段优化)。
 4. **预览中反复回收同舱的 use-after-free 窗口**(第二阶段标注的压测点):推流线程抓帧与会话回收 Dispose 相机有竞态,靠全局相机锁串行 + native HPCSE 兜底。**真机重点压测**确认不偶发崩溃;若崩,最小修=底层 `Camera.UnInit` 顺带置 `IsStart=false`(单独评估,不在本阶段擅动)。
@@ -109,6 +135,7 @@ D2-02 总设计把恢复方案拆成三段:
 ### 7.1 纯逻辑单测(无需真机)
 - `DebugSessionClient`:请求体拼装(acquire/command/release/heartbeat 的 JSON 结构正确)、`SESSION_EXPIRED` 触发失效回调、心跳定时器启停、Release 幂等。用假 HTTP/可注入传输验证。
 - control 新增缓冲瓶 op:假 lease 验证 `BufferState`/`BufferAeration`/`ReadLight`/`WriteLight`/`WriteOpenIntakeTimeBuffer` 路由到正确底层方法;未知 op 返回 `BAD_OP`。
+- **培养态回带(§5a)**:假舱 `Dish=null`→`cultivating=false/embryoCount=0`;`Dish` 有 N 枚→`cultivating=true/embryoCount=N`。
 
 ### 7.2 真机门控(= V-012,Claude 自主跑,UAC 静默提权)
 1. **借串口让路时序**:acquire → 该舱采集暂停(/status 反映)→ 操作 → release → 采集恢复,不死锁/不双占。
@@ -130,9 +157,9 @@ D2-02 总设计把恢复方案拆成三段:
 
 ## 9. 分步落地建议(writing-plans 阶段细化为 bite-sized 任务)
 
-1. control 回补缓冲瓶 op + 纯逻辑单测(最小、先行,不依赖 operate)。
+1. control 回补缓冲瓶 op + acquire 响应回带培养态(§5/§5a)+ 纯逻辑单测(最小、先行,不依赖 operate)。
 2. operate `DebugSessionClient`(HTTP + 心跳 + 失效回调)+ 纯逻辑单测。
-3. operate `HouseDebugPageViewModel` 接入 client(含 ComHouseInit 逐句 command)。
+3. operate `HouseDebugPageViewModel` 接入 client(含 ComHouseInit 逐句 command + 进调试前培养态确认框 §4a)。
 4. operate `BufferDebugViewModel` 接入 client。
 5. operate 两个 View 后置(acquire/release/喂 sid/抓图按钮置灰)。
 6. Release 双编译 0 错 + 全量单测绿。