Register/Unregister/Resolve ported to microkernel, integrated with the
committed main.go shapes (PluginManifest typed struct; Hooks widened to
map[string]interface{} for oracle parity — the manifest carries bool
enabled flags). Resolve: priority ladder (lower = higher), active-only
filter, stable tie order. 6-case battery from the live oracle with a
tmp-REGISTRY_DB seam (the reactive store isolated). The oracle fixtures
corrected my snapshot approach: the registry is PERSISTED per-op, so the
truth reloads from the store rather than trusting a stale in-memory
object.
72 lines
2.6 KiB
Python
72 lines
2.6 KiB
Python
#!/usr/bin/env python3
|
|
"""gen_microkernel_truth.py — factory batch 8 truth battery (live oracle)."""
|
|
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
REPO = Path(__file__).resolve().parent.parent
|
|
sys.path.insert(0, str(REPO / "src"))
|
|
sys.path.insert(0, str(REPO / "src" / "rune"))
|
|
|
|
import microkernel as mk # noqa: E402
|
|
|
|
FROZEN = "2026-10-07T23:35:00"
|
|
|
|
|
|
def main():
|
|
mk.now_iso = lambda: FROZEN
|
|
cases = []
|
|
|
|
def snap(reg, name):
|
|
return {
|
|
"plugins": {k: {"active": v["active"], "registered_at": v["registered_at"]}
|
|
for k, v in reg["plugins"].items()},
|
|
"capabilities": reg["capabilities"],
|
|
"hooks": reg["hooks"],
|
|
}
|
|
|
|
# register + resolve priority tie
|
|
import tempfile, os as _os
|
|
_tmpdb = _os.path.join(tempfile.mkdtemp(prefix="mk-truth-"), "registry.json")
|
|
mk.REGISTRY_DB = _tmpdb
|
|
|
|
def _snap():
|
|
return mk._load_registry()
|
|
mk.register({"name": "alpha", "capabilities": ["cap.a"], "priority": 50})
|
|
mk.register({"name": "beta", "capabilities": ["cap.a"], "priority": 10})
|
|
mk.register({"name": "gamma", "capabilities": ["cap.a"], "priority": 10, "auto_activate": False})
|
|
mk.register({"name": "delta", "hooks": {"pre-turn": True, "post-turn": False}})
|
|
cases.append({"fn": "state", "name": "after_registers", "input": {},
|
|
"expected": snap(_snap(), "x")})
|
|
cases.append({"fn": "resolve", "name": "priority_active",
|
|
"input": {"capability": "cap.a"},
|
|
"expected": {"resolved": mk.resolve("cap.a")}})
|
|
cases.append({"fn": "resolve", "name": "unknown_cap",
|
|
"input": {"capability": "cap.nope"},
|
|
"expected": {"resolved": mk.resolve("cap.nope")}})
|
|
|
|
# unregister removes from indexes
|
|
mk.unregister("beta")
|
|
cases.append({"fn": "state", "name": "after_unregister", "input": {},
|
|
"expected": snap(_snap(), "x")})
|
|
cases.append({"fn": "resolve", "name": "after_unregister",
|
|
"input": {"capability": "cap.a"},
|
|
"expected": {"resolved": mk.resolve("cap.a")}})
|
|
|
|
# error texts
|
|
err1 = mk.register({})
|
|
err2 = mk.unregister("nope")
|
|
cases.append({"fn": "errors", "name": "shapes", "input": {},
|
|
"expected": {"register_empty": err1, "unregister_unknown": err2}})
|
|
|
|
out = {"oracle": "src/rune/microkernel.py (live)", "generated": "2026-10-07",
|
|
"frozen_now": FROZEN, "cases": cases}
|
|
(REPO / "src/go/microkernel" / "truth_microkernel.json").write_text(
|
|
json.dumps(out, indent=1) + "\n")
|
|
print(f"wrote {len(cases)} cases")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|