113 lines
6.9 KiB
Python
113 lines
6.9 KiB
Python
"""Read-only evidence check. Python 3; --index also compares every Git staged byte.
|
|
|
|
Historical launch/preparation scripts are never executed. SVG logic is loaded
|
|
without importing or writing __pycache__; the full model delta is independently
|
|
reconciled below. Optional --source verifies the frozen source manifest via Git.
|
|
"""
|
|
from pathlib import Path
|
|
from types import SimpleNamespace
|
|
import copy
|
|
import hashlib
|
|
import json
|
|
import subprocess
|
|
import sys
|
|
|
|
evidence = Path(__file__).resolve().parent
|
|
repo = evidence.parents[3]
|
|
load = lambda path: json.loads(path.read_text(encoding="utf-8"))
|
|
digest = lambda data: {"bytes": len(data), "sha256": hashlib.sha256(data).hexdigest()}
|
|
inventory = load(evidence / "evidence-files.json")
|
|
actual_files = {p.relative_to(evidence).as_posix() for p in evidence.rglob("*") if p.is_file()}
|
|
assert actual_files == set(inventory) | {"evidence-files.json"}, "Missing or extra evidence files"
|
|
for name, expected in inventory.items():
|
|
assert digest((evidence / name).read_bytes()) == expected, name
|
|
if "--index" in sys.argv:
|
|
for name in actual_files:
|
|
path = evidence / name
|
|
staged = subprocess.check_output(["git", "show", ":" + path.relative_to(repo).as_posix()], cwd=repo)
|
|
assert staged == path.read_bytes(), "Staged byte conversion: " + name
|
|
if "--source" in sys.argv:
|
|
manifest = load(evidence / "source-manifest.json")
|
|
for name, expected in manifest["files"].items():
|
|
data = subprocess.check_output(["git", "show", manifest["source"] + ":" + name], cwd=repo)
|
|
assert digest(data) == expected, "Frozen source mismatch: " + name
|
|
|
|
source = "d0896ced75fea73bcda6bd14f259a34503840704"
|
|
binary = "2b6d76d744d7422fc826f7f7ca0009b296a0efb751fe0b3bbc1516b8a624c201"
|
|
runtime = "f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4"
|
|
fixture = "9db1015369f450d5810c96a01fddb8a009d57f6aafbda5182703f15ded23d9c8"
|
|
assert digest((evidence.parent / "fixture/eight-card.json").read_bytes())["sha256"] == fixture
|
|
namespace = {"__name__": "readonly_svg_oracle", "__file__": str(evidence / "scripts/check-wrapped-svg.py")}
|
|
exec(compile((evidence / "scripts/check-wrapped-svg.py").read_bytes(), namespace["__file__"], "exec"), namespace)
|
|
svg_results = {}
|
|
for profile in ["E", "F"]:
|
|
run = evidence / ("native-" + profile)
|
|
baseline, start, finish = [load(run / name) for name in ["baseline.json", "started.json", "finished.json"]]
|
|
assert baseline["source"] == start["source"] == finish["source"] == source
|
|
assert start["label_profile"] == finish["label_profile"] == profile
|
|
assert start["binary_sha256"] == finish["binary_sha256"] == binary
|
|
assert start["runtime_sha256"] == finish["runtime_sha256"] == runtime
|
|
assert start["fixture_sha256"] == finish["fixture_sha256"] == fixture
|
|
assert digest((run / "working/eight-card.json").read_bytes())["sha256"] == fixture
|
|
assert finish["exit_code"] == 0 and finish["all_pinned_files_unchanged"]
|
|
for stream in ["stdout", "stderr"]:
|
|
assert finish[stream + "_bytes"] == 0 and (run / (stream + ".log")).read_bytes() == b""
|
|
result = {}
|
|
namespace["check"](SimpleNamespace(
|
|
baseline=str(evidence / "baseline/working/baseline.svg"),
|
|
candidate=str(run / ("working/pristine-" + profile + ".svg")), profile=profile), result)
|
|
assert result["status"] == "PASS" and result["all_remaining_svg_bytes_exact"]
|
|
svg_results[profile] = result["remaining_svg"]
|
|
|
|
run = evidence / "native-F"
|
|
before = load(run / "working/eight-card.json")
|
|
after = load(run / "working/moved-F.json")
|
|
receipt = load(run / "model-oracle.json")
|
|
assert digest((run / "working/moved-F.json").read_bytes())["sha256"] == receipt["saved_sha256"]
|
|
diagram = "00000000-0038-4000-8000-000000000001"
|
|
edge = "63009b5f-539e-5914-b630-ec6b7fefb4d5"
|
|
routes = after["diagrams"][diagram]["routes"]
|
|
declared = [route for route in routes if route["edge"] == edge]
|
|
assert len(declared) == 1 and declared[0] == receipt["declared_edit"]
|
|
route = declared[0]
|
|
assert set(route) <= {"edge", "waypoints", "label", "source_attachment", "target_attachment"}
|
|
assert route["waypoints"] == [] and route.get("source_attachment") is None and route.get("target_attachment") is None
|
|
assert set(route["label"]) == {"fraction", "offset"} and route["label"]["fraction"] == 0.55
|
|
assert route["label"]["offset"] == {"x": 120.812744, "y": 38.814423}
|
|
restored = copy.deepcopy(after)
|
|
restored["diagrams"][diagram]["routes"] = [route for route in routes if route["edge"] != edge]
|
|
assert restored == before, "Full Project delta exceeds target label fraction/offset"
|
|
log = (evidence / "gates/wrapped-label-diagram-tests.log").read_text(encoding="utf-8")
|
|
assert "126 passed; 0 failed; 0 ignored; 0 measured; 1426 filtered out" in log
|
|
commands = load(evidence / "commands.json")
|
|
assert commands["source"] == source and all(gate["exit_code"] == 0 for gate in commands["final_gates"])
|
|
assert (evidence / "gates/wrapped-label-format-check.log").read_bytes() == b""
|
|
for profile in ["F", "Baseline"]:
|
|
run = evidence / ("reopen-" + profile)
|
|
start, finish = [load(run / name) for name in ["started.json", "finished.json"]]
|
|
assert start["source"] == finish["source"] == source
|
|
assert start["profile"] == finish["profile"] == profile
|
|
assert start["external_profile"] == finish["external_profile"] == ("F" if profile == "F" else None)
|
|
assert start["files"] == finish["files"]
|
|
assert finish["files"]["bin/arcadia-studio.exe"] == binary
|
|
assert finish["files"]["bin/libunwind.dll"] == runtime
|
|
assert (run / "working/moved-F.json").read_bytes() == (evidence / "native-F/working/moved-F.json").read_bytes()
|
|
assert finish["exit_code"] == 0 and finish["all_pinned_files_unchanged"]
|
|
for stream in ["stdout", "stderr"]:
|
|
assert finish[stream + "_bytes"] == 0 and (run / (stream + ".log")).read_bytes() == b""
|
|
reopen_script = evidence / "scripts/wrapped-reopen-independent-check.py"
|
|
reopen_namespace = {"__name__": "readonly_reopen_oracle", "__file__": str(reopen_script)}
|
|
exec(compile(reopen_script.read_bytes(), str(reopen_script), "exec"), reopen_namespace)
|
|
reopen_result = reopen_namespace["check"]({
|
|
"pristine_project": (evidence / "native-F/working/eight-card.json").read_bytes(),
|
|
"saved_project": (evidence / "reopen-F/working/moved-F.json").read_bytes(),
|
|
"pristine_svg": (evidence / "native-F/working/pristine-F.svg").read_bytes(),
|
|
"reopened_svg": (evidence / "reopen-F/working/reopened-F.svg").read_bytes(),
|
|
})
|
|
assert reopen_result["all_12_edges_exact"] and reopen_result["all_svg_bytes_outside_target_label_exact"]
|
|
print(json.dumps({"status": "PASS", "inventory_files": len(inventory), "svg_conservation": svg_results,
|
|
"full_project_delta_exact": True, "reopened_F_logical_geometry_exact": True,
|
|
"index_checked": "--index" in sys.argv,
|
|
"source_manifest_checked": "--source" in sys.argv,
|
|
"scope": "Preserved evidence and offline oracles; not a native/glyph/usability replay"}, indent=2))
|