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
fix(build): verify fingerprint-scoped staging by size, so a read-denying holder can't fail the build
The Windows job's own repro exposed the gap: my holder maps the destination with
FileShare.None, so `same_content` cannot even OPEN it → equivalence is
undecidable → mcpp attempts the write → ERROR_SHARING_VIOLATION(32) → build
failed. Which is precisely the #311 outcome, arrived at from the other side.
Reading needs an open; SIZE comes from directory metadata and does not. So the
verify mode is now per-edge rather than one global setting:
std BMI / std.o / std.compat.* --verify size fingerprint-scoped: the cache
dir and the build dir share
the fp covering compiler
identity, triple, stdlib, std
source hash and dialect flags
⇒ equal size IS equivalence
Windows DLL deploy / runtime_alias content not fp-scoped, and a rebuilt
DLL keeps its size (PE
sections are page-padded)
So #311's actual path — clangd mapping the std BMI — now survives even an
EXCLUSIVE lock, while a possibly-stale DLL is still gated byte-for-byte.
Carried on a per-edge `$verify` ninja variable; the separating space lives in the
rule's command string because ninja trims trailing whitespace in variable values.
Verified on Linux with chmod 000 (the closest analogue of a read-denying holder):
the fp-scoped edge skips and the build succeeds.
Also: bootstrap pin 2026.7.29.1 → 2026.7.29.2. Unrelated to this work and
pre-existing on main — the index no longer serves .1 (`available: 2026.7.29.2`),
so the aarch64 fresh-install job fails on main too. .2 is released and indexed,
and the guard's rule (both pins equal, never newer than the building version)
still holds.
0 commit comments