BarunAction-35M / source /scripts /verify_public_release.py
harrrshall's picture
Release BarunAction-35M candidate-v2
5a46e5d verified
Raw
History Blame Contribute Delete
10.9 kB
"""Verify the curated BarunAction-35M public release without network access."""
from __future__ import annotations
import argparse
import hashlib
import json
from collections import Counter
from pathlib import Path
from typing import Any
EXPECTED_FILES = {
"barunaction-aggregate.json": (
5841,
"5d7244d2fa449a7ce4b2aa3a20fc095fb118a38920b1dd9181f56669a7ddfea1",
),
"barunaction-predictions.jsonl": (
282046,
"e5aea59e5090e3aa7c9dbd6b1a810c753410a159ce18dc8bb889fde3a58b8665",
),
"int8-paired-outcomes.jsonl": (
169082,
"e63e48dc8149b615ab03a14fb9fff9b1435ab59c6623e72c16b44d34d7c651ad",
),
"manifest.json": (
1908,
"d7d4223a58ac0277653c44209d9cb35edc0d98754b0c543019c0be67545bd318",
),
"qwen-aggregate.json": (
5822,
"2184b93d383f1136c050d95e71fb129bbe083b3fea4de86da6bdf5ec7f3e1756",
),
"qwen-paired-outcomes.jsonl": (
95113,
"ad5d44e741f9b98a0a0ffaadfa147c142cdaf8fea8801a11b62b7d323e93730a",
),
"qwen-predictions.jsonl": (
282394,
"836788091d08b931bf37565d197c4053e6e6f4664d379c38e7668ae9b8739b08",
),
"qwen-provenance.json": (
3434,
"1a1c19cdfacaa25e296ab1c3f92a42ebc8c08802c0cec8047ab581d50669769e",
),
}
EXPECTED_MODEL_FILES = {
"barun_config.json": "9b3a1d71baa95a198744d250f9629231738d942570b8685c44307fd83dd33565",
"checkpoint_manifest.json": (
"c743ab7c4d33ae75c6b0aa4547458a961b92766da8fcf85fd148fda2ebb5530a"
),
"model.safetensors": "fdb95ccf58a095e0d321be998924318b35ee59a334f6dd97d8726d2cf80021d3",
"tokenizer.json": "70ded9605fccd09c2340ca7e225361eab0ae8b4dbbb0d6e26343ab5183979db6",
}
EXPECTED_QWEN_OUTCOMES = {
"both_correct": 583,
"both_wrong": 74,
"candidate_only_win": 19,
"baseline_only_win": 80,
}
EXPECTED_MANIFEST_FILES = frozenset(EXPECTED_FILES) - {"manifest.json"}
ALLOWED_PREDICTION_KEYS = {
"generated_tokens",
"generation_failure",
"id",
"prediction_raw",
"prompt_tokens",
"truncated",
}
class ReleaseVerificationError(ValueError):
"""Raised when a public release commitment does not reproduce."""
def _sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open("rb") as source:
for block in iter(lambda: source.read(1024 * 1024), b""):
digest.update(block)
return digest.hexdigest()
def _strict_json(path: Path) -> Any:
def reject_pairs(pairs: list[tuple[str, Any]]) -> dict[str, Any]:
value: dict[str, Any] = {}
for key, item in pairs:
if key in value:
raise ReleaseVerificationError(f"duplicate JSON key {key!r} in {path}")
value[key] = item
return value
try:
return json.loads(path.read_text(encoding="utf-8"), object_pairs_hook=reject_pairs)
except (OSError, UnicodeError, json.JSONDecodeError) as error:
raise ReleaseVerificationError(f"invalid JSON: {path}") from error
def _jsonl(path: Path) -> list[dict[str, Any]]:
rows: list[dict[str, Any]] = []
for line_number, line in enumerate(path.read_text(encoding="utf-8").splitlines(), start=1):
try:
row = json.loads(line)
except json.JSONDecodeError as error:
raise ReleaseVerificationError(f"invalid JSONL at {path}:{line_number}") from error
if not isinstance(row, dict):
raise ReleaseVerificationError(f"non-object JSONL row at {path}:{line_number}")
rows.append(row)
return rows
def verify_release(root: Path, *, checkpoint: Path | None = None) -> dict[str, Any]:
evidence = root / "benchmarks" / "evidence"
checked: dict[str, dict[str, int | str]] = {}
for name, (expected_bytes, expected_sha256) in EXPECTED_FILES.items():
path = evidence / name
if not path.is_file():
raise ReleaseVerificationError(f"missing curated evidence file: {path}")
actual_bytes = path.stat().st_size
actual_sha256 = _sha256(path)
if actual_bytes != expected_bytes or actual_sha256 != expected_sha256:
raise ReleaseVerificationError(f"curated evidence hash mismatch: {path}")
checked[name] = {"bytes": actual_bytes, "sha256": actual_sha256}
predictions: dict[str, list[dict[str, Any]]] = {}
for name in ("barunaction-predictions.jsonl", "qwen-predictions.jsonl"):
rows = _jsonl(evidence / name)
if len(rows) != 756:
raise ReleaseVerificationError(f"{name} must contain exactly 756 rows")
if any(set(row) != ALLOWED_PREDICTION_KEYS for row in rows):
raise ReleaseVerificationError(f"{name} contains a non-public prediction field")
ids = [row["id"] for row in rows]
if len(ids) != len(set(ids)):
raise ReleaseVerificationError(f"{name} contains duplicate sample IDs")
predictions[name] = rows
barun_ids = [row["id"] for row in predictions["barunaction-predictions.jsonl"]]
qwen_ids = [row["id"] for row in predictions["qwen-predictions.jsonl"]]
if barun_ids != qwen_ids:
raise ReleaseVerificationError("BarunAction and Qwen prediction IDs are not aligned")
paired = _jsonl(evidence / "qwen-paired-outcomes.jsonl")
if len(paired) != 756 or [row.get("id") for row in paired] != barun_ids:
raise ReleaseVerificationError("paired comparison IDs do not align with predictions")
outcome_counts = Counter(str(row.get("outcome")) for row in paired)
if dict(outcome_counts) != EXPECTED_QWEN_OUTCOMES:
raise ReleaseVerificationError("paired comparison outcomes do not reproduce")
if any(
set(row) != {"baseline_ast_exact", "candidate_ast_exact", "id", "outcome"} for row in paired
):
raise ReleaseVerificationError("paired outcomes contain non-public fields")
int8_rows = _jsonl(evidence / "int8-paired-outcomes.jsonl")
if len(int8_rows) != 756:
raise ReleaseVerificationError("int8 paired evidence must contain exactly 756 rows")
aggregates = {
"barunaction": _strict_json(evidence / "barunaction-aggregate.json"),
"qwen": _strict_json(evidence / "qwen-aggregate.json"),
}
expected_exact = {"barunaction": (602, 756), "qwen": (663, 756)}
for name, (numerator, denominator) in expected_exact.items():
metric = aggregates[name].get("ast_exact_match")
if not isinstance(metric, dict):
raise ReleaseVerificationError(f"{name} aggregate lacks ast_exact_match")
if metric.get("numerator") != numerator or metric.get("denominator") != denominator:
raise ReleaseVerificationError(f"{name} aggregate exact count changed")
checkpoint_result: dict[str, str] | None = None
if checkpoint is not None:
checkpoint_result = {}
for name, expected_sha256 in EXPECTED_MODEL_FILES.items():
path = checkpoint / name
if not path.is_file():
raise ReleaseVerificationError(f"missing model file: {path}")
actual_sha256 = _sha256(path)
if actual_sha256 != expected_sha256:
raise ReleaseVerificationError(f"model file hash mismatch: {path}")
checkpoint_result[name] = actual_sha256
manifest = _strict_json(evidence / "manifest.json")
if manifest.get("schema_version") != "barunaction-curated-benchmark-evidence-v1":
raise ReleaseVerificationError("unexpected curated evidence manifest version")
benchmark = manifest.get("benchmark")
if not isinstance(benchmark, dict):
raise ReleaseVerificationError("curated evidence manifest lacks benchmark boundary")
expected_benchmark = {
"dataset": "google/mobile-actions",
"dataset_revision": "e920309bc2acbc2e99a5e3201cf37df2b9fd9151",
"dev_manifest_sha256": ("988bdce5874d1f1a775feeb5ba2b58cd2bdc128f57e73cb9a63d535fae7c1d55"),
"dev_rows": 756,
"evaluator_version": "action-ir-v1.0.0",
"official_evaluation_rows_accessed": 0,
"scorer_version": "barun-mobile-actions-score-v1",
}
if benchmark != expected_benchmark:
raise ReleaseVerificationError("curated evidence benchmark boundary changed")
redistribution = manifest.get("redistribution")
expected_redistribution = {
"gold_labels_included": False,
"official_evaluation_included": False,
"prompts_included": False,
"raw_or_processed_dataset_rows_included": False,
}
if redistribution != expected_redistribution:
raise ReleaseVerificationError("curated evidence redistribution boundary changed")
manifest_files = manifest.get("files")
if not isinstance(manifest_files, dict) or set(manifest_files) != EXPECTED_MANIFEST_FILES:
raise ReleaseVerificationError("curated evidence manifest inventory changed")
for name in sorted(EXPECTED_MANIFEST_FILES):
declaration = manifest_files.get(name)
if not isinstance(declaration, dict):
raise ReleaseVerificationError(f"curated evidence declaration missing: {name}")
expected_bytes, expected_sha256 = EXPECTED_FILES[name]
if (
declaration.get("bytes") != expected_bytes
or declaration.get("sha256") != expected_sha256
):
raise ReleaseVerificationError(f"curated evidence declaration changed: {name}")
if name.endswith(("predictions.jsonl", "paired-outcomes.jsonl")):
if (
declaration.get("rows") != 756
or declaration.get("contains_gold_labels") is not False
):
raise ReleaseVerificationError(f"curated evidence row boundary changed: {name}")
elif set(declaration) != {"bytes", "sha256"}:
raise ReleaseVerificationError(
f"unexpected curated evidence declaration fields: {name}"
)
return {
"barunaction_ast_exact": {"denominator": 756, "numerator": 602},
"checkpoint": checkpoint_result,
"evidence_files": checked,
"official_evaluation_rows_accessed": benchmark["official_evaluation_rows_accessed"],
"ok": True,
"qwen_ast_exact": {"denominator": 756, "numerator": 663},
"qwen_paired_outcomes": dict(sorted(outcome_counts.items())),
"schema_version": "barunaction-public-release-verification-v1",
}
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--root", type=Path, default=Path(__file__).resolve().parents[1])
parser.add_argument("--checkpoint", type=Path)
args = parser.parse_args()
result = verify_release(args.root.resolve(), checkpoint=args.checkpoint)
print(json.dumps(result, indent=2, sort_keys=True))
return 0
if __name__ == "__main__":
raise SystemExit(main())