You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Track upstream: Vale lint time is superlinear in single-block size, and no output is emitted until the run finishes #325
Resolved upstream in Vale 3.21.0, which 0.11.2 ships (2026-09-20). Reproduction repo with the timing data: https://github.com/thecodedrift/reproduction_vale_blocks. The 128KB guard 0.11.2 added against the old behavior comes out in the next patch: #351.
We build no workaround for the all-or-nothing output. Batching would have made a timeout cost one batch instead of the whole run, and its entire value disappears if finding 2 here is fixed. Not worth carrying a workaround whose lifetime is bounded by a bug report we have already filed.
The size cap is knowingly a proxy for the wrong quantity, per finding 1: cost tracks single-block size, not file size. It over-fires on a well-formed 3 MB document (~4s, passes a 128 KB cap) and under-fires on a 512 KB single-block file (~2s, may sit beneath it). Accepted, because measuring block structure means reading every candidate, which costs more than the guard saves.
Either upstream fix changes what we do here:
Incremental output (finding 2) removes the reason batching ever existed, and makes a caller-side timeout able to preserve findings.
Linear block cost (finding 1) lets VALE_MAX_FILE_BYTES rise substantially or disappear.
A "won't fix" upstream is the trigger to reopen #324, not a reason to start it now.
Verified with @taskless/vale-*@3.21.0-20260915061224: the 3 MB single-block fixture drops from ~81 s to ~230 ms and now matches the many-block file (~270 ms), with identical alert counts. Scaling a single block to 25 MB gives ~1.8 s, linear in size. Vale still emits nothing until the whole run finishes, but with no slow block for a timeout to hit that is no longer causing lost output; treating this as fixed for Vale ≥ 3.21 and archiving the repro repo.
Activity
theCodeDrift commentedon Sep 9, 2026
Direction settled: this issue is the one we are betting on. #324 (batching) is closed in its favour.
The position we are standing on until upstream moves:
VALE_MAX_FILE_BYTES(fix(cli): skip an oversized file instead of letting Vale time out on it #323) stays as the guard. It avoids the spend rather than spending and discarding it, and it is the only check cheap enough to run before spawning Vale.Either upstream fix changes what we do here:
VALE_MAX_FILE_BYTESrise substantially or disappear.A "won't fix" upstream is the trigger to reopen #324, not a reason to start it now.
Reproduction repo, with the vale binary pinned via npm and
npm run bug:reproduce: https://github.com/thecodedrift/reproduction_vale_blocksdocs: mark resolved as of Vale 3.21.0 and record the new measurements
theCodeDrift commentedon Sep 20, 2026
Verified with @taskless/vale-*@3.21.0-20260915061224: the 3 MB single-block fixture drops from ~81 s to ~230 ms and now matches the many-block file (~270 ms), with identical alert counts. Scaling a single block to 25 MB gives ~1.8 s, linear in size. Vale still emits nothing until the whole run finishes, but with no slow block for a timeout to hit that is no longer causing lost output; treating this as fixed for Vale ≥ 3.21 and archiving the repro repo.
fix(vale): drop the 128 KB file-size guard
fix(vale): drop the 128 KB file-size guard