报告 002 · 实际 go-mini 的运行边界实验
日期:2026-09-19。证据层次:受控原型。状态:完成本实验机制实验;未测试模型认知质量、真实持久恢复或长期性能。
1. 固定条件
使用本地 go-mini 提交 7c195d95fb8894f394e8ebf22299388a767afd60,没有修改该仓库。Go 版本为 go1.27.1-X:nodwarf5,平台为 Linux/amd64,编译采用 OptimizationDefault 并保留符号。实验为独立 Go module,根项目依赖和产品代码不变。
夹具由真实 .mgo 源码编译和运行。每个合成步骤两次命名调用 Policy(),得到 (a,b),累加 10*a+b 到实例 global total。版本 1 返回 1,版本 2 返回 2。FFI 检查点明确控制更新位置,不用睡眠猜测执行时序。
此处“步骤完成”仅指合成计算已结束,不涉及数据库提交或真实外部动作。宿主保存的 checkpoint 只是同一进程内的整数,不代表已验证断电或进程崩溃恢复。
2. 生命周期与热更新结果
| 条件 | 四个步骤的输出对 | 最终 total | 观测 |
|---|---|---|---|
| 不更新,长驻入口 | 11、11、11、11 | 44 | 基线 |
| 第一步结束后更新,入口继续 | 11、22、22、22 | 77 | 更新后仍保留版本 1、2;入口及 scope 结束后只保留版本 2 |
| 第一步结束并退出 scope,再更新和重入 | 11、22、22、22 | 77 | 重入前已只保留版本 2,global total 连续 |
| 第一步两次调用之间更新 | 12、22、22、22 | 78 | 一个逻辑步骤内混用了两个版本 |
| 第一步后新建实例,不恢复 checkpoint | 11、22、22、22 | 66 | 新实例丢失此前累计值 11 |
| 第一步后新建实例,显式恢复 checkpoint | 11、22、22、22 | 77 | 在这份完整整数状态下恢复连续 |
表中 11 表示 (1,1),不是模型质量分数。新实例的 generation 从 1 开始,不能据此把它解释成旧实例版本倒退。
长驻边界更新的 Run scope 执行 413 条指令;分段两次 Run 分别执行 110、312 条,共 422 条。这个数只包含 Run 的 scope,未计入宿主调用、初始化、Read/Restore 等成本;不能作为系统性能优劣或模型开销结论。
3. 全局闭包反例
在空闲实例中保存版本 1 创建的闭包,再更新到版本 2:
- 新的命名调用返回 2,已保存闭包仍返回 1。
- 此时没有长期活动入口,旧版本仍被保留;摘要显示其显式 Pins 为 0、GlobalRoot 为 true。
- 显式清除全局闭包后,只保留版本 2。
这否定“只要运行段返回,就会释放所有旧代码”的概括。需要分别观察旧帧、global、闭包与资源回调的生命周期。若业务允许保留旧闭包,它也需要明确的版本归属;不能把它误当作随补丁自动升级的调用。
默认 RevisionRoots 的 10,000 节点预算在本夹具中被耗尽,返回 Complete=false 且没有路径。报告保留了这个不完整结果,没有把空路径解释为无引用,也没有提高扫描预算后覆盖原结果。上述 global 归因依据是摘要的 GlobalRoot、闭包对照和显式清除后的变化,不是声称路径扫描成功定位了它。
4. 配额实验及修订
原先计划直接给带 FFI 的夹具设置 MaxSteps=500。实际在根模块初始化时已经失败:
initialize root module: fn.init instruction 24 const:
execution step limit exceeded: max 500
失败保留在试跑日志,最终程序也单独记录该配置的初始化失败。没有把限额调高后声称原条件通过。
为了隔离业务 scope 的计费,追加一个不导入标准库的纯整数夹具,继续使用同样的 500 指令限额和预定工作量:
| 条件 | 结果 |
|---|---|
| 单 scope 执行 1000 次迭代 | 在累计 500 指令时失败 |
| 同一 scope 在 100 指令后热更新 | 更新前后计数均为 100,仍在累计 500 指令时失败 |
| 同一实例中 100 个 scope,各 10 次迭代 | 全部完成,每 scope 159 指令,合计 15,900 指令,最终 total=1000 |
分段获得新的 scope 配额,热更新和 Poll 分片不会重置当前 scope 配额。15,900 指令成功不是“500 指令完成了整个活动”;如果仅限制 scope,长活动可以通过不断重入持续获得新预算。
因此初始化配额、运行段配额和活动总预算应分别研究。默认累计限额是否适合特定标准库依赖,也不能仅凭最小纯计算脚本推断。
5. 实验驱动修正
首次试跑在补丁场景超时。检查发现驱动把 PollSteps 的所有错误都当成停止手动推进的信号,其中包括契约允许的临时 ErrBusy;随后转入 Wait 时可能遇到需要实验驱动释放的 FFI 检查点。驱动已按契约对 ErrBusy 重试,并使用独立的有界清理 context。没有扩大实验执行期限。
最终运行记录到一次 busy 重试,其他主要条件为零。首次试跑未记录完整调度轨迹,因此这里只说明已发现并修正的驱动问题,不将其包装成 go-mini 故障或已完全复现的内部原因。
随后配额试跑暴露初始化失败,按第 4 节保留失败并增加隔离对照。最终所有既定输出断言、闭包对照和追加配额条件均完成。
6. 对设计的更新
保留:业务边界独立于 VM 安全点。 如果希望一个对外决策的步骤只使用一代逻辑,就需要宿主约束更新时间。VM 允许安全切换不等于业务步骤版本一致。
修正:运行段结束是回收手段之一。 它可以释放旧帧,但不能替代 global 和回调的生命周期管理,也没有证明必须定期重启实例。
保留为候选:同实例重入。 该合成状态下与长驻边界更新输出相同。它不要求同时结束模型会话或压缩上下文。
新增研究约束:活动总预算不从 scope 配额推导。 重入可能用于资源整理,但不能让活动因重入获得无限新预算。
继续开放:认知状态表示和分段策略。 整数 checkpoint 没有验证目标、假设、未完成问题等语义状态能否正确恢复,也没有证明长期运行稳定或分段成本可接受。
- 实验源码与运行说明
- 完整 JSON 结果
- 最终运行日志
- 输入和环境记录
运行只依赖本地相邻源码和已有 Go 环境,网络下载关闭。原始输出含各条件的值、scope 指令数、版本摘要及截断的引用扫描,保留所有 100 个配额分段。
下一项 E1 实验转向模型上下文与会话连续性。在模型服务和预算确定前,不生成认知质量分数,不用这次机制实验替代模型对照。
数据可用性
本报告公开实验条件、汇总统计和失败分析。原始输入、脚本及逐次运行记录未随报告发布,因此不能仅凭本文独立复现实验。