Dopplung weg: "Bei dir klingelt nichts" stand zweimal auf einem Schirm

Der neue Kasten von heute Mittag hat die alte Tagesblick-Zeile nicht
ersetzt, sondern sich darueber gesetzt. Beide sagten dasselbe,
untereinander, auf derselben Seite.

GEFUNDEN HAT DAS NUR EIN BILDSCHIRMFOTO. Beide Teile waren fuer sich
gruen: pruef-glocke verlangte die Zeile, pruef-push-hinweis den
Kasten, und keine der beiden konnte sehen, dass die andere existiert.
Zahlen zeigen so etwas nie. Deshalb macht pruef-push-hinweis jetzt
bei jedem Lauf ein Foto -- und scrollt vorher hin, weil der erste
Versuch brav die Begruessungskachel zeigte und den Kasten gar nicht
im Bild hatte. Ein Beweisbild ohne das, was es beweisen soll, ist
schlimmer als keins: Man glaubt ja, hingesehen zu haben.

Entfernt wurde die aeltere der beiden (19.09.2026). Sie war gut
gebaut, server-seitig und nicht wegklickbar -- aber sie hat das
Problem nicht geloest: Am 03.10. nachgemessen hatten immer noch
12 von 20 kein Geraet, darunter die linke Hand und ein Modi. Sie SAGT
es und man kann nichts tun; sie fuehrt nur auf eine andere Seite. Der
neue Kasten hat einen Knopf und erklaert den iPhone-Fall, in dem
Web-Push ohne Home-Bildschirm gar nicht geht.

Entscheidung von Filipe am 03.10. Offen gesagt, was damit aufgegeben
ist: Wer "Nicht jetzt" tippt, bekommt keine zweite Erinnerung mehr.
Gegensicherung ist die Personenliste -- dort steht seit heute bei
jeder Person, die nichts bekommt, genau das.

pruef-glocke 36 -> 33, und die Zahl ist erklaert: 5 Pruefungen zur
alten Zeile entfernt, 2 neue dafuer. Die neuen pruefen das
GEGENTEIL von vorher -- dass die Zeile nicht unbemerkt
zurueckkommt -- mit der Zahl der geprueften Hinweise in der
Bedingung, damit eine leere Antwort der Schnittstelle nicht als
"steht nicht drin" durchgeht.

Die alte Gegenprobe ("mit angemeldetem Geraet ist der Hinweis weg")
ist ersatzlos entfallen, nicht aus Bequemlichkeit: Sie waere ab jetzt
IMMER gruen, egal was das Haus tut. Eine Pruefung, die nichts mehr
widerlegen kann, taeuscht nur Deckung vor. Was sie geprueft hat,
prueft pruef-push-hinweis am neuen Kasten, mit einer echten
Anmeldung.

OHNE_ZAHL in start.js bleibt als leere Liste stehen -- der naechste
Zustandshinweis braucht sie wieder, und als Liste ist sie die eine
Stelle dafuer.

