From 34096ad11c1ae33531186a86961a9e2e883d60a9 Mon Sep 17 00:00:00 2001 From: magnaprog <132261408+magnaprog@users.noreply.github.com> Date: Wed, 1 Jul 2026 23:54:50 -0700 Subject: [PATCH 1/2] fix: verify expansion artifacts before the paper release republishes them The paper wrapper checked only that the expansion manifest recorded the expected source commit, then copied paper/expansion/results and figures into the detached build worktree without validating the recorded hashes. A tampered or unexpected expansion output would flow into the published PDFs without any digest failure (reproduced: editing a generated value while leaving the manifest unchanged produced a successful release reporting the edited number). - Add verify_expansion_artifacts to scripts/run_paper_experiments.py: every file listed in manifest[artifacts] must exist, be a regular non-symlink file inside the expansion tree with a safe relative path, and match its recorded SHA-256; every file on disk under results/ and figures/ must be listed (results/manifest.json is the only exception because it cannot record its own hash). - Call it from release_paper_artifacts.sh after the source-commit equality check and before the copy; correct both wrappers' comments, which overclaimed that only release-critical source dirt could corrupt a release. - Regression tests: valid tree accepted; tampered, missing, unexpected, symlinked, traversal, and absolute-path artifacts each fail closed; the wrapper calls the verifier before copying; the committed expansion tree validates. - CLAUDE.md: document that dependency changes require regenerating both artifact releases because pyproject.toml and poetry.lock are release-critical fingerprinted inputs. - dependabot.yml: move pip version updates to a monthly grouped cadence; security alerts remain handled immediately via the coordinated flow. --- .github/dependabot.yml | 3 +- CLAUDE.md | 6 +- scripts/release_expansion_artifacts.sh | 10 ++- scripts/release_paper_artifacts.sh | 22 +++-- scripts/run_paper_experiments.py | 55 +++++++++++++ tests/test_paper_artifacts.py | 106 ++++++++++++++++++++++++- 6 files changed, 189 insertions(+), 13 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 2e8f4b6..f15f6b2 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,8 +3,7 @@ updates: - package-ecosystem: pip directory: / schedule: - interval: weekly - day: monday + interval: monthly time: "09:00" timezone: America/Los_Angeles open-pull-requests-limit: 5 diff --git a/CLAUDE.md b/CLAUDE.md index efdf42c..81a7659 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -18,7 +18,11 @@ the development lock with `pip install -r requirements/dev.lock`, then run - Lint: `.venv/bin/ruff check .` (CI enforces this; must stay clean). Auto-fix: `ruff check . --fix`. - Dependency changes: edit `pyproject.toml`, then run `scripts/update_dependency_locks.sh`; commit `poetry.lock` and every changed - export under `requirements/`. + export under `requirements/`. Because `pyproject.toml` and `poetry.lock` are + release-critical fingerprinted inputs, a dependency change also requires + regenerating both artifact releases from the new clean source commit + (expansion wrapper first, then the paper wrapper); Dependabot lock-only PRs + therefore cannot pass CI and are handled through this coordinated flow. - Operational scripts import `quantcortex.*`, so run them with the root on the path: `PYTHONPATH=. .venv/bin/python scripts/.py` (validate_performance, generate_report, survivorship_demo, verify_brokers, diff --git a/scripts/release_expansion_artifacts.sh b/scripts/release_expansion_artifacts.sh index 273ecdc..afba8d3 100755 --- a/scripts/release_expansion_artifacts.sh +++ b/scripts/release_expansion_artifacts.sh @@ -9,10 +9,12 @@ if [[ ! -x "${python_bin}" ]]; then printf '%s\n' "Python environment not found: ${python_bin}" >&2 exit 1 fi -# Generation runs from a detached worktree at the source commit, so only -# uncommitted changes to release-critical source can corrupt a release. -# Scoping the cleanliness check to those paths keeps the wrapper rerunnable -# while regenerated artifacts sit uncommitted in the working tree. +# Generation runs from a detached worktree at the source commit, so +# uncommitted changes outside release-critical source cannot alter what is +# generated here. Scoping the cleanliness check to those paths keeps the +# wrapper rerunnable while regenerated artifacts sit uncommitted in the +# working tree; the paper wrapper independently verifies those artifacts +# against this release's manifest before republishing them. release_source_paths=( quantcortex schemas/canonical_target_tape.schema.json diff --git a/scripts/release_paper_artifacts.sh b/scripts/release_paper_artifacts.sh index 2470a77..390f67b 100755 --- a/scripts/release_paper_artifacts.sh +++ b/scripts/release_paper_artifacts.sh @@ -10,11 +10,13 @@ if [[ ! -x "${python_bin}" ]]; then exit 1 fi -# Generation runs from a detached worktree at the source commit, so only -# uncommitted changes to release-critical source can corrupt a release. -# Scoping the cleanliness check to those paths lets the paper release run -# after the expansion wrapper has deposited regenerated artifacts in the -# working tree, which the documented dual-release flow requires. +# Generation runs from a detached worktree at the source commit, so +# uncommitted changes outside release-critical source cannot alter what is +# generated. Scoping the cleanliness check to those paths lets the paper +# release run after the expansion wrapper has deposited regenerated artifacts +# in the working tree, which the documented dual-release flow requires. The +# expansion artifacts that this release republishes are separately verified +# against the expansion manifest below before they are copied. release_source_paths=( quantcortex schemas @@ -250,6 +252,16 @@ if [[ "${expansion_source_commit}" != "${source_commit}" ]]; then "expansion source: ${expansion_source_commit}" >&2 exit 1 fi +# The copied expansion artifacts are republished inside the built PDFs, so +# verify every file against the expansion manifest before copying. A tampered +# or unexpected expansion output must fail the release, not flow into print. +PYTHONPATH="${repo_root}" "${python_bin}" - "${repo_root}/paper/expansion" <<'PY' +import sys + +from scripts.run_paper_experiments import verify_expansion_artifacts + +verify_expansion_artifacts(sys.argv[1]) +PY rm -rf "${source_worktree}/paper/expansion/results" \ "${source_worktree}/paper/expansion/figures" cp -R "${repo_root}/paper/expansion/results" \ diff --git a/scripts/run_paper_experiments.py b/scripts/run_paper_experiments.py index 9ef0870..e04da9b 100644 --- a/scripts/run_paper_experiments.py +++ b/scripts/run_paper_experiments.py @@ -203,6 +203,61 @@ def _json_sha256(value: object) -> str: return hashlib.sha256(encoded).hexdigest() +def verify_expansion_artifacts(expansion_root: Path) -> None: + """Fail closed unless the expansion artifact tree matches its manifest. + + The paper release republishes ``paper/expansion/results`` and + ``paper/expansion/figures`` inside the built PDFs, so every file it copies + must be exactly the file the expansion manifest recorded. Rejects absolute + or parent-traversing manifest paths, symlinks, missing files, digest + mismatches, and files present on disk that the manifest does not list + (``results/manifest.json`` itself is the only exception, because it cannot + record its own hash). + """ + expansion_root = Path(expansion_root) + manifest_path = expansion_root / "results" / "manifest.json" + if manifest_path.is_symlink() or not manifest_path.is_file(): + raise SystemExit(f"expansion manifest missing: {manifest_path}") + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + artifacts = manifest.get("artifacts") + if not isinstance(artifacts, dict) or not artifacts: + raise SystemExit("expansion manifest lists no artifacts") + + resolved_root = expansion_root.resolve() + for relative, expected in artifacts.items(): + candidate = Path(relative) + if candidate.is_absolute() or ".." in candidate.parts: + raise SystemExit(f"unsafe expansion artifact path: {relative}") + artifact = expansion_root / candidate + if artifact.is_symlink(): + raise SystemExit(f"expansion artifact is a symlink: {relative}") + if not artifact.is_file(): + raise SystemExit(f"expansion artifact missing: {relative}") + if not artifact.resolve().is_relative_to(resolved_root): + raise SystemExit(f"unsafe expansion artifact path: {relative}") + if _sha256(artifact) != expected: + raise SystemExit(f"expansion artifact digest mismatch: {relative}") + + allowed = {Path(relative) for relative in artifacts} + allowed.add(Path("results/manifest.json")) + for subdirectory in ("results", "figures"): + directory = expansion_root / subdirectory + if not directory.is_dir(): + raise SystemExit(f"expansion directory missing: {subdirectory}") + for found in sorted(directory.rglob("*")): + if found.is_symlink(): + raise SystemExit( + "unexpected symlink under expansion artifacts: " + f"{found.relative_to(expansion_root)}" + ) + if found.is_file(): + relative_found = found.relative_to(expansion_root) + if relative_found not in allowed: + raise SystemExit( + f"unexpected expansion artifact: {relative_found}" + ) + + def _threadpool_environment() -> list[dict[str, object]]: """Return stable BLAS/OpenMP metadata without machine-specific paths.""" try: diff --git a/tests/test_paper_artifacts.py b/tests/test_paper_artifacts.py index 1eb73bb..8f83cac 100644 --- a/tests/test_paper_artifacts.py +++ b/tests/test_paper_artifacts.py @@ -8,7 +8,13 @@ import subprocess from pathlib import Path -from scripts.run_paper_experiments import _json_sha256, source_tree_manifest +import pytest + +from scripts.run_paper_experiments import ( + _json_sha256, + source_tree_manifest, + verify_expansion_artifacts, +) REPO_ROOT = Path(__file__).resolve().parent.parent PAPER_ROOT = REPO_ROOT / "paper" @@ -446,3 +452,101 @@ def test_paper_citations_are_defined_used_and_unique(): for eprint in eprints: assert f"https://arxiv.org/abs/{eprint}" in bibliography + + +def _build_expansion_fixture(root: Path) -> Path: + """Create a minimal valid expansion artifact tree with a correct manifest.""" + expansion = root / "expansion" + (expansion / "results").mkdir(parents=True) + (expansion / "figures").mkdir() + (expansion / "results" / "summary.csv").write_text("a,b\n1,2\n", encoding="ascii") + (expansion / "figures" / "plot.pdf").write_bytes(b"%PDF-1.4 fixture") + artifacts = { + "results/summary.csv": _sha256(expansion / "results" / "summary.csv"), + "figures/plot.pdf": _sha256(expansion / "figures" / "plot.pdf"), + } + manifest = {"git": {"source_commit": "0" * 40}, "artifacts": artifacts} + (expansion / "results" / "manifest.json").write_text( + json.dumps(manifest), encoding="ascii" + ) + return expansion + + +def test_verify_expansion_artifacts_accepts_valid_tree(tmp_path): + expansion = _build_expansion_fixture(tmp_path) + verify_expansion_artifacts(expansion) + + +def test_verify_expansion_artifacts_rejects_tampered_artifact(tmp_path): + # Regression: the paper release once copied expansion artifacts into the + # built PDFs after checking only the manifest's source commit, so a + # tampered aggregate (for example an edited generated value) was published + # without any digest failure. + expansion = _build_expansion_fixture(tmp_path) + (expansion / "results" / "summary.csv").write_text("a,b\n9,9\n", encoding="ascii") + with pytest.raises(SystemExit, match="digest mismatch"): + verify_expansion_artifacts(expansion) + + +def test_verify_expansion_artifacts_rejects_missing_artifact(tmp_path): + expansion = _build_expansion_fixture(tmp_path) + (expansion / "figures" / "plot.pdf").unlink() + with pytest.raises(SystemExit, match="missing"): + verify_expansion_artifacts(expansion) + + +def test_verify_expansion_artifacts_rejects_unexpected_file(tmp_path): + expansion = _build_expansion_fixture(tmp_path) + (expansion / "results" / "extra.csv").write_text("x\n", encoding="ascii") + with pytest.raises(SystemExit, match="unexpected expansion artifact"): + verify_expansion_artifacts(expansion) + + +def test_verify_expansion_artifacts_rejects_symlink(tmp_path): + expansion = _build_expansion_fixture(tmp_path) + target = expansion / "results" / "summary.csv" + link = expansion / "figures" / "plot.pdf" + link.unlink() + link.symlink_to(target) + with pytest.raises(SystemExit, match="symlink"): + verify_expansion_artifacts(expansion) + + +def test_verify_expansion_artifacts_rejects_unsafe_manifest_paths(tmp_path): + expansion = _build_expansion_fixture(tmp_path) + manifest_path = expansion / "results" / "manifest.json" + manifest = json.loads(manifest_path.read_text(encoding="ascii")) + + outside = tmp_path / "outside.txt" + outside.write_text("leak\n", encoding="ascii") + for unsafe in ("../outside.txt", str(outside)): + tampered = dict(manifest) + tampered["artifacts"] = dict(manifest["artifacts"]) + tampered["artifacts"][unsafe] = _sha256(outside) + manifest_path.write_text(json.dumps(tampered), encoding="ascii") + with pytest.raises(SystemExit, match="unsafe"): + verify_expansion_artifacts(expansion) + + +def test_verify_expansion_artifacts_rejects_empty_manifest(tmp_path): + expansion = _build_expansion_fixture(tmp_path) + manifest_path = expansion / "results" / "manifest.json" + manifest_path.write_text(json.dumps({"artifacts": {}}), encoding="ascii") + with pytest.raises(SystemExit, match="lists no artifacts"): + verify_expansion_artifacts(expansion) + + +def test_release_wrapper_verifies_expansion_artifacts_before_copying(): + release_script = (REPO_ROOT / "scripts" / "release_paper_artifacts.sh").read_text( + encoding="utf-8" + ) + assert "verify_expansion_artifacts" in release_script + # The verification must run before the expansion artifacts are copied into + # the detached build worktree. + assert release_script.index("verify_expansion_artifacts") < release_script.index( + 'cp -R "${repo_root}/paper/expansion/results"' + ) + + +def test_committed_expansion_artifacts_validate(): + verify_expansion_artifacts(PAPER_ROOT / "expansion") From 0ad13ef48792d71ae146604f7bc0bba3d8ab6075 Mon Sep 17 00:00:00 2001 From: magnaprog <132261408+magnaprog@users.noreply.github.com> Date: Thu, 2 Jul 2026 00:02:26 -0700 Subject: [PATCH 2/2] docs: regenerate release artifacts for verified expansion publication Both releases regenerated from clean source commit 34096ad via the release wrappers (expansion first, then paper); the paper release ran with the new expansion-artifact verification active. Every economic CSV, figure, and target-tape hash is byte-identical to the prior release; the only content change in either PDF is the source-tree digest hex in the reproducibility appendix (pdftotext diff: one line per document). --- docs/img/performance_manifest.json | 4 ++-- paper/build_manifest.json | 10 +++++----- paper/expansion/results/manifest.json | 8 ++++---- paper/quantcortex_audit_anonymous.pdf | Bin 728812 -> 728813 bytes paper/quantcortex_audit_anonymous.sha256 | 2 +- paper/quantcortex_audit_neurips2026.pdf | Bin 730907 -> 730906 bytes paper/quantcortex_audit_neurips2026.sha256 | 2 +- ...antcortex_audit_neurips2026.sources.sha256 | 6 +++--- paper/results/generated_values.tex | 2 +- paper/results/manifest.json | 14 +++++++------- 10 files changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/img/performance_manifest.json b/docs/img/performance_manifest.json index 60f9f1f..d494aa7 100644 --- a/docs/img/performance_manifest.json +++ b/docs/img/performance_manifest.json @@ -1,11 +1,11 @@ { "schema_version": 4, - "generated_at": "2026-07-02T05:47:22Z", + "generated_at": "2026-07-02T06:57:57Z", "generator": { "path": "scripts/generate_report.py", "script_sha256": "b536aa7fc5e4fe7df6c7ff28c0992629a489869eaec46486db7aff1cb946099b", "git": { - "source_commit": "dddead6351d956223e2c7aecf959dd2d93388be9", + "source_commit": "34096ad11c1ae33531186a86961a9e2e883d60a9", "worktree_clean_at_start": true }, "source_tree": { diff --git a/paper/build_manifest.json b/paper/build_manifest.json index 4c6bcb4..288bfd0 100644 --- a/paper/build_manifest.json +++ b/paper/build_manifest.json @@ -1,18 +1,18 @@ { "anonymous_pdf": { "path": "quantcortex_audit_anonymous.pdf", - "sha256": "7a7e5283b098957602eea34e38dde3ffe5b2968a622f4789e0ad8bdbe0c3bbb6" + "sha256": "74bd8f67606e4bad177b81c49f3818fd2682abceef3b39cb279bb497d5b8d062" }, "pdf": { "path": "quantcortex_audit_neurips2026.pdf", - "sha256": "cf50fea34c2020061d86815c586106de87f26c9e29af46336524b899d1365cc2" + "sha256": "c2a16206747a6f9205396cb040d7cd01d0f5306319570286a218d9072388e7af" }, "schema_version": 1, - "source_commit": "dddead6351d956223e2c7aecf959dd2d93388be9", - "source_date_epoch": 1782970812, + "source_commit": "34096ad11c1ae33531186a86961a9e2e883d60a9", + "source_date_epoch": 1782975290, "source_manifest": { "path": "quantcortex_audit_neurips2026.sources.sha256", - "sha256": "39e28d3967612a086eaab5d81bbb69023dbb939900c119f42d28cab3ec48a631" + "sha256": "e550f507515e06a0ee005ec23b828d0ed346230841a99c718063589249c3d443" }, "tectonic_bundle": { "name": "default_bundle_v33.tar", diff --git a/paper/expansion/results/manifest.json b/paper/expansion/results/manifest.json index 34f753a..26eff98 100644 --- a/paper/expansion/results/manifest.json +++ b/paper/expansion/results/manifest.json @@ -163,9 +163,9 @@ } ] }, - "generated_at": "2026-07-02T05:40:12Z", + "generated_at": "2026-07-02T06:54:51Z", "git": { - "source_commit": "dddead6351d956223e2c7aecf959dd2d93388be9", + "source_commit": "34096ad11c1ae33531186a86961a9e2e883d60a9", "tracked_worktree_clean_at_start": true }, "protocol": { @@ -290,9 +290,9 @@ "quantcortex/timing/vix_scaler.py": "a3667424e5573fb289e63c26c69da6a68d6c943742359f0466d29b25c56e3686", "schemas/canonical_target_tape.schema.json": "4f1c0bf6d5360305d2982adea78de3f61c4bc1ebae9207cb2ba2bd4379b43d44", "scripts/fetch_expansion_data.py": "678b5c7fcc1b89e333fc5298b1fdaeb8994de713bc7b2b5ed461e1ec1eb94403", - "scripts/release_expansion_artifacts.sh": "c66de150012bc2ad4ea06f65e2f8993a564c003c717e3b220cf6c2f665d363e0", + "scripts/release_expansion_artifacts.sh": "727e7b9c023df48550481f38887624e5c6154217e279af2d4e77da11b93c7400", "scripts/run_expansion_experiments.py": "df9932dc67a1e1151faebc5dfd742f0aa622dfcf8093ce5ef9c55d9be4fbaf59" }, - "sha256": "3aeaab12c2c63f8022700be3a45978b4ca4f429703fde4566877eb4f2c830f0f" + "sha256": "3cea145651a58cdbb70509df5f53c56ff22d6ddf07c3bbe282280940d918777f" } } diff --git a/paper/quantcortex_audit_anonymous.pdf b/paper/quantcortex_audit_anonymous.pdf index cfd8337f03a86ab32d41c4db4c72fd3df5f3830c..a19d2bcb469e6e45e891de26e1a0176e57742838 100644 GIT binary patch delta 6266 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%0DWnwTk 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