// 实时面板数据源(监控面板.html 读 window.PROGRESS_DATA)。每推进一步更新本文件。
window.PROGRESS_DATA = {
project: "operate/control 双进程拆分",
generatedAt: "2026-06-24 18:00",
phase: "三阶段主体完成;M区全闭合;D2-02 第一阶段【代码+真机全过】+第二阶段 MJPEG 预览【代码完成+审查全过+Release双编译0错+46单测绿,待真机出图】;舱室故障隔离+H-08 已并main",
currentTask: "D2-02 第二阶段 MJPEG 实时预览代码完成(分支 feature/d2-02-mjpeg-preview,12 commit)。子代理驱动 7 编码任务 + 每任务 spec合规审查+代码质量审查两阶段全过。control端:MjpegStreamWriter(RGB→JPEG+multipart封帧纯逻辑)/DebugSession.StreamBroken+Manager.TryGet/ControlHttpServer /debug/preview/stream 推流端点(专用后台线程,校验后return不阻塞HttpListener,退出标记StreamBroken交心跳TTL回收)。operate端:MjpegFrameParser(切帧状态机5单测)/MjpegStreamClient(流式读+解码BitmapImage Freeze+FrameReceived/Stopped事件,不自动重连,一次性实例)/调试页View接入(OpenVideo/CloseVideo改走client+Image+断开提示,每次new+当值实例闸防残帧)/ControlClient.BaseUrl提public。control+operate Release双编译0错,全量46单测绿。下一步:本分支并main 或推进第三阶段(operate完整接入+真机V-012)。",
note: "关键决策(用户确认):JPEG编码放control端(压缩20-100倍)/专用后台线程推流(崩了不拖垮主服务)/相机锁全进程一把(SDK不改,A/B舱预览采集互等串行本轮不优化真机观察)/不自动重连(断了明确提示手动重开)/A舱调试时B舱可能正培养拍照不限空闲时段。残=真机门控(归V-012):预览出图需先curl /debug/acquire拿sid赋vm.CurrentSessionId(第二阶段无UI赋值点)/画面方向(倒置则推流层补Y翻转)/★重点压测预览中反复release-回收同舱(use-after-free窗口·全局锁+HPCSE兜底)/关预览无残帧。Release编译踩坑:control pid10360锁DLL,经/shutdown(token tl13579)优雅停机后编0错。",
milestones: [
{ 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-03", name: "受护栏停止/shutdown(口令+安全停机释放硬件)", status: "☑" },
{ id: "D2-02一", name: "调试页命令代理第一阶段control后端(会话/超时回收/Execute分发含红线钳位,27单测+真机冒烟全过)", status: "☑" },
{ id: "D2-02二", name: "MJPEG实时预览:control MjpegStreamWriter+推流端点专用线程/operate MjpegFrameParser切帧+MjpegStreamClient解码+调试页View接入。子代理驱动+两阶段审查全过,Release双编译0错,46单测绿,待真机出图(归V-012)", status: "🟢" }
]},
{ name: "阶段3 · 清理老壳+装机收尾", tasks: [
{ id: "D3-01", name: "退役删ivf_tl_ControlTest(两编译0错)", status: "☑" },
{ id: "D3-03", name: "双进程部署指南+布局E2E验", status: "☑" },
{ id: "D3-02", name: "开机自启注册表方案验(整机复测需重启)", status: "◑" },
{ id: "D1-10", name: "control oplog审计埋点迁移到活栈(project=control真机入库)", status: "☑" },
{ id: "D3-05", name: "control崩溃看门狗(崩溃重拉/DPAPI凭据/可暂停停止卸载,TDD+真机5项)", status: "☑" },
{ id: "HIL", name: "硬件在环回归套件IvfTl.Hardware.HilTests(守护M-05帧长/M-06按well焦点/M-01-03 EEPROM写;门控Skip+默认零写入,真机4/4)", status: "☑" },
{ id: "CONFIG", name: "配置收敛(operate↔control连接组7键单一数据源tl-shared.config经合并读+operate删12换气CCD死键;SharedConfigStore+operate单测工程;真机改一处对称生效)", status: "☑" },
{ id: "D3-04", name: "删operate死串口栈(去重·有风险删除·被D2-02阻塞)延后专项", status: "✗" }
]}
],
pending: [
{ id: "D1-01", rel: "Task7", point: "operate拉起control(真实ControlProcessLauncher实跑:探活→拉起→轮询)", env: "运行", risk: "中", status: "☑实跑" },
{ id: "D1-02", rel: "Task7", point: "/ping、/status 返回JSON", env: "运行", risk: "低", status: "☑" },
{ id: "D1-03", rel: "Task7", point: "control 独立进程真机硬件获取(6相机SN/7COM口True)", env: "真机", risk: "高", status: "☑" },
{ id: "D1-04", rel: "Task7", point: "operate关闭后control续命(harness退出control仍跑)", env: "运行", risk: "高", status: "☑" },
{ id: "D1-05", rel: "Task7", point: "复用已在跑的control(真实代码:已在运行直接连接,PID不变)", env: "运行", risk: "中", status: "☑实跑" },
{ id: "D1-06", rel: "Task7", point: "单实例 Mutex:第二个 control 自退", env: "运行", risk: "低", status: "☑" },
{ id: "D1-07", rel: "Task7", point: "完整闭环+数据入库(house_collect 37℃真温/alarm_data 落108库)", env: "真机", risk: "高", status: "☑DB实证" },
{ id: "D1-08", rel: "合并遗留", point: "serialBin/HAL借用ComBin重开不复活发送线程致握手死锁 修复", env: "真机", risk: "高", status: "☑已修复验证" },
{ id: "D1-09", rel: "合并遗留", point: "control本地SQLite InitTables AUTOINCREMENT建表失败(不阻塞)", env: "运行", risk: "中", status: "☑已修复" },
{ id: "D1-10", rel: "阶段3", point: "control硬件操作进operation_log(审计埋点迁移到control活栈,project=control真机70行)", env: "真机", risk: "低", status: "☑已修复验证" }
]
};