# ek-station DESIGN
设计与决策记录(docs/ek-ui-station-plan.md 的 S1a 落地面;扎钉后不放)。
## BD(边界钉)
- **BD-U1 svctl.stop ≅ svctl.remove**:ek-core 0.3.0 无"停而不摘表"导出
(`close_one` 是私有方法,公开面只有 `close_all`/`remove_plugin`)。
运行期下线 = remove(五步闭停 + 摘表 + `ePlugDown` 广播);重启用 start
(宿主 `add_plugin` 在 start 后即时 `launch_one` 上线 + `ePlugUp` 广播)。
测试 c0 全链钉死。
- **BD-U2 工厂 build 用 `Arc<dyn Fn>` 而非 `fn` 指针**:测试探针需要捕获
共享槽;S3 参数化配置也吃这个签名。行动面不变(零参调用)。
- **BD-U3 headless 的 stdin 退出策略**:Windows 控制台无 std 信号面,
`SetConsoleCtrlHandler` 需三方/unsafe → v1 记录:`q`/`quit` 行 = 优雅退出。
~~管道 EOF = 优雅退出~~ **0.1.4 文档纠错(T2 t2g 实测推翻)**:EOF 与 stdin
不可用(detached)同归**常驻 keep-alive**——launcher 的 spawn 用 stdin=null,
子进程起手即 EOF,EOF 若走优雅退则 launcher 协议即碎。五步闭停在 `q` 与
窗口关闭(ek-ui 侧)路径生效;常驻进程由进程外 kill 终止。
- **BD-U4 `--from` 清单延迟校验**:行格式错即时报(exit 2),未知工厂名
延迟到 boot 单一硬报错点(exit 1)——避免两套重名/存在性校验的重复面。
- **BD-U5 构造期身份**:v1 工厂名 == 插件注册名(dm/oms/ctp 各一实例);
多实例(多网关 `ctp_A/ctp_B`)进 S3 配置面后由 config 段给名。
## 契约面(wire.rs)
`PlugRow { name, version, state(Debug 形状), deps, spilled, panics }`;
`StartRes/RemoveRes` 用**业务回执枚举**(Started/Rejected、Removed/NoSuchName)
而非 `ReplyErr` 承载业务错 —— 回执在总线/测试里可读可断言。