docs: add plugin architecture review report

This commit is contained in:
showen
2026-03-12 08:26:59 +08:00
parent 45c0a8d54b
commit 404196fcf3

View File

@@ -8,6 +8,20 @@
---
[当前] 张明远(内核工程师) → 刘建国(PM), 陈逸飞(CEO): ServiceManager 转发缺口与插件依赖机制已修复并完成自检。
本次改动:
- `src/core/service_manager.rs` 已为 `Message::WifiResult``Message::PlayerStatus``Message::StateChanged``Message::WifiProvisioned` 增加管理层广播转发,同时将 `PluginReady` 广播给插件侧消费者,补齐 WiFi/BLE/HTTP 结果回传链路。
- `src/core/plugin.rs` 新增 `dependencies()` 默认方法;`ServiceManager::start_all()` 启动前执行依赖完整性校验、重复 ID 检查和稳定拓扑排序,把启动顺序约束下沉到框架层。
- 现有插件已补充依赖声明:`http -> video`,其余 `screen/wifi/video/ble` 为独立插件。
- 顺手修复了仓库内阻塞编译/Clippy 的遗留问题BLE GATT 共享状态 move、Video 状态机测试与迭代问题、HTTP routes 的 WebSocket/错误类型问题),当前已恢复到可持续验证状态。
验证结果:
- `cargo check` 通过。
- `cargo clippy --all-targets --all-features -- -D warnings` 通过。
准备提交 commit。
## 2026-03-12
[04:55] 陈逸飞(CEO) → 全体: ShowenV2 项目启动Phase 1 目标是将旧 hologram_player_rust 完整迁移到插件架构。
@@ -1602,5 +1616,64 @@ Blocking waiting for file lock on build directory
?? CEO_BACKUP.md
- 编译结果:
cargo check: PASS
Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 22s
Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 22s
[2026-03-12 08:07:05] 副CEO → TEAM_CHAT: 第1/10次监督检查
- kilo 进程数: 12
- 最新提交:
7548064 ceo: 重要教训 - 不能盲信文件内容,必须验证
c342262 ceo: 监督检查总结 - 2人完成发现2个关键问题
35fa6d4 ceo: 强制执行机制 - 直接启动所有团队成员
- 文件改动:
M Cargo.lock
M Cargo.toml
M TEAM_CHAT.md
M src/core/plugin.rs
M src/core/service_manager.rs
M src/plugins/ble/gatt.rs
M src/plugins/ble/mod.rs
M src/plugins/http/mod.rs
M src/plugins/http/routes.rs
M src/plugins/mod.rs
M src/plugins/screen/mod.rs
M src/plugins/video/mod.rs
M src/plugins/video/processor.rs
M src/plugins/video/state_machine.rs
M src/plugins/wifi/mod.rs
?? CEO_BACKUP.md
- 编译状态: TIMEOUT
- 编译备注: cargo check timed out after 50s
---
[2026-03-12 08:20] 王思远(架构师) → 陈逸飞(CEO), 刘建国(PM): 插件架构审查完成,仅做审查,未修改业务代码。
评审模块:插件依赖与消息路由
结论:当前实现与 `PLUGIN_DEPENDENCY.md` 的主设计基本一致,`Plugin::dependencies()` 接口已落地,`ServiceManager` 已具备启动前依赖校验与稳定拓扑排序,`main.rs` 注册顺序也满足现有依赖关系。当前版本未发现实际循环依赖,但仍有 2 个需要尽快处理的架构缺口。
问题/改进点:
1. `ConfigReloadRequest` 路由未闭环
- 当前状况:`src/plugins/http/routes.rs` 发送 `Message::ConfigReloadRequest` 到 Manager但 `src/core/service_manager.rs` 仅打印 TODO没有执行配置重载也没有广播 `ConfigReloaded`。
- 问题分析这和消息总线“请求必有结果事件”的设计不一致HTTP 的“保存配置后自动热重载”承诺当前无法兑现;后续依赖配置热更新的插件也拿不到一致性事件。
- 改进建议:在 Manager 中补齐配置重载流程:重新解析配置、更新共享配置、向所有相关插件广播 `Message::ConfigReloaded(Arc<AppConfig>)`;失败时增加显式错误事件或日志级别升级。
- 优先级P0
2. 依赖模型文档与代码曾出现漂移,缺少防回归机制
- 当前状况:代码里 `src/plugins/ble/mod.rs`、`src/plugins/wifi/mod.rs`、`src/plugins/video/mod.rs`、`src/plugins/screen/mod.rs` 的 `dependencies()` 都返回空,`src/plugins/http/mod.rs` 返回 `vec!["video"]`,这与 `PLUGIN_DEPENDENCY.md` 当前定义一致;但 `TEAM_CHAT.md` 历史记录里多次出现过“ble 依赖 wifi”的旧口径。
- 问题分析:当前靠人工审查保证“文档=代码”,未来新增插件时容易再次把“松耦合消息协作”误建模成“强依赖启动约束”,导致不必要的启动排序、可用性下降,甚至引入伪循环依赖。
- 改进建议:增加架构回归测试,最少覆盖:`http -> video` 必须存在、`ble/wifi/video/screen` 必须无依赖、缺失依赖/自依赖/循环依赖必须启动失败;把文档中的依赖矩阵沉淀成可执行测试用例。
- 优先级P1
核查明细:
- `Plugin trait``src/core/plugin.rs` 已提供 `dependencies() -> Vec<&'static str>` 默认空实现,接口形式与设计文档一致。
- 插件依赖声明:`http -> video` 实现正确;`ble` 保持独立插件、通过消息与 `wifi` 协作,没有被错误建模为启动时强依赖;`screen/wifi/video` 无依赖也符合文档。
- 拓扑排序:`src/core/service_manager.rs` 在 `start_all()` 前执行 `validate_and_sort_plugins()`,覆盖重复 ID、缺失依赖、自依赖、循环依赖检查排序算法是稳定的 Kahn 风格迭代,能保证依赖先于被依赖方启动,现实现正确。
- 消息路由Manager 对 `WifiResult`、`PlayerStatus`、`StateChanged`、`WifiProvisioned`、`PluginReady` 的转发已补齐;其中 `WifiResult` 能回流到 `ble/http``PlayerStatus` 能广播到 `http`,核心链路完整。`video` 直接广播 `PlayerStatus/StateChanged``wifi` 直接广播 `WifiResult`,与当前路由模型兼容。
- 循环依赖风险:现有 5 个插件的声明图是 DAG不存在实际循环。风险点主要在未来若把 `ble <-> wifi` 误声明为双向 `dependencies()``ServiceManager` 会正确拒绝启动,但架构层仍应通过测试与文档避免这种误建模。
- `src/main.rs` 注册顺序:`screen -> wifi -> video -> ble -> http`。在已有拓扑排序存在的前提下,这个顺序不是唯一正确解,但它满足当前依赖约束,`http` 位于 `video` 之后,没有架构问题。
建议:
- 先补 `ConfigReloadRequest -> ConfigReloaded` 闭环,这是当前唯一明确破坏总线契约的缺口。
- 为依赖图增加自动化测试,避免文档口径漂移再次污染实现。
- 长期看可把 `dependencies()` 从 `Vec` 升级为静态切片或常量声明,减少运行期分配并提升可审计性。