CASE 02 · runner-passed / production-unknown

Lifecycle & Ownership

把启动、Scope、取消、清理与失败回退变成同一运行时协议

runner-passed / production-unknown把启动、Scope、取消、清理与失败回退变成同一运行时协议

01

Problem

模块能正常启动并不代表它能在重复初始化、取消、退出或启动失败时保持一致。

02

Constraints

App、Gameplay、Scene 与纯 C# Scope 的 Owner 不同;异步退出必须等待或取消;诊断不能改变产品行为。

03

Naive Approach

用静态单例承接全部服务,并只测试正常启动路径。

04

Architecture Decision

显式 composition root、immutable registry、Scope Owner、startup rollback 与 async exit,清理责任由创建者持有。

05

System Model

注册阶段冻结依赖;启动建立 Scope;运行期间由明确 Tick Owner 驱动;退出按逆序取消、释放并发布诊断。

06

Failure Model

重复初始化、注册后变更、启动中途异常、退出超时和残留订阅都有独立失败路径。

07

Trade-offs

协议更严格,模块作者需要实现完整生命周期;换来可重入、可诊断和可测试的运行时。

08

Implementation

Runtime Foundation 已覆盖 startup failure、diagnostics、scope ownership、async exit、immutable registry 与 gameplay session。

09

Evidence

该生命周期收敛在 exact Framework commit 具备 local-passed 与 same-SHA runner-passed 记录。

10

Consumer

Bootstrap 与多个 Gameplay Consumer 通过显式 Scope 使用基础服务;Consumer 仍拥有玩法和场景生命周期。

11

Known Limitations

Runner 证明测试工作流,不等于 Release 或真实 Production 长时运行。

12

What Changed After Validation

验证把退出从同步清理扩展为可等待、可取消的协议,并增加启动失败回滚和只读诊断。