File size: 9,755 Bytes
a8bdc84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#!/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 ("<script", "<iframe", "<object", "<embed", "http://", "https://")):
        fail("active or externally fetched HTML payload is forbidden")
    if re.search(r"\son[a-z]+\s*=", lowered):
        fail("inline HTML event handler is forbidden")


def negative_tamper_tests() -> 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()