Der Anrufkasten zeigt, WER dran ist -- nicht dreimal "Verbunden"

Filipe, zu Screen 1: "wenn ich anrufe soll das auch viel besser geiler
und spezieller aussehen aber es soll nicht raushaengen."

Erst gemessen: Es haengt nichts raus. Der Kasten ist 374 px am Handy,
340 am Rechner, 72 Teile geprueft, kein einziges ueber dem Rand. Die
Optik war also gar nicht der Mangel -- zwei andere Dinge waren es.

1. DER NAME DES ANRUFERS GING IMMER VERLOREN.
   `wer(raumName || "Anruf")` lief VOR `kastenBauen()`. Das Element
   #anruf-wer gab es zu dem Zeitpunkt noch nicht, die Zuweisung lief
   ins Leere, und oben stand bei jedem Anruf das Wort "Anruf". Die
   Reihenfolge ist umgedreht: erst bauen, dann beschriften.

2. IN EINEM ANRUF OHNE VIDEO STAND JE PERSON DAS WORT "Verbunden".
   Bei dreien dreimal dasselbe Wort -- und man sah nicht, WER dabei
   war. In einer Gruppe ist genau das die Frage: Ist Kessi schon
   drin? Jetzt steht dort ein Kreis mit den Anfangsbuchstaben und der
   echte Name; waehrend es klingelt ein wartendes Gesicht mit dem
   Namen dessen, den man anruft. Vorher war die Flaeche in dieser
   Sekunde leer, und ein leerer Kasten mit "Es klingelt ..." sieht
   aus wie einer, der haengt -- ausgerechnet im unsichersten Moment.

Der Name kommt NICHT aus einer Abfrage. Wer anruft, bekannt beim
Start nur sich selbst; alle weiteren kommen ausschliesslich ueber das
Ereignis "dabei", und genau dort fehlte das Einsammeln. Deshalb sah
der ANRUFER unter jedem Kreis "Jemand" -- die Angerufenen nicht.

UND DIE PRUEFUNG WAR ZU NACHSICHTIG. Sie verlangte einen Namen
"laenger als ein Zeichen"; der Rueckfalltext "Jemand" ist sechs
Zeichen lang und kam damit durch. Gruen, waehrend der Hauptfall
kaputt war. Die zweite Fassung verglich gegen eine abgeschriebene
Namensliste -- die nannte "Jonas, Luna, Mara, Pat", angelegt werden
aber "Filipe, Rieke, Kessi, Tili", und der Kommentar daneben
behauptete schon da, sie sei abgeleitet. Jetzt ist sie es wirklich:
Die Namen werden beim Anlegen eingesammelt, und geprueft wird, dass
jeder GENAU DIE BEIDEN ANDEREN sieht -- nicht "irgendeinen echten
Namen", denn der eigene Name im eigenen Kasten waere auch einer.

