#!/usr/bin/env python3 """Offline release gate for the KLENT static audit candidate.""" from __future__ import annotations import argparse import hashlib import json import os import re import shutil import stat import subprocess import sys import tempfile from pathlib import Path ROOT = Path(__file__).resolve().parents[1] PAPER_ID = "sSQdICPJv1" EXPECTED_PATHS = { "README.md", "evidence/claims.json", "evidence/claims_active.json", "evidence/claims_anchored.json", "evidence/provenance.json", "index.html", "manifest.sha256", "pages/01-claim-matrix.md", "pages/02-reproducibility-audit.md", "pages/03-provenance-and-safety.md", "release-allowlist.txt", "scripts/verify_release.py", } REQUIRED_TAGS = ("icml2026-repro", "paper-sSQdICPJv1") BOUNDARY = ( "Evidence limit: this package is a released-paper source/proof audit and a static inspection of the author " "repository. It is not an independent reproduction, it contains no author material, it ran no author code, " "and it does not validate the reported numerical results." ) EXPECTED_DEFAULT = ( "Regularized policy optimization with reverse KL and entropy divergence provides convergence guarantees on two-player zero-sum games", "Algorithm demonstrates efficient learning on five board games: Animal Shogi, Gardner Chess, Go, Hex, and Othello", ) EXPECTED_ACTIVE = ( "The regularized policy update combines reverse KL divergence and entropy regularization (weighted by parameters beta and alpha) with a closed-form analytical solution for the optimal policy pi'(a|s) (Section 4.1, Equations 2-3).", "Theorem A.2 formally derives the closed-form regularized policy-update solution via Lagrange multipliers (Appendix A, Theorem A.2).", "Using fixed hyperparameters alpha=0.03, beta=0.1, and lambda=e^(-1/8)≈0.88 across all five games, KLENT (the proposed algorithm) achieves roughly fourfold greater sample/compute efficiency than Gumbel AlphaZero on Animal Shogi, Gardner Chess, 9x9 Go, Hex, and Othello (Section 5.1, Figure 1, Figure 5, Table 1).", "An ablation isolating KL-only, entropy-only, single-step, and Monte Carlo variants shows both KL regularization, entropy regularization, and lambda-returns each contribute to performance across all five games (Section 5.2, Figure 6, Table 2).", "On 19x19 Go, KLENT achieves performance competitive with AlphaZero, demonstrating scalability beyond the smaller board-game benchmarks (Section 5.3, Figure 8).", ) EXPECTED_PROVENANCE = { "challenge_revision": "7b5b56aebf3abe590eab9f2c241a796125cab928", "claims_sha256": "af5ab2d62f786ae36861957cbd08b4188f6d4c86e67152becc661a9c5bbb9d57", "claims_anchored_sha256": "eb3f2d878646ca5c40da121741a613c1f9e1e10c14845f373db107e74a4ef439", "merge_code_sha256": "acdd7be31b6982ef1e6cb609e60e506abb57aa2199b0b55561a34ed9b25175c6", } def fail(message: str) -> None: print(f"FAIL: {message}", file=sys.stderr) raise SystemExit(1) def sha256(path: Path) -> str: return hashlib.sha256(path.read_bytes()).hexdigest() def public_files(root: Path) -> set[str]: files: set[str] = set() for directory, dirnames, filenames in os.walk(root, followlinks=False): relative_dir = Path(directory).relative_to(root) if ".git" in dirnames: dirnames.remove(".git") for name in filenames: path = Path(directory, name) if path.is_symlink(): fail(f"symlink is forbidden: {path.relative_to(root)}") files.add(str(relative_dir / name)) return files def load_manifest(root: Path) -> dict[str, str]: entries: dict[str, str] = {} for line in (root / "manifest.sha256").read_text(encoding="utf-8").splitlines(): digest, separator, path = line.partition(" ") if not separator or len(digest) != 64 or path in entries: fail("malformed manifest") entries[path] = digest return entries def claim_texts(entries: list[dict[str, str]]) -> tuple[str, ...]: if any(set(entry) != {"text", "status"} or entry["status"] != "unverified" for entry in entries): fail("claim structure or status differs from the pinned target") return tuple(entry["text"] for entry in entries) def check(root: Path) -> None: actual_paths = public_files(root) if actual_paths != EXPECTED_PATHS: fail(f"release inventory mismatch: {sorted(actual_paths ^ EXPECTED_PATHS)}") allowlist = set((root / "release-allowlist.txt").read_text(encoding="utf-8").splitlines()) if allowlist != EXPECTED_PATHS: fail("release allowlist is not the exact expected inventory") for relative in EXPECTED_PATHS: if stat.S_IMODE((root / relative).stat().st_mode) != 0o644: fail(f"unexpected file mode: {relative}") manifest = load_manifest(root) expected_manifest_paths = EXPECTED_PATHS - {"manifest.sha256"} if set(manifest) != expected_manifest_paths: fail("manifest inventory is incomplete or has undeclared paths") for relative, digest in manifest.items(): if sha256(root / relative) != digest: fail(f"hash mismatch: {relative}") readme = (root / "README.md").read_text(encoding="utf-8") if not all(tag in readme for tag in REQUIRED_TAGS): fail("required discovery tags are missing") if "sdk: static" not in readme or "app_file: index.html" not in readme: fail("static Space metadata is missing") if BOUNDARY not in readme: fail("immutable evidence boundary is missing from README") defaults = json.loads((root / "evidence/claims.json").read_text(encoding="utf-8")) anchored = json.loads((root / "evidence/claims_anchored.json").read_text(encoding="utf-8")) active = json.loads((root / "evidence/claims_active.json").read_text(encoding="utf-8")) if set(defaults) != {PAPER_ID} or set(anchored) != {PAPER_ID}: fail("claim extracts must contain only the target OpenReview ID") if claim_texts(defaults[PAPER_ID]) != EXPECTED_DEFAULT: fail("default claims differ from the pinned target extract") if claim_texts(anchored[PAPER_ID]) != EXPECTED_ACTIVE: fail("anchored claims differ from the pinned target extract") if active.get("openreview_id") != PAPER_ID or active.get("active_source") != "claims_anchored.json": fail("active claim provenance is incorrect") if claim_texts(active.get("claims", [])) != EXPECTED_ACTIVE: fail("active claims do not exactly equal the anchored override") provenance = json.loads((root / "evidence/provenance.json").read_text(encoding="utf-8")) official = provenance.get("official_claim_feeds", {}) if provenance.get("openreview_id") != PAPER_ID or any(official.get(key) != value for key, value in EXPECTED_PROVENANCE.items()): fail("immutable official-feed provenance differs from the pinned values") if provenance.get("released_repository", {}).get("licence_status", "").startswith("No licence") is False: fail("no-redistribution licence decision is missing") page_text = "\n".join(path.read_text(encoding="utf-8") for path in sorted((root / "pages").glob("*.md"))) if len("".join(page_text.split())) < 200: fail("combined stripped page text is under 200 characters") if "Not reproducible for the central numerical claims" not in page_text: fail("reproducibility status is missing") html = (root / "index.html").read_text(encoding="utf-8") lowered = html.lower() if BOUNDARY not in html: fail("immutable evidence boundary is missing from static HTML") if any(token in lowered for token in (" None: with tempfile.TemporaryDirectory(prefix="klent-static-audit-") as temporary: copy_root = Path(temporary) / "candidate" shutil.copytree(ROOT, copy_root, ignore=shutil.ignore_patterns(".git")) script = copy_root / "scripts/verify_release.py" (copy_root / "tamper.txt").write_text("unexpected", encoding="utf-8") extra = subprocess.run([sys.executable, str(script), "--check"], capture_output=True, text=True) if extra.returncode == 0 or "release inventory mismatch" not in extra.stderr: fail("negative inventory tamper test did not fail as expected") (copy_root / "tamper.txt").unlink() readme = copy_root / "README.md" readme.write_text(readme.read_text(encoding="utf-8") + "\ntampered\n", encoding="utf-8") modified = subprocess.run([sys.executable, str(script), "--check"], capture_output=True, text=True) if modified.returncode == 0 or "hash mismatch" not in modified.stderr: fail("negative content tamper test did not fail as expected") def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--check", action="store_true", help="run the offline release checks only") parser.add_argument("--self-test", action="store_true", help="also run negative tamper tests in a temporary copy") arguments = parser.parse_args() if arguments.check and arguments.self_test: fail("choose at most one mode") check(ROOT) if arguments.self_test: negative_tamper_tests() print("PASS: release checks and negative tamper tests") else: print("PASS: exact inventory, hashes, tags, claims, provenance, boundary, page length, and inert HTML checks") if __name__ == "__main__": main()