import copy import hashlib import importlib.util import os import shutil import subprocess import sys import tempfile import unittest from pathlib import Path ROOT = Path(__file__).resolve().parents[1] SPEC = importlib.util.spec_from_file_location("check", ROOT / "scripts/check.py") check = importlib.util.module_from_spec(SPEC) SPEC.loader.exec_module(check) class PublicationChecks(unittest.TestCase): def test_current_documents(self): self.assertTrue(check.check(ROOT)["offline_only"]) def test_rejects_duplicate_and_nonfinite_json(self): with tempfile.TemporaryDirectory() as directory: file = Path(directory) / "input.json" for value in ('{"x":1,"x":2}', '{"x":NaN}', '[]'): file.write_text(value) with self.assertRaises(ValueError): check.load(file) def test_rejects_false_green_and_wrong_repository_evidence(self): data = check.load(ROOT / "status.json") evidence = check.load(ROOT / data["evidence_path"]) for field, value in (("conclusion", "failure"), ("url", "https://example.invalid/run/1")): invalid = copy.deepcopy(data) invalid["repositories"][0]["checks"][0][field] = value with self.assertRaises(ValueError): check.snapshot(invalid, evidence) def test_renamed_repositories_link_by_their_github_names(self): data = check.load(ROOT / "status.json") evidence = check.load(ROOT / data["evidence_path"]) renamed = [r for r in data["repositories"] if r["name"] in check.GITHUB_NAMES] self.assertTrue(renamed, "the snapshot lists renamed repositories") for repo in renamed: self.assertEqual("https://github.com/ta-amps/" + check.GITHUB_NAMES[repo["name"]], repo["url"]) invalid = copy.deepcopy(data) next(r for r in invalid["repositories"] if r["name"] == repo["name"])["url"] = ( "https://github.com/ta-amps/" + repo["name"]) with self.assertRaises(ValueError): check.snapshot(invalid, evidence) def test_rejects_mutable_revision_and_inconsistent_counts(self): data = check.load(ROOT / "status.json") evidence = check.load(ROOT / data["evidence_path"]) for revision in ("main", "abc123"): invalid = copy.deepcopy(data) invalid["repositories"][0]["main_revision"] = revision with self.assertRaises(ValueError): check.snapshot(invalid, evidence) data["summary"]["merged_pull_requests"] += 1 with self.assertRaises(ValueError): check.snapshot(data, evidence) def test_blocks_broken_and_escaping_links(self): with tempfile.TemporaryDirectory() as directory: root = Path(directory) file = root / "guide.md" for link in ("missing.md", "../outside.md", "%2e%2e/outside.md"): file.write_text("[reference](" + link + ")") with self.assertRaises(ValueError): check.local_links(file, root) def test_blocks_common_credentials_without_real_secrets(self): for prefix in ("ghp_", "tan_", "tsk_", "hmk_"): with self.assertRaises(ValueError): check.public_text(prefix + "z" * 40) with self.assertRaises(ValueError): check.public_text("https://" + "user:password@" + "example.invalid") def test_architecture_rejects_competing_work_authority_and_hidden_fallback(self): baseline = check.load(ROOT / "architecture.json") names = {r["name"] for r in check.load(ROOT / "status.json")["repositories"]} invalid = copy.deepcopy(baseline) invalid["implicit_server_fallback"] = True with self.assertRaisesRegex(ValueError, "reasoning belongs in workers"): check.architecture(invalid, names, ROOT) invalid = copy.deepcopy(baseline) next(r for r in invalid["repositories"] if r["role"] == "seed_pack")["role"] = "fabric" with self.assertRaisesRegex(ValueError, "must not own"): check.architecture(invalid, names, ROOT) def test_architecture_rejects_incomplete_inventory_and_management_inference(self): baseline = check.load(ROOT / "architecture.json") names = {r["name"] for r in check.load(ROOT / "status.json")["repositories"]} invalid = copy.deepcopy(baseline) invalid["repositories"].pop() with self.assertRaisesRegex(ValueError, "classify every"): check.architecture(invalid, names, ROOT) invalid = copy.deepcopy(baseline) next(e for e in invalid["server_exceptions"] if e["id"] == "management")["reasoning"] = True with self.assertRaisesRegex(ValueError, "blanket inference"): check.architecture(invalid, names, ROOT) for field in ("payer", "model", "destination"): invalid = copy.deepcopy(baseline) next(e for e in invalid["server_exceptions"] if e["id"] == "explicit_inference")["required_record"].remove(field) with self.assertRaisesRegex(ValueError, "record authority"): check.architecture(invalid, names, ROOT) def test_architecture_rejects_extra_primitives_and_pack_authority(self): baseline = check.load(ROOT / "architecture.json") names = {r["name"] for r in check.load(ROOT / "status.json")["repositories"]} for field, value in (("core_entities", ["noun", "verb", "project"]), ("project_is_primitive", True), ("seed_pack_contents", ["noun", "verb", "autonomous_service"])): invalid = copy.deepcopy(baseline) invalid[field] = value with self.assertRaises(ValueError): check.architecture(invalid, names, ROOT) def test_architecture_has_two_surfaces_and_unnamed_packs(self): baseline = check.load(ROOT / "architecture.json") names = {r["name"] for r in check.load(ROOT / "status.json")["repositories"]} check.architecture(baseline, names, ROOT) for field, value in (("public_surfaces", ["eranos", "agora", "home"]), ("public_surfaces", ["eranos"]), ("infrastructure", ["tessera"])): invalid = copy.deepcopy(baseline) invalid[field] = value with self.assertRaisesRegex(ValueError, "exactly two public surfaces"): check.architecture(invalid, names, ROOT) invalid = copy.deepcopy(baseline) next(r for r in invalid["repositories"] if r["role"] == "seed_pack")["role"] = "surface" with self.assertRaisesRegex(ValueError, "never a surface"): check.architecture(invalid, names, ROOT) invalid = copy.deepcopy(baseline) next(r for r in invalid["repositories"] if r["name"] == "herma")["role"] = "authoring_kit" with self.assertRaisesRegex(ValueError, "only Tessera and Herma"): check.architecture(invalid, names, ROOT) retired = [r for r in baseline["repositories"] if check.retired_names(r["name"])] self.assertTrue(retired, "the inventory still lists the older pack repositories") for repo in retired: self.assertEqual("seed_pack", repo["role"]) invalid = copy.deepcopy(baseline) next(r for r in invalid["repositories"] if check.retired_names(r["name"]))["role"] = "authoring_kit" with self.assertRaisesRegex(ValueError, "retired pack name"): check.architecture(invalid, names, ROOT) # Frozen history: every deck version and the dated storyboards, pinned here as well as in the site's own manifests. PUBLISHED = {"v1": "f82b276b2fde16f993c958845de56026a4a2ef50a655d616a93b7f8c377803e4", "v2": "5ebb6fefbd04ed37907d27ab2b07974d1b0e785eadd1bf9550daf05231a5ac02", "v3": "a2985302395e965631c44c7a7a18b340f3a8c2cc25fd69bd66f156cbd3a18bea", "v4": "1a68ed7af008f15368f37033142d05a69dab832f6f5f37e9530bff1d27a82bc9"} FROZEN_DRAFTS = {"storyboards/2026-10-29/eranos-video-v1/": "33b0b50d733799e86291567c18a176a53193740675ef6db5c803e66570cdd1b5", "storyboards/2026-10-29/two-videos/": "aae6a382379b94a13d2bb92cc0748dcb622f38b10aa811f8517b54b2787237fb"} def page(path: Path, body: str) -> None: path.parent.mkdir(parents=True, exist_ok=True) path.write_text("
" + body + "") class SiteChecks(unittest.TestCase): def test_published_deck_versions_never_change(self): decks = check.load(ROOT / "site/decks.json") self.assertEqual(set(PUBLISHED), {version["version"] for version in decks["versions"]}) for version in decks["versions"]: self.assertEqual(PUBLISHED[version["version"]], version["html_sha256"]) data = (ROOT / "site" / version["path"] / "index.html").read_bytes() self.assertEqual(PUBLISHED[version["version"]], hashlib.sha256(data).hexdigest()) def test_frozen_drafts_never_change(self): listing = check.load(ROOT / "site/content/earlier-drafts.json") pinned = {item["href"]: item["html_sha256"] for group in listing["groups"] for item in group["items"] if "html_sha256" in item} self.assertEqual(FROZEN_DRAFTS, pinned) site = ROOT / "site" self.assertEqual({(site / href / "index.html").resolve() for href in pinned}, check.frozen_drafts(listing, site)) with tempfile.TemporaryDirectory() as directory: copy = Path(directory) page(copy / "storyboards/2026-10-29/two-videos/index.html", "edited
") page(copy / "storyboards/2026-10-29/eranos-video-v1/index.html", "edited
") with self.assertRaisesRegex(ValueError, "frozen draft changed"): check.frozen_drafts(listing, copy) def test_frozen_pages_may_still_link_to_moved_pages_and_nothing_else(self): with tempfile.TemporaryDirectory() as directory: root = Path(directory) site = root / "site" page(site / "decks/index.html", 'Still here
") with self.assertRaisesRegex(ValueError, "must be gone"): check.moved_pages({"pages": [{"from": "docs/", "to": "decks/", "what": "Docs"}]}, site, check.site_pages(site)) def test_the_real_moved_pages_resolve(self): site = ROOT / "site" listing = check.load(site / "content/moved.json") moved = check.moved_pages(listing, site, check.site_pages(site)) self.assertIn((site / "docs/connect/index.html").resolve(), moved) self.assertIn((site / "docs/status/index.html").resolve(), moved) def test_current_decks_need_their_source_slides_and_pdf(self): decks = check.load(ROOT / "site/decks.json") site = ROOT / "site" self.assertEqual(5, len(decks["decks"])) frozen = {(site / v["path"] / "index.html").resolve() for v in decks["versions"]} for deck in decks["decks"]: self.assertEqual(1, len(check.current_deck(deck, site, frozen))) for field, value, message in (("downloads", [], "needs its PDF"), ("slides", deck["slides"] + 1, "slide count"), ("source", "decks/nowhere/", "needs its source"), ("path", "decks/2026-10-29/v4/", "frozen version")): with self.assertRaisesRegex(ValueError, message): check.current_deck(dict(deck, **{field: value}), site, frozen) def test_site_links_must_resolve_inside_the_site(self): with tempfile.TemporaryDirectory() as directory: root = Path(directory) site = root / "site" page(site / "index.html", 'DocsTop') page(site / "docs/index.html", 'The Oldname pack
")) self.assertFalse(check.retired_names('A collection of nouns and verbs
")) finally: check.RETIRED_NAME_HASHES = saved class PortableChecks(unittest.TestCase): """Hunt, October 30: the check failed under an ASCII locale, and a CRLF checkout changed frozen hashes.""" def test_the_check_reads_utf8_whatever_the_locale(self): env = {key: value for key, value in os.environ.items() if not key.startswith(("LC_", "LANG", "PYTHONUTF8"))} env.update({"LC_ALL": "C", "LANG": "C", "PYTHONCOERCECLOCALE": "0", "PYTHONUTF8": "0"}) result = subprocess.run([sys.executable, "-X", "utf8=0", str(ROOT / "scripts/check.py")], cwd=ROOT, env=env, capture_output=True, text=True, encoding="utf-8", errors="replace") self.assertEqual(0, result.returncode, result.stderr[-2000:]) def test_checkouts_keep_lf_line_endings_and_binary_media(self): rules = (ROOT / ".gitattributes").read_text(encoding="utf-8").split("\n") self.assertIn("* text=auto eol=lf", rules) for kind in ("png", "mp4", "pdf", "pptx"): self.assertIn(f"*.{kind} binary", rules) if __name__ == "__main__": unittest.main()