Files
rune/scripts/gen_microkernel_truth.py
T
Nick 4c7ee39f61 feat(go): factory batch 8 — microkernel registry primitives (contract BUILDER-2026-10-07T23:35:52Z-see-contract)
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.
2026-10-08 00:41:51 +01:00

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()