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
Committed .clj.dll (nostrand/references/, magic-unity/Runtime/Infrastructure/Export/) are guarded by source-SHA manifests that fingerprint each DLL's own .clj source, not the DLL bytes.
But a DLL's bytes depend on its source and the compiler and the runtime, so a change with no matching .clj edit silently leaves committed DLLs stale while drift stays green:
a compiler .clj change (e.g. hashing or emission behavior) re-emits other namespaces' DLLs, whose own source SHA never moved;
a runtime .cs change (e.g. hasheq) alters emitted bytes with no .clj change at all.
We cannot just byte-diff the DLLs to catch this, because compilation is non-deterministic: emission order comes from identity-hashed collections (Var, MethodInfo, Type), and every AssemblyBuilder.Save stamps a fresh MVID and PE timestamp.
Concrete incident: a hasheq change in the runtime altered the hashes baked into clojure.spec.alpha's regex-op case jump tables; the .clj never moved, drift stayed green, and the regex ops threw "No matching clause" at runtime.
Suggestion
Make compilation byte-deterministic:
sort member and interface emission by a stable key (lifted Vars, override methods, fn interfaces);
normalize assembly headers (MVID from a content hash, PE timestamp zeroed).
Then have drift check rebuild and byte-diff the committed DLLs, replacing the source-SHA manifests, so it catches staleness from any compiler or runtime change and not just a DLL's own source.
Problem
.clj.dll(nostrand/references/,magic-unity/Runtime/Infrastructure/Export/) are guarded by source-SHA manifests that fingerprint each DLL's own.cljsource, not the DLL bytes..cljedit silently leaves committed DLLs stale while drift stays green:.cljchange (e.g. hashing or emission behavior) re-emits other namespaces' DLLs, whose own source SHA never moved;.cschange (e.g.hasheq) alters emitted bytes with no.cljchange at all.AssemblyBuilder.Savestamps a fresh MVID and PE timestamp.hasheqchange in the runtime altered the hashes baked intoclojure.spec.alpha's regex-opcasejump tables; the.cljnever moved, drift stayed green, and the regex ops threw "No matching clause" at runtime.Suggestion