refactor(okr): endelig sentinel for urangerte entries i akse-B-sammenligneren

`rankOf` returnerte Infinity for urangerte navn, så to urangerte ga
Infinity - Infinity = NaN i sammenligneren. Det ga riktig resultat, men kun
fordi NaN er falsy og faller gjennom til den alfabetiske sammenligneren --
en korrekt-ved-uhell-konstruksjon som neste leser lett ville "fikset" i feil
retning. Erstattet med en endelig sentinel (MAX_SAFE_INTEGER) + begrunnelse.

Ren lesbarhet; ingen oppførselsendring. Suite 187/187 uendret.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EaQkAtvpNCLxWkjdEJ11vx
This commit is contained in:
Kjell Tore Guttormsen 2026-07-31 15:56:54 +02:00
commit 667b7037a1

View file

@ -144,9 +144,14 @@ function orderEntries(names, linkOf, existing, callerRank, dir) {
const known = names.filter((n) => pos.has(linkOf(n)));
const fresh = names.filter((n) => !pos.has(linkOf(n)));
known.sort((a, b) => pos.get(linkOf(a)) - pos.get(linkOf(b)));
// Urangert sorteres sist. Sentinelen er et ENDELIG tall, ikke Infinity: to
// urangerte ville gitt Infinity - Infinity = NaN, som bare "virker" fordi NaN
// er falsy og faller gjennom til den alfabetiske sammenligneren. Det er en
// korrekt-ved-uhell-konstruksjon, og neste leser skal ikke behoeve aa se den.
const UNRANKED = Number.MAX_SAFE_INTEGER;
const rankOf = (n) => {
const r = callerRank.get(resolve(dir, n));
return r === undefined ? Infinity : r;
return r === undefined ? UNRANKED : r;
};
fresh.sort((a, b) => (rankOf(a) - rankOf(b)) || (a < b ? -1 : a > b ? 1 : 0));
return [...known, ...fresh];