Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

报告 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、1144基线
第一步结束后更新,入口继续11、22、22、2277更新后仍保留版本 1、2;入口及 scope 结束后只保留版本 2
第一步结束并退出 scope,再更新和重入11、22、22、2277重入前已只保留版本 2,global total 连续
第一步两次调用之间更新12、22、22、2278一个逻辑步骤内混用了两个版本
第一步后新建实例,不恢复 checkpoint11、22、22、2266新实例丢失此前累计值 11
第一步后新建实例,显式恢复 checkpoint11、22、22、2277在这份完整整数状态下恢复连续

表中 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 实验转向模型上下文与会话连续性。在模型服务和预算确定前,不生成认知质量分数,不用这次机制实验替代模型对照。

数据可用性

本报告公开实验条件、汇总统计和失败分析。原始输入、脚本及逐次运行记录未随报告发布,因此不能仅凭本文独立复现实验。