CASE 02 · runner-passed / production-unknown
Lifecycle & Ownership
把启动、Scope、取消、清理与失败回退变成同一运行时协议
runner-passed / production-unknown把启动、Scope、取消、清理与失败回退变成同一运行时协议
Problem
模块能正常启动并不代表它能在重复初始化、取消、退出或启动失败时保持一致。
Constraints
App、Gameplay、Scene 与纯 C# Scope 的 Owner 不同;异步退出必须等待或取消;诊断不能改变产品行为。
Naive Approach
用静态单例承接全部服务,并只测试正常启动路径。
Architecture Decision
显式 composition root、immutable registry、Scope Owner、startup rollback 与 async exit,清理责任由创建者持有。
System Model
注册阶段冻结依赖;启动建立 Scope;运行期间由明确 Tick Owner 驱动;退出按逆序取消、释放并发布诊断。
Failure Model
重复初始化、注册后变更、启动中途异常、退出超时和残留订阅都有独立失败路径。
Trade-offs
协议更严格,模块作者需要实现完整生命周期;换来可重入、可诊断和可测试的运行时。
Implementation
Runtime Foundation 已覆盖 startup failure、diagnostics、scope ownership、async exit、immutable registry 与 gameplay session。
Evidence
该生命周期收敛在 exact Framework commit 具备 local-passed 与 same-SHA runner-passed 记录。
Consumer
Bootstrap 与多个 Gameplay Consumer 通过显式 Scope 使用基础服务;Consumer 仍拥有玩法和场景生命周期。
Known Limitations
Runner 证明测试工作流,不等于 Release 或真实 Production 长时运行。
What Changed After Validation
验证把退出从同步清理扩展为可等待、可取消的协议,并增加启动失败回滚和只读诊断。
CONTINUE THE SYSTEM