272 lines
13 KiB
Python
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()
|