Verhindere Passt-auf-alles-Stapel ohne gemeinsame Merkmale

proposeAssignment verlangt jetzt zusätzlich zur bisherigen
Verträglichkeitsprüfung, dass Stapel und Modul mindestens ein Merkmal
gemeinsam belegt haben. Ein Stapel mit vollständig leerem Spec (Rot-Fall,
"neuer Stapel") hatte sonst mit jedem Modul null gemeinsame Felder und
galt fälschlich als verträglich mit allem.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
vchuser
2026-07-28 18:09:04 +02:00
co-authored by Claude Opus 5
parent cfdccb3f74
commit 00bc62f546
2 changed files with 45 additions and 2 deletions
+18 -2
View File
@@ -18,15 +18,31 @@ function nextStackId(session) {
return `A${session.stacks.length}`;
}
const FINGERPRINT_FIELDS = ['capacityGb', 'formFactor', 'rank', 'speed', 'partNumber'];
/**
* Ein Stapel ist nur dann Kandidat, wenn er mit dem Modul mindestens ein
* Merkmal gemeinsam belegt hat. Ein Stapel ohne jede erkannte Angabe (z.B.
* aus einem Rot-Fall mit leerem Spec entstanden) hat mit jedem Modul null
* gemeinsame Felder und darf deshalb nie als "passt" gelten - sonst wuerde
* er lautlos alles an sich ziehen.
*/
function sharesSetField(a, b) {
return FINGERPRINT_FIELDS.some((field) => (
a[field] !== null && a[field] !== undefined
&& b[field] !== null && b[field] !== undefined
));
}
/**
* Schlaegt vor, wohin ein Modul gehoert.
* Genau ein vertraeglicher Stapel -> Zuweisung.
* Genau ein vertraeglicher Stapel mit gemeinsamer Grundlage -> Zuweisung.
* Keiner -> neuer Stapel.
* Mehrere -> mehrdeutig, der Nutzer entscheidet.
*/
export function proposeAssignment(session, spec) {
const candidates = session.stacks
.filter((stack) => specsCompatible(stack.spec, spec))
.filter((stack) => specsCompatible(stack.spec, spec) && sharesSetField(stack.spec, spec))
.map((stack) => stack.id);
if (candidates.length === 1) {