Files
rune/scripts/gen_iteration_truth.py
T

272 lines
13 KiB
Python

#!/usr/bin/env python3
"""Freeze the dichotomy-wave truth corpus for src/rune/iteration.py.
LAW (poisoned-truth): RUNE_IT_CORE=python is pinned at the top — truth is
generated by the PYTHON ORACLE ONLY, never by the kernel under test.
RUNE_LEDGER_CORE=python pins the capability ledger to its Python floor.
The evidence_provenance cdylib stays LIVE: it is part of the oracle stack
(behaviour_ledger has no Python floor) and is already parity-verified.
Every public function is exercised across ALL branches. Timestamps:
iteration._now / behaviour_ledger._now are monkeypatched to a FIXED value
so the frozen corpus is byte-stable; the Rust kernel receives `now` as an
argument (the same determinism seam the facade uses live).
"""
import copy
import json
import os
import shutil
import sys
import tempfile
from pathlib import Path
os.environ["RUNE_IT_CORE"] = "python" # poisoned-truth law
os.environ["RUNE_LEDGER_CORE"] = "python" # capability_ledger floor
REPO = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(REPO / "src"))
sys.path.insert(0, str(REPO / "src" / "rust" / "evidence_provenance"))
import rune.iteration as it # noqa: E402
import rune.behaviour_ledger as bl_mod # noqa: E402
from rune.structural_model import StructuralModel # noqa: E402
from rune.capability_ledger import CapabilityLedger # noqa: E402
from rune.behaviour_ledger import BehaviourLedger # noqa: E402
FIXED_NOW = "2026-10-12T00:00:00Z"
it._now = lambda: FIXED_NOW
bl_mod._now = lambda: FIXED_NOW
OUT = REPO / "src" / "rust" / "iteration" / "src" / "frozen_it_truth.json"
cases = []
def case(fn, name, args, expect):
cases.append({"fn": fn, "name": name,
"args": args, "expect": expect})
def build_fixture(tmp):
model = StructuralModel(Path(tmp) / "model", "demo")
model.add("subsystem", "core")
model.add("component", "alpha", parent="subsystem:core",
ext={"source": "src/alpha.py"})
model.add("component", "beta", parent="subsystem:core")
for e in model.doc["entities"]:
if e["id"] == "component:beta":
e["identities"]["source"] = "src/beta.py"
model.add("interface", "api")
model.add("interface", "legacy")
model.add("state_store", "db")
model.add("test_suite", "t1")
model.add("deployment_surface", "prod")
model.add("component", "gamma", parent="subsystem:core")
model.add("component", "delta", parent="subsystem:core")
model.relate("component:alpha", "provides", "interface:api")
model.relate("component:gamma", "consumes", "interface:api")
model.relate("component:delta", "depends_on", "component:alpha",
status="stale")
model.relate("component:alpha", "consumes", "interface:legacy")
model.relate("component:alpha", "owns", "state_store:db")
model.relate("component:alpha", "verified_by", "test_suite:t1")
model.relate("component:alpha", "deployed_by", "deployment_surface:prod")
model.relate("component:gamma", "provides", "interface:legacy")
model.relate("component:gamma", "owns", "state_store:db")
model.save()
ledger = CapabilityLedger(Path(tmp) / "ledger")
ledger.define(
capability_id="alpha-cap", name="alpha", purpose="alpha purpose",
owning_project="demo", component="component:alpha",
source_locations=["src/alpha.py", "src/alpha_util.py"],
contract="alpha contract", state_touched="state_store:db",
dependencies=["interface:legacy"], consumers=["component:gamma"],
invariants=["inv-1"], behaviour_specs=["b-alpha"],
constraints="no network", generation="g1")
ledger.define(
capability_id="beta-cap", name="beta", purpose="beta purpose",
owning_project="demo", component="component:beta",
source_locations=["src/beta.py"])
ledger.doc["capabilities"]["capability:beta-cap"]["maturity"] = "retired"
ledger.define(
capability_id="gamma-cap", name="gamma", purpose="gamma purpose",
owning_project="demo", component="component:gamma",
source_locations=["src/gamma.py", "src/gamma_more.py"])
behaviours = BehaviourLedger(Path(tmp) / "behaviours")
behaviours.define(
behaviour_id="b-alpha", owning_project="demo",
intended_behaviour="alpha behaves", owner_component="component:alpha",
dependencies=["component:beta"])
behaviours.define(
behaviour_id="b-gamma", owning_project="demo",
intended_behaviour="gamma behaves", owner_component="component:gamma")
behaviours.record_real_world("b-alpha", passed=True, detail="ok")
return model, ledger, behaviours
def main():
tmp = tempfile.mkdtemp(prefix="it_truth_")
try:
model, ledger, behaviours = build_fixture(tmp)
model_doc = model.doc
ledger_doc = ledger.doc
bh_doc = behaviours.doc
# ── context_packet ────────────────────────────────────────────
r = it.context_packet(model, ledger, "component:alpha")
case("context_packet", "alpha_full",
{"model": model_doc, "ledger": ledger_doc,
"target": "component:alpha", "now": FIXED_NOW}, r)
r = it.context_packet(model, ledger, "nope:missing")
case("context_packet", "unknown_target",
{"model": model_doc, "ledger": ledger_doc,
"target": "nope:missing", "now": FIXED_NOW}, r)
r = it.context_packet(model, ledger, "component:gamma",
intent="ship gamma", basis_summary={"depth": 2})
case("context_packet", "gamma_intent_basis",
{"model": model_doc, "ledger": ledger_doc,
"target": "component:gamma", "intent": "ship gamma",
"basis_summary": {"depth": 2}, "now": FIXED_NOW}, r)
r = it.context_packet(model, ledger, "component:alpha",
max_local_files=1)
case("context_packet", "alpha_truncated",
{"model": model_doc, "ledger": ledger_doc,
"target": "component:alpha", "max_local_files": 1,
"now": FIXED_NOW}, r)
r = it.context_packet(model, ledger, "component:beta")
case("context_packet", "beta_identities_source",
{"model": model_doc, "ledger": ledger_doc,
"target": "component:beta", "now": FIXED_NOW}, r)
r = it.context_packet(model, ledger, "interface:api")
case("context_packet", "interface_target",
{"model": model_doc, "ledger": ledger_doc,
"target": "interface:api", "now": FIXED_NOW}, r)
r = it.context_packet(model, ledger, "project:demo")
case("context_packet", "root_project",
{"model": model_doc, "ledger": ledger_doc,
"target": "project:demo", "now": FIXED_NOW}, r)
empty = CapabilityLedger.__new__(CapabilityLedger)
empty.doc = {"schema_version": 1, "capabilities": {}}
r = it.context_packet(model, empty, "component:alpha")
case("context_packet", "empty_ledger",
{"model": model_doc, "ledger": empty.doc,
"target": "component:alpha", "now": FIXED_NOW}, r)
# ── predictive_impact ─────────────────────────────────────────
for name, target in [("alpha", "component:alpha"),
("unknown", "nope:missing"),
("leaf", "component:beta")]:
r = it.predictive_impact(model, target)
case("predictive_impact", name,
{"model": model_doc, "target": target}, r)
# ── descriptive_impact ────────────────────────────────────────
for name, kwargs in [
("full_overlap", {"observed_changed": ["component:alpha",
"component:gamma"]}),
("unexpected", {"observed_changed": ["component:alpha",
"surprise:one"]}),
("none_observed", {"observed_changed": []}),
]:
r = it.descriptive_impact(model, "component:alpha", **kwargs)
case("descriptive_impact", name,
{"model": model_doc, "target": "component:alpha",
"observed_changed": kwargs["observed_changed"],
"now": FIXED_NOW}, r)
r = it.descriptive_impact(model, "component:alpha",
observed_changed=["component:gamma"],
generation="g7")
case("descriptive_impact", "generation_tag",
{"model": model_doc, "target": "component:alpha",
"observed_changed": ["component:gamma"],
"generation": "g7", "now": FIXED_NOW}, r)
r = it.descriptive_impact(model, "nope:missing",
observed_changed=["x"])
case("descriptive_impact", "unknown_target",
{"model": model_doc, "target": "nope:missing",
"observed_changed": ["x"], "now": FIXED_NOW}, r)
# ── record_impact_delta (exact jsonl line — file IO facade) ───
deltas = [
{"target": "component:alpha", "generation": "g1",
"predicted": ["component:alpha"], "observed": [],
"unexpected": [], "unaffected_as_predicted":
["component:alpha"], "recorded_at": FIXED_NOW},
{"b": 1, "a": [1.5, 2], "c": None, "s": "é\nx"},
{"nested": {"z": True, "y": 0.1}},
]
for i, delta in enumerate(deltas):
d = Path(tmp) / f"deltas{i}"
d.mkdir()
it.record_impact_delta(d, delta)
line = (d / "impact_deltas.jsonl").read_text()
assert line.endswith("\n") and line.count("\n") == 1
case("record_impact_delta", f"line{i}", {"delta": delta},
line[:-1])
# ── invalidate_behaviours ─────────────────────────────────────
for name, changed in [
("hit_deps_and_owner", {"component:alpha", "component:beta"}),
("owner_only", {"component:gamma"}),
("no_intersection", {"component:delta"}),
]:
b = BehaviourLedger.__new__(BehaviourLedger)
b.doc = copy.deepcopy(bh_doc)
recs = it.invalidate_behaviours(
model, b, changed_entities=changed, generation="g9")
case("invalidate_behaviours", name,
{"behaviours": bh_doc, "changed": sorted(changed),
"generation": "g9", "now": FIXED_NOW},
{"doc": b.doc, "recs": recs})
# ── post_change_obligations ───────────────────────────────────
for name, target, changed in [
("alpha_default", "component:alpha", None),
("alpha_two_changed", "component:alpha",
["component:alpha", "component:gamma"]),
("beta_leaf", "component:beta", None),
("gamma_consumes_iface", "component:gamma", None),
("delta_stale_dep", "component:delta", None),
("unknown_in_changed", "component:beta",
["component:beta", "ghost:x"]),
]:
if changed is None:
r = it.post_change_obligations(model, target)
args = {"model": model_doc, "target": target}
else:
r = it.post_change_obligations(
model, target, changed_entities=set(changed))
args = {"model": model_doc, "target": target,
"changed": changed}
case("post_change_obligations", name, args, r)
r = it.post_change_obligations(model, "component:alpha",
behaviours=behaviours)
case("post_change_obligations", "alpha_with_behaviours",
{"model": model_doc, "target": "component:alpha",
"behaviours": bh_doc}, r)
# ── _now (literal-100% residue: oracle stamp shape) ──────────
import time as _t
for name, epoch in [("epoch_zero", 0), ("frozen_epoch", 1791806400),
("negative", -1), ("midnight", 1791763200),
("far_future", 4102444800)]:
case("now", name, {"epoch": epoch},
_t.strftime("%Y-%m-%dT%H:%M:%SZ", _t.gmtime(epoch)))
OUT.parent.mkdir(parents=True, exist_ok=True)
groups = {}
for c in cases:
groups.setdefault(f"{c['fn']}_cases", []).append(c)
OUT.write_text(json.dumps(
{"module": "iteration", "now": FIXED_NOW, **groups},
indent=1, sort_keys=True) + "\n")
print(f"frozen {len(cases)} cases -> {OUT}")
finally:
shutil.rmtree(tmp, ignore_errors=True)
if __name__ == "__main__":
main()