chore(bench): archive reference-only scripts

A1-A3 of the legacy inventory, moved with git mv to benchmarks/archive/:
the stage-2 verifier chain (verify_batched, score_batched, verify_sinks,
model_sinks, sink_candidates), the v2 tool hunter (hunt.py) and the
harnessx-removal equality proof. The plane's verify/agree/roles tasks
replaced the first six; the harnessx-removal spec is closed.

- The six independent scripts keep HERE = benchmarks/independent (population,
  evaluate.py, results) and add their own directory for archived siblings.
- harnessx_removal_equality's REPO root is one level deeper.
- tests/test_plane_scoring_parity.py loads score_batched from the archive
  (ran here, not skipped); test_harnessx_removal_equality points at the new path.
- benchmarks/archive/README.md: what each script was, which committed
  records cite it, the commit that last ran it. paths.md maps old -> new;
  committed records are not rewritten.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01EmM1j46qgKMh3zqD1QMwEo
This commit is contained in:
Marius Ciepluch
2026-10-02 08:07:35 +02:00
co-authored by Claude Opus 5.5
parent bd74ba63b2
commit 067adb9845
11 changed files with 81 additions and 22 deletions
+26
View File
@@ -0,0 +1,26 @@
# Archived benchmark scripts
Reference-only scripts, moved here with `git mv` on 2026-10-02 (legacy cleanup) so their history
follows them. Nothing in `src/` imports them and no current workflow runs them. They stay because
committed records cite them and their numbers: to re-run a record, check out the commit the record
names rather than running these copies against today's package.
The old paths still appear inside committed records and in some docstrings. [paths.md](paths.md)
maps each old path to the new one. The records themselves are not rewritten.
| script | what it was | records that cite it | last recorded run |
|---|---|---|---|
| `verify_batched.py` | Stage-2 verifier, second design: triage per file, verify per file, report what two passes agree on. Replaced by the plane's `verify` + `agree` tasks. | `independent/results-v2-model-pipeline.json`, `independent/verifier-batched-check-2026-09-29.json`, `independent/plane-increment-2.json` (parity baseline) | `072a102` (named in `results-v2-model-pipeline.json`) |
| `score_batched.py` | Exploratory scorer for the batched verifier: sites anchored to the candidate, matched by `evaluate.matches_v2`. | `independent/verifier-batched-check-2026-09-29.json`, `independent/plane-increment-2.json`; `tests/test_plane_scoring_parity.py` still loads it as the reference | added in `6acd354` (2026-09-29); the parity test replays it on hosts with the recorded scans |
| `verify_sinks.py` | The first stage-2 verifier, one candidate at a time. `verify_batched.py` imports `ACCOUNT_ERRORS` and `_Recording` from it. | `independent/verifier-check-2026-09-29.json` | the known-answer check after `041d871` |
| `model_sinks.py` | Stage-1 source-only model classification of sinks. Moved into the package as `plane/tasks/roles.py`. | `independent/selection-v2-model-sinks.json`, `measurements/2026-10-01-decision-engine-harvest/record.json`, both `2026-10-01-decision-engine-leak-audit` records | `05d5699` (named in `selection-v2-model-sinks.json`) |
| `sink_candidates.py` | Diagnostic: vocabulary-declared sink candidates per case. Its declaration patterns live on in `plane/tasks/repo_facts.py`. | `independent/results-v2-model-pipeline.json` ("vocabulary sink-first: 2/17") | no commit recorded |
| `hunt.py` | The v2 tool-hunter run over the population (protocol `hunter-protocol-v2.md`, including its `FAMILY_WORDS` table). Replaced by the plane's `verify` / `agree` tasks. | `independent/hunter-protocol-v2.md`, `independent/results-v2-hunter.json` (a label source in `learn/sources.toml`) | `6bfb05f`, the commit that introduced the protocol, which pins the runner |
| `harnessx_removal_equality.py` | One-off equality proof for `harnessx-removal` (record and compare deterministic outputs). The spec is closed. `tests/test_harnessx_removal_equality.py` still checks that the comparison detects differences. | `measurements/2026-09-30-harnessx-removal-baseline/`, `measurements/2026-09-30-harnessx-removal-equality/` | baseline `ca5caf7`, candidate `b9afb66` |
The six `independent` scripts still read the population, `evaluate.py` and the results from
`benchmarks/independent/`. Their `HERE` points there, so outputs land where they always did.
`evaluate.py` and `freeze.py` are current and were not moved.
`verify_sinks.py --help` fails with an argparse `%` formatting error. That bug was already there
before the move. The script still imports cleanly.
@@ -5,8 +5,8 @@
non-zero on the first difference outside the exclusion list, naming the file and key. non-zero on the first difference outside the exclusion list, naming the file and key.
Usage: Usage:
python benchmarks/harnessx_removal_equality.py record <out-dir> [--tree-ish HEAD] [--workdir DIR] python benchmarks/archive/harnessx_removal_equality.py record <out-dir> [--tree-ish HEAD] [--workdir DIR]
python benchmarks/harnessx_removal_equality.py compare <baseline-dir> <candidate-dir> \\ python benchmarks/archive/harnessx_removal_equality.py compare <baseline-dir> <candidate-dir> \\
[--suite-map map.json] [--record comparison.json] [--suite-map map.json] [--record comparison.json]
The instrument checks come first and fail loudly: ``harnessx`` must not be importable, ``tree_sitter`` must be, The instrument checks come first and fail loudly: ``harnessx`` must not be importable, ``tree_sitter`` must be,
@@ -30,7 +30,7 @@ import xml.etree.ElementTree as ET
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
REPO = Path(__file__).resolve().parents[1] REPO = Path(__file__).resolve().parents[2] # archived under benchmarks/archive/
# Design section 3 "Comparison": timestamps, durations and run identifiers are excluded; nothing else is. # Design section 3 "Comparison": timestamps, durations and run identifiers are excluded; nothing else is.
EXCLUDED_KEYS = frozenset({"runtime_seconds", "scan_id", "timestamp", "started", "finished", "created_at", "generated_at"}) EXCLUDED_KEYS = frozenset({"runtime_seconds", "scan_id", "timestamp", "started", "finished", "created_at", "generated_at"})
@@ -10,9 +10,9 @@ Model calls go to the resolved hunter client (DeepSeek when its key is set); the
the recorded spend reaches `--budget-usd`. the recorded spend reaches `--budget-usd`.
Usage: Usage:
python benchmarks/independent/hunt.py --population population-v2.toml [--only ID,...] [--pins a,b] python benchmarks/archive/hunt.py --population population-v2.toml [--only ID,...] [--pins a,b]
python benchmarks/independent/hunt.py --population population-v2.toml --score python benchmarks/archive/hunt.py --population population-v2.toml --score
python benchmarks/independent/hunt.py --pilot-root <checkout> --family injection # a development case python benchmarks/archive/hunt.py --pilot-root <checkout> --family injection # a development case
""" """
from __future__ import annotations from __future__ import annotations
@@ -25,7 +25,8 @@ import sys
import time import time
from pathlib import Path from pathlib import Path
HERE = Path(__file__).resolve().parent # Archived 2026-10-02 from benchmarks/independent/: HERE stays that directory (population, evaluate.py, results).
HERE = Path(__file__).resolve().parents[1] / "independent"
sys.path.insert(0, str(HERE)) sys.path.insert(0, str(HERE))
import evaluate # noqa: E402 import evaluate # noqa: E402
@@ -12,7 +12,7 @@ counted as UNCLASSIFIED, never as "no sinks". Hard spend ceiling `--budget-usd`;
v2 is spent for tuning; this informs the selection design and qualifies nothing. v2 is spent for tuning; this informs the selection design and qualifies nothing.
Usage: python benchmarks/independent/model_sinks.py [--population population-v2.toml] [--only ID,...] Usage: python benchmarks/archive/model_sinks.py [--population population-v2.toml] [--only ID,...]
""" """
from __future__ import annotations from __future__ import annotations
@@ -27,7 +27,8 @@ import threading
import time import time
from pathlib import Path from pathlib import Path
HERE = Path(__file__).resolve().parent # Archived 2026-10-02 from benchmarks/independent/: HERE stays that directory (population, evaluate.py, results).
HERE = Path(__file__).resolve().parents[1] / "independent"
sys.path.insert(0, str(HERE)) sys.path.insert(0, str(HERE))
import evaluate # noqa: E402 import evaluate # noqa: E402
+24
View File
@@ -0,0 +1,24 @@
# Old path to new path (2026-10-02)
Committed records, specs and some docstrings name these scripts by their old path. Those files are
not rewritten. Read the old path as the new one:
| old path | new path |
|---|---|
| `benchmarks/independent/verify_batched.py` | `benchmarks/archive/verify_batched.py` |
| `benchmarks/independent/score_batched.py` | `benchmarks/archive/score_batched.py` |
| `benchmarks/independent/verify_sinks.py` | `benchmarks/archive/verify_sinks.py` |
| `benchmarks/independent/model_sinks.py` | `benchmarks/archive/model_sinks.py` |
| `benchmarks/independent/sink_candidates.py` | `benchmarks/archive/sink_candidates.py` |
| `benchmarks/independent/hunt.py` | `benchmarks/archive/hunt.py` |
| `benchmarks/harnessx_removal_equality.py` | `benchmarks/archive/harnessx_removal_equality.py` |
Files that still use the old path:
- Records: `independent/hunter-protocol-v2.md`, `independent/results-v2-model-pipeline.json`,
`independent/selection-v2-model-sinks.json`, `independent/verifier-batched-check-2026-09-29.json`,
`measurements/2026-09-30-harnessx-removal-equality/README`
- Specs: `.kiro/specs/ai-service-plane/`, `.kiro/specs/harnessx-removal/design.md`,
`.kiro/specs/learned-decision-engine/`
- Docstrings: `src/openultrasast/plane/generate.py`, `plane/tasks/{verify,agree,roles,repo_facts}.py`.
These are left for the owners of those packages.
@@ -10,7 +10,7 @@ detected when an AGREED finding matches; unstable when only a DISPUTED one does;
finding at the fixed pin matches the fix's new side. The precision sample is every third agreed vulnerable-pin finding at the fixed pin matches the fix's new side. The precision sample is every third agreed vulnerable-pin
finding (all if 15 or fewer), to be adjudicated by hand. v2 is spent for tuning: this qualifies nothing. finding (all if 15 or fewer), to be adjudicated by hand. v2 is spent for tuning: this qualifies nothing.
Usage: python benchmarks/independent/score_batched.py [--results-suffix batched] [--population population-v2.toml] Usage: python benchmarks/archive/score_batched.py [--results-suffix batched] [--population population-v2.toml]
""" """
from __future__ import annotations from __future__ import annotations
@@ -20,7 +20,8 @@ import json
import sys import sys
from pathlib import Path from pathlib import Path
HERE = Path(__file__).resolve().parent # Archived 2026-10-02 from benchmarks/independent/: HERE stays that directory (population, evaluate.py, results).
HERE = Path(__file__).resolve().parents[1] / "independent"
sys.path.insert(0, str(HERE)) sys.path.insert(0, str(HERE))
import evaluate # noqa: E402 import evaluate # noqa: E402
@@ -12,7 +12,7 @@ changed files -- never to choose scope.
v2 is spent for tuning; this informs the selection design and qualifies nothing. v2 is spent for tuning; this informs the selection design and qualifies nothing.
Usage: python benchmarks/independent/sink_candidates.py [--population population-v2.toml] [--only ID,...] Usage: python benchmarks/archive/sink_candidates.py [--population population-v2.toml] [--only ID,...]
""" """
from __future__ import annotations from __future__ import annotations
@@ -24,7 +24,8 @@ import shutil
import sys import sys
from pathlib import Path from pathlib import Path
HERE = Path(__file__).resolve().parent # Archived 2026-10-02 from benchmarks/independent/: HERE stays that directory (population, evaluate.py, results).
HERE = Path(__file__).resolve().parents[1] / "independent"
sys.path.insert(0, str(HERE)) sys.path.insert(0, str(HERE))
import evaluate # noqa: E402 import evaluate # noqa: E402
@@ -22,7 +22,7 @@ Source only; the stage-1 candidates come from `model_sinks.py`. Results in `~/ou
EXPLORATORY: v2 is spent for tuning; this qualifies nothing. EXPLORATORY: v2 is spent for tuning; this qualifies nothing.
Usage: Usage:
python benchmarks/independent/verify_batched.py [--only ID,...] [--subset sets.json] [--passes 2] [--budget-usd 40] python benchmarks/archive/verify_batched.py [--only ID,...] [--subset sets.json] [--passes 2] [--budget-usd 40]
""" """
from __future__ import annotations from __future__ import annotations
@@ -35,8 +35,10 @@ import sys
import time import time
from pathlib import Path from pathlib import Path
HERE = Path(__file__).resolve().parent # Archived 2026-10-02 from benchmarks/independent/: HERE stays that directory (population, evaluate.py, results).
HERE = Path(__file__).resolve().parents[1] / "independent"
sys.path.insert(0, str(HERE)) sys.path.insert(0, str(HERE))
sys.path.insert(0, str(Path(__file__).resolve().parent)) # archived siblings: model_sinks, verify_sinks
import evaluate # noqa: E402 import evaluate # noqa: E402
from model_sinks import OPERATIONS, chunks # noqa: E402 from model_sinks import OPERATIONS, chunks # noqa: E402
@@ -10,7 +10,7 @@ Scope: the candidates `model_sinks.py` recorded for each case's vulnerable pin
detected sites (`--fixed`). Findings are written in the scan-result shape `evaluate.py` reads. Hard spend detected sites (`--fixed`). Findings are written in the scan-result shape `evaluate.py` reads. Hard spend
ceiling. EXPLORATORY: v2 is spent for tuning; this qualifies nothing. ceiling. EXPLORATORY: v2 is spent for tuning; this qualifies nothing.
Usage: python benchmarks/independent/verify_sinks.py [--only ID,...] [--budget-usd 40] [--fixed] Usage: python benchmarks/archive/verify_sinks.py [--only ID,...] [--budget-usd 40] [--fixed]
""" """
from __future__ import annotations from __future__ import annotations
@@ -23,8 +23,10 @@ import sys
import time import time
from pathlib import Path from pathlib import Path
HERE = Path(__file__).resolve().parent # Archived 2026-10-02 from benchmarks/independent/: HERE stays that directory (population, evaluate.py, results).
HERE = Path(__file__).resolve().parents[1] / "independent"
sys.path.insert(0, str(HERE)) sys.path.insert(0, str(HERE))
sys.path.insert(0, str(Path(__file__).resolve().parent)) # archived siblings: model_sinks, verify_sinks
import evaluate # noqa: E402 import evaluate # noqa: E402
from model_sinks import OPERATIONS # noqa: E402 from model_sinks import OPERATIONS # noqa: E402
+1 -1
View File
@@ -12,7 +12,7 @@ import json
from pathlib import Path from pathlib import Path
ROOT = Path(__file__).resolve().parents[1] ROOT = Path(__file__).resolve().parents[1]
_SPEC = importlib.util.spec_from_file_location("hxr_equality", ROOT / "benchmarks" / "harnessx_removal_equality.py") _SPEC = importlib.util.spec_from_file_location("hxr_equality", ROOT / "benchmarks" / "archive" / "harnessx_removal_equality.py")
assert _SPEC is not None and _SPEC.loader is not None assert _SPEC is not None and _SPEC.loader is not None
equality = importlib.util.module_from_spec(_SPEC) equality = importlib.util.module_from_spec(_SPEC)
_SPEC.loader.exec_module(equality) _SPEC.loader.exec_module(equality)
+5 -4
View File
@@ -1,6 +1,6 @@
"""`agree` scores exactly as the reference measurement did (ai-service-plane Requirement 6). """`agree` scores exactly as the reference measurement did (ai-service-plane Requirement 6).
The reference is `benchmarks/independent/score_batched.py` over the batched-check scans: sites anchored by The reference is `benchmarks/archive/score_batched.py` over the batched-check scans: sites anchored by
`score_batched.anchored`, matched by `evaluate.matches_v2` against `evaluate.hunks(case, "old")`. The plane cannot `score_batched.anchored`, matched by `evaluate.matches_v2` against `evaluate.hunks(case, "old")`. The plane cannot
ship the benchmark tree, so the generator resolves the ranges into `case.json` and `agree.matches_declared` ship the benchmark tree, so the generator resolves the ranges into `case.json` and `agree.matches_declared`
reproduces the rule. These tests run both on the recorded reference outputs of the 15 validation cases and reproduces the rule. These tests run both on the recorded reference outputs of the 15 validation cases and
@@ -23,6 +23,7 @@ from openultrasast.plane.manifests import load_manifests
from openultrasast.plane.tasks import agree from openultrasast.plane.tasks import agree
BENCH = Path("benchmarks/independent") BENCH = Path("benchmarks/independent")
ARCHIVE = Path("benchmarks/archive") # score_batched.py, archived 2026-10-02
POPULATION = BENCH / "population-v2.toml" POPULATION = BENCH / "population-v2.toml"
SCANS = Path.home() / "ousast-results" / "independent-v2-batched-check" / "scans" SCANS = Path.home() / "ousast-results" / "independent-v2-batched-check" / "scans"
REPOS = Path.home() / ".cache" / "openultrasast" / "independent" REPOS = Path.home() / ".cache" / "openultrasast" / "independent"
@@ -33,10 +34,10 @@ pytestmark = pytest.mark.skipif(
) )
def _load(name: str) -> ModuleType: def _load(name: str, where: Path = BENCH) -> ModuleType:
sys.path.insert(0, str(BENCH.resolve())) # score_batched imports evaluate by name sys.path.insert(0, str(BENCH.resolve())) # score_batched imports evaluate by name
try: try:
spec = importlib.util.spec_from_file_location(f"parity_{name}", BENCH / f"{name}.py") spec = importlib.util.spec_from_file_location(f"parity_{name}", where / f"{name}.py")
assert spec is not None and spec.loader is not None assert spec is not None and spec.loader is not None
module = importlib.util.module_from_spec(spec) module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module) spec.loader.exec_module(module)
@@ -47,7 +48,7 @@ def _load(name: str) -> ModuleType:
@pytest.fixture(scope="module") @pytest.fixture(scope="module")
def reference() -> tuple[ModuleType, ModuleType]: def reference() -> tuple[ModuleType, ModuleType]:
evaluate, score_batched = _load("evaluate"), _load("score_batched") evaluate, score_batched = _load("evaluate"), _load("score_batched", ARCHIVE)
evaluate.use(POPULATION.resolve()) evaluate.use(POPULATION.resolve())
return evaluate, score_batched return evaluate, score_batched