Gegengemessen: pruef-tagesblick 23, pruef-start-ansicht 160,
pruef-push-hinweis 16 -- alle 0 Fehler.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-10-03 13:47:50 +02:00
co-authored by Claude Opus 5
parent cc716a9c1c
commit e00a905ce8
50 changed files with 773 additions and 764 deletions
+35 -37
View File
@@ -512,42 +512,40 @@ melde("\n=== Anmelden und wieder abmelden ===");
const zahl = () => p.prepare("SELECT COUNT(*) AS n FROM push_anmeldungen").get().n;
ok(zahl() === 0, `vorher ${zahl()} Anmeldungen in der Datenbank`);
/* ==== "BEI DIR KLINGELT NICHTS" (19.09.2026) ======================
/* ==== "BEI DIR KLINGELT NICHTS" IST HIER WEG (03.10.2026) ========
Gemessen an diesem Tag auf dem echten Server: Von elf Zugaengen
hatten SIEBEN kein einziges Geraet angemeldet. Bei ihnen kommt
nichts an, solange die Seite zu ist -- keine Aufgabe, kein Termin,
kein Anruf.
Bis heute stand dieser Hinweis in "Was ist dran?", eingefuehrt am
19.09., als sieben von elf Zugaengen kein Geraet hatten. Er hat
das Problem nicht geloest: Am 03.10. nachgemessen waren es immer
noch 12 von 20, darunter die linke Hand und ein Modi. Er SAGT es,
aber man kann nichts tun -- er fuehrt nur auf eine andere Seite.
Die Glocke sagt das seit jeher korrekt. Nur tippt sie niemand an:
Sie ist ein stiller Schalter in einer Leiste. Deshalb steht es
jetzt auch dort, wo man hinsieht -- in "Was ist dran?".
Ersetzt durch einen Kasten mit "Anschalten"-Knopf, direkt ueber
dieser Liste (gemessen in pruef-push-hinweis.mjs, 16 Pruefungen).
DIE GEGENPROBE IST DER EIGENTLICHE PUNKT: Der Hinweis muss
VERSCHWINDEN, sobald ein Geraet da ist. Eine Warnung, die immer
kommt, ist keine Warnung mehr -- und bei sieben von elf Leuten
stuende sie sonst dauerhaft ueber den echten. */
WAS HIER JETZT GEPRUEFT WIRD, ist das Gegenteil von vorher, und
zwar aus einem Grund: Aufgefallen ist die Dopplung erst auf einem
Bildschirmfoto -- beide Saetze standen untereinander auf
demselben Schirm. Zahlen haetten das nie gezeigt, beide Teile
waren fuer sich genommen gruen. Diese Pruefung sorgt dafuer, dass
die Zeile nicht unbemerkt zurueckkommt. */
const hinweise = async () => (await seite.evaluate(async () => {
const a = await fetch("/workspace/api/hinweise", { credentials: "same-origin" });
return a.json();
})).hinweise || [];
{
const vorher = await hinweise();
const h = vorher.find((x) => x.art === "kein_geraet");
ok(!!h, "ohne Geraet steht der Hinweis in „Was ist dran?“");
ok(h?.ziel === "anruf-probe.html",
`und er fuehrt auf die Seite, die sagt warum (${h?.ziel})`);
ok(h?.stufe === "offen",
`als offener Punkt, nicht als Warnung (${h?.stufe}) — sonst stuende er `
+ "dauerhaft ueber den echten Warnungen");
/* Und auf dem Bildschirm steht er ohne die "1" davor: Er zaehlt
nichts, er beschreibt einen Zustand. */
const sichtbar = await seite.evaluate(() =>
const offen = await hinweise();
/* Die Zahl gehoert in die Bedingung: Kaeme die Schnittstelle gar
nicht zustande, waere die Liste leer -- und "kein_geraet steht
nicht drin" waere gruen, ohne etwas gesehen zu haben. */
ok(Array.isArray(offen) && !offen.some((x) => x.art === "kein_geraet"),
`"Bei dir klingelt nichts" steht nicht mehr in der Liste `
+ `(${offen.length} Hinweise geprueft) -- es stuende sonst zweimal auf einem Schirm`);
const aufDerSeite = await seite.evaluate(() =>
[...document.querySelectorAll(".dran__punkt")]
.map((li) => li.textContent.trim()).find((t) => /klingelt nichts/.test(t)) || "");
ok(/klingelt nichts/.test(sichtbar) && !/^\s*1/.test(sichtbar),
`auf der Seite steht er ohne Zahl davor: „${sichtbar.replace(/\s+/g, " ").slice(0, 60)}“`);
.filter((li) => /klingelt nichts/.test(li.textContent)).length);
ok(aufDerSeite === 0, `und auch nicht auf der Seite (${aufDerSeite})`);
}
await seite.click("#glocke");
@@ -555,17 +553,17 @@ melde("\n=== Anmelden und wieder abmelden ===");
ok(zahl() === 1, `nach dem Klick: ${zahl()} Anmeldung`);
/* GEGENPROBE: Jetzt muss der Hinweis weg sein. */
{
/* OHNE NEULADEN. Der erste Anlauf lud die Seite neu -- danach war
das Test-Doppel fuer den Push-Dienst weg, der Glockenknopf stand
wieder auf "aus", und die drei folgenden Pruefungen meldeten
Fehler, die es nicht gab. Die Schnittstelle antwortet ohnehin
live; eine neue Seite braucht es dafuer nicht. */
const nachher = await hinweise();
ok(!nachher.some((x) => x.art === "kein_geraet"),
"mit einem angemeldeten Geraet ist der Hinweis weg — nichts zu quittieren");
}
/* Hier stand bis zum 03.10.2026 die Gegenprobe "mit angemeldetem
Geraet ist der Hinweis weg". Sie ist ersatzlos entfallen -- nicht
aus Bequemlichkeit, sondern weil sie seit dem Entfernen des
Hinweises IMMER gruen waere, egal was das Haus tut. Eine
Pruefung, die nichts mehr widerlegen kann, bestaetigt nichts;
sie taeuscht nur Deckung vor.
Was sie geprueft hat ("verschwindet von selbst, sobald ein Geraet
da ist"), prueft jetzt pruef-push-hinweis.mjs am neuen Kasten --
dort mit einer echten Anmeldung, die nachweislich in der
Datenbank landet. */
const eintrag = p.prepare("SELECT * FROM push_anmeldungen").get();
ok(eintrag?.person_id === idDogi && /^https:\/\//.test(eintrag?.endpunkt || ""),
+15
View File
@@ -165,6 +165,21 @@ const seite = await anmelden(kontext);
return Math.round(k.getBoundingClientRect().right - document.documentElement.clientWidth);
});
ok(ueber <= 0, `nichts steht ueber (${ueber} px)`);
/* EIN BILD DAZU. Zahlen sagen, dass er passt -- nicht, ob er
aussieht wie etwas, das man anfassen moechte.
ERST HINSCROLLEN. Der erste Versuch zeigte brav die
Begruessungskachel: Der Hinweis steht darunter und war im Bild
gar nicht drin. Ein Beweisbild ohne das, was es beweisen soll,
ist schlimmer als keins -- man glaubt ja, hingesehen zu haben. */
await seite.evaluate(() => document.querySelector("#push-hinweis")
.scrollIntoView({ block: "center" }));
await seite.waitForTimeout(400);
await seite.screenshot({
path: new URL("./pruef-push-hinweis.png", import.meta.url).pathname
.replace(/^\/([A-Za-z]:)/, "$1"),
});
}
/* =====================================================================
+26 -32
View File
@@ -377,43 +377,37 @@ hinweisRouter.get("/workspace/api/hinweise", (req, res) => {
"neue Anfrage für Modi", "bewerbungen.html",
zaehle("SELECT COUNT(*) n FROM bewerbungen WHERE zustand = 'neu'", []));
/* ==== BEI DIR KLINGELT NICHTS (19.09.2026) =======================
/* ==== BEI DIR KLINGELT NICHTS -- STEHT JETZT WOANDERS =========
Gemessen an diesem Tag: Von elf Zugaengen hatten SIEBEN kein
einziges Geraet angemeldet. Bei ihnen kommt keine einzige
Erinnerung an, solange die Seite zu ist -- keine Aufgabe, kein
Termin, kein Anruf.
Hier stand bis zum 03.10.2026 der Hinweis "Bei dir klingelt
nichts -- kein Geraet angemeldet", eingefuehrt am 19.09., als
sieben von elf Zugaengen kein Geraet hatten.
Die Glocke oben rechts sagt das seit jeher korrekt ("Benach-
richtigungen aus") und kennt sogar den iPhone-Sonderfall. Nur
tippt sie niemand an: Sie ist ein stiller Schalter in einer
Leiste, kein Hinweis. Deshalb steht es jetzt dort, wo man
hinsieht.
ER HAT DAS PROBLEM NICHT GELOEST. Am 03.10. nachgemessen:
immer noch 12 von 20 ohne Anmeldung, darunter die linke Hand
und ein Modi. Der Grund liegt auf der Hand -- er SAGT es, aber
man kann nichts tun: Er fuehrt auf anruf-probe.html, wo man
sich erst zurechtfinden muss.
DIESER HINWEIS GEHT NUR AN DIE PERSON SELBST, nicht an die
Sicht. `req.person` und nicht `person`: Wenn DogFather die Lage
eines Scouts ansieht, waere "bei DIR klingelt nichts" eine
Aussage ueber den falschen Menschen -- und eine, die er nicht
loesen kann.
Ersetzt durch einen Kasten auf der Startseite mit einem
"Anschalten"-Knopf (glocke.js, `hinweisZeichnen`). Ein
Fingertipp statt eines Umwegs -- und er erklaert den
iPhone-Fall, in dem Web-Push ohne Home-Bildschirm gar nicht
geht. Das wusste hier niemand.
STUFE "offen", NICHT "warnung". Es ist kein Ausfall, sondern
etwas, das man einmal einrichtet. Ein rotes Warnzeichen, das
bei sieben von elf Leuten dauerhaft oben steht, waere nach
einer Woche unsichtbar -- und mit ihm die echten Warnungen
daneben.
WARUM NICHT BEIDES: Der neue Kasten sitzt auf derselben Seite,
direkt ueber dieser Liste. Zwei Saetze zur selben Sache auf
EINEM Bildschirm sind kein doppelter Schutz, sondern zwei
Stellen, die irgendwann Verschiedenes behaupten -- derselbe
Grund, aus dem die Betreuungs-Auswahl am 31.08. zusammengelegt
wurde.
ER VERSCHWINDET VON SELBST, sobald ein Geraet angemeldet ist.
Nichts zu quittieren, nichts, was veralten kann -- Regel 1
dieser Datei. */
if (req.person?.id) {
const geraete = zaehle(
"SELECT COUNT(*) n FROM push_anmeldungen WHERE person_id = ?", [req.person.id]);
if (!geraete) {
dazu("kein_geraet", "offen",
"Bei dir klingelt nichts – kein Gerät angemeldet",
"anruf-probe.html", 1);
}
}
WAS DAMIT AUFGEGEBEN IST, offen gesagt: Diese Zeile liess sich
nicht wegklicken, der neue Kasten schon (einmalig, je Geraet).
Eine Entscheidung von Filipe am 03.10. Die Gegensicherung ist
die Personenliste: Dort steht seit heute bei jeder Person, die
nichts bekommt, genau das -- die Leitung sieht es also
weiterhin, auch wenn jemand den Kasten wegtippt. */
/* ---------- Manager-Ziele (02.10.2026) ----------