9f5fba2e

By: Tom Sydney Kerckhove <syd@cs-syd.eu>

Mutation: order covering tests cheapest-first in the mutation child

When a mutation child runs the tests that cover a mutation, it runs them
synchronously under fail-fast, so the first covering test that fails kills
the mutant.  Ordering the covering tests cheapest-first (by the per-test
baseline the coverage phase already measures) reaches a killing test sooner
and reduces the mutation phase's wall-clock, since killed mutants are the
majority of a run.

- reorderTestForestByTiming: pure, tree-aware, stable reorder that sorts
  siblings by ascending baseline (missing = first) and orders each subtree by
  its minimum contained leaf cost, so a shared-setup group reorders as a unit
  and setup is never split.  It mirrors randomiseTestForest by leaving
  DoNotRandomiseExecutionOrder subtrees untouched, so it is legal wherever
  execution-order randomisation is.
- The coverage phase now persists the merged per-test baselines as
  baseline.json next to the manifest; the run and diff paths union them into
  the augmented dir the children read.
- The child reads that baseline and reorders the filtered forest after
  filtering (so the coverage-order ids the filter needs are untouched), gated
  on settingRandomiseExecutionOrder.

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 31s 1s 1s 33s 31s
Eval 33s 23s 23s 56s 0s
Build - - - - 17h43m17s
Suite 31s 24s - - 17h43m49s