docs(kernelboot): ID:14 已完成,同步 registry_test.go 失败面第 4 条

## 为什么改
bootgraph_test.go(原 internal/kernelboot/modules/registry_test.go)文件头
「失败面」一节第 4 条是**历史实测记录**,原文结句写着:

    要"红得干净"得让 kernelboot.Run 对 nil 依赖显式报错 —— 那是业务改动,
    不在本线权限内,已记入待办。

ID:14(e70c2b5)做完之后这句成了**假信息**:留着比删掉更有害 ——
下次有人照着它判断「Run 不拦 nil 依赖」,会得出与事实相反的结论。
同时 kernelstate.go 的注释已改成「Run 会显式拦」,两边口径不一致更要命。

## 改了什么(纯注释,**零行为改动**)
- 原记录的「崩在业务代码里」形态**保留**,但明确标注为「ID:14 之前的形态,
  作为为什么需要执行期校验的原始证据」
- 新增「已完成(ID:14,提交 e70c2b5)」小节,写清现在的行为与**实测**结果
- 指向专用回归判据(runtime_dep_test.go / runtimedep_test.go)

## 注释里那句「换成可读报错」是实测过的(非声称)
用真实登记表 kernelmod.Registered() 算 plan 后注入两种变异,均得
*DependencyNotReadyError,**无 panic / SIGSEGV**:
  · 整层逆序    ⇒ 第 0 层拒(produced 为空)
    模块 agent 缺设施 [docmem knowledge llm memory stagehost textmem tracker];
    模块 plugin-host 缺设施 [config docmem kernel-io knowledge lua memory
    stagehost supervisor textmem tracker]
  · 跳过第 2 层 ⇒ 第 2 层拒
    模块 stage-host 缺设施 [knowledge llm textmem]

(初稿写成「第 1 层 … 模块 llm 缺设施 [lua]」,与实测不符,已按实际输出改正。)

## 校验
git diff 中非注释行改动 = 0(grep 计数)
go build ./... = 0 error,go vet ./... = 0 warning
go test ./internal/kernelboot/ ./internal/kernelmod/all/ = ok
This commit is contained in:
JianFeeeee
2026-10-24 12:58:40 +08:00
parent 3864f36992
commit 1905d32053

View File

@ -87,13 +87,29 @@ package all
// //
// 4. 把 Run 的层执行顺序改成逆序 // 4. 把 Run 的层执行顺序改成逆序
// ⇒ 判据 1/2/3/4 红,但**红在装配失败**(第 4 层模块拿到 nil 依赖: // ⇒ 判据 1/2/3/4 红,但**红在装配失败**(第 4 层模块拿到 nil 依赖:
// 「agent 依赖的设施 "memory" 对应的数据为 nil」), // 「agent 依赖的设施 “memory” 对应的数据为 nil」),
// 不是「层间顺序断言」咬的 —— 装配先于断言就炸了。 // 不是「层间顺序断言」咬的 —— 装配先于断言就炸了。
// ⇒ 把某一层整个跳过:**内核 panic**(llm.buildProviderManager 拿到 // ⇒ 把某一层整个跳过:**内核 panic**(llm.buildProviderManager 拿到
// 0x0 的 LuaVM,SIGSEGV)。仍是红的,但形态是崩溃不是可读断言。 // 0x0 的 LuaVM,SIGSEGV)。仍是红的,但形态是崩溃不是可读断言。
// ★ 结论:这两种改动确实能被发现,但报错可读性差(崩在业务代码里)。 // ★ 以上是 **ID:14 之前**的形态(2026-10-24 实测记录,保留下来
// 要"红得干净"得让 kernelboot.Run 对 nil 依赖显式报错 —— 那是业务改动, // 作为“为什么需要执行期校验”的原始证据)。
// 不在本线权限内,已记入待办。 //
// ✅ **已完成(ID:14,提交 e70c2b5)**:kernelboot.Run 现在在**每层 Init
// 之前**先校“本层依赖 ⊆ 此前真跑完的层实际产出的设施”,缺就返回
// *DependencyNotReadyError(指名模块名 + 缺哪些设施),**本层一个
// Init 都不调**。用真实登记表实测,同一个变异变成可读报错:
// · 逆序 ⇒ 第 **0** 层就拒(produced 为空):
// 「模块 agent 缺设施 [docmem knowledge llm …];
// 模块 plugin-host 缺设施 [config docmem …]」
// · 跳过第 2 层 ⇒ 第 **2** 层拒:
// 「模块 stage-host 缺设施 [knowledge llm textmem]」
// **两种都不再是 panic / SIGSEGV**。
//
// ⇒ 下次看到本条,请不要据此认为“Run 不拦 nil 依赖”;它现在拦。
// 另:该行为的专用回归判据在 internal/kernelmod/all/runtime_dep_test.go
// (A 正序不误报 / B 交换两层 / C 删提供者整层)与
// internal/kernelboot/runtimedep_test.go(纯逻辑四形状 + 防预填自检)——
// 那两组比在本节做整机变异快得多,改代码时优先跑它们。
// //
// 5. 某层不再登记关闭函数(模块忘调 AddCloser / 层边界钩子丢了) // 5. 某层不再登记关闭函数(模块忘调 AddCloser / 层边界钩子丢了)
// ⇒ 判据 3 红(哨兵数量不符)。与第 7 条同支路,实测由第 7 条覆盖。 // ⇒ 判据 3 红(哨兵数量不符)。与第 7 条同支路,实测由第 7 条覆盖。