174 lines
9.4 KiB
Python
174 lines
9.4 KiB
Python
#!/usr/bin/env python3
|
|
"""Freeze the oracle truth for the GO port of src/rune/verification_layer.py
|
|
(dichotomy wave #2479, GO). Every public function, every branch, against the
|
|
LIVE oracle (which delegates to the Rust evidence_provenance core — parity
|
|
already proven 33/33). Rows pin the full VerificationResult field set AND the
|
|
byte-exact json.dumps(to_dict()) rendering. handle_hook + PLUGIN pinned too.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(ROOT / "src"))
|
|
|
|
from rune import verification_layer as vl # noqa: E402
|
|
|
|
FIXTURE = ROOT / "src/go/verification_layer/.fixtures/exists.txt"
|
|
|
|
rows: list[dict] = []
|
|
|
|
|
|
def row(name, fn, verifier_type, result):
|
|
got = getattr(vl, fn)(dict(result), verifier_type) if fn == "verify" \
|
|
else getattr(vl, fn)(dict(result))
|
|
rows.append({
|
|
"name": name,
|
|
"fn": fn,
|
|
"verifier_type": verifier_type,
|
|
"result": result,
|
|
"want": got.to_dict(),
|
|
"want_json": json.dumps(got.to_dict()),
|
|
})
|
|
|
|
|
|
def hook_row(name, event, data=None):
|
|
got = vl.handle_hook(event) if data is None else vl.handle_hook(event, data)
|
|
rows.append({
|
|
"name": name,
|
|
"fn": "handle_hook",
|
|
"verifier_type": "",
|
|
"result": {"event": event, "data": data},
|
|
"want": got,
|
|
"want_json": json.dumps(got, sort_keys=True),
|
|
})
|
|
|
|
|
|
# ── verify_exit_code: every branch ──────────────────────────────────────────
|
|
row("exit_code:absent-defaults-0", "verify_exit_code", "exit_code", {})
|
|
row("exit_code:zero-pass", "verify_exit_code", "exit_code", {"exit_code": 0})
|
|
row("exit_code:one-fail", "verify_exit_code", "exit_code", {"exit_code": 1})
|
|
row("exit_code:negative-fail", "verify_exit_code", "exit_code", {"exit_code": -3})
|
|
row("exit_code:float-zero-pass", "verify_exit_code", "exit_code", {"exit_code": 0.0})
|
|
row("exit_code:float-frac-fail", "verify_exit_code", "exit_code", {"exit_code": 0.5})
|
|
row("exit_code:bool-true-fails", "verify_exit_code", "exit_code", {"exit_code": True})
|
|
row("exit_code:bool-false-passes", "verify_exit_code", "exit_code", {"exit_code": False})
|
|
row("exit_code:str-zero-not-equal", "verify_exit_code", "exit_code", {"exit_code": "0"})
|
|
row("exit_code:null-not-equal", "verify_exit_code", "exit_code", {"exit_code": None})
|
|
row("exit_code:big-int-evidence", "verify_exit_code", "exit_code", {"exit_code": 91247})
|
|
|
|
# ── verify_unit_test ────────────────────────────────────────────────────────
|
|
row("unit_test:all-defaults-total-zero-fails", "verify_unit_test", "unit_test", {})
|
|
row("unit_test:pass", "verify_unit_test", "unit_test",
|
|
{"tests_passed": 10, "tests_failed": 0, "tests_total": 10})
|
|
row("unit_test:two-fail", "verify_unit_test", "unit_test",
|
|
{"tests_passed": 3, "tests_failed": 2, "tests_total": 5})
|
|
row("unit_test:failed-zero-total-positive", "verify_unit_test", "unit_test",
|
|
{"tests_failed": 0, "tests_total": 7})
|
|
row("unit_test:bool-failed-false-total-true", "verify_unit_test", "unit_test",
|
|
{"tests_failed": False, "tests_total": True})
|
|
row("unit_test:failed-true-counts-1", "verify_unit_test", "unit_test",
|
|
{"tests_failed": True, "tests_total": 1})
|
|
row("unit_test:str-total-ignored", "verify_unit_test", "unit_test",
|
|
{"tests_total": "5", "tests_failed": 0})
|
|
|
|
# ── verify_schema ───────────────────────────────────────────────────────────
|
|
row("schema:defaults-pass", "verify_schema", "schema", {})
|
|
row("schema:valid-true-no-errors", "verify_schema", "schema", {"schema_valid": True})
|
|
row("schema:invalid-fail", "verify_schema", "schema", {"schema_valid": False})
|
|
row("schema:errors-fail", "verify_schema", "schema",
|
|
{"schema_valid": True, "schema_errors": ["bad type at $.a", "missing $.b"]})
|
|
row("schema:empty-errors-pass", "verify_schema", "schema",
|
|
{"schema_valid": True, "schema_errors": []})
|
|
row("schema:errors-nonlist-ignored", "verify_schema", "schema",
|
|
{"schema_valid": True, "schema_errors": "nope"})
|
|
row("schema:errors-with-nested-values", "verify_schema", "schema",
|
|
{"schema_valid": False, "schema_errors": [3, {"path": "$.x", "msg": "type"}, True]})
|
|
row("schema:valid-null-defaults-true", "verify_schema", "schema",
|
|
{"schema_valid": None})
|
|
row("schema:valid-zero-falsy", "verify_schema", "schema", {"schema_valid": 0})
|
|
row("schema:valid-truthy-str", "verify_schema", "schema", {"schema_valid": "yes"})
|
|
row("schema:unicode-error-escaping", "verify_schema", "schema",
|
|
{"schema_valid": False, "schema_errors": ["ungültig bei „$.pfad“"]})
|
|
|
|
# ── verify_file_exists (fixture file is committed next to the port) ────────
|
|
row("file_exists:exists-pass", "verify_file_exists", "file_exists",
|
|
{"file_path": str(FIXTURE)})
|
|
row("file_exists:missing-fail", "verify_file_exists", "file_exists",
|
|
{"file_path": str(ROOT / "src/go/verification_layer/.fixtures/definitely_missing.txt")})
|
|
row("file_exists:empty-path-fail", "verify_file_exists", "file_exists",
|
|
{"file_path": ""})
|
|
row("file_exists:dir-counts", "verify_file_exists", "file_exists",
|
|
{"file_path": str(ROOT / "src/go/verification_layer/.fixtures")})
|
|
row("file_exists:absent-key-fail", "verify_file_exists", "file_exists", {})
|
|
|
|
# ── verify_file_changed ─────────────────────────────────────────────────────
|
|
row("file_changed:empty-expected-pass", "verify_file_changed", "file_changed",
|
|
{"file_path": "a.txt", "expected_hash": "", "actual_hash": "deadbeef"})
|
|
row("file_changed:match-pass", "verify_file_changed", "file_changed",
|
|
{"file_path": "a.txt", "expected_hash": "cafe", "actual_hash": "cafe"})
|
|
row("file_changed:mismatch-fail", "verify_file_changed", "file_changed",
|
|
{"file_path": "a.txt", "expected_hash": "cafe", "actual_hash": "beef"})
|
|
row("file_changed:no-keys-pass", "verify_file_changed", "file_changed", {})
|
|
|
|
# ── verify_tool_receipt ─────────────────────────────────────────────────────
|
|
row("tool_receipt:default-pass", "verify_tool_receipt", "tool_receipt", {})
|
|
row("tool_receipt:success-true", "verify_tool_receipt", "tool_receipt",
|
|
{"tool_success": True, "tool_name": "grep"})
|
|
row("tool_receipt:fail-with-error", "verify_tool_receipt", "tool_receipt",
|
|
{"tool_success": False, "tool_error": "boom: exit 2"})
|
|
row("tool_receipt:fail-empty-error", "verify_tool_receipt", "tool_receipt",
|
|
{"tool_success": False})
|
|
row("tool_receipt:zero-falsy", "verify_tool_receipt", "tool_receipt",
|
|
{"tool_success": 0, "tool_error": "falsy rc"})
|
|
row("tool_receipt:error-str-truthy", "verify_tool_receipt", "tool_receipt",
|
|
{"tool_success": "ok"})
|
|
|
|
# ── verify_constraint_check ─────────────────────────────────────────────────
|
|
row("constraint:default-pass", "verify_constraint_check", "constraint_check", {})
|
|
row("constraint:met-true-pass", "verify_constraint_check", "constraint_check",
|
|
{"constraints_met": True})
|
|
row("constraint:unmet-fail", "verify_constraint_check", "constraint_check",
|
|
{"constraints_met": False})
|
|
row("constraint:violations-fail", "verify_constraint_check", "constraint_check",
|
|
{"constraints_met": True, "constraint_violations": ["no secrets in diff"]})
|
|
row("constraint:violations-nested", "verify_constraint_check", "constraint_check",
|
|
{"constraints_met": False,
|
|
"constraint_violations": [{"rule": "R1", "at": 7}, 12, None]})
|
|
|
|
# ── verify dispatch (named + unknown) ───────────────────────────────────────
|
|
for vt in ("exit_code", "unit_test", "schema", "file_exists", "file_changed",
|
|
"tool_receipt", "constraint_check"):
|
|
row(f"dispatch:{vt}", "verify", vt, {})
|
|
row("dispatch:unknown-verifier", "verify", "nonexistent_verifier", {})
|
|
row("dispatch:unknown-empty-name", "verify", "", {})
|
|
row("dispatch:unknown-case-sensitive", "verify", "Exit_Code", {"exit_code": 0})
|
|
|
|
# ── handle_hook ─────────────────────────────────────────────────────────────
|
|
hook_row("hook:event-only", "verification.request")
|
|
hook_row("hook:event-with-data", "verification.done", {"passed": True})
|
|
|
|
# ── PLUGIN manifest ─────────────────────────────────────────────────────────
|
|
rows.append({
|
|
"name": "plugin:manifest",
|
|
"fn": "plugin",
|
|
"verifier_type": "",
|
|
"result": {},
|
|
"want": vl.PLUGIN,
|
|
"want_json": json.dumps(vl.PLUGIN, sort_keys=True),
|
|
})
|
|
|
|
doc = {
|
|
"frozen_ts": "2026-10-12T00:00:00+00:00",
|
|
"generator": "scripts/gen_verification_layer_truth.py — live oracle "
|
|
"src/rune/verification_layer.py (Rust evidence_provenance core)",
|
|
"rows": rows,
|
|
}
|
|
out = ROOT / "src/go/verification_layer/truth.json"
|
|
out.write_text(json.dumps(doc, indent=1, ensure_ascii=False) + "\n",
|
|
encoding="utf-8")
|
|
print(f"frozen {len(rows)} rows → {out}")
|