One harness that runs the verification suites reproducibly on the target machine: each suite gets a fresh build directory (so it creates its own D81), a wall-clock limit that bounds emulated cycles, a captured log, a machine-readable result, and — where the output is stable — a reviewed SHA-256 baseline of the PRG/MAP artifacts. A failing suite names its fixture and the observed mismatch.
tests/regression/run-regression.ps1 (new): suite loop, child PowerShell per
suite, timeout with tree kill, log capture, artifact hashing and comparison,
JSON results, baseline updatetests/regression/suites.ps1 (new): manifest of 24 suites, each pointing at
an existing scripts/verify-*-test.ps1 script and a <name>-test build
directorytests/regression/baseline.json (new): reviewed hashes for the source, lexer
and parser artifactstests/regression/harness.tests.ps1 (new): self-tests of the mechanics with
no emulatordocs/decisions.md (D152), planning/claims/E08-S01.mdbuild/regression/ (results, per-suite logs)build/<name>-test, which the harness deletes before the run unless
-NoFresh is passed; each of the three exercised suites builds its own
image there. The self-test proves the deletion with a suite that only passes
when its directory starts empty.Timeout seconds is killed with its process tree and recorded
as timedOut; results are JSON with startedAt, finishedAt, per-suite
status, seconds, exitCode, signature, problems, log and
artifacts, plus passed/failed totals.baseline.json; a rerun reports
match, a changed file reports changed, a new file reports new, and a
baselined file that disappeared reports missing.exit code 3.scripts/verify-*-test.ps1 scripts unchanged,
so it adds automation rather than a second implementation of any check.-NoFresh exists for the self-test only; a normal run always reuses nothing.suites.psd1; invoking a .psd1 with &
yields nothing, so the harness reported “manifest lists no suites”. It is now
suites.ps1.$results while the output path
parameter was $Results: PowerShell variable names are case-insensitive, so
the path became an empty array and New-Item -Path "" failed with
“Cannot bind argument to parameter ‘Path’". The parameter is now
$ResultsPath with an alias -Results so callers are unchanged.-File passes -Filter source,lexer,parser as a single string; the filter
now splits on commas as well as accepting a string array.exit code 3; it now prefers the
diagnosis line from the captured output.tests/regression/harness.tests.ps1, then
run-regression.ps1 -Filter source,lexer,parser -UpdateBaseline, then the
same filter without -UpdateBaseline to prove the baseline matches.regression harness tests passed; both real runs reported
3 passed, 0 failed (source 18.3 s / 18.5 s, lexer 21.7 s / 23.7 s, parser
35.6 s / 37.9 s). Baseline covers 3 suites: source PRG
4C0FA221…DC6AAC65, lexer PRG 822074D0…97AA4, parser PRG
7A2E1B90…4128FBA.-UpdateBaseline; the other 21 suites
have no pinned artifacts yet, so a silent byte-level change in them would not
be caught.Powered by TurnKey Linux.