Ein Anruf faengt leise an

Filipe: "uebrigens soll man auswaehlen koennen ob man lautsprecher will
oder nicht bitte. es soll ohne lautsprecher anfangen das gespraech und
nur wenn man drauf klickt soll es laut werden ... es soll nicht
raushaengen oder so, das ist nicht cool."

DER GRUND IST DER STREAM. Ein Anruf, der beim Annehmen sofort aus den
Lautsprechern kommt, ist im schlimmsten Fall fuer alle Zuschauer zu
hoeren, bevor irgendjemand reagieren kann. Das laesst sich nicht
zurueckholen.

HIER STAND `hoeren = true` mit der Begruendung: "Wer den Ton abgestellt
hat, will ihn nicht beim naechsten Gespraech wieder an." Das war richtig
gedacht und ist jetzt umgedreht -- aus demselben Grund, nur in die
andere Richtung: Der Zustand soll NICHT ueberdauern. Eine Entscheidung
von vorhin darf nicht fuer ein Gespraech gelten, von dem man noch
nichts wusste. Zurueckgesetzt wird an BEIDEN Wegen, beim Anrufen und
beim Rangehen -- einer allein waere die Haelfte, und die andere Haelfte
faellt niemandem auf, bis es einmal zu laut war.

UND MAN SIEHT ES. Leise anfangen ohne Hinweis waere die naechste
Sackgasse: "ich hoere nichts" ohne Grund und ohne Weg. Ein Balken sagt
es, solange es gilt, und verschwindet in dem Moment, in dem man den Ton
anmacht. Er ist SELBST der Knopf -- wer liest "tippen, um den Ton
anzumachen", will genau das tun. Gedaempftes Bernstein statt Alarmrot:
Es ist kein Fehler, sondern ein Zustand.

DABEI EINEN EIGENEN FEHLER GEFANGEN: Der Balken fragte `!anruf` -- und
diese Variable wird erst gesetzt, NACHDEM der Kasten aufgeht. Beim
Aufbauen blieb er deshalb versteckt, und man sass in einem stummen
Gespraech ohne einen Satz dazu. Genau der Zustand, den er verhindern
soll. Jetzt haengt er am sichtbaren Kasten.

DIE PRUEFUNG WURDE ROT und hat damit ihre Arbeit getan -- sie hielt das
alte Verhalten fest. Umgedreht, nicht gestrichen: Die wichtigste Falle
(ueberlebt der Schalter das Neuzeichnen, wenn jemand auflegt?) bleibt,
nur der erwartete Zustand hat sich gedreht.

