One side of a revision comparison: a completed run plus the durable
identity of every model it drew elements from.
ClashElementRef.model (carried on Clash.a/Clash.b) is the federation's
per-LOAD id — crypto.randomUUID() in the viewer — so it is deliberately
useless for asking "is this model still part of the comparison". modelNames
is the caller-supplied bridge: a map from that ephemeral id, AS IT APPEARS ON
THIS RESULT'S OWN CLASHES, to a durable identity (the model's display name /
filename in the viewer). Two different model ids that map to the same name
are treated as the same model reloaded; a name present in previous but
absent from next is treated as a model the comparison lost entirely.
This is a heuristic, not a proof: renaming a model between runs makes it
look "missing" (its old name has no counterpart), and two distinctly loaded
files that happen to share a display name look like one. Both failure modes
point the same way — toward unretested rather than a wrongly-confident
resolved — which is the direction this module exists to be safe in.
One side of a revision comparison: a completed run plus the durable identity of every model it drew elements from.
ClashElementRef.model(carried onClash.a/Clash.b) is the federation's per-LOAD id —crypto.randomUUID()in the viewer — so it is deliberately useless for asking "is this model still part of the comparison".modelNamesis the caller-supplied bridge: a map from that ephemeral id, AS IT APPEARS ON THIS RESULT'S OWN CLASHES, to a durable identity (the model's display name / filename in the viewer). Two differentmodelids that map to the same name are treated as the same model reloaded; a name present inpreviousbut absent fromnextis treated as a model the comparison lost entirely.This is a heuristic, not a proof: renaming a model between runs makes it look "missing" (its old name has no counterpart), and two distinctly loaded files that happen to share a display name look like one. Both failure modes point the same way — toward
unretestedrather than a wrongly-confidentresolved— which is the direction this module exists to be safe in.