@@ -44,26 +44,27 @@ const REGRESSION_THRESHOLD = BENCH_CANARY ? 0.5 : 0.25;
4444/**
4545 * Wider regression threshold applied to metrics in NOISY_METRICS.
4646 *
47- * Sub-30ms timing metrics (no-op rebuild, 1-file rebuild, fnDeps depth 1)
48- * routinely jitter ±10ms from CI runner load, GC pauses, and OS scheduling,
49- * which translates to ±50 %+ on small absolute numbers . The MIN_ABSOLUTE_DELTA
50- * floor (10ms) filters trivial noise but cannot distinguish a 10–14ms
51- * "real" jitter event from a regression on these specific metrics.
47+ * Short-latency timing metrics (no-op rebuild, 1-file rebuild, fnDeps depth 1)
48+ * that routinely jitter ±10–50ms from CI runner load, GC pauses, and OS
49+ * scheduling — translating to ±25–155 %+ on sub-100ms baselines . The
50+ * MIN_ABSOLUTE_DELTA floor (10ms) filters trivial noise but cannot distinguish
51+ * a 10–14ms "real" jitter event from a regression on these specific metrics.
5252 *
53- * Keeping the global threshold at 25% means a regression in the 30–100ms
54- * range is still caught (e.g. 50ms→63ms = +26%, flagged), while sub-30ms
55- * metrics in this set get the wider 50% allowance.
53+ * Keeping the global threshold at 25% means a regression in the 100–500ms
54+ * range is still caught (e.g. 200ms→253ms = +26%, flagged), while the
55+ * high-jitter metrics in this set get the wider 50% allowance.
5656 *
5757 * In BENCH_CANARY mode this is overridden to 1.0 (100%) — the canary's
58- * purpose is to catch gross regressions (+50%+), not sub-30ms jitter.
58+ * purpose is to catch gross regressions (+50%+), not short-latency jitter.
5959 */
6060const NOISY_METRIC_THRESHOLD = BENCH_CANARY ? 1.0 : 0.5 ;
6161
6262/**
6363 * Metric labels treated as high-variance and given the NOISY_METRIC_THRESHOLD
6464 * tolerance instead of the default REGRESSION_THRESHOLD. Add a metric here
65- * only when its baseline is consistently sub-30ms and CI variance has been
66- * empirically shown to exceed 25%.
65+ * only when CI variance has been empirically shown to exceed 25% due to runner
66+ * jitter (±10–50ms absolute) that dominates the percentage on short-ish
67+ * sub-200ms baselines — document the evidence in the entry below.
6768 *
6869 * - `No-op rebuild`: native baselines across releases span 15–30ms
6970 * (3.11.0: 15ms, 3.11.2: 19–25ms, 3.12.0: 23–30ms depending on suite).
@@ -104,7 +105,7 @@ const NOISY_METRIC_THRESHOLD = BENCH_CANARY ? 1.0 : 0.5;
104105 * CI consistently measures +40–60% on this sub-30ms metric while the
105106 * absolute delta (~13ms) is at the noise floor for shared runners.
106107 * Methodology already discards 3 warmup runs (#1077). Same pattern as
107- * No-op rebuild and 1-file rebuild — sub-30ms baseline amplified by
108+ * No-op rebuild and 1-file rebuild — short-latency baseline amplified by
108109 * ±10ms runner jitter into a percentage swing that looks like regression.
109110 */
110111const NOISY_METRICS = new Set < string > ( [ 'No-op rebuild' , '1-file rebuild' , 'fnDeps depth 1' ] ) ;
0 commit comments