feat(cordis): 完成阶段5访问介导与诊断
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# ShrinkContext.Core
|
||||
|
||||
《Cordis: A Programming Paradigm for Spatiotemporal Composability》核心机制的 Unity/C# 原型(改造方案见仓库根 `CORDIS_MIGRATION.md` 的阶段 0 产物)。
|
||||
《Cordis: A Programming Paradigm for Spatiotemporal Composability》核心机制的 Unity/C# 实现(改造方案与当前边界见仓库根 `CORDIS_MIGRATION.md`)。
|
||||
|
||||
## 定位
|
||||
|
||||
@@ -9,16 +9,17 @@
|
||||
- **可逆效应**(时间可组合性,论文 3.1 / 算法 1):`ctx.Effect / EffectAsync`,前向执行时产出逆操作,运行时按 LIFO 累积,卸载即回滚;
|
||||
- **响应式余效应**(空间可组合性,论文 3.2 / 算法 2、3):`ctx.Set / Get`,依赖键的安装/撤回自动通知依赖者,组件在依赖全部可用时激活、失效时停用、换提供者时重载;
|
||||
- **纤程生命周期**(论文 4 / 算法 4、5):`runtime.Use(component)` 实例化组件为纤程,惯性状态机 `Loading → Active → Unloading → Inactive`,卸载先等待依赖者排空再回滚自身效应,父卸载级联子卸载。
|
||||
- **声明式协调与访问介导**:加载器以事务更新期望组合,失败时恢复旧组合;`isolate / intercept` 控制解析域与服务视图,组件供给受 `Provide` 声明约束。
|
||||
|
||||
## 目录结构
|
||||
|
||||
| 目录 | 说明 |
|
||||
|---|---|
|
||||
| `Runtime/Context/` | `ShrinkCtx`(一等上下文、隔离派生、介导访问)与 `ShrinkEffectHandle`(算法 1) |
|
||||
| `Runtime/Coeffects/` | 绑定与异常类型(供给冲突、未声明/未激活访问) |
|
||||
| `Runtime/Coeffects/` | 绑定、强类型版本键、访问策略与异常类型 |
|
||||
| `Runtime/Fibers/` | `IShrinkComponent`(inject/provide/apply)、`ShrinkFiber`、分步效应接口 |
|
||||
| `Runtime/Loader/` | 声明式加载器(论文 5.2 原型子集):`ShrinkLoaderEntry` / `ShrinkComponentCatalog` / `ShrinkContextLoader` 增量协调 |
|
||||
| `Runtime/` | `ShrinkContextRuntime`(注册表 + 算法 2-5)、`ShrinkContextDefaults`(Domain Reload 重置) |
|
||||
| `Runtime/Loader/` | 声明式加载器:`ShrinkLoaderEntry` / `ShrinkComponentCatalog` / `ShrinkContextLoader` 增量协调、事务恢复与条目诊断 |
|
||||
| `Runtime/` | `ShrinkContextRuntime`(注册表 + 算法 2-5 + notify 倒排索引)、诊断快照与 Domain Reload 重置 |
|
||||
| `Tests/` | EditMode 测试:对照论文定理 7/16/20/63/64 与算法 1/2/3/4/5/6 的可观察行为 + 加载器协调行为 |
|
||||
|
||||
## 论文 → API 对照
|
||||
@@ -28,12 +29,13 @@
|
||||
| `ctx.effect(callback)` → dispose | `ShrinkCtx.Effect / EffectAsync` → `ShrinkEffectHandle.DisposeAsync`(armed 单次执行,等待进行中前向) |
|
||||
| `ctx.get/set`(算法 2) | `ShrinkCtx.Set<T>`(可逆,安装+通知 / 撤回+通知) |
|
||||
| `ctx.isolate(key, realm)` | `ShrinkCtx.Isolate`(派生子上下文,丢弃即恢复) |
|
||||
| 代理介导访问(算法 6) | `ShrinkCtx.Get<T>/TryGet`(沿纤程链解析已提交视图;未声明/未激活访问抛异常) |
|
||||
| `ctx.intercept(key, metadata)` | `ShrinkCtx.Intercept`(派生访问元数据;provider 通过 `IShrinkCoeffectAccessPolicy` 返回受限视图或拒绝访问) |
|
||||
| 代理介导访问(算法 6) | `ShrinkCtx.Get<T>/TryGet`(沿纤程链解析已提交视图;未声明/未激活/策略拒绝分别抛出不同异常) |
|
||||
| `ctx.use(component)`(算法 4) | `ShrinkContextRuntime.Use`(实例化是父上下文的可逆效应 → 级联卸载;支持条目级 isolate 叠加) |
|
||||
| 声明式配置 + 协调(论文 5.2) | `ShrinkContextLoader.ApplyAsync`(条目消失→退役;disabled→卸载;组件/配置变化→重建;无变化→幂等;依赖缺失→条目保持被管理并等待) |
|
||||
| 声明式配置 + 协调(论文 5.2) | `ShrinkContextLoader.ApplyAsync`(预校验期望组合;条目消失→退役;组件/配置变化→重建;intercept 变化→原位更新;失败→恢复旧组合) |
|
||||
| refresh/reload/unload(算法 5) | `RunTransitionAsync`(惯性链式转换;卸载先 drain 依赖者) |
|
||||
| notify(算法 3) | `ShrinkContextRuntime.Notify`(realm 一致的依赖者刷新) |
|
||||
| target = 提供者 uid 集合 | `ShrinkFiber.Target`(uid 永不复用:同值不同提供者也触发重载) |
|
||||
| notify(算法 3) | `ShrinkContextRuntime.Notify`(`key → inject fibers` 倒排索引选候选,再按 realm 过滤) |
|
||||
| target = 按 inject 顺序解析的提供者 uid | `ShrinkFiber.Target`(保留键顺序与重复依赖;uid 永不复用,因此同值换提供者也会重载) |
|
||||
| `𝔈iterΓ` 分步效应 | `IShrinkIterativeComponent.ApplySteps`(自定义 UniTask 步进器,步进边界守卫 → 部分回滚;不用 IAsyncEnumerable,规避 Mono ValueTask 迭代器的非内联调度) |
|
||||
| fiber.committed 提交视图 | `ShrinkFiber.Committed`(装载前提交,拆除完才丢弃) |
|
||||
|
||||
@@ -41,6 +43,7 @@
|
||||
|
||||
- 定理 7(恢复初始上下文)/ 定理 16(LIFO)/ 选择性撤销 / armed 幂等 / dispose 等待进行中前向
|
||||
- set 可逆性、介导访问纪律(UNDECLARED / INACTIVE)、隔离域派生与丢弃恢复
|
||||
- 未声明供给回滚、访问策略拒绝、intercept 原位更新与只读服务视图
|
||||
- 依赖驱动激活、缺依赖静默非活动、晚到提供者激活
|
||||
- 退役次序:依赖者先于提供者逆操作排空(drain-before-inverse)
|
||||
- 提供者替换重载(含同值替换,uid 语义)
|
||||
@@ -48,14 +51,16 @@
|
||||
- 惯性:装载中途退役永不 Active、链式卸载(论文 4.3.3)
|
||||
- 分步效应部分回滚(定理 64)
|
||||
- apply 失败的部分效应回滚(L-Raise)
|
||||
- 加载器失败恢复旧组合、跨 realm 替换隔离、notify 倒排索引候选计数与运行时诊断
|
||||
- Domain Reload 重置
|
||||
|
||||
## 明确不在本原型内(后续阶段)
|
||||
## 当前边界
|
||||
|
||||
- 声明式配置树加载器与增量协调(阶段 2)
|
||||
- 热模块替换 / ModFramework 合流(阶段 4,受 Unity 程序集不可卸载约束,回滚单位是纤程实例)
|
||||
- 拦截(intercept)与细粒度访问控制(阶段 5)
|
||||
- 主线程泵与 MonoBehaviour 宿主、notify 的 key→fibers 倒排索引(性能)
|
||||
- `intercept` 是经 `ShrinkCtx.Get` 的能力介导,不是对不可信 DLL 的内存、反射、文件或网络沙箱。
|
||||
- loader 的 isolate 变化仍通过重建条目生效;尚未提供运行中 fiber 的原位 realm 迁移。
|
||||
- 强类型版本键是新增契约,现有字符串键不会在阶段 5 被一次性重写。
|
||||
- 尚未提供 ScriptableObject/JSON 配置资产、Editor 调试面和正式容量基准。
|
||||
- 主线程宿主与 Unity PlayerLoop 调度仍由上层应用负责。
|
||||
- 跨进程/独立服务器上下文
|
||||
|
||||
## 约定
|
||||
|
||||
Reference in New Issue
Block a user