GEPRUEFT: pruef-anruf 117/0 (war 114) -- drei Aussagen mehr, darunter
dass der Hinweis da ist, 44 px hoch und im richtigen Moment
verschwindet.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-20 19:01:28 +02:00
co-authored by Claude Opus 5
parent 01151574ae
commit c59517cb23
40 changed files with 699 additions and 527 deletions
+52 -18
View File
@@ -1015,12 +1015,37 @@ melde("=== 8. Zu dritt ===");
.map((m) => m.muted));
{
/* ==== JEDES GESPRAECH FAENGT LEISE AN (20.09.2026) ==========
Filipe: "es soll ohne lautsprecher anfangen das gespraech und
nur wenn man drauf klickt soll es laut werden ... es soll
nicht raushaengen oder so, das ist nicht cool."
Diese Pruefung stand hier genau ANDERSHERUM und ist beim
Umbau rot geworden -- richtig so, sie hat die Aenderung
bemerkt. Der Grund fuer die Umkehr steht bei `hoeren` in
anruf.js: Ein Anruf, der beim Annehmen sofort aus den
Lautsprechern kommt, ist im schlimmsten Fall fuer alle
Zuschauer zu hoeren, bevor jemand reagieren kann. Das laesst
sich nicht zurueckholen. */
const vorher = await stumm(a);
/* Die ANZAHL gehoert in die Bedingung: `every` ist auf einer
leeren Liste wahr, und dann waere diese Pruefung gruen,
ohne ein einziges Element gesehen zu haben. */
ok(vorher.length >= 2 && vorher.every((m) => m === false),
`vorher hoert DogFather beide (${vorher.length} Stroeme, keiner stumm)`);
ok(vorher.length >= 2 && vorher.every((m) => m === true),
`das Gespraech faengt LEISE an (${vorher.length} Stroeme, alle stumm)`);
/* UND MAN SIEHT ES. Leise anfangen ohne Hinweis waere die
naechste Sackgasse: "ich hoere nichts" ohne einen Grund und
ohne einen Weg. */
const balken = await a.se.evaluate(() => {
const b = document.getElementById("anruf-stumm");
return b ? { da: !b.hidden, text: b.textContent.trim(),
hoch: Math.round(b.getBoundingClientRect().height) } : null;
});
ok(balken?.da === true, `ein Hinweis sagt es ("${balken?.text}")`);
ok((balken?.hoch || 0) >= 44,
` und er ist selbst antippbar (${balken?.hoch} px hoch)`);
const knopf = await a.se.evaluate(() => {
const k = document.getElementById("anruf-hoeren");
@@ -1032,26 +1057,31 @@ melde("=== 8. Zu dritt ===");
durchgestrichene Zeichen den Zustand und das Wort nur die
Sache. Geprueft wird deshalb aria-pressed; der Text bleibt
gleich und beweist nichts mehr. */
ok(knopf?.an === "true",
`der Lautsprecher-Knopf ist da und steht auf an („${knopf?.text}")`);
ok(knopf?.an === "false",
`der Lautsprecher-Knopf steht auf AUS ("${knopf?.text}")`);
/* ---- UND EIN DRUCK MACHT IHN LAUT ------------------------- */
await a.se.click("#anruf-hoeren");
await a.se.waitForTimeout(300);
const nachher = await stumm(a);
ok(nachher.length >= 2 && nachher.every((m) => m === true),
`nach dem Druecken ist ALLES stumm (${nachher.length} Stroeme)`);
ok(nachher.length >= 2 && nachher.every((m) => m === false),
`nach dem Druecken hoert er alle (${nachher.length} Stroeme, keiner stumm)`);
const knopf2 = await a.se.evaluate(() => {
const k = document.getElementById("anruf-hoeren");
return { text: k.textContent.trim(), an: k.getAttribute("aria-pressed") };
const b = document.getElementById("anruf-stumm");
return { an: k.getAttribute("aria-pressed"), balken: b ? !b.hidden : null };
});
ok(knopf2.an === "false",
`und der Knopf steht auf aus (aria-pressed="${knopf2.an}")`);
ok(knopf2.an === "true",
`und der Knopf steht auf an (aria-pressed="${knopf2.an}")`);
ok(knopf2.balken === false,
"der Hinweis verschwindet in dem Moment, in dem er ueberfluessig wird");
/* NUR BEI IHM. Ein Schalter, der bei den anderen mitwirkt,
waere kein Lautsprecher, sondern eine Fernbedienung. */
waere kein Lautsprecher, sondern eine Fernbedienung.
Bei ihr ist ALLES stumm -- sie hat ihren Ton nie angemacht. */
const beiB = await stumm(b);
ok(beiB.length >= 2 && beiB.every((m) => m === false),
`bei der rechten Hand aendert sich nichts (${beiB.length} Stroeme, keiner stumm)`);
ok(beiB.length >= 2 && beiB.every((m) => m === true),
`bei der rechten Hand aendert sich nichts (${beiB.length} Stroeme, alle noch stumm)`);
}
/* Einer legt auf -- fuer die anderen laeuft es weiter. */
@@ -1065,15 +1095,19 @@ melde("=== 8. Zu dritt ===");
`und bei DogFather ist genau ein Strom weniger (${zA.stroeme})`);
/* DIE FALLE: Die Runde hat sich geaendert, die Elemente wurden
neu gebaut. Bliebe der Schalter dabei auf der Strecke, wuerde
DogFather ploetzlich wieder mithoeren -- ohne dass irgendwo
etwas anders aussieht. */
neu gebaut. Bliebe der Schalter dabei auf der Strecke, stuende
der Ton ploetzlich anders -- ohne dass irgendwo etwas anders
aussieht.
RICHTUNG UMGEDREHT AM 20.09.2026: DogFather hat den Ton oben
eingeschaltet, also muss er JETZT hoeren. Die Falle ist
dieselbe geblieben, nur der erwartete Zustand nicht. */
const nachWechsel = await stumm(a);
ok(nachWechsel.length === 1 && nachWechsel[0] === true,
`und der Lautsprecher bleibt aus, obwohl neu gezeichnet wurde (${nachWechsel.length} Strom)`);
ok(nachWechsel.length === 1 && nachWechsel[0] === false,
`und der eingeschaltete Ton ueberlebt das Neuzeichnen (${nachWechsel.length} Strom)`);
const knopfNoch = await a.se.evaluate(() =>
document.getElementById("anruf-hoeren")?.getAttribute("aria-pressed"));
ok(knopfNoch === "false", "auch der Knopf steht noch richtig");
ok(knopfNoch === "true", "auch der Knopf steht noch richtig");
await a.se.click("#anruf-auflegen");
await b.se.click("#anruf-auflegen");