- Move calibration preflight from test:e2e to test:prepare-e2e so
calibration runs during preparation, not during tests.
- Remove rimraf/developmentMkdir duplication from test:e2e.
- Increase Prepare E2E timeout to 15min to accommodate calibration.
- Remove FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 workaround; actions will
update to Node.js 24 naturally before September 2026 deprecation.
- Remove FALLBACK_STEP_MS/LAUNCH_MS/WAIT_MS/ELEMENT_MS — all timeouts
now come exclusively from calibration measurements.
- requireRecord() throws with clear instructions when calibration file
is missing instead of silently using fallback values.
- getMeasuredStepTimeoutMs() uses measured stepMs from calibration.
- Re-import getMeasuredWaitTimeoutMs for LOG_MARKER_WAIT_TIMEOUT.
- Add FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true to all CI workflows
to fix Node.js 20 actions deprecation warnings.
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)