pruef-anruf: 127 Pruefungen, 0 Fehler.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-20 22:25:45 +02:00
co-authored by Claude Opus 5
parent 9d086eccaf
commit b0e7542507
41 changed files with 812 additions and 512 deletions
+85
View File
@@ -68,7 +68,15 @@ const anrufModul = await import("./workspace-anruf.js");
/* ---- Leute anlegen ---- */
const d = new DatabaseSync(process.env.WORKSPACE_DB);
/* Die Namen der Konten, die diese Pruefung anlegt -- gesammelt an der
Stelle, an der sie entstehen. Eine zweite Liste weiter unten waere
beim naechsten umbenannten Konto die veraltete: Genau das ist hier
passiert (die Liste nannte „Jonas, Luna, Mara, Pat", angelegt wurden
„Filipe, Rieke, Kessi, Tili"), und der Kommentar daneben behauptete
schon damals, sie sei abgeleitet. Jetzt ist sie es. */
const ANGELEGTE_NAMEN = [];
function person(name, rolle, code) {
ANGELEGTE_NAMEN.push(name);
const salt = randomBytes(16).toString("hex");
const hash = scryptSync(code, salt, 64,
{ N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex");
@@ -996,6 +1004,83 @@ melde("=== 8. Zu dritt ===");
`${wer} hoert BEIDE anderen (${z.stroeme} Stroeme, „${z.lage}")`);
}
/* ---- WER IST DRAN (20.09.2026) -----------------------------
Filipe: „die soll auch viel besser geiler und spezieller
aussehen, aber nicht so raushaengen."
DER MANGEL WAR KEIN SCHOENHEITSFEHLER: In einem Anruf ohne
Video stand unter dem Kasten je Person das Wort „Verbunden"
-- bei dreien dreimal dasselbe Wort, und man sah nicht, WER
verbunden war. In einer Gruppe ist genau das die Frage.
Gemessen wird deshalb, dass NAMEN dastehen, nicht Kacheln:
Ein Gesichtsfeld ohne Namen bestuende jede Pruefung, die nur
zaehlt. */
/* WER MUSS WEN SEHEN. Nicht „irgendein echter Name", sondern
genau die beiden ANDEREN: Stuende bei DogFather sein eigener
Name im Kasten, waere das ein Fehler, den eine Pruefung auf
„ist ein echter Name" durchliesse. Die Namen kommen aus
`ANGELEGTE_NAMEN` -- sie werden beim Anlegen eingesammelt und
hier nur noch verteilt. */
const NAME = { [idDogi]: ANGELEGTE_NAMEN[0], [idHand]: ANGELEGTE_NAMEN[1],
[idModi]: ANGELEGTE_NAMEN[2] };
const ERWARTET = {
DogFather: [NAME[idHand], NAME[idModi]],
"die rechte Hand": [NAME[idDogi], NAME[idModi]],
"der Modi": [NAME[idDogi], NAME[idHand]],
};
for (const [wen, x] of [["DogFather", a], ["die rechte Hand", b], ["der Modi", c]]) {
const g = await x.se.evaluate(() => ({
felder: document.querySelectorAll("#anruf-leute .anruf__gesicht").length,
namen: [...document.querySelectorAll("#anruf-leute .anruf__gesicht .anruf__name")]
.map((e) => e.textContent.trim()).filter(Boolean),
verbunden: /Verbunden/.test(document.getElementById("anruf-leute")?.textContent || ""),
}));
ok(g.felder === 2,
`${wen} sieht die beiden anderen als Gesichtsfeld (${g.felder})`);
/* NICHT „laenger als ein Zeichen" -- der Rueckfalltext
„Jemand" ist sechs Zeichen lang und kam damit durch. Die
Pruefung war gruen, waehrend ausgerechnet der ANRUFER unter
jedem Kreis „Jemand" stehen sah. Verglichen wird deshalb
gegen die Namen, die es wirklich gibt. */
const soll = [...ERWARTET[wen]].sort().join(", ");
const ist = [...g.namen].sort().join(", ");
ok(g.namen.length === 2 && ist === soll,
` und zwar genau die beiden anderen (${ist || "keine"}, erwartet: ${soll})`);
ok(!g.verbunden,
" statt dreimal dem Wort „Verbunden“, das nichts unterscheidet");
}
/* ---- UND NICHTS HAENGT RAUS --------------------------------
„nicht so raushaengen" ist die schaerfere der beiden Vorgaben:
Der Kasten ist 340 px breit und liegt in der Ecke. Bei DREI
Gesichtsfeldern plus Knopfreihe ist das die engste Lage, die
im Betrieb vorkommt -- also die, in der gemessen wird. */
for (const [wen, x] of [["am Rechner", a]]) {
const raus = await x.se.evaluate(() => {
const k = document.querySelector(".anruf");
if (!k) return null;
const r = k.getBoundingClientRect();
const treffer = [];
for (const e of k.querySelectorAll("*")) {
const b2 = e.getBoundingClientRect();
if (b2.width < 1 || b2.height < 1) continue;
if (b2.right > r.right + 1 || b2.left < r.left - 1 || b2.bottom > r.bottom + 1) {
treffer.push((e.className.baseVal ?? e.className).toString().split(" ")[0]);
}
}
return { geprueft: k.querySelectorAll("*").length, treffer };
});
/* DIE ZAHL GEHOERT IN DIE BEDINGUNG: Faende der Wahlausdruck
nichts, waere die Liste leer und die Pruefung gruen, ohne
etwas angesehen zu haben. */
ok(raus && raus.geprueft > 10 && raus.treffer.length === 0,
raus?.treffer.length
? `es haengt etwas raus: ${raus.treffer.slice(0, 3).join(", ")}`
: `nichts haengt aus dem Kasten (${raus?.geprueft} Teile geprueft, ${wen})`);
}
/* ---- DER LAUTSPRECHER (18.09.2026) -------------------------
Filipe: „die funktion lautsprecher fehlt."