/** Normalized: 1.0 = linear, ~step = quadratic. Start loose, calibrate from data. */ export declare const GROWTH_BOUND = 2; export declare const WARMUP = 2; export declare const RUNS = 7; /** Median ms over `runs` timed calls after `warmup` untimed ones. For the * absolute smoke checks; growthFactor times differently (a nested median * would defeat its interleave). */ export declare function measureMs(fn: () => unknown, opts?: { warmup?: number; runs?: number; }): number; /** * Normalized growth: 1.0 = linear, ~step = quadratic. `build(n)` does untimed * setup and returns the timed closure. * * The schedule is load-bearing: warm both sizes first, one timing per size per * round, and alternate the within-round order. Interleaving cancels random * noise; alternating also cancels monotonic drift (a fixed order would bias the * always-later size every round, which a median can't remove). */ export declare function growthFactor(build: (n: number) => () => unknown, small: number, large: number, opts?: { rounds?: number; warmup?: number; }): number; /** Record, then gate: with PERF_ENFORCE unset a breach only logs (informational); * set, it throws. Tests never touch the env, so the flip to gating is one line. */ export declare function expectPerf(label: string, actual: number, bound: number): void; /** Writes `source` to a fresh unique temp path so the process-wide parse cache * (keyed on path) always misses, with content fixed so the workload stays * constant. Only the file-based compile/build tests need this. */ export declare function cacheFreePath(source: string, ext?: string): string;