test(run): full runs end to end on a claude stand-in

The Runs test drives this binary as crafter-review on a scratch repository,
with a /bin/sh claude that answers every pass from its system file and
prompt: a dry run; a run SIGKILLed in its last gate (every pass goes with
it through its supervisor); the next run resuming the first gate from the
checkpoint, salvaging the killed run's outputs and buying only the pass that
never answered; a run with nothing left to buy; a FIX FIRST with
--no-reuse --no-salvage; a stop by the stop file and by SIGTERM, each
leaving no process behind; a stale stop file dropped by the run that claims
its dir; a stop between gates.

Two fixes it led to:
- A stop that lands while a gate's pool is set up is no longer lost: the
  stop is checked under the same lock that publishes the pool.
- A run never takes the number of a dump on record. Past a killed run that
  left no dump, a later run that bought nothing could have its number
  taken again and its dump written over.

Drivers gains the --no-reuse store check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jorijn van der Graaf 2026-10-31 09:59:12 +01:00
commit 952eb13f5c
Signed by: jorijnvdgraaf
GPG key ID: 2937E59CDCC1BCFB
4 changed files with 455 additions and 11 deletions

View file

@ -84,7 +84,7 @@ namespace {
// One per directory under tests/, each an ordinary main() that links the
// library: exit 0 passes, nonzero fails, 77 skips.
constexpr std::array<std::string_view, 23> Tests = {
constexpr std::array<std::string_view, 24> Tests = {
"Crypto",
"Text",
"Platform",
@ -108,6 +108,7 @@ namespace {
"StoreRules",
"StacksMemory",
"ReviewFixes",
"Runs",
};
// The version the binary reports: CI sets it from the tag, a checkout