4dec646e2f
Ports the WS1 fast/parallel coverage engine onto master and reconciles the coverage gate to a single source. Local full-suite run on master's suite: NOX_EXIT=0, all 12 chunks alive (no dead chunks), peak 658MB/chunk (ceiling ~2.6GB vs the old ~1.4GB single-process that OOMs/reaper-kills), 96.465% -> 96.5 (rounded) >= 96.5 floor. noxfile.py — coverage_report full-suite path now fans out K concurrent slipcover processes (K=COVERAGE_PROCESSES, default 4) over N bin-packed chunks (by scenario count), failing loud on any dead chunk (never merges survivors) and merging per-chunk JSON. Bounds per-process peak RSS, killing the single-process OOM/reaper collapse. Targeted (.feature posargs) runs keep the single-process path. COVERAGE_THRESHOLD now reads pyproject [tool.coverage.report].fail_under. Features are enumerated by direct glob (NOT by importing run_behave_parallel, whose top level imports behave/behave_parallel and is unavailable in the nox orchestrator process). pyproject.toml — adds [tool.coverage.report].fail_under = 96.5 as the single source of truth, with the evidence-gated ratchet rule (objective 97%). .forgejo/workflows/ci.yml — coverage job: carries the skip_coverage operator valve; propagates nox's exit EXPLICITLY (set -uo pipefail + PIPESTATUS + exit $rc) instead of relying on the runner's implicit bash -eo pipefail; adds timeout-minutes: 30 so a hang fails cleanly with diagnostics; deletes the dead threshold=50 "Surface coverage summary" step; fixes the phantom-97 step label. Gating remains nox's --fail-under (sourced from pyproject). coverage_threshold_config_steps.py — the fail-under feature step resolves the floor from pyproject when COVERAGE_THRESHOLD delegates to the reader. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>