评审日期 2026-10-19(成稿 2026-10-20)· 仓库 cbb/DCU_DesktopController · 分支 main · 基线 commit eac3717(feat: 添加局域网设备发现功能和链路胶囊优化)· 评审方式:多专家组并行通读 + 抽样复核行号
| 编号 | 严重度 | 模块 | 标题 | 位置 |
|---|
| M-1 | 致命 | 电机控制/故障保护 | 无急停/全部失能,停止类操作均不下发失能帧 | js/motor/main.js:809-811, 2391, 2403, 2494; js/motor/seq.js:449; js/motor/main.js:1103, 11… |
| M-2 | 致命 | 电机控制/故障保护 | CMD 数值无范围校验,整数编码会回绕 | js/motor/main.js:744-756; pages/motor.html:141-149; js/motor/main.js:2462-2470 |
| M-3 | 致命 | 电机控制/故障保护 | 真实链路丢失永远判不出离线 | js/motor/main.js:969-987, 1175 |
| M-4 | 致命 | 电机控制/故障保护 | 序列停止后立即重启会出现两个并发执行循环 | js/motor/seq.js:431-447, 449-455, 461-504 |
| O-1 | 致命 | OTA/刷写 | 同一块 GD32 可被两条通道同时刷写 | js/ota/session.js:128; js/ota/boot_ecat.js:176-189, 576-577; js/ota/console-mode.js:67, 12… |
| O-2 | 致命 | OTA/刷写 | HEX 解析可放过损坏或截断文件 | js/ota/file-handle.js:458-516(校验 472-477,分配 506-509) |
| P-1 | 致命 | 主机服务/安全 | 本地服务无 Origin/Host/Content-Type 校验,任意网页可跨站驱动电机 | esp32_server.py:480-541(do_POST),504-532(ECAT 代理分支) |
| P-2 | 致命 | 主机服务/安全 | ESF1 快发在 sendall 成功后出错仍整包重发 | ecat_client.py:247-279 |
| C-1 | 严重 | CAN/公共层 | DBC 中 [0|0] 被当成真实范围 | js/can/dbc.js:164-165; js/can/signals.js:299-304 |
| C-11 | 严重 | CAN/公共层 | 独立 CAN 监控页无视所选设备 | pages/can_monitor.html:55; js/can_monitor.js:60-68; js/can/dbc.js:40-47 |
| C-12 | 严重 | CAN/公共层 | 监控页超时永不显示离线 | js/can_monitor.js:199 |
| C-2 | 严重 | CAN/公共层 | 扩展多路复用信号被静默丢弃 | js/can/dbc.js:153 |
| C-4 | 严重 | CAN/公共层 | 扩展/标准帧靠 ID 数值猜测,发送载荷无帧类型标志 | js/can/dbc.js:146; js/can/send.js:304, 373, 453, 461 |
| C-5 | 严重 | CAN/公共层 | DLC 未按 CAN FD 合法长度校验 | js/can/send.js:406; js/can/signals.js:233-235 |
| H-1 | 严重 | 仓库卫生/文档 | AI 工具目录被提交 | .qoder/repowiki/(约 75 个文件); .zcode/plans/plan-sess_*.md; .gitignore |
| H-5 | 严重 | 仓库卫生/文档 | 默认 ECAT 周期 0.25 ms 与既有报告建议冲突且缺复测依据 | js/common/ecat-bus.js:28; js/motor/transport-ecat.js:428-431 |
| M-10 | 严重 | 电机控制/故障保护 | 周期发送与序列计时在后台标签被节流,且无可见性处理 | js/motor/main.js:2488; js/motor/seq.js:503 |
| M-11 | 严重 | 电机控制/故障保护 | ECAT 发送不核对 queued,失败也报成功 | js/motor/transport-ecat.js:803-810 |
| M-5 | 严重 | 电机控制/故障保护 | ECAT 活性保持把陈旧数据显示为在线 | js/motor/transport-ecat.js:526, 552, 572-590; js/motor/refresh-rate.js:138 |
| M-6 | 严重 | 电机控制/故障保护 | 「谁可以动总线」红线被多处绕过 | js/motor/transport-ecat.js:394-459, 668; js/common/device-link.js:250-287, 322-327 |
| M-7 | 严重 | 电机控制/故障保护 | OTA 忙标志写在 iframe 窗口,外壳 Owner 读不到 | js/motor/transport-ecat.js:80-82; js/common/device-link.js:255 |
| M-8 | 严重 | 电机控制/故障保护 | ECAT 桥失败回落 HTTP,非幂等命令可能执行两次 | js/motor/transport-ecat.js:259-271; js/common/desktop-bridge.js:59-74 |
| M-9 | 严重 | 电机控制/故障保护 | 修改网卡输入框即关闭运行中总线,无任何保护 | js/motor/transport-ecat.js:899-908; js/motor/main.js:3215-3227 |
| O-3 | 严重 | OTA/刷写 | ESP32 重启按钮无 OTA 守卫 | js/ota/upload-esp32.js:594-613; pages/index.html:368 |
| O-4 | 严重 | OTA/刷写 | GD32 完成判定可被陈旧 alive 标志误判 | js/ota/stages.js:497-499 |
| O-5 | 严重 | OTA/刷写 | ESP32 重启后成功判定不核对新版本 | js/common/polling.js:~236; js/ota/upload-esp32.js:435-449, 468-474 |
| O-6 | 严重 | OTA/刷写 | WiFi/BLE OTA 不通知其它标签,端点可中途切换 | js/ota/boot_ecat.js:598; js/app.js:63-71, 403-421 |
| O-7 | 严重 | OTA/刷写 | BLE abort 总发会话 0;中继阶段可随意中止 | js/ble/session.js:89; js/ble/state.js |
| O-8 | 严重 | OTA/刷写 | BLE GD32 身份检查未 await | js/ble/file.js:174, 182-205 |
| O-9 | 严重 | OTA/刷写 | 前端不校验 ESP32 镜像 | js/ota/file-handle.js:725-751 |
| P-3 | 严重 | 主机服务/安全 | 健康探测 1 s 超时即无差别强杀所有 ecat_native | ecat_proc.py:124-140, 143-194, 250-253 |
| P-4 | 严重 | 主机服务/安全 | 跨进程锁超时或 CreateMutexW 失败仍继续执行 | ecat_proc.py:67-94(尤其 72-81) |
| P-5 | 严重 | 主机服务/安全 | 桌面桥路径不记录循环状态,『关 app 必停从站』可能失效 | ecat_client.py:470-497; esp32_server.py:331-340, 403-420, 533 |
| P-6 | 严重 | 主机服务/安全 | 外链在窗口内导航,外部页面可调用桌面桥 js_api | esp32_server.py:142-146, 998-1000 |
| P-7 | 严重 | 主机服务/安全 | ecat_native 提到 REALTIME 优先级,配合自旋线程可能拖死系统;复用实例不提权 | ecat_proc.py:96-121, 212-215, 273-276 |
| C-10 | 一般 | CAN/公共层 | 单条发送无防重入 | js/can/send.js:282, 358, 435 |
| C-13 | 一般 | CAN/公共层 | 对设备的并发轮询过多 | js/common/device-link.js:30; js/can.js:131, 424; js/can_monitor.js:487, 490; tabs.html:76-… |
| C-14 | 一般 | CAN/公共层 | 轮询超时计时器可能丢失 | js/common/polling.js:194 |
| C-16 | 一般 | CAN/公共层 | 读取已存 IP 不校验;网关猜测探测 | js/common/base-url.js:44-50; js/common/connection.js:761-789 |
| C-3 | 一般 | CAN/公共层 | 多行 CM_ 注释丢失 | js/can/dbc.js:178, 184 |
| C-6 | 一般 | CAN/公共层 | 手动 ID 解析过宽 | js/can/dbc.js:58 |
| C-7 | 一般 | CAN/公共层 | 枚举/多路复用/浮点信号编码细节错误 | js/can/signals.js:45-51, 76, 294-296, 406 |
| C-8 | 一般 | CAN/公共层 | 持久化静默失败且状态只增不减 | js/can/persist.js:93-124; js/can.js:229 |
| C-9 | 一般 | CAN/公共层 | toast 模块被加载成两个实例 | js/can/send.js:17; js/can.js:19-20, 47 |
| H-2 | 一般 | 仓库卫生/文档 | 受版本控制文件含个人绝对路径 | scripts/build_mem.bat:21; README.md:3, 449; docs/compose/spec/host-code-quality.md:67 |
| H-3 | 一般 | 仓库卫生/文档 | README 脚本清单与 scripts/ 不一致;.gitignore 规则重叠 | README.md; scripts/check_fe_guard_mutation.py; scripts/ui_diag_motor.mjs; .gitignore; .git… |
| H-4 | 一般 | 仓库卫生/文档 | 注释/文档与代码不符(默认周期等) | js/motor/transport-ecat.js:37, 166, 416-417, 607; README.md:190 |
| H-6 | 一般 | 仓库卫生/文档 | GD32 WiFi 中继刷写缺『刷写≠生效』版本比对,守卫脚本已删除 | js/ota/upload-gd32.js; js/ota/stages.js:497-499 |
| H-8 | 一般 | 仓库卫生/文档 | ecat_integral_report 结论与其附带脚本输出自相矛盾 | docs/reports/ecat_integral_report.html |
| M-12 | 一般 | 电机控制/故障保护 | 运行中导入/水合配置会替换正在使用的参数 | js/motor/main.js:242-289; js/motor/seq.js:223 |
| M-13 | 一般 | 电机控制/故障保护 | 危险默认值 | js/motor/seq.js:76-89; pages/motor.html:105, 123, 127 |
| M-14 | 一般 | 电机控制/故障保护 | NaN/Inf 浮点被显示为 0 | js/motor/main.js:624-627, 666-669 |
| M-15 | 一般 | 电机控制/故障保护 | 磁盘水合后链路状态不一致 | js/motor/main.js:268, 3172 |
| M-16 | 一般 | 电机控制/故障保护 | 节点 ID 修改不核对 ACK;去重表键不含通道 | js/motor/main.js:3044-3046 |
| M-19 | 一般 | 电机控制/故障保护 | 自动化测试未覆盖停机/序列竞态/数值范围 | scripts/test_motor_transport.mjs; scripts/test_motor_refresh.mjs; scripts/test_ecat_autost… |
| O-10 | 一般 | OTA/刷写 | BLE ACK/重传机制薄弱 | js/ble/gatt.js:249-255; js/ble/transfer.js:45-57, 75-78, 282 |
| O-11 | 一般 | OTA/刷写 | BLE 载荷固定 480 B,无 MTU 回退 | js/ble/constants.js:38, 50; js/ble/state.js:76 |
| O-12 | 一般 | OTA/刷写 | BLE 断开不拒绝结果等待 | js/ble/gatt.js:139-150; js/ble/transfer.js:394 |
| O-13 | 一般 | OTA/刷写 | GD32 中继触发超时后可能误判失败 | js/ota/upload-gd32.js:191-216 |
| O-14 | 一般 | OTA/刷写 | ECAT 直灌无完整性校验,api() 不查 HTTP 状态 | js/ota/boot_ecat.js:89-99, 635-661 |
| P-10 | 一般 | 主机服务/安全 | 代理读取 Content-Length 与 native 响应均无上限 | esp32_server.py:509-512; ecat_client.py:350-355 |
| P-11 | 一般 | 主机服务/安全 | ESF 打包静默修改数据 | ecat_client.py:140-141, 157-166 |
| P-12 | 一般 | 主机服务/安全 | 静态服务暴露整个 BASE_DIR,无扩展名文件被当 HTML 注入脚本 | esp32_server.py:434, 454-466, 474 |
| P-13 | 一般 | 主机服务/安全 | WebSocket 实现不完整且不校验 Origin | esp32_server.py:551-564, 604-606 |
| P-14 | 一般 | 主机服务/安全 | 端口复用与单实例检测存在竞态 | esp32_server.py:756-779, 897-898, 954 |
| P-15 | 一般 | 主机服务/安全 | 退出路径可能跳过停机 | ecat_proc.py:301-311; esp32_server.py:348, 873-878 |
| P-8 | 一般 | 主机服务/安全 | 非幂等请求首次可能误报 503 | ecat_client.py:405, 415, 426-439 |
| P-9 | 一般 | 主机服务/安全 | 桥接路径可写入任意 HTTP 请求行 | ecat_client.py:93-107, 337-344, 470 |
| C-15 | 建议 | CAN/公共层 | 大量隐式全局与重复代码 | js/common/polling.js:10-29; js/common/connection.js:6-13; js/can/send.js:36; js/can_monito… |
| H-7 | 建议 | 仓库卫生/文档 | 报告中的资源与脚本链接随归档失效 | docs/reports/ECAT_RATE_TRADEOFF.md; docs/reports/ecat_integral_report.html; docs/reports/R… |
| M-17 | 建议 | 电机控制/故障保护 | 示波器数据经滤波与重采样,定时器从不停止 | js/motor/scope.js:31, 228-256, 269 |
| M-18 | 建议 | 电机控制/故障保护 | main.js 约 3250 行,流控逻辑重复 | js/motor/main.js:807-948 |
| O-15 | 建议 | OTA/刷写 | 大量 window.* 全局、猴补 showOpenFilePicker、内存复制 | js/ota/console-mode.js:170-199; js/ota/upload-esp32.js:213-247; js/ota/progress.js:177; js… |
| P-16 | 建议 | 主机服务/安全 | native_stdout.log 只追加不轮转 | ecat_proc.py:259-262 |
| P-17 | 建议 | 主机服务/安全 | LAN 探测接口可被当端口扫描器 | lan_probe.py:320-333; esp32_server.py:673-684 |
| 来源 | 编号 | 原结论 / 建议 | 当前状态 | 证据(文件:行号) | 备注 |
|---|
| ECAT_BEAT_TAIL_REPORT | BT-1 | 前端每 PDO 电机槽数与扫描拍数按 dense 布局改(MOT_SLOTS_PER_PDO=9、MOTOR_SCAN_CYCLES=1) | 已修复 | js/motor/transport-ecat.js:57, 88 | |
| ECAT_BEAT_TAIL_REPORT | BT-2 | 测速页跳拍卡改读 cyc_us.late/lost | 已修复 | lab/spi_test.html:506, 1522-1534, 2154-2167 | |
| ECAT_BEAT_TAIL_REPORT | BT-3 | 刷写≠生效:flash_gd32.py 增加生效守卫 | 已过时 | —(beeae8a 随 scripts 收敛删除) | 网页 WiFi 中继路径无替代版本比对,见新问题 H-6;ECAT 直灌有 0x100A 比对(boot_ecat.js:629-632, 792-794) |
| ECAT_BEAT_TAIL_REPORT | BT-4 | 345µs 归因:win 布局固有成本 vs 主站 97fab23 回归,需一次刷板钉死实验 | 无法在本仓库核实 | — | 涉及固件布局与 ecat_native.c,不在本仓 |
| ECAT_BEAT_TAIL_REPORT | BT-5 | 0.25ms 档实测列为待办 | 仍存在 | js/common/ecat-bus.js:28 | 默认已是 0.25ms 却无复测记录,见 H-5 |
| ECAT_BEAT_TAIL_REPORT | BT-6 | 报告引用 lab/ecat_rate_sweep.csv 等证据数据 | 已过时 | — | 数据随归档删除,报告不可复现,见 H-7 |
| ECAT_RATE_TRADEOFF | RT-1 | 建议周期停在 0.5ms,0.25ms 为功能损坏 | 仍存在 | js/common/ecat-bus.js:28; js/motor/transport-ecat.js:428-431 | 代码默认 0.25ms,建议未采纳且无复测依据(H-5) |
| ECAT_RATE_TRADEOFF | RT-2 | 周期可被 localStorage 覆盖(原 :227-228) | 仍存在 | js/motor/transport-ecat.js:167, 428-430 | 设计如此,但应在 UI 明示并限定合法档位 |
| ECAT_RATE_TRADEOFF | RT-3 | drop 口径、fillRxWindow 计时待办 | 无法在本仓库核实 | — | 属固件/native 侧 |
| ECAT_RATE_TRADEOFF | RT-4 | sweep_ecat_rate.py / calibrate_ecat_metrics.py / plot_* / build_ecat_report_html.py 与图表数据 | 已过时 | — | beeae8a 删除,.md 中图片链接失效(H-7) |
| ECAT_RATE_TRADEOFF | RT-5 | 注释/README 称默认 4ms 由后端决定 | 仍存在 | js/motor/transport-ecat.js:166, 416-417; README.md:190 | 文档与代码不符(H-4) |
| REPORT_ecat_skip_opt_20260917 | SK-1 | ecat_native 提权为 RealTime | 部分修复 | ecat_proc.py:97-120, 273-276 | 仅新拉起进程提权;复用实例分支 :212-215 不提权;且 REALTIME 有饿死系统线程风险(P-7) |
| REPORT_ecat_skip_opt_20260917 | SK-2 | 生产建议 2ms | 仍存在 | js/common/ecat-bus.js:28 | 默认 0.25ms,与建议冲突(H-5) |
| REPORT_ecat_skip_opt_20260917 | SK-3 | 第四节回滚命令依赖 scripts/skip_*.py | 已过时 | — | 脚本已删除,回滚步骤不可直接执行 |
| REPORT_ecat_skip_opt_20260917 | SK-4 | I210 协议绑定/高级属性调整 | 无法在本仓库核实 | — | 属主机网卡配置 |
| REPORT_ecat_skip_opt_20260917 | SK-5 | 标定/实验脚本(第五节) | 已过时 | — | 已出库(H-7) |
| GD32_OTA_FLOW_COMPARE | OF-1 | 新流程 0 次上板实测 | 已过时 | js/ota/boot_ecat.js:55-58, 307-322 | EtherCAT 直灌已移植入本仓(d73e2fb 起),注释含 2026-10-12/13 实测记录 |
| GD32_OTA_FLOW_COMPARE | OF-2 | 正在跑 APP 的机器还不能直接刷 | 部分修复 | js/ota/boot_ecat.js:663-676 | 主机侧已写 CoE 0x2502:00=1 交接;固件侧无法核实 |
| GD32_OTA_FLOW_COMPARE | OF-3 | 刷前刷后 0x100A 版本比对 | 已修复 | js/ota/boot_ecat.js:629-632, 792-794 | |
| GD32_OTA_FLOW_COMPARE | OF-4 | 4 字节对齐补 0xFF | 无法在本仓库核实 | — | 发生在 native 侧 |
| GD32_OTA_FLOW_COMPARE | OF-5 | 固件 OTA.cpp 尾巴丢弃缺陷 | 无法在本仓库核实 | — | 固件仓 |
| GD32_OTA_FLOW_COMPARE | OF-6 | 老流程无断点续传,每次从偏移 0 重写 | 仍存在 | js/ota/upload-esp32.js:213-247 | 整文件 POST 且内存双份(O-15) |
| GD32_OTA_FLOW_COMPARE | OF-7 | 报告引用行号 upload-gd32.js:58,194 | 已过时(行号漂移) | js/ota/upload-gd32.js:67-68; js/ota/file-handle.js:458, 563 | file-handle 引用仍有效 |
| GD32_OTA_FLOW_COMPARE | OF-8 | 两条路互为备份、复用同一 flash 写入者 | 无法在本仓库核实 | — | 前端侧两条路缺统一互斥,见新问题 O-1(致命) |
| ecat_integral_report | IN-1 | 数据源 lab/ecat_passive_latest.csv | 已过时 | — | CSV 不在仓库,报告不可复现(H-7) |
| ecat_integral_report | IN-2 | 结论:积分差大头在停车段 | 存疑 | docs/reports/ecat_integral_report.html(附带脚本输出) | 附带 JSON 的 main_source_of_integral_error=起动段、who_lags_at_stop=N2,与正文『N3 停车更拖』相矛盾(H-8) |
| ecat_integral_report | IN-3 | 建议④ 序列 hold 不短于两台都停稳时间 | 仍存在 | js/motor/seq.js:95 | holdMs 范围 0~600000,无『停稳确认』机制;且序列重启存在并发循环(M-4) |
| ecat_integral_report | IN-4 | 建议①~③ 统一减速段、对称负载、v2+v3 纠偏 | 无法在本仓库核实 | — | 属固件控制器 |
| device-link | DL-1 | 外壳 Owner + BroadcastChannel 快照 | 已修复(已交付) | tabs.html:205; js/common/device-link.js:117, 389 | |
| device-link | DL-2 | 端点配置只在 ConnectionHub | 部分修复 | pages/can_monitor.html:55; js/can_monitor.js:60-68; js/app.js:63-71 | CAN 监控页硬编码 IP 优先于 Hub(C-11);OTA 页 IP 输入可绕过 |
| device-link | DL-3 | 功能页不再各自判定在线 | 部分修复 | js/common/polling.js; js/can.js:424; js/can_monitor.js:487 | 多处仍独立轮询 /system/status(C-13) |
| device-link | DL-4 | 外壳启动强制开总线,失败 10s 退避 | 仍存在风险 | js/common/device-link.js:32, 250-287 | 无 reason、unknown 视为需启动、OTA 闸读不到 iframe 标志(M-6、M-7) |
| device-link | DL-5 | BLE 经 reportBle 上报 | 已修复(已交付) | js/ble/gatt.js:119, 123, 128 | |
| tab-keepalive | TK-1 | 多 iframe 宿主 + visibility 切换 | 已修复(已交付) | tabs.html:70-81, 100, 113 | |
| tab-keepalive | TK-2 | F5/⟳ 只 reload .page-frame.active | 已修复(已交付) | esp32_server.py:126, 150, 166 | |
| tab-keepalive | TK-3 | 不做后台页降频(Out of Scope) | 仍存在风险 | tabs.html:76-81; js/common/polling.js:350-352 | 隐藏帧持续轮询挤占设备 6 个 socket(C-13);电机页发送节拍在后台被节流(M-10)——建议重新评估此决策 |
| ecat-rx-stuck | RX-1 | 主站 OP 后 seq 沿踢帧 + 活性判据加宽 | 无法在本仓库核实 | — | ecat_native.c 不在本仓 |
| ecat-rx-stuck | RX-2 | 从站新鲜度救援先 Process 再 InputMapping | 无法在本仓库核实 | — | 固件仓 |
| ecat-rx-stuck | RX-3 | 规格状态仍为 in-progress,但 T1~T3 已勾选 | 仍存在 | docs/compose/spec/ecat-rx-stuck.md:3 | 建议改为 delivered 或注明剩余事项 |
| pdo-fast-send | FS-1 | Python 桥 ESF1 仅走 TCP,无 HTTP 回落 | 已修复(已交付) | ecat_client.py:231-287 | |
| pdo-fast-send | FS-2 | 前端 sendViaFastOrJson 有桥时只调快发 | 已修复(已交付) | js/motor/transport-ecat.js:282-300 | |
| pdo-fast-send | FS-3 | 失败重探端口后再试 TCP 一次 | 仍存在风险 | ecat_client.py:247-279 | sendall 成功后 recv 失败也会重发,同一帧可能入队两次(P-2,致命) |
| pdo-fast-send | FS-4 | 堵死慢发原则 | 部分修复 | js/motor/transport-ecat.js:259-271 | 低频路径(motor/send、motor/start)桥失败仍回落 HTTP(M-8) |
| host-code-quality | HQ-R1 | 非幂等不自动重发 | 部分修复 | ecat_client.py:58-62, 290-299, 418-436 | HTTP 代理已遵守;ESF1 快发重试违反同一原则(P-2) |
| host-code-quality | HQ-R2 | 网卡默认 I210 | 已修复 | ecat_proc.py:28 | |
| host-code-quality | HQ-R3 | 跨进程互斥/复用 | 部分修复 | ecat_proc.py:67-94, 125-140 | 锁超时/CreateMutexW 失败仍继续执行(P-4) |
| host-code-quality | HQ-R4 | 拆 main.js | 部分修复 | js/motor/main.js(3254 行) | 仍为上帝文件(M-18) |
| host-code-quality | HQ-R5 | 版本/参数下沉 | 仍未实施 | — | |
| host-code-quality | HQ-R6 | ECAT bootstrap 单点 | 部分修复 | js/motor/transport-ecat.js:418-441; js/common/ecat-bus.js:65-75 | 电机侧仍自算周期并绕过预算(M-6) |
| host-code-quality | HQ-R7 | toast/quiet 去重 | 仍未实施 | js/can/send.js:17 | CAN 侧还出现 toast 双实例(C-9) |
| host-code-quality | HQ-R8~R14 | 服务端拆分与卫生 | 已修复(大部分) | ecat_client.py; ecat_proc.py; docs/reports/ | 但 .qoder/.zcode 入库(H-1) |
| host-code-quality | HQ-R15 | README | 部分修复 | README.md:3, 190, 449 | 个人路径与默认周期描述过时(H-2、H-4) |
| .zcode-plan | ZC-A1 | ecat_native 新增 /api/pm/hold | 无法在本仓库核实 | — | native 不在本仓 |
| .zcode-plan | ZC-A2 | lan9252_pm.html enterMode 后发 pm/hold | 已修复 | lab/lan9252_pm.html:447 | |
| .zcode-plan | ZC-A3 | 睡眠标记另写带时间戳 localStorage | 已修复 | lab/lan9252_pm.html:289-309 | |
| .zcode-plan | ZC-B | GD32 固件 HBI 门控 | 无法在本仓库核实 | — | 固件仓 |