Calibration now extracts actual max individual step duration from
cucumber JSON output — no multipliers, REFERENCE, caps, or floors.
The measured worst-case step IS the timeout.
- calibration.ts: getMeasuredStepTimeoutMs() returns raw maxStepMs
- preflight: cucumber --format json → parse nanosecond durations
- timeouts.ts: CUCUMBER_GLOBAL_TIMEOUT = measured max step
- calibration mode: 1h timeout, purely for measurement to finish
- No REFERENCE_CALIBRATION_MS, no CALIBRATION_PREFLIGHT_MULTIPLIER
- No BASE_STEP_TIMEOUT_MS, no multipliers
- Missing calibration → throws immediately
Also fix CI deprecations:
- github/codeql-action/*@v3 → v4
- actions/upload-artifact@v4 → v5 (test.yml + release.yml)