diff --git a/research/agent-07-verifeng-seed88/README.md b/research/agent-07-verifeng-seed88/README.md new file mode 100644 index 0000000000..9149a71207 --- /dev/null +++ b/research/agent-07-verifeng-seed88/README.md @@ -0,0 +1,142 @@ +# Concurrent scheduling for the isolated test runner (verification engineering) + +Track 85–94 (verification engineering), assignment seed 88. Base commit +`f567884aeb8851b6e794af1184119a3bfbe1e631`. Prepared with help from opencode. +No new kappa claim; this is a tooling improvement only. + +## What changed + +`scripts/run_isolated_tests.py` (run by `make verify-tests`, hence by +`make verify`) ran each test module in a fresh interpreter, sequentially. A +timing survey of the `make verify` checks on the base commit found this +runner to be by far the most expensive single check: it exceeded a 250 s +sweep budget and measured 298.5 s end to end, while every other individual +check surveyed was at most 144 s (`scripts/audit_quadratic_affine.py`), +most below 10 s. + +The runner now schedules the same per-module commands concurrently, one +isolated interpreter per module, and replays each module's captured +stdout/stderr bytes in sorted module order. The point of the original +design — one fresh interpreter per test module, so research packages with +colliding module names (`verify`, `skip_graph`, `data_recovery`, ...) cannot +bind each other's imports — is unchanged: process isolation is exactly what +makes the modules independent and safely concurrent. A test-module audit +found no writes outside `tempfile.TemporaryDirectory()` blocks (see +"Exactness" below), so concurrent modules share no mutable state. + +A `--workers N` flag pins the concurrency width (default: CPU count). With +no arguments the command line, the per-module commands, the summary lines +and the exit behavior are those of the pre-change runner. + +## Measured result (same host, same input) + +| Run | Modules | Wall time | +|---|---|---| +| Pre-change runner, base commit, end to end | 87 (its test file not yet added) | 298.5 s | +| Benchmark sequential pass (pre-change schedule, captured) | 88 | 250.6 s | +| Benchmark concurrent pass (`run_modules`, 16 workers) | 88 | 75.9 s (3.30x) | +| Post-change runner end to end | 88 | 76.7 s (3.9x vs. the base run) | + +The sequential baseline differs from the shipped old script only in pipe +capture; commands and ordering are identical. The end-to-end comparison +covers 87 vs. 88 modules because `tests/test_isolated_test_runner.py` is +part of this change; the extra module accounts for roughly a second on +either side. Host: 16 logical CPUs, CPython 3.13.15 on Windows; the +speedup is bounded by the slowest single module (tail effect), so it scales +with core count up to that floor. + +## Exactness + +The change alters scheduling only. Per module, the command is +byte-identical to the pre-change one: + + python -m unittest discover -s -p -v + +with the same interpreter, working directory and environment. The runner +replays each module's captured bytes in sorted module order, so the +combined stdout and stderr streams equal a sequential run module for +module. + +Equivalence is machine-checked by `benchmark.py`: it runs every module with +the pre-change sequential schedule and again with the concurrent scheduler, +then compares per-module exit codes and stdout/stderr SHA-256. Measured on +88 modules: + +- exit codes: identical for all 88; the failing-module sets of the two + schedules are equal (the same 15 modules fail in both); +- stdout: byte-identical for all 88; +- stderr: byte-identical for 87 after normalizing the wall-clock field + `unittest -v` embeds in its `Ran N tests in T.TTTs` line (raw stderr + differs in every module for exactly that field); +- `test_frontier799_bindings.py` is inherently nondeterministic across any + two runs: its failing traceback embeds a machine-random temporary + directory path (`...\Temp\tmpXXXX\ancestor\bit`). The benchmark proves + this automatically by re-running any mismatched module twice under the + same schedule; `scheduling_driven_mismatches` is empty. + +Coverage is unchanged: the same glob (`tests/test*.py`), the same command +per module, and every module's exit code still contributes to the shared +`Failed modules: ...` failure summary and the +`PASS all N test modules in isolated interpreters` success line. + +## Negative controls + +`tests/test_isolated_test_runner.py` runs the real runner end to end in a +sandbox (a copied runner plus a tiny `tests/` directory): + +1. Two passing and one deliberately failing module: every module runs and + the failure is reported in the shared summary (failure detection intact). +2. A barrier test: three modules each write a marker and then wait (8 s) + for three markers to exist. They only all pass if at least three module + processes run concurrently. Against the pre-change runner this test + fails with "barrier timeout: test modules did not run concurrently"; it + passes with `--workers 3` after the change. +3. Default-invocation compatibility: unchanged summary lines and exit + code 1 on failure. + +The benchmark itself is a negative control on exactness: any exit-code or +scheduling-driven receipt change makes it fail. + +## Reproduce + + python3 -B research/agent-07-verifeng-seed88/benchmark.py + +Expected final line (numbers above it may vary with core count): + + PASS identical exit codes (88 modules); receipts identical for 87 modules modulo the unittest timing field; 1 module(s) inherently nondeterministic across same-mode runs: ['test_frontier799_bindings.py'] + + python3 -B scripts/run_isolated_tests.py + +Expected on a host with the full Unix test surface: per-module +`Checking ...` lines and `PASS all 88 test modules in isolated interpreters`. +Measured on this Windows host: exit 1 with the pre-existing 15-module +failing set (`Failed modules: ...`), 88 `Checking` lines, 76.7 s; the same +set fails at the base commit. + +## Scope and inherited obligations + +- The 15 failing test modules on this Windows host are environmental and + present identically before and after this change (for example + `ModuleNotFoundError: No module named 'resource'`, a Unix-only + standard-library module, in the `copied_*` tests). This package does not + fix Windows portability of the test suite; the claim is that the + concurrent runner reproduces the sequential runner's per-module receipts, + exit codes and failing set exactly. +- This changes no mathematical content: no certificate, patch, generator, + proof supplement or pinned source file is touched. + `run_isolated_tests.py` is not hash-pinned by + `certificates/selected-result.json`, + `research/community-frontier799-audit/SELECTED-SOURCE.json` or any + checkpoint record. +- Unresolved: live interleaved output during a run is replaced by + per-module replay when each module finishes (still in sorted order). A + hung module stalls the printed stream where a sequential run would, but + earlier finished modules wait for their turn to print. + +## Attribution + +Written with help from opencode. The runner's original design and the +test-suite content are repository predecessors; this package only changes +scheduling and adds evidence. Related concurrent work on other targets +includes PR #853 (concurrent pinned stages for the #741 replay); this +result does not touch or depend on it. diff --git a/research/agent-07-verifeng-seed88/SPRINT-CLAIM.md b/research/agent-07-verifeng-seed88/SPRINT-CLAIM.md new file mode 100644 index 0000000000..5969e81393 --- /dev/null +++ b/research/agent-07-verifeng-seed88/SPRINT-CLAIM.md @@ -0,0 +1,19 @@ +# Sprint claim — agent-07 (recorded locally; no pinned coordination issue exists) + +- Track: 85–94 Verification engineering +- Assignment seed: 88 (OS randomness via Python `secrets.randbelow(100)`) +- Base commit: f567884aeb8851b6e794af1184119a3bfbe1e631 (origin/main of CrocSwap/integer-mult-bounds) +- Branch: research/agent-07-verifeng-seed88 +- Object under investigation: one costly `make verify` check not covered by any open + verification-engineering PR (survey taken 2026-10-13; open tooling PRs already cover + data-corner replay #903, sparse-fusion #900, Leech minors #898, joint-frame #871, + #741 concurrent stages #853, PR799 dyadic fusion #849, stage-pair #824, + signed-sparse #833, R420 RREF #818, cyclic routing #808, PR626 gzip portability #819, + frontier741 receipts #847/#838, PR799 evidence coverage #865). +- Method: profile the remaining checks; pick the slowest untargeted one; optimize its + hot loop with exact arithmetic preserved (identical stdout/receipts), or make it + reproducible; benchmark before/after on the same input; keep exactness and + failure-detection coverage. +- Expected deliverable: a tooling PR with before/after wall times and byte-identical + receipts, or a scoped reproducibility improvement. +- Expected finish: same session (2026-10-13). diff --git a/research/agent-07-verifeng-seed88/benchmark.py b/research/agent-07-verifeng-seed88/benchmark.py new file mode 100644 index 0000000000..e08253527a --- /dev/null +++ b/research/agent-07-verifeng-seed88/benchmark.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 +"""Before/after benchmark and receipt-equivalence check for run_isolated_tests. + +Before: runs every test module with the exact sequential command the +pre-change runner used, capturing each module's stdout/stderr bytes. +After: runs the concurrent scheduler from scripts/run_isolated_tests.py +(run_modules) over the same modules with the same commands. + +Then it compares per-module exit codes and byte streams. unittest -v +embeds a wall-clock field ("Ran N tests in T.TTTs") in stderr, so stderr +is compared both raw and with that single field normalized; stdout is +compared raw. The failing-module sets must match exactly. + +Usage: python3 -B research/agent-07-verifeng-seed88/benchmark.py +Writes evidence/benchmark.json next to this file. +""" +from hashlib import sha256 +from importlib.util import module_from_spec, spec_from_file_location +import json +import os +from pathlib import Path +import re +import subprocess +import sys +import time + +ROOT = Path(__file__).resolve().parents[2] +HERE = Path(__file__).resolve().parent +TIMING = re.compile(r'in \d+\.\d+s') + + +def load_runner(): + spec = spec_from_file_location('run_isolated_tests', ROOT / 'scripts' / 'run_isolated_tests.py') + module = module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def digest(data): + return sha256(data).hexdigest() + + +def normalize(data): + return TIMING.sub('in T', data.decode('utf-8', errors='replace')).encode() + + +def record(results): + out = {} + for path, code, stdout, stderr in results: + out[path.name] = { + 'code': code, + 'stdout_sha256': digest(stdout), + 'stderr_sha256': digest(stderr), + 'stderr_normalized_sha256': digest(normalize(stderr)), + } + return out + + +def main(): + runner = load_runner() + files = sorted((ROOT / 'tests').glob('test*.py')) + workers = min(len(files), os.cpu_count() or 1) + + sequential = [] + start = time.perf_counter() + for path in files: + result = subprocess.run( + runner.module_command(sys.executable, ROOT / 'tests', path.name), + cwd=ROOT, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + sequential.append((path, result.returncode, result.stdout, result.stderr)) + seq_wall = time.perf_counter() - start + + start = time.perf_counter() + concurrent = runner.run_modules(files, workers=workers) + par_wall = time.perf_counter() - start + + seq_rec, par_rec = record(sequential), record(concurrent) + mismatches = [] + code_mismatches = [] + raw_equal = normalized_equal = 0 + for path in files: + s, p = seq_rec[path.name], par_rec[path.name] + if s['code'] != p['code']: + code_mismatches.append(path.name) + if s['stdout_sha256'] == p['stdout_sha256'] and s['stderr_sha256'] == p['stderr_sha256']: + raw_equal += 1 + if s['stdout_sha256'] == p['stdout_sha256'] and s['stderr_normalized_sha256'] == p['stderr_normalized_sha256']: + normalized_equal += 1 + else: + mismatches.append(path.name) + + # A module whose receipts differ between schedules is acceptable only if its + # output is nondeterministic across two runs of the SAME schedule as well + # (for example a failing traceback embedding a random temporary path). + inherent = [] + scheduling_driven = [] + for name in mismatches: + runs = [] + for _ in range(2): + result = subprocess.run( + runner.module_command(sys.executable, ROOT / 'tests', name), + cwd=ROOT, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + runs.append((result.returncode, result.stdout, result.stderr)) + same = (record([(Path(name),) + runs[0]])[name] == record([(Path(name),) + runs[1]])[name]) + (inherent if not same else scheduling_driven).append(name) + + evidence = { + 'runner': 'scripts/run_isolated_tests.py', + 'baseline': 'per-module sequential command of the pre-change runner (identical commands, sequential scheduling)', + 'python': sys.version.split()[0], + 'cpu_count': os.cpu_count(), + 'workers': workers, + 'modules': len(files), + 'sequential_wall_seconds': round(seq_wall, 2), + 'concurrent_wall_seconds': round(par_wall, 2), + 'speedup': round(seq_wall / par_wall, 2) if par_wall else None, + 'raw_equal_modules': raw_equal, + 'normalized_equal_modules': normalized_equal, + 'code_mismatches': code_mismatches, + 'receipt_mismatches': mismatches, + 'inherently_nondeterministic': inherent, + 'scheduling_driven_mismatches': scheduling_driven, + 'sequential_failing': sorted(n for n, r in seq_rec.items() if r['code']), + 'concurrent_failing': sorted(n for n, r in par_rec.items() if r['code']), + 'per_module_sequential': seq_rec, + 'per_module_concurrent': par_rec, + } + (HERE / 'evidence').mkdir(exist_ok=True) + (HERE / 'evidence' / 'benchmark.json').write_text(json.dumps(evidence, indent=1) + '\n') + print(json.dumps({k: v for k, v in evidence.items() + if not k.startswith('per_module')}, indent=1)) + if code_mismatches or scheduling_driven: + raise SystemExit('scheduling changed behavior: %r %r' % (code_mismatches, scheduling_driven)) + print('PASS identical exit codes (%d modules); receipts identical for %d modules ' + 'modulo the unittest timing field; %d module(s) inherently nondeterministic ' + 'across same-mode runs: %r' % (len(files), normalized_equal, len(inherent), inherent)) + + +if __name__ == '__main__': + main() diff --git a/research/agent-07-verifeng-seed88/evidence/benchmark.json b/research/agent-07-verifeng-seed88/evidence/benchmark.json new file mode 100644 index 0000000000..4c601b18cb --- /dev/null +++ b/research/agent-07-verifeng-seed88/evidence/benchmark.json @@ -0,0 +1,1115 @@ +{ + "runner": "scripts/run_isolated_tests.py", + "baseline": "per-module sequential command of the pre-change runner (identical commands, sequential scheduling)", + "python": "3.13.15", + "cpu_count": 16, + "workers": 16, + "modules": 88, + "sequential_wall_seconds": 250.63, + "concurrent_wall_seconds": 75.9, + "speedup": 3.3, + "raw_equal_modules": 0, + "normalized_equal_modules": 87, + "code_mismatches": [], + "receipt_mismatches": [ + "test_frontier799_bindings.py" + ], + "inherently_nondeterministic": [ + "test_frontier799_bindings.py" + ], + "scheduling_driven_mismatches": [], + "sequential_failing": [ + "test_batched_network.py", + "test_climbed_48.py", + "test_copied_fixed.py", + "test_copied_fixed_reversed.py", + "test_copied_reversed.py", + "test_cpp_headers.py", + "test_frontier799_bindings.py", + "test_lean_sources.py", + "test_open_pr_lean.py", + "test_pair_assembly.py", + "test_positive_skip.py", + "test_pr_reconciliation.py", + "test_skip_clones.py", + "test_skip_strips.py", + "test_skip_suffix.py" + ], + "concurrent_failing": [ + "test_batched_network.py", + "test_climbed_48.py", + "test_copied_fixed.py", + "test_copied_fixed_reversed.py", + "test_copied_reversed.py", + "test_cpp_headers.py", + "test_frontier799_bindings.py", + "test_lean_sources.py", + "test_open_pr_lean.py", + "test_pair_assembly.py", + "test_positive_skip.py", + "test_pr_reconciliation.py", + "test_skip_clones.py", + "test_skip_strips.py", + "test_skip_suffix.py" + ], + "per_module_sequential": { + "test_additive_labels.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "f8008723c5c810d97e99075bf2d95e4d5af78a9593ad7ead23f4669551d6f180", + "stderr_normalized_sha256": "e30df3a1a154d414549626973d4c178b9e03d5810a932ed228f9a9942fc7e1e6" + }, + "test_affine_vector_screens.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "44c8b9f91fc946c3a140775aeaaabe9ab2ba4a0ba87e45ce4e7c2443bea1fe23", + "stderr_normalized_sha256": "6b09d70c395c29df5bbae265d8b4d7725b68815a75706e6778848932341d090e" + }, + "test_assembly_domain.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "ed2a289bb9b0ccbf2396c708e9bb58949e4c01ba96a0eeb06becf15c8d4f94f3", + "stderr_normalized_sha256": "7d9f033d0eedcfb3d475577a52d16d6a7cb00f3d2eea3fa3b9e6193a517034f2" + }, + "test_batched_network.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "9502513ddae7e95d7cf14e1a4a9679a89b6c6632d2c73a3385d88b81e3ef843d", + "stderr_normalized_sha256": "08120bd126e763b0639551092b0357172b913406119f4d44d2824855028e1418" + }, + "test_bit_compression.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "23e1a60cd1ee26f8ec46101b636220c94923bff9fa8733d8cb0047875dcc7d2b", + "stderr_normalized_sha256": "bba4de85ede81758907255083dfa0aad3ed4827a3535911315f10063e3cc422c" + }, + "test_block_carry.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "3f6cbd11b94803476a8340b83ce5afad66a4be4da3397fab8fd9302bf2951ea0", + "stderr_normalized_sha256": "7370a36ae0f648638ca652083c88baafe3c847d982f0fb14a7a6be7e6de27d5f" + }, + "test_block_core.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "33af686ecfbfe0af08d44a726eeee3f6d16610e8c11810897a75b0e9da46e48d", + "stderr_normalized_sha256": "f2803563b07cc60c4a5cedd9305b7d7b099cde29c1e7dfa3a82f2529dbd78dc6" + }, + "test_block_label_audit.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "b563df1b3b2c1e77f2a87ea02083bda621f609e397dd12d2a03df8c0c656f80b", + "stderr_normalized_sha256": "741721cf314d7f131637be4b18156bca4ee838a898ff948f0e156f8542312b57" + }, + "test_cancellation.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "a4e5b40694eb468f45a6f51308839c1217da892b3ca31af3bba57b25e7e620f7", + "stderr_normalized_sha256": "24d63d534a63c3ec902e6de1cd6886ec9cc9c5c8e1c071e11a2356630459a379" + }, + "test_certificates.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "2991d94d8b95f94c338d786344389ea7f80d406b43bb3c1579c33e386a43668a", + "stderr_normalized_sha256": "ae884034a067f2b32c662c8ea955025bee6acd837f570ab6d1128f389bc8a8ce" + }, + "test_climbed_48.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "2a0e254a196dbb164071520df2db2c0bd38147d5c8de982481851e15934694f5", + "stderr_normalized_sha256": "244010e8b58c8cb0591e5173c6c58b306bcbbdb72711935795fa1723fb285c79" + }, + "test_coded_carries.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "4551fa076fb293daece722ee2d663c41c2927ca509e0b7fb82d4e3135860ce14", + "stderr_normalized_sha256": "3923140aa1b598790f078a50662474ed13a10163097d12719978f0c6ffe63d39" + }, + "test_compact_control_layer.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "097ae63244fea854d9e1b8f485486e4b7d28cb2e716cfcddb92dde8c9bba9fec", + "stderr_normalized_sha256": "a9a9a1df475f313384766ddffddd420e28e70e57634db66ccd17faa5a121336b" + }, + "test_compact_control_patch.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "8947d319d959331e0e539d8880ab0f0c8e7ab7388a517d90c2e04e441b3da029", + "stderr_normalized_sha256": "df2c61e1525cb0925e0b29f1779a5e7a234a8fa4e90bea721d0215ddea148826" + }, + "test_compact_controls.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "48c50f00a0a2cd1a0e67595cc653117b58040a9bfa72e2177671eef0a804204d", + "stderr_normalized_sha256": "c36f957f735e90eb49870d171fdd5d4e0760ffd6b5e20ed5cb097bb188f702ae" + }, + "test_complex_centers.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "7af73cb2b78ad7c13350ec96692fb43e3551634cc31fa8bb09ba01c397e4f02c", + "stderr_normalized_sha256": "20dcf7d223b24cb36e51ee645811851d52c222bcd52c84984a53b2f930bcc49b" + }, + "test_complex_compression.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "7f3cf343e784a1caa0053c2bb8d839d0f047d710795ee10c2857a4a2b9cf79fc", + "stderr_normalized_sha256": "1c889e5567f2e08fd4062648ac4445136fe37d66ec3e1b387446819e4b819acb" + }, + "test_complex_compression_patch.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "06747b4851e9cbf32588cdaa4263e0036787ba6c09a05710e276fcd2214463a5", + "stderr_normalized_sha256": "8b61b69b62caaf62a0543f269f56a92ab928cf3958c561a2868f43f715f1446b" + }, + "test_copied_fixed.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "37ae2e7b8e6376074f1daa101aebbbbb6e14378ac1366ef46ea1564e274cdd1b", + "stderr_normalized_sha256": "ff62f23a11fce8c136cdfa18adf3f657ea83611db6fe9bd631e79a431c53084d" + }, + "test_copied_fixed_reversed.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "51503cd8d4b348fabc58c03a298b17ff43b0a2243f19a8f92e3fceb0402f8076", + "stderr_normalized_sha256": "bed4a3aaa33e3d637b332e6ba76de02c8a9a69c08ab3748f3be9bf13de0333dc" + }, + "test_copied_reversed.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "e09c56b4201d20e1b31767120e5e7cf7b720e7ce27443be90ed57f555508ce6f", + "stderr_normalized_sha256": "7840843aa7e19a1ea4668fa2ea1af0f13e234289aea1e2c08722259396dce4a4" + }, + "test_core_limits.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "5a5be5f70e63e125e6791303ae04bcb37326c7fdd01dec02873a15820bb258ed", + "stderr_normalized_sha256": "1607a77536085e7b34c8a3e11956155278c26dbd02a85456c1c3e2ac9299eae1" + }, + "test_cpp_headers.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "41b10ad16ceaf66380f0da1f32c260092f3aa2f17b03f8676b0eb81b36a79290", + "stderr_normalized_sha256": "4a832da0a006bb9cd6e443651ad27b923d944f450a4653f555d968460ea28db6" + }, + "test_cube_core_family.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "ae425df22eca7e10170a930cb35e2636f5354408c5925ab2155aecb27f0c291c", + "stderr_normalized_sha256": "4ed030e90faac5a5bc7e514c490439fe632c064ee20d8a93e37e48f8109af846" + }, + "test_dag_network.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "c826d8f5d7f288e1085e0b66c696ff41a09ecb896511effb8a1fae1b781d8322", + "stderr_normalized_sha256": "6791d3b4fa07c78097e4c89c40eed5e3d75eebadd66fb824aac05a8be2ea565a" + }, + "test_disjoint_tensor.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "e3f8da7f236d10387502b9d49b20b90e70c35417c21942cce4b93cec3ae50bcb", + "stderr_normalized_sha256": "e6e8e5b501c38ce175d44ac2c70397b25bc8f5250d70c1d2d22921adfdf08e32" + }, + "test_early_sharing_and_centers.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "a8f4ed3fe5dcbde1894caa4d49e8646507d7e33882bc929255ad352a0d1038aa", + "stderr_normalized_sha256": "04dced7c4570960286a8e87d76569b3221ddc6fb959d328c95ab15a4b39a76fe" + }, + "test_endpoint_gauge.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "2ec45ebaacd987eea36ddbf8f08a15784a07909eb4d45c33805b662fe0afbbbf", + "stderr_normalized_sha256": "fede12211df8dfa1a694b377380c99362ba3a7f37dd26b5b12ead4209dc02157" + }, + "test_fano_completion.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "62ceb6063bceac90393853850db872635c14e46dfcbfe7bb475d7adc7d7551e3", + "stderr_normalized_sha256": "2ce50a1197ecfa33f6236e12a7bc6366f019e3ec7079da4625663d6cb7d1eaf0" + }, + "test_fano_permutation.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "6fcb3a15e7e0a2fb3078f48c3e9722ae5a02ec184989227959bb91aa27f61475", + "stderr_normalized_sha256": "d90c0c362fa835f44f9ddf696613c2d84b48919e118615cbdb3a08c1aa62a8a6" + }, + "test_finite_bit_contract.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "7f08fe92df3a60e1796de1deed1a5618a75c1e01b7ce448ed7a59c1f69ea553b", + "stderr_normalized_sha256": "c29dae55b76d7d10246d931721d576bd8619dc98f18b4b0c472262ba27e107c6" + }, + "test_finite_identities.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "ec1e9986b39a8d2a0d0f08301074c2b616c96f299610c71be982a8e59938fae0", + "stderr_normalized_sha256": "4ee84b8c853020b303f41c06bf51a66cc3de045c03932824d45aa2f554577b4a" + }, + "test_frontier741_bindings.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "255efaeeaf1447eee3b69d4e293e57122c78a611f39d37a13f7b9d7db6457651", + "stderr_normalized_sha256": "0d4b4ebf2ee04664f8656097ba3b54030368e215aa1611d59ee4a18292ab6342" + }, + "test_frontier799_bindings.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "0bb9b46388677510ded6c8357681a3f30b5100c60b2d3bb9e911da06ed576547", + "stderr_normalized_sha256": "2b25f40b85027dab6b3ff3f549a1427ebedd9e91ea3622587c3a64e23d3c7145" + }, + "test_fused_block.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "98b62ca69877549f166548b44852ea4b42a51eafd017754714ba0bbe04a3f380", + "stderr_normalized_sha256": "f55b3f1b7eeaadbf273941b791a7cf501c048916f439f85c1690fc8b2169cc41" + }, + "test_gather_schedules.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "113b859bbd4fe1e27bd8bcf02bf461484516a3258b595eb7ea341a55e2c8db66", + "stderr_normalized_sha256": "ff255d870e4cec956214b5db41b9922d301efbd6a7e90ac862d9cd73e5d70757" + }, + "test_general_network_guard.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "6a579b8fa21f68a1e5c90d502fb88c00f0281cab0d6f62dbbe4914494fbd9d5e", + "stderr_normalized_sha256": "e48ecd90a427bc8bea8efec0fcc7dfbe3b85f0c13e32a739ab3c01b0491d82d1" + }, + "test_incidence_network.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "c82472938da850c5b5f715196c9a7e0dda63943f5951afcdcf60c3a6ace8c3d7", + "stderr_normalized_sha256": "bef41bda3869a637c37edb6156be68ea83effc5b2266bd59f94db22985ed0c20" + }, + "test_inplace_side.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "4b1a881bc803a8950fa7c20c47933a89a140912f1bc586a12f8d5b48d843c246", + "stderr_normalized_sha256": "5580f293e55171f2298fe66683fdb622b97571b9fda96b8b0490954dc9163d71" + }, + "test_isolated_test_runner.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "4c4e3280f7e26ea7fe5e4313c51f8b0d1488bf4a7e5094d73547e58556a30bef", + "stderr_normalized_sha256": "4bc731f6fe73665caeae82277f91894b558db3e9b731d0f603b18677447e22d0" + }, + "test_joint_frames.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "55abeffcc012fea55f3b81f76006982ca277b13e3d67ec68880b0f2673392256", + "stderr_normalized_sha256": "0aea955181e49339582d4a5548be0bcd7a6cfabb67aef4fece6af88fa4b06d0b" + }, + "test_joint_reclaim.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "5aeec7a2b2cc2d9b6e70c01d0b20a844a7becd07134d040acd0a13bfd933dd27", + "stderr_normalized_sha256": "6cedcf4cb196bf10e9cd56b310a0821b1622ca4b77984cfcb25e45fb9ad96714" + }, + "test_joint_return.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "7877ec0cfdcb1ae0925b997242941210317bc41ff95b9936fd076a5c881757c2", + "stderr_normalized_sha256": "cde6a8136de5bae472e120b0f2e2f9054b98731e7fba30176ae56ae4d67a0b7f" + }, + "test_layer_preparation.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "823b595f436b9c45cfcbce5dfe4a59b8cb64f0998dcff8fd3ddc653cedc4350b", + "stderr_normalized_sha256": "2fec10f429b4233f54daab12df99992e8b0edc3849d933ed57ba6588ff508c4c" + }, + "test_lean_sources.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "5b987ea21c5866c8357b790a5e4f52fd6cc2c0e9d4385c0a1259d11670645dba", + "stderr_normalized_sha256": "c9f8b85996fbb1186793e589b8b34c23571dc8a69dcdbe7fb9b1a1d2b09e1563" + }, + "test_mixed_point.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "dfe16ed9ef21487cde5d694dfa03524774ac1b7561e6fee632b808e5e3d6ed67", + "stderr_normalized_sha256": "fc0ed68e09b4323594a122eaec2df8b1365631fe7354ab5e07bd6572586dd7b5" + }, + "test_network_research.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "a68f485c033f490bc8229152141b2f52ecf8cd1352c5a6a2677e045dff4168e6", + "stderr_normalized_sha256": "a097d05986bfe93c18f5a33a7f236f05a5d07264b6c9344d00092da0f8a00a83" + }, + "test_network_search.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "1583f6bf961ca17ee2b5f4e7204bd48ecd530e2cb4967c07b659da56bce68d4c", + "stderr_normalized_sha256": "17af122190f9843828894fab260b9079da4dc8e696da94d238528cd111f721e3" + }, + "test_network_variants.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "3d73e0d94eafa18da04bcd741b0b94daa98a9a2688bff9714db1f16f978bf7ec", + "stderr_normalized_sha256": "9453eac7190fd3d144a6cc67fb63eb5d267b904020ccc94084957202f365d24e" + }, + "test_nonadjacent.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "6aa5f966524c71f280660051f436853d9480a94d152e819edabfb406c26fe777", + "stderr_normalized_sha256": "e9abbefc6cd6c9a4f45aef32c25fbba03e5132e7e8f39f932ef8f7b9e5cd718d" + }, + "test_open_pr_lean.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "c5647c78a1bcdeecb4c6cbbf82e841eacb5988779323f3a22d7e8b6f8fdf7bb8", + "stderr_normalized_sha256": "b540b8a7f95ac41c950ec93e74480eb645b9e0c71eaf303910dd9c2305d622d4" + }, + "test_packed_audit.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "e8b00f2d2524a2a00d629d1e45b430c8a4a0e759207293879322bc873750640c", + "stderr_normalized_sha256": "e5108f93f6d3902174f61be571015738519dd4411ccb0e26c86eb7b9ef66e943" + }, + "test_pair_assembly.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "8ada06b84efcc5b05cd5d2ca262eefbf248338fe81f8af11045095d941b7d490", + "stderr_normalized_sha256": "764ebb2c823724b43ec68d01073fe4f4195a782eed65afe20786e81700330bdd" + }, + "test_paired_circuit_check.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "fdc7c2c63d4a9b00e079a5586a5e9907d7d3baf60c2f94e23146baaab97ded33", + "stderr_normalized_sha256": "4bb50e92856fa92a7002fc578b8c2140b51337f8348870635e61cbf2969fe0b9" + }, + "test_paired_cube_entrypoints.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "1bcb4c7bbe7797fda54535a7339fae6b46ce21813388f1fe86f158e7c02639b2", + "stderr_normalized_sha256": "34609d7563cb362568960e8ea1aad582dd2adf0ca20c53d4e9a82f3c79601a22" + }, + "test_paired_network.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "df741d98a8068fb5fc0389d90eb5db9534f18eca1e28e2200404c72ce10222b8", + "stderr_normalized_sha256": "d91994b046f8055c99de344500ebc4efa8fa318867ac45b7dcd56d6238839d89" + }, + "test_parity_side.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "81386ae29fe3a0a317aa897fcde9f63eafe92b6f8466c5c1b2571b46f94db375", + "stderr_normalized_sha256": "ada2483c3888458a43d2a0a3d557963de10df8f6f8f72994e6b9bae828a56555" + }, + "test_partial_swap.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "85ee6c7bdf015b5a2945a87b78dbe94da3313282eea7df483c1f82879588a2da", + "stderr_normalized_sha256": "495dd4986f1ad6d708fb360ecec88f08abc835147aef5afead40a943953d3685" + }, + "test_positive_side_core.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "54795d1f6273921b1f3d38d4c03c48304784ea33608d5b9ae9172641224a64b2", + "stderr_normalized_sha256": "f7726ffbca0b9d7e6268dba4f3a3a9c4bff71b555f3234c6a9d3a1c9adeaff24" + }, + "test_positive_skip.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "40582f674aec1abafe42e5623e109191c54f6c36d8e8cb95fbaec9d37dcae920", + "stderr_normalized_sha256": "7ee0d5cd2d5f452ec06a639098e696f45300b04b47c60b7a7808f3e641a42288" + }, + "test_pr_reconciliation.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "69c074af954b41551d5ebc1688d2a9ddc375e5c041f4edc1085cd8b49ebd6b82", + "stderr_normalized_sha256": "62f75d085f19d524f0ad78f297201e0d0de9cb754d8261357e7a9783aea59133" + }, + "test_prime_core.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "b73bc331142a74cbb5a494411837decfcd2312461e4bb94260599305d6f35a4c", + "stderr_normalized_sha256": "5c3c7ab43e2f018d23827b1123f4c694017acd63266ee1580f64771c14c33286" + }, + "test_prime_subset_limits.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "6febda033f1e2ffe9898e9d384d4b5587119e40636ff700c30e44ea921c6690c", + "stderr_normalized_sha256": "d40a979e05a3e2d503c0a8f7a64f80b541ccc3a07d918f31556cd9c07f12a054" + }, + "test_quadratic_affine.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "031ffc1823c8e50816d3dfd80b21d7ea8f80eca5f1555aa7647f306446a8920c", + "stderr_normalized_sha256": "9d1d7214fdd42a437e0442bde8371fddc5af00463dbd3424d5ac8f192da247e7" + }, + "test_rank_product_core.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "a4001d9ef4da5ab2912cda666642b5e63fb92bf81914c09763d931c3e31eb0eb", + "stderr_normalized_sha256": "afaa9a9e5de354da5f6be503814ff5b20323eb1bc669d995df30e2258cf150cf" + }, + "test_rational_span_frames.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "fa0c47391786e7cbd2877ddee79617f9a832b1be785dfdedd2530f2155034300", + "stderr_normalized_sha256": "6b476e25a9f58e49ebe32beb294bac1394c4896d344f2d96825bf708e9f92992" + }, + "test_reconciliation_archive.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "c89bc26a14c622ac6f56c017b70ceeddbfcf17228d80cdfa9f907f66be44f839", + "stderr_normalized_sha256": "171bcfdcac9f61807d610c4b7e146e236daf4059cfb05963390329e6e5736ade" + }, + "test_recycled_bit_integration.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "ab4c16d010c75087b86ddc512445a990cc4593df2e53f5fbdbeccd3ad2ad1959", + "stderr_normalized_sha256": "d8b46592bf46b13378d022510175c60c7d524a9ce1b5f7c2f61c8366f19bfd27" + }, + "test_reuse_network.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "c441662d630b7db46925e5fca63b87250abb35f119ae24db779a55ce4ec3b3fc", + "stderr_normalized_sha256": "58f67db602db0f53735d7e9f616e3ab6efe7177a1cb33cdea621ace90798ced8" + }, + "test_scratch_pooling.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "d9e8123c871f86fefedfa6d601eb904ef9afd9bc53745b9823ef3440eac7cf51", + "stderr_normalized_sha256": "fab68d855b61612bb81270d9bf4917b47a8b86ab08f0b5c564eb5af03dbe299f" + }, + "test_selected_result.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "65411a94ea9fcac1db02bbf1e8bcbf5d66a8b7fd41cd7426c2f300cccf21816e", + "stderr_normalized_sha256": "8122d7d3d9d2ba1bec3e2dbe839cec917549fd50469d34777b312565549b7c5d" + }, + "test_shared_core.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "ec5e566f522139f763a6c4ed1fa1b4ff19a67816a0fffbe97de5bac3fcff7a86", + "stderr_normalized_sha256": "e5a7b89ac4d57f3fcbc759b781932cba8ffa7462653e7fb213864f410414e3a4" + }, + "test_shared_point_network.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "d8a57e3df750c5eb955a75c2914ed74ad5f3f5faa5b25b3aa3035f2ba8d58ee6", + "stderr_normalized_sha256": "d16b9cb195e4ceefce38653a5fb06b9624eb81b56dcdbe507f76f97888f7a396" + }, + "test_short_guards.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "2d75d1501cea774c0c7b0257d004b23ce3e331892a778cf34c9355cf8c96656a", + "stderr_normalized_sha256": "c01221d0ecf08d9846f468be5fe52425dc7e1b1d56b22b0d798a143aff63f2c9" + }, + "test_signed_sparse_core.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "d5900a024307cf3c8c30b9a285b9a63be9c1baf3d02e79f9cd351f0abb2ffd23", + "stderr_normalized_sha256": "5d20bda8979ff74d48ab8000d06f395b2b12dc771cd0d08d3840241b43b29f65" + }, + "test_single_intersection.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "60da5f64716a846112beb3281ee47d4d2285bacab7f0a4fa5085da778ee82518", + "stderr_normalized_sha256": "7cdf29ff2b7f1be05edcb1f835446ff00eae27bca3715e4e6a213f6371de83f5" + }, + "test_skip_clones.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "530c1bec48ef4e7672109789c532b0e1d8cd180f866dac32d38bb255d1b4398d", + "stderr_normalized_sha256": "8c59a48071684c7b276c9459dede47aa0d94815ec0ca4c17da51fd457c17d5be" + }, + "test_skip_strips.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "e354c62a5e5a6f3858a2e2a30bf2597833c5172cdc6e7a19a4b54c066eaa1cf4", + "stderr_normalized_sha256": "f726b000b9d6e164d60706441ed1f22f10b096a80597782145d6754afdec9129" + }, + "test_skip_suffix.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "73383f264a500db79e41e4f4a9ae36cc55a295c75989e543cf8a5039a71a3458", + "stderr_normalized_sha256": "1399d35ccd64fc27f96f15c980426d05f9f18b3b30fb6ab4655e02f62aebaa3a" + }, + "test_small_block_witness.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "41d857538d1a8595f2957847550993259f07ed648db0b45ecba5fd86d3f8b0c0", + "stderr_normalized_sha256": "abbd5c336abed4f56ebd8c1093180606f479aed36dbeef3106767ff7817766f8" + }, + "test_sparse_fusion.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "0cf7eb548967dc28362523103ef625cd20b0b6c5d51638e717a905b07dac91f5", + "stderr_normalized_sha256": "c738ad33abc446d62ff7773ed1b307412a5ba4481734d566941af9119fbfe576" + }, + "test_split_skip.py": { + "code": 0, + "stdout_sha256": "d1a321a82ddd3ad53b8442441b036f2d852b6815eaf47a543eeeec46bb7bd910", + "stderr_sha256": "735d7ae4c939a1c0320dcaf7313a53afc4144cd5519221b9153cf48f9ea6e321", + "stderr_normalized_sha256": "68f1219ce9c5024a18f00f475ae575d3a2043a29b5e1f64019f5ccf6c1ededba" + }, + "test_stage_pair.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "b0a80e22479e20c39655a8f12021d6e314189529bee3b931bb2e188132895c63", + "stderr_normalized_sha256": "e4297197bbee4151b2bfe35ae84d3f8de79578b134beb22cd37d69e6eef9e7d7" + }, + "test_stronger_screens.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "45dfecb82d0d8d1c0f78e4724315a7c833f01a7b2b654698b814f24e317324eb", + "stderr_normalized_sha256": "4be0772645981d1c7320d637f6bdd2ece7a7c2e66ff528fb6c39a1a8b220c0f2" + }, + "test_subset_core_family.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "68b740148db78301eeac05a33520f78ccc62575126c53c7f22b165db7806d76c", + "stderr_normalized_sha256": "faf18b9cb3db04e21b6bb180e2b13337d3b3dcd808678efde281374904e58716" + }, + "test_ternary_patch.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "ccf3bebebf3ad18a1f204805993b8b21123d78a69b6d2b6d85379040923aeeaf", + "stderr_normalized_sha256": "1cf73c4a9134956099a9ef1daf0aaff748c77112999889f1ccd2f1bd1d474f3e" + }, + "test_ternary_side.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "dd46c18159b2154e741eb298a0f38302dbf44e6044639472f2451499783e62de", + "stderr_normalized_sha256": "e9279bb337d9a0b4cd40c20cd7bf054eb2b3d1293ebf09c1a9f2271ce392ab10" + }, + "test_tune_routing.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "b8a738856cf8c77faae1170dcd42c6d54d5bdafaaa94145790889fd1236df7f7", + "stderr_normalized_sha256": "b063a8c455d2a47bbb461f56db939e087c44982a33dc58c6a937d656514b1659" + } + }, + "per_module_concurrent": { + "test_additive_labels.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "09084c8696653b7b7d613a74a97e76b1f12f7cced2e27ce60a901e5431c6e741", + "stderr_normalized_sha256": "e30df3a1a154d414549626973d4c178b9e03d5810a932ed228f9a9942fc7e1e6" + }, + "test_affine_vector_screens.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "99cd3a97e2576b840e062fe92dfc1a8fd6d605a14965827cf3f48ce470027269", + "stderr_normalized_sha256": "6b09d70c395c29df5bbae265d8b4d7725b68815a75706e6778848932341d090e" + }, + "test_assembly_domain.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "1ce73d6fe1786e4be40bd4c362ec6a4e441ad19030a48b632f1227a0e7152315", + "stderr_normalized_sha256": "7d9f033d0eedcfb3d475577a52d16d6a7cb00f3d2eea3fa3b9e6193a517034f2" + }, + "test_batched_network.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "0e8d87df47e599feff68438e57a5664501e934a0ba9e861cd11534e78b23cafe", + "stderr_normalized_sha256": "08120bd126e763b0639551092b0357172b913406119f4d44d2824855028e1418" + }, + "test_bit_compression.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "d2d66ce5d97bbf1978c1c0905bb5cd6f0eb3b7107f6f48e077bb884165b3bf79", + "stderr_normalized_sha256": "bba4de85ede81758907255083dfa0aad3ed4827a3535911315f10063e3cc422c" + }, + "test_block_carry.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "cbeac1de8776806fc6058f9adb0e4aaa0d4f60f3480c9259661b9280b00b3ebc", + "stderr_normalized_sha256": "7370a36ae0f648638ca652083c88baafe3c847d982f0fb14a7a6be7e6de27d5f" + }, + "test_block_core.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "d9c700e755ff7a70e26a0711464ecfd7945192c9abe5fa59f895f3ff8aecb0c8", + "stderr_normalized_sha256": "f2803563b07cc60c4a5cedd9305b7d7b099cde29c1e7dfa3a82f2529dbd78dc6" + }, + "test_block_label_audit.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "f62e8cda3143a83b94ca402816cf77881f41546dfcf4ca8921030696e7782c13", + "stderr_normalized_sha256": "741721cf314d7f131637be4b18156bca4ee838a898ff948f0e156f8542312b57" + }, + "test_cancellation.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "7dee44987f4c304475289daaeda8ee75684b18d2be1c3e473190d17f1c557824", + "stderr_normalized_sha256": "24d63d534a63c3ec902e6de1cd6886ec9cc9c5c8e1c071e11a2356630459a379" + }, + "test_certificates.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "a8e65dfb529b5366005d6216c2ce23a84940a28cf9b67e031328027cbaa411b8", + "stderr_normalized_sha256": "ae884034a067f2b32c662c8ea955025bee6acd837f570ab6d1128f389bc8a8ce" + }, + "test_climbed_48.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "ee622c6b2ff9b08e3c7a269f5b669ccb318cb4f942bbd04130cb1ec7551d8b14", + "stderr_normalized_sha256": "244010e8b58c8cb0591e5173c6c58b306bcbbdb72711935795fa1723fb285c79" + }, + "test_coded_carries.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "e040a7c289d576c75a8d593eab7686ade296502d17d0ce60e280b15a5a83ebe3", + "stderr_normalized_sha256": "3923140aa1b598790f078a50662474ed13a10163097d12719978f0c6ffe63d39" + }, + "test_compact_control_layer.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "f66548741ee13c6f32b1a47b8e090c503fe92df52510f4b75162939e33b89ad3", + "stderr_normalized_sha256": "a9a9a1df475f313384766ddffddd420e28e70e57634db66ccd17faa5a121336b" + }, + "test_compact_control_patch.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "c319992fc0e236bab2b1f2a342dcd99ce0c2d46d194610d34272d842a3a09b89", + "stderr_normalized_sha256": "df2c61e1525cb0925e0b29f1779a5e7a234a8fa4e90bea721d0215ddea148826" + }, + "test_compact_controls.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "a585012d399ac26b93b07790809771466bb05f0eae9d84d99cacfa668814e5dd", + "stderr_normalized_sha256": "c36f957f735e90eb49870d171fdd5d4e0760ffd6b5e20ed5cb097bb188f702ae" + }, + "test_complex_centers.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "55d34a8a5853c1d28fb88a7bb5a53c2e9d56d687f3747ce5a8399d9390e99156", + "stderr_normalized_sha256": "20dcf7d223b24cb36e51ee645811851d52c222bcd52c84984a53b2f930bcc49b" + }, + "test_complex_compression.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "f1a36568e174ee4d209b69ebf8b453b5d311b49c78f9215628fcd17a90ce6406", + "stderr_normalized_sha256": "1c889e5567f2e08fd4062648ac4445136fe37d66ec3e1b387446819e4b819acb" + }, + "test_complex_compression_patch.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "fd76493bafc78e68e1008bf569face5525f741eeb18eff6be6aedbd5cf84d29a", + "stderr_normalized_sha256": "8b61b69b62caaf62a0543f269f56a92ab928cf3958c561a2868f43f715f1446b" + }, + "test_copied_fixed.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "56a00df53760f3e941d23b31b10ca0f7d6a5c62aa402a1e10f6a0ecad926f53c", + "stderr_normalized_sha256": "ff62f23a11fce8c136cdfa18adf3f657ea83611db6fe9bd631e79a431c53084d" + }, + "test_copied_fixed_reversed.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "9224834653aae88d9ad7cba76eed90d405ae18b1ca86705464fce61dc64a0147", + "stderr_normalized_sha256": "bed4a3aaa33e3d637b332e6ba76de02c8a9a69c08ab3748f3be9bf13de0333dc" + }, + "test_copied_reversed.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "d3f106044df0fcdf2e2c7b5dedc7ede53ef865df32fa61de9f807198973a14f7", + "stderr_normalized_sha256": "7840843aa7e19a1ea4668fa2ea1af0f13e234289aea1e2c08722259396dce4a4" + }, + "test_core_limits.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "530eba42679dc22ff0e5073dc4e94a49bd5641887a7298f7cca4a56c36b024ba", + "stderr_normalized_sha256": "1607a77536085e7b34c8a3e11956155278c26dbd02a85456c1c3e2ac9299eae1" + }, + "test_cpp_headers.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "a702569a1f1ef7d46c0ca2ff4fd65a8c55f2317aa04054785b3b78fb72251b6a", + "stderr_normalized_sha256": "4a832da0a006bb9cd6e443651ad27b923d944f450a4653f555d968460ea28db6" + }, + "test_cube_core_family.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "104f110e4c577239c6e480d009192e5645d09e5fa55c9d66a8e5030cff73f069", + "stderr_normalized_sha256": "4ed030e90faac5a5bc7e514c490439fe632c064ee20d8a93e37e48f8109af846" + }, + "test_dag_network.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "b8dd52a028e1edb503e5f1c36d0415479dd70d49654e0f22c866fe69d88f8cfa", + "stderr_normalized_sha256": "6791d3b4fa07c78097e4c89c40eed5e3d75eebadd66fb824aac05a8be2ea565a" + }, + "test_disjoint_tensor.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "1066609a6fc1cc8c39c762bace492df33132268e15e64f9142510120ce3fa376", + "stderr_normalized_sha256": "e6e8e5b501c38ce175d44ac2c70397b25bc8f5250d70c1d2d22921adfdf08e32" + }, + "test_early_sharing_and_centers.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "7ac401b8b34613078374667d2dc26b6a88a0fdb32818904c9721d01e838f4f8f", + "stderr_normalized_sha256": "04dced7c4570960286a8e87d76569b3221ddc6fb959d328c95ab15a4b39a76fe" + }, + "test_endpoint_gauge.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "885a0b693d44042a3dc60acc315f1ca448af98f735c266dce064630c59301269", + "stderr_normalized_sha256": "fede12211df8dfa1a694b377380c99362ba3a7f37dd26b5b12ead4209dc02157" + }, + "test_fano_completion.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "e8409d1f4fe5af58f6f7d14329d83e8cad4e306c79571ddf9925cfb4781e5582", + "stderr_normalized_sha256": "2ce50a1197ecfa33f6236e12a7bc6366f019e3ec7079da4625663d6cb7d1eaf0" + }, + "test_fano_permutation.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "b0ff6e75d4971d5a7b4ff2c6bbfd7d9c9ab605beab96088a2e267f8f69ea3d71", + "stderr_normalized_sha256": "d90c0c362fa835f44f9ddf696613c2d84b48919e118615cbdb3a08c1aa62a8a6" + }, + "test_finite_bit_contract.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "e8957818ca6b10b0894b1eea9b7af6815e883a7a001a53cc929ed8f9e2ced559", + "stderr_normalized_sha256": "c29dae55b76d7d10246d931721d576bd8619dc98f18b4b0c472262ba27e107c6" + }, + "test_finite_identities.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "4164066e4f25dd1ac9578f9372246d973192cd8c580f21655341f80601dd4898", + "stderr_normalized_sha256": "4ee84b8c853020b303f41c06bf51a66cc3de045c03932824d45aa2f554577b4a" + }, + "test_frontier741_bindings.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "b22f560f647cc076fb5267dc2ee795ce7914ff60e38d85ad70c3030ddb650fbe", + "stderr_normalized_sha256": "0d4b4ebf2ee04664f8656097ba3b54030368e215aa1611d59ee4a18292ab6342" + }, + "test_frontier799_bindings.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "3ef1c92a124a43b90de893f239c9631d8f71e245781b922844b330e3550295bd", + "stderr_normalized_sha256": "cd867816c81663080ac5cd5708dec3569a94156d5eeff248a2fbf7c5b585acba" + }, + "test_fused_block.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "194c908447d2c344a005f216b4272c95e4d1391f6857fca7a902af4bcafd05e8", + "stderr_normalized_sha256": "f55b3f1b7eeaadbf273941b791a7cf501c048916f439f85c1690fc8b2169cc41" + }, + "test_gather_schedules.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "85919630400a7ed9d0692d8610316cd2522d312dfa834f2ef0ef2f09ee72e3f3", + "stderr_normalized_sha256": "ff255d870e4cec956214b5db41b9922d301efbd6a7e90ac862d9cd73e5d70757" + }, + "test_general_network_guard.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "c6328c95c745c2c8ad0790e09b8728daf7a719f9a800c5e8d5c55938b106297f", + "stderr_normalized_sha256": "e48ecd90a427bc8bea8efec0fcc7dfbe3b85f0c13e32a739ab3c01b0491d82d1" + }, + "test_incidence_network.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "c38e7d31463c41dc72addb85d3437df8e2cfb6b32a1f5d32f73cc63fe9dcbaa9", + "stderr_normalized_sha256": "bef41bda3869a637c37edb6156be68ea83effc5b2266bd59f94db22985ed0c20" + }, + "test_inplace_side.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "b1fdd7cd56c090eec87c6ed76d39a445e7df918c3a88245d044ca9553d772be1", + "stderr_normalized_sha256": "5580f293e55171f2298fe66683fdb622b97571b9fda96b8b0490954dc9163d71" + }, + "test_isolated_test_runner.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "7b0779139a654473641a655ef4439533b1684670ecfcc9f8d36e7ead57548118", + "stderr_normalized_sha256": "4bc731f6fe73665caeae82277f91894b558db3e9b731d0f603b18677447e22d0" + }, + "test_joint_frames.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "9b3a3f80efaadaa865738101ed8f825c1ce3eb718d39cd6fabeba1e607ad3012", + "stderr_normalized_sha256": "0aea955181e49339582d4a5548be0bcd7a6cfabb67aef4fece6af88fa4b06d0b" + }, + "test_joint_reclaim.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "1750baa46b7c671ba754ed53c2d9a7788439032f803b105cae6a3f765b2dbc76", + "stderr_normalized_sha256": "6cedcf4cb196bf10e9cd56b310a0821b1622ca4b77984cfcb25e45fb9ad96714" + }, + "test_joint_return.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "0bb01dc9c20d5b324f814b9476d8af287a3e3b0b46a90a0b7e38485c7a16b47b", + "stderr_normalized_sha256": "cde6a8136de5bae472e120b0f2e2f9054b98731e7fba30176ae56ae4d67a0b7f" + }, + "test_layer_preparation.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "8d49e216528dc18480467e3b8987cac006d14c950bdba8c00f5b57c0e500cf47", + "stderr_normalized_sha256": "2fec10f429b4233f54daab12df99992e8b0edc3849d933ed57ba6588ff508c4c" + }, + "test_lean_sources.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "4baa858dfa0af504a0645c1318245200eb54736e7aa390ce773a290e4650c454", + "stderr_normalized_sha256": "c9f8b85996fbb1186793e589b8b34c23571dc8a69dcdbe7fb9b1a1d2b09e1563" + }, + "test_mixed_point.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "e227a7d82a3b241b7062806662aae3b2e00add998e5ef846063b0ce2052bc887", + "stderr_normalized_sha256": "fc0ed68e09b4323594a122eaec2df8b1365631fe7354ab5e07bd6572586dd7b5" + }, + "test_network_research.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "9b5078b039691f0fe51e45f8e31efc94b85c4ddee32a161555bfbf7186615adc", + "stderr_normalized_sha256": "a097d05986bfe93c18f5a33a7f236f05a5d07264b6c9344d00092da0f8a00a83" + }, + "test_network_search.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "55686a8f104f37a670912db59998bfb4b2604c6328c4ff3ea7d0c39b4030da9c", + "stderr_normalized_sha256": "17af122190f9843828894fab260b9079da4dc8e696da94d238528cd111f721e3" + }, + "test_network_variants.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "3955b5a94e015b0a911762990d86811733ae0f1cc4ca4ebb4cfd38850b08cabb", + "stderr_normalized_sha256": "9453eac7190fd3d144a6cc67fb63eb5d267b904020ccc94084957202f365d24e" + }, + "test_nonadjacent.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "f5d16448b4a53affd36b2e1a4ddccea8e25f70f161af55a40e804ad36088b1e9", + "stderr_normalized_sha256": "e9abbefc6cd6c9a4f45aef32c25fbba03e5132e7e8f39f932ef8f7b9e5cd718d" + }, + "test_open_pr_lean.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "21952dd34ee9b983cc7809d81584413c17d3b943ddb811f82b731859f273013d", + "stderr_normalized_sha256": "b540b8a7f95ac41c950ec93e74480eb645b9e0c71eaf303910dd9c2305d622d4" + }, + "test_packed_audit.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "2edcd5c16cc40e23c624acb1cd1db0533c8e4642ade14de3a02f19aa2bf6ae21", + "stderr_normalized_sha256": "e5108f93f6d3902174f61be571015738519dd4411ccb0e26c86eb7b9ef66e943" + }, + "test_pair_assembly.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "6c2bc0316dc36e52cd0b9dc5b932abb0eff3a3b667c2fb08e5f4b9470e2408b9", + "stderr_normalized_sha256": "764ebb2c823724b43ec68d01073fe4f4195a782eed65afe20786e81700330bdd" + }, + "test_paired_circuit_check.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "4e74543e2dad8c37ece634d2895f6574e561dc14f9713e4eb116ec8474c781d2", + "stderr_normalized_sha256": "4bb50e92856fa92a7002fc578b8c2140b51337f8348870635e61cbf2969fe0b9" + }, + "test_paired_cube_entrypoints.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "f1533d47f1028b254929ad7aa1c2b198b7005e2d5d9eeb71c4b5f6849a3e1274", + "stderr_normalized_sha256": "34609d7563cb362568960e8ea1aad582dd2adf0ca20c53d4e9a82f3c79601a22" + }, + "test_paired_network.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "f39ebada52bd11148011aebbd4b72deea3a8b8f9b71158106dce718099fa9bd5", + "stderr_normalized_sha256": "d91994b046f8055c99de344500ebc4efa8fa318867ac45b7dcd56d6238839d89" + }, + "test_parity_side.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "04b7e47d09557a27baf2701e4ea6e5bed09376d50c212d8c70bc4c6c80cd00f4", + "stderr_normalized_sha256": "ada2483c3888458a43d2a0a3d557963de10df8f6f8f72994e6b9bae828a56555" + }, + "test_partial_swap.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "89d66b0d317f2c1e19e52e97f13fccbf70db96e4545fec9bbae459d5603e0817", + "stderr_normalized_sha256": "495dd4986f1ad6d708fb360ecec88f08abc835147aef5afead40a943953d3685" + }, + "test_positive_side_core.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "d91de76215094bff5730175babde409cbd2257f478c87eaa287a5417d127ab19", + "stderr_normalized_sha256": "f7726ffbca0b9d7e6268dba4f3a3a9c4bff71b555f3234c6a9d3a1c9adeaff24" + }, + "test_positive_skip.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "39824dcb8f272fdc54fd77511b0f4915d173332429ff55e6014cd0ce94d4dff1", + "stderr_normalized_sha256": "7ee0d5cd2d5f452ec06a639098e696f45300b04b47c60b7a7808f3e641a42288" + }, + "test_pr_reconciliation.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "99d313f39527d0651fb8b9efdf40cef9b27ceb3fa65ae7ee3987261224d223c9", + "stderr_normalized_sha256": "62f75d085f19d524f0ad78f297201e0d0de9cb754d8261357e7a9783aea59133" + }, + "test_prime_core.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "2263d78bde8fe703380fa8b569c0dd3512be52355a11eba7d1889fb4a4e81004", + "stderr_normalized_sha256": "5c3c7ab43e2f018d23827b1123f4c694017acd63266ee1580f64771c14c33286" + }, + "test_prime_subset_limits.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "daa59c8d5148f6ea298c160b0d99bc6b3c8cf0b463edd2fdd4a0c63e498b08f4", + "stderr_normalized_sha256": "d40a979e05a3e2d503c0a8f7a64f80b541ccc3a07d918f31556cd9c07f12a054" + }, + "test_quadratic_affine.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "329b7c7b0bae6aee35a95878d13fababad314e5f23ef43599edbc511ff0e5b89", + "stderr_normalized_sha256": "9d1d7214fdd42a437e0442bde8371fddc5af00463dbd3424d5ac8f192da247e7" + }, + "test_rank_product_core.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "0b6b146ce0413c5b46a9fac65d9903e4083eb53a103f97a0b794440e1125d161", + "stderr_normalized_sha256": "afaa9a9e5de354da5f6be503814ff5b20323eb1bc669d995df30e2258cf150cf" + }, + "test_rational_span_frames.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "924fe3b81e994a8bd4f15bde2181b13b8ba71bb75245827e327a5ac1c552c70b", + "stderr_normalized_sha256": "6b476e25a9f58e49ebe32beb294bac1394c4896d344f2d96825bf708e9f92992" + }, + "test_reconciliation_archive.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "02aae078bfe7bc3c7d0fdc18045dab65dff355b76d029d75b0edadbf51598377", + "stderr_normalized_sha256": "171bcfdcac9f61807d610c4b7e146e236daf4059cfb05963390329e6e5736ade" + }, + "test_recycled_bit_integration.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "ed4cc403cf356b028fc1885773c58b1805c9542e81a0eb4edf18eff8a715b5f0", + "stderr_normalized_sha256": "d8b46592bf46b13378d022510175c60c7d524a9ce1b5f7c2f61c8366f19bfd27" + }, + "test_reuse_network.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "48c0abcfbf8720f239083485b31f315a104c9dda994cadbf260eaa1a6017fb8c", + "stderr_normalized_sha256": "58f67db602db0f53735d7e9f616e3ab6efe7177a1cb33cdea621ace90798ced8" + }, + "test_scratch_pooling.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "535139b66e2b28300ee41fd6e2c1550e799ef8e44221d7558a78e363311be9e2", + "stderr_normalized_sha256": "fab68d855b61612bb81270d9bf4917b47a8b86ab08f0b5c564eb5af03dbe299f" + }, + "test_selected_result.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "2fed16ee3a5dd1ba4533f450c0da8016e138522597e7691459e138bf3e0e889c", + "stderr_normalized_sha256": "8122d7d3d9d2ba1bec3e2dbe839cec917549fd50469d34777b312565549b7c5d" + }, + "test_shared_core.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "f2b24de045c582f4bad8eeb3e00dd5ede322bb4861004a12291d3d3beb6eb07a", + "stderr_normalized_sha256": "e5a7b89ac4d57f3fcbc759b781932cba8ffa7462653e7fb213864f410414e3a4" + }, + "test_shared_point_network.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "7ffe6575c85222e2d12dce1400b9569e7219d22c9a8ff0d796bea1d3c9db8202", + "stderr_normalized_sha256": "d16b9cb195e4ceefce38653a5fb06b9624eb81b56dcdbe507f76f97888f7a396" + }, + "test_short_guards.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "de80074033b627da7e84fd9c2fa42c53a6d8279505ace1f77b6e874d06e6a0bf", + "stderr_normalized_sha256": "c01221d0ecf08d9846f468be5fe52425dc7e1b1d56b22b0d798a143aff63f2c9" + }, + "test_signed_sparse_core.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "f98e380da35ec84d68707e0febce5206f9fe38a9a5cc5d7160f04e5bf47d4f8b", + "stderr_normalized_sha256": "5d20bda8979ff74d48ab8000d06f395b2b12dc771cd0d08d3840241b43b29f65" + }, + "test_single_intersection.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "244b6f72c71aacdc518e922c582cd303c9501836c7e314255c2ca1d2a82b7db5", + "stderr_normalized_sha256": "7cdf29ff2b7f1be05edcb1f835446ff00eae27bca3715e4e6a213f6371de83f5" + }, + "test_skip_clones.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "cbf3acdd45ac8b26f57d8b76f08aaee1f9c37db5c1d68602eeb4e6f441a9fca0", + "stderr_normalized_sha256": "8c59a48071684c7b276c9459dede47aa0d94815ec0ca4c17da51fd457c17d5be" + }, + "test_skip_strips.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "ee717f1d871e65e859263c3edefbcb300e4fa57b03931ba5f527767a641dd2e1", + "stderr_normalized_sha256": "f726b000b9d6e164d60706441ed1f22f10b096a80597782145d6754afdec9129" + }, + "test_skip_suffix.py": { + "code": 1, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "0dce728d37c5cab2c3179dfc54d4e4d2f690e7167225e31d28106b0d5e3c32e8", + "stderr_normalized_sha256": "1399d35ccd64fc27f96f15c980426d05f9f18b3b30fb6ab4655e02f62aebaa3a" + }, + "test_small_block_witness.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "8edb5909d3b3d2acb5b80a918cca6a8aec20d8c1b69d5542e267f092b60b71b7", + "stderr_normalized_sha256": "abbd5c336abed4f56ebd8c1093180606f479aed36dbeef3106767ff7817766f8" + }, + "test_sparse_fusion.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "68e836777a7592c67aa38d27968d5f183903642306d2493250958d2c99167512", + "stderr_normalized_sha256": "c738ad33abc446d62ff7773ed1b307412a5ba4481734d566941af9119fbfe576" + }, + "test_split_skip.py": { + "code": 0, + "stdout_sha256": "d1a321a82ddd3ad53b8442441b036f2d852b6815eaf47a543eeeec46bb7bd910", + "stderr_sha256": "e2a849eb373b931619d7d8da6097b6388cff0c54fa604db921eaa8d5b175c9a0", + "stderr_normalized_sha256": "68f1219ce9c5024a18f00f475ae575d3a2043a29b5e1f64019f5ccf6c1ededba" + }, + "test_stage_pair.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "3110396808d045d480a5c38eb57f9d79a94f422ab0097611ccb2fd9bc8be89b1", + "stderr_normalized_sha256": "e4297197bbee4151b2bfe35ae84d3f8de79578b134beb22cd37d69e6eef9e7d7" + }, + "test_stronger_screens.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "49d80b11ebd8e8621bbb90d3914cf166dfc06266f0b3145cc7f32107561dca21", + "stderr_normalized_sha256": "4be0772645981d1c7320d637f6bdd2ece7a7c2e66ff528fb6c39a1a8b220c0f2" + }, + "test_subset_core_family.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "f41a46a963b34b1a131b272b7320aedbaf41cc424a724280c19104434a22ac34", + "stderr_normalized_sha256": "faf18b9cb3db04e21b6bb180e2b13337d3b3dcd808678efde281374904e58716" + }, + "test_ternary_patch.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "cbe68f994172ab8da6e57a9d2a00a0a3d530e34cb288e2153ce88f1de2533f40", + "stderr_normalized_sha256": "1cf73c4a9134956099a9ef1daf0aaff748c77112999889f1ccd2f1bd1d474f3e" + }, + "test_ternary_side.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "31134d0edadeec68d3e26295d4e85f65d2c7044c9c7f9d2d8535d31da62a5e94", + "stderr_normalized_sha256": "e9279bb337d9a0b4cd40c20cd7bf054eb2b3d1293ebf09c1a9f2271ce392ab10" + }, + "test_tune_routing.py": { + "code": 0, + "stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stderr_sha256": "8acf23a4091f19adbff6f046853dc490b71ef44e98f0223390c4264c90b7297a", + "stderr_normalized_sha256": "b063a8c455d2a47bbb461f56db939e087c44982a33dc58c6a937d656514b1659" + } + } +} diff --git a/scripts/run_isolated_tests.py b/scripts/run_isolated_tests.py index bb4ecc7cd3..65db599ab0 100644 --- a/scripts/run_isolated_tests.py +++ b/scripts/run_isolated_tests.py @@ -5,21 +5,71 @@ skip_graph and data_recovery. A shared unittest process can silently bind a later package to an earlier package's module. Preserve full test discovery within each file, but do not share those imports between files. + +Modules are scheduled concurrently (one isolated interpreter per module, +--workers controls the width). Every module keeps the exact sequential +command and its captured stdout/stderr bytes are replayed in sorted module +order, so the combined receipts match a sequential run module for module. """ +import argparse +from concurrent.futures import ThreadPoolExecutor +import os from pathlib import Path import subprocess import sys ROOT = Path(__file__).resolve().parents[1] -files = sorted((ROOT/'tests').glob('test*.py')) -if not files: - raise RuntimeError('No test modules discovered') -failed = [] -for path in files: - print('Checking '+path.name, flush=True) - result = subprocess.run([sys.executable, '-m', 'unittest', 'discover', '-s', str(ROOT/'tests'), '-p', path.name, '-v'], cwd=ROOT) - if result.returncode: - failed.append(path.name) -if failed: - raise SystemExit('Failed modules: '+', '.join(failed)) -print(f'PASS all {len(files)} test modules in isolated interpreters') + + +def module_command(python, tests_dir, name): + """The one command every module runs, unchanged from the sequential runner.""" + return [python, '-m', 'unittest', 'discover', '-s', str(tests_dir), '-p', name, '-v'] + + +def run_modules(files, python=None, tests_dir=None, cwd=None, workers=None): + """Run each test module in its own interpreter; return (path, code, out, err). + + Results follow the input order regardless of scheduling. The per-module + command and byte streams are those of a sequential run; only the + scheduling is concurrent. + """ + python = sys.executable if python is None else python + tests_dir = ROOT / 'tests' if tests_dir is None else tests_dir + cwd = ROOT if cwd is None else cwd + if workers is None: + workers = os.cpu_count() or 1 + workers = max(1, min(workers, len(files))) + + def run_one(path): + result = subprocess.run(module_command(python, tests_dir, path.name), + cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return path, result.returncode, result.stdout, result.stderr + + with ThreadPoolExecutor(max_workers=workers) as pool: + return list(pool.map(run_one, files)) + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--workers', type=int, default=None, + help='concurrent test-module processes (default: CPU count)') + args = parser.parse_args(argv) + files = sorted((ROOT / 'tests').glob('test*.py')) + if not files: + raise RuntimeError('No test modules discovered') + failed = [] + for path, code, out, err in run_modules(files, workers=args.workers): + print('Checking ' + path.name, flush=True) + sys.stdout.buffer.write(out) + sys.stdout.flush() + sys.stderr.buffer.write(err) + sys.stderr.flush() + if code: + failed.append(path.name) + if failed: + raise SystemExit('Failed modules: ' + ', '.join(failed)) + print(f'PASS all {len(files)} test modules in isolated interpreters') + + +if __name__ == '__main__': + main() diff --git a/tests/test_isolated_test_runner.py b/tests/test_isolated_test_runner.py new file mode 100644 index 0000000000..34820a8f24 --- /dev/null +++ b/tests/test_isolated_test_runner.py @@ -0,0 +1,136 @@ +"""Behavior tests for scripts/run_isolated_tests.py. + +The runner executes every test module in a fresh interpreter. These tests +exercise the runner end to end in a sandbox (a copied runner plus a tiny +tests/ directory) so the real suite is never re-run inside a test. + +They guard three obligations: +1. Coverage and failure detection: every discovered module runs in its own + process and every failing module is reported. +2. Concurrency: modules are scheduled concurrently (the reason the change + exists), with the exact same per-module command. +3. Receipt stability: stdout blocks stay contiguous per module in sorted + module order and the summary lines are unchanged. +""" +import os +import shutil +import subprocess +import sys +import unittest +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +RUNNER = ROOT / 'scripts' / 'run_isolated_tests.py' + +PASS_MODULE = '''import unittest + +class T(unittest.TestCase): + def test_ok(self): + self.assertEqual(2 + 2, 4) +''' + +FAIL_MODULE = '''import unittest + +class T(unittest.TestCase): + def test_fail(self): + self.fail('deliberate negative control') +''' + +BARRIER_MODULE = '''import os +import time +import unittest +from pathlib import Path + +class T(unittest.TestCase): + def test_arrive(self): + d = Path(os.environ['ARRIVE_DIR']) + d.mkdir(exist_ok=True) + (d / Path(__file__).stem).write_text('x') + deadline = time.time() + 8 + while time.time() < deadline: + if len(list(d.iterdir())) >= 3: + return + time.sleep(0.05) + self.fail('barrier timeout: test modules did not run concurrently') +''' + + +class Sandbox: + def __init__(self, tmp, modules): + scripts = tmp / 'scripts' + scripts.mkdir() + shutil.copyfile(RUNNER, scripts / 'run_isolated_tests.py') + tests = tmp / 'tests' + tests.mkdir() + for name, body in modules.items(): + (tests / name).write_text(body, encoding='utf-8') + self.tmp = tmp + + def run(self, *args, env=None, timeout=180): + merged = dict(os.environ) + if env: + merged.update(env) + return subprocess.run( + [sys.executable, '-B', str(self.tmp / 'scripts' / 'run_isolated_tests.py'), *args], + cwd=self.tmp, capture_output=True, timeout=timeout, env=merged) + + +class IsolatedRunnerTest(unittest.TestCase): + def setUp(self): + import tempfile + self._td = tempfile.TemporaryDirectory() + self.tmp = Path(self._td.name) + + def tearDown(self): + self._td.cleanup() + + def sandbox(self, modules): + return Sandbox(self.tmp, modules) + + def test_every_module_runs_and_every_failure_is_reported(self): + box = self.sandbox({ + 'test_a_pass.py': PASS_MODULE, + 'test_b_pass.py': PASS_MODULE, + 'test_c_fail.py': FAIL_MODULE, + }) + result = box.run('--workers', '3') + self.assertNotEqual(result.returncode, 0) + out = result.stdout.decode() + err = result.stderr.decode() + names = ['test_a_pass.py', 'test_b_pass.py', 'test_c_fail.py'] + positions = [out.index('Checking ' + n) for n in names] + self.assertEqual(positions, sorted(positions)) + self.assertIn('Failed modules: test_c_fail.py', err) + self.assertIn('deliberate negative control', err) + + def test_modules_are_scheduled_concurrently(self): + box = self.sandbox({ + 'test_arrive_1.py': BARRIER_MODULE, + 'test_arrive_2.py': BARRIER_MODULE, + 'test_arrive_3.py': BARRIER_MODULE, + }) + arrive = self.tmp / 'arrive' + result = box.run('--workers', '3', env={'ARRIVE_DIR': str(arrive)}, timeout=120) + self.assertEqual( + result.returncode, 0, + 'concurrent scheduling broken (or --workers rejected): ' + + result.stderr.decode()[-500:]) + self.assertIn('PASS all 3 test modules in isolated interpreters', + result.stdout.decode()) + + def test_default_invocation_keeps_receipt_and_summary(self): + box = self.sandbox({ + 'test_a_pass.py': PASS_MODULE, + 'test_b_fail.py': FAIL_MODULE, + }) + result = box.run() + self.assertEqual(result.returncode, 1) + lines = result.stdout.decode().splitlines() + self.assertEqual(lines[0], 'Checking test_a_pass.py') + self.assertIn('Checking test_b_fail.py', lines) + self.assertFalse(any(line.startswith('PASS all') for line in lines)) + self.assertIn('Failed modules: test_b_fail.py', result.stderr.decode()) + + +if __name__ == '__main__': + unittest.main()