File size: 3,467 Bytes
157831f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/usr/bin/env python3
"""Self-authored static bundle validator; no network access."""

from __future__ import annotations

import json
import re
import sys
from pathlib import Path


REQUIRED = [
    "pages/index.md",
    "pages/executive-summary/page.md",
    "pages/conclusion/page.md",
]
for n in range(1, 7):
    REQUIRED.append(f"pages/claim-{n}/page.md")

HEDGES = [
    r"\bcould not be\b", r"\bunable to\b", r"\bleft open\b",
    r"\bfurther work\b", r"\binconclusive\b", r"\bnot possible to\b",
    r"\bdid not attempt\b", r"\bwe do not claim\b", r"\bpending\b",
]
PAGE_LEAKS = [r"/Users/", r"\bvalidator\b", r"\bduplicate\b", r"\bhandoff\b",
              r"\bpublisher\b", r"\bpeer\b", r"\bexpected score\b"]


def main() -> int:
    root = Path(sys.argv[1]).resolve() if len(sys.argv) > 1 else Path.cwd()
    warnings: list[str] = []
    for rel in REQUIRED:
        p = root / rel
        if not p.is_file() or not p.read_text(encoding="utf-8").strip():
            warnings.append(f"missing_or_empty:{rel}")

    page_files = sorted((root / "pages").rglob("*.md")) if (root / "pages").is_dir() else []
    if len(page_files) != 9:
        warnings.append(f"page_file_count:{len(page_files)}")
    claim_files = sorted((root / "pages").glob("claim-*/page.md")) if (root / "pages").is_dir() else []
    if len(claim_files) != 6:
        warnings.append(f"claim_page_count:{len(claim_files)}")

    verdicts = []
    for p in claim_files:
        text = p.read_text(encoding="utf-8")
        match = re.search(r"^# Claim [1-6] — (VERIFIED|FALSIFIED)$", text, re.M)
        if not match:
            warnings.append(f"missing_decisive_heading:{p.relative_to(root)}")
        else:
            verdicts.append(match.group(1))
        for pat in HEDGES:
            if re.search(pat, text, re.I):
                warnings.append(f"hedge:{p.relative_to(root)}:{pat}")
        for pat in PAGE_LEAKS:
            if re.search(pat, text, re.I):
                warnings.append(f"page_leak:{p.relative_to(root)}:{pat}")

    if len(verdicts) != 6:
        warnings.append(f"verdict_count:{len(verdicts)}")
    if any(v not in {"VERIFIED", "FALSIFIED"} for v in verdicts):
        warnings.append("non_decisive_verdict")
    total_chars = sum(len(p.read_text(encoding="utf-8")) for p in page_files)
    if total_chars < 5000:
        warnings.append(f"pages_under_minimum:{total_chars}")
    if total_chars >= 120000:
        warnings.append(f"pages_over_cap:{total_chars}")

    readme = root / "README.md"
    readme_text = readme.read_text(encoding="utf-8") if readme.is_file() else ""
    if "- icml2026-repro" not in readme_text:
        warnings.append("missing_tag:icml2026-repro")
    if "- paper-NinueNAODD" not in readme_text:
        warnings.append("missing_tag:paper-NinueNAODD")

    forbidden_names = {"known-", "quarantine"}
    for p in root.rglob("*"):
        if any(token.lower() in p.name.lower() for token in forbidden_names):
            warnings.append(f"forbidden_path:{p.relative_to(root)}")
    out = {
        "warnings": warnings,
        "warning_count": len(warnings),
        "page_chars": total_chars,
        "page_files": len(page_files),
        "claim_pages": len(claim_files),
        "verdicts": verdicts,
        "score": 2 * len(verdicts) if len(verdicts) == 6 else None,
    }
    print(json.dumps(out, indent=2, sort_keys=True))
    return 1 if warnings else 0


if __name__ == "__main__":
    raise SystemExit(main())