Phase 0 内核与契约
Phase 0 建立的是「什么东西可以被装进来、装进来之后能拿到什么、装不进来时如何被拒绝」的最小闭环。它不追求可玩,而追求可判定:任何扩展单元的档次、写边、签名与能力边界,都能在装载期给出确定结论。
状态:已完成。
目标与非目标
目标
- 用构建期生成的根插件名单(RPM)焊死大插件集合,启动时校验清单与入口哈希。
- 提供统一的装载管线:目录、ZIP、内置三种形态走同一条判定路径。
- 以 guard 完成四档分类、写边核对、签名核验与准入裁决,并输出可读的审计报告。
- 让扩展单元只能经
ctx取用能力;缺省能力必须「不存在」,而不是「返回空实现」。 - 用同一份核心代码在纯浏览器与 Tauri 宿主中运行,宿主差异只出现在宿主层。
非目标
- 不实现剧本、翻译、渲染、音频等任何内容能力。
- 不实现 Mod 对具体机制插槽的改写;Phase 0 只验证「分类与写边」本身。
- 不实现云存档、在线能力与创作工具。
- 不把「同 realm 运行」当成安全边界;guard 是流程约束与可观测性,不是沙箱。
覆盖的大插件
| 大插件 | 契约 | 本阶段职责 |
|---|---|---|
| Kernel | kernel@1 | RPM 生成与校验、装载器、包读取、guard、审计、能力注入 |
| Platform | platform@1 | 宿主抽象双端骨架、应用外壳、下载浮层的静态形态 |
交付内容清单
| 交付 | 大插件 | 关键接口或产物 | 状态 |
|---|---|---|---|
| RPM 生成器与启动校验器 | Kernel | rpm.json、manifestHash、入口哈希核对 | 已完成 |
| 装载器 | Kernel | kernel:loader、kernel:unit-files、kernel:pack-reader@1 | 已完成 |
| guard 准入与审计 | Kernel | guard:report、分类与写边判定、原因码 | 已完成 |
| 签名核验与信任存储宿主绑定 | Kernel | Ed25519 验签、清单序号防回滚、宿主侧信任存储 | 已完成 |
| 能力注入与缺省降级 | Kernel、Platform | caps:*、platform:host、按单元裁剪的 ctx | 已完成 |
| 宿主抽象双端骨架 | Platform | host:backend@1、网页与 Tauri 两条实现 | 已完成 |
| 应用外壳 | Platform | 内置外壳、独立源信任页、下载浮层静态形态 | 已完成 |
| 拒绝用例矩阵 | Kernel | 两端各跑一遍的拒绝路径测试 | 已完成 |
拒绝矩阵覆盖的典型路径
| 场景 | 期望结果 |
|---|---|
| 清单哈希或根插件入口哈希不符 | 拒绝启动 |
| 注册到未声明的实现位 | 拒绝注册并给出原因码 |
Mod 的 targets 与根插件不匹配 | 拒绝装载 |
写入 closed 目标 | 拒绝写入并保留原值 |
| 缺少能力时请求敏感能力 | 拒绝,且对象不存在 |
| 翻译器不在隔离 realm 中运行 | 拒绝装载 |
| release 下装载调试类单元 | 拒绝装载 |
| 签名核验失败 | 拒绝装载 |
| release 下未签名单元 | 拒绝装载 |
| 同名异钥的发布者 | 提示冲突并挂起新来者 |
| 资源包试图影响安全关键 UI | 拒绝装载并给出原因码 |
| 发布产物中检出 dev 挂载符号 | 构建期失败 |
出口条件
- [x] 拒绝用例矩阵在网页与宿主两端全部通过。
- [x] 能装载一个空数据包、一个空资源包、一个插件与一个 Mod。
- [x] 能正确拒绝一次对
closed目标的写入。 - [x] 能验证分类判据:注册到实现位者判为插件,替换在用 provider 者判为 Mod。
- [x] 卸载扩展单元后无残留注册、无残留订阅。
- [x] 同一份核心代码在网页与 Tauri 两端可运行。
- [x] 发布产物中不存在 dev 挂载符号。
- [x] 「一个 Mod」由带机制插槽的样例根插件与夹具 RPM 演示;Phase 0 的 Kernel 本身不含机制插槽。
当前状态与证据
| 证据类型 | 位置或内容 | 结论 |
|---|---|---|
| 契约测试 | test/contract/kernel.test.ts、guard.test.ts、manifest.test.ts、names.test.ts | 通过 |
| 签名与信任 | test/contract/signing-list.test.ts、signing-update.test.ts、signing-probe.test.ts | 通过 |
| 宿主切换 | test/contract/host-switch.test.ts、inspection-consistency.test.ts | 通过 |
| Rust 侧 | cargo test --manifest-path src-tauri/Cargo.toml | 通过 |
| 宿主冒烟 | test/host/tauri-smoke.js、trust-smoke.js | 通过 |
| 测试记录 | 见当前状态与测试 | 两端契约测试通过 |
「已完成」的依据是网页与宿主两端契约测试通过,而不是某个单一实现的通过记录。
尚未完成与风险
| 项目 | 说明 |
|---|---|
platform:resolve-asset-url | 不在 Phase 0 落地;按已确认的包内逻辑地址重定向方案在 Phase 1 实现。Phase 0 不宣称该接口可用。 |
| 同 realm 的技术隔离 | 插件与宿主运行在同一个 JavaScript realm,eval、原型篡改等行为在技术上不可完全拦截;只要求可观测与留痕,不得宣称为「已守护」。 |
| 信任页正式域名 | 开发期使用独立源;网页正式部署的独立子域尚未确定,不写入文档承诺。 |
| 调试通道 | 调试接口只在调试构建存在;发布构建必须不注册、不监听,并以产物扫描兜底。 |