Die Personenkachel wird eine Standkarte -- mit den Aufgaben darauf

Filipe: "mach das bitte viel krasser und viel geiler. die aufgaben die
wir verteilen sollen da auch zu sehen sein und so. viel
uebersichtlicher, viel moderner. nicht so banal und einfach."

VORHER: Name, Rolle, ein flacher Balken und drei Zahlenkaesten. Auf
seinem Bildschirmfoto standen in fuenf von sechs Kacheln exakt
dieselben drei Zahlen (0 / 68 / 0) -- achtzehn Kaesten fuer eine
einzige Auskunft. Und die Aufgaben, die er eine Handbreit darunter
verteilt, kamen auf der Kachel derselben Person gar nicht vor.

JETZT drei Zonen in der Reihenfolge, in der man fragt:
  KOPF     Ring mit dem Anteil in der Mitte, Name, Rolle.
  AUFTRAG  Wie viele offen, wie viele ueberfaellig, und die naechste
           mit Namen und Frist ("seit gestern ueberfaellig").
  FUSS     "46 von 68 angesehen" -- und "verschieden gesehen" nur
           dann, wenn es dort etwas gibt.

Der Ring rechnet mit stroke-dasharray auf einem Kreis vom Umfang 100:
der Anteil in Prozent ist damit buchstaeblich die Strichlaenge. Keine
Ampelfarbe -- was "genug" ist, haengt davon ab, wie lange jemand dabei
ist. Gewarnt wird nur an einem Massstab, der nicht geraten ist: einer
ueberschrittenen Frist.

Die Aufgabenzeile wird aus derselben Liste gerechnet wie das
Verteil-Band und der Katalog (alleAufgabenV) und in aufgabenHolen()
nachgezogen -- an EINER Stelle, damit es keine gibt, die es vergisst.

GITTER STATT FLIESSREIHE: Bei sieben Leuten stand die letzte Kachel
allein in ihrer Zeile und wuchs auf 1160 px neben 379 px der anderen.
Eine Person sah dreimal so wichtig aus, weil die Teamgroesse ungerade
ist.

Drei Funde nebenbei, alle durch die neuen Messungen:

  - pruef-schritt verlangte seit dem 23.09. einen Sprung, der an dem
    Tag ABSICHTLICH entfernt wurde. Sie war seither rot, ohne dass
    etwas kaputt war. Neu gefasst auf den Sprung, den es noch gibt:
    den Weg von aussen ueber "?zeigen=person-...".
  - Und der war kaputt. Gesprungen wurde, waehrend in der Karte nur
    "wird geladen ..." stand -- die Seite war zu kurz zum Scrollen,
    der Browser klemmte bei 0 ab. Wer der Talentseite folgte, landete
    oben auf der Liste. Gesprungen wird jetzt, wenn die Karte steht.
  - Auf demselben Weg rief karte() das Vorlagenbrett, bevor es
    eingerichtet war ("zeigen() vor einrichten()"). Das Einrichten ist
    vorgezogen. Ueber "?zeigen=" ging vorher KEINE Pruefung.

Gemessen: pruef-entwicklung-kacheln 31 (vorher 16), pruef-schritt 68
(vorher 65), pruef-entwicklung 48, pruef-modi-katalog 133,
pruef-bewerbung-aufgaben 101, pruef-zuteilung, pruef-css-klassen --
alle gruen. Schriftgroessen unter 11,5 px: 40 statt 42.

Neu: server/mess-entwicklung-kacheln.mjs. Die Pruefung braucht einen
kargen Bestand und zeigt deshalb den Sonderfall (alles auf null); diese
Datei legt sieben Leute mit verschiedenen Staenden und Aufgaben an und
macht Bilder fuer 1280 und 390 px. Sie prueft nichts.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-24 13:30:17 +02:00
co-authored by Claude Opus 5
parent 1d41e29bf7
commit 5b244ab7ec
46 changed files with 1795 additions and 924 deletions
+89 -23
View File
@@ -485,14 +485,25 @@ melde("=== 8. Im Browser ===");
return {
name,
y: Math.round(window.scrollY),
/* DIE KACHEL ZAEHLT SEIT DEM 17.09.2026 IN KAESTEN.
/* WO DIE ZAHL AUF DER KACHEL STEHT -- zum dritten Mal woanders.
Vorher stand dort ein Satz ("2 von 68 angesehen"), und dieser
Selektor las ihn. Seit die Kachel dieselben Bilanz-Kaesten
traegt wie das Brett daneben, ist `.e-person__zahl` nur noch
die Zeile fuer veraltete Einschaetzungen -- die Pruefung las
seitdem einen leeren String, ohne dass etwas kaputt war. */
kachel: kachel?.querySelector(".bilanz-zahl__n")?.textContent.trim() || "",
Bis 17.09.2026 ein Satz ("2 von 68 angesehen"), danach ein
Bilanz-Kasten, seit dem 24.09.2026 die Ziffer vor "von 68
angesehen" plus der Ring darueber.
Das ist kein Zufall und kein Pech: Wer eine Kachel umbaut,
verschiebt die Zahl. Die Pruefung muss es merken -- und sie
merkt es nur, weil sie die Zahl VERGLEICHT statt sie bloss zu
lesen. Beim Umbau am 17.09. las genau dieser Selektor
monatelang einen leeren String, ohne dass etwas kaputt war.
DER RING WIRD MITGELESEN. Er ist seit dem 24.09. die groessere
der beiden Darstellungen; bewegte sich nur die Ziffer, stuende
ein Ring bei 3 % ueber einer 46 -- und das faellt niemandem
auf, weil man das eine sieht und das andere liest. */
kachel: kachel?.querySelector(".e-person__stand-zahl")?.textContent.trim() || "",
bogen: kachel?.querySelector(".e-ring__bogen")
?.getAttribute("stroke-dasharray") || "",
kopfZahl: (document.querySelector("#karte .e-karte__stand")?.textContent
.match(/(\d+) von/) || [])[1] || "",
kopf: document.querySelector("#karte .e-karte__stand")?.textContent.trim() || "",
@@ -522,14 +533,25 @@ melde("=== 8. Im Browser ===");
.find((x) => x.querySelector(".e-person__name")?.textContent.trim() === name);
return {
y: Math.round(window.scrollY),
/* DIE KACHEL ZAEHLT SEIT DEM 17.09.2026 IN KAESTEN.
/* WO DIE ZAHL AUF DER KACHEL STEHT -- zum dritten Mal woanders.
Vorher stand dort ein Satz ("2 von 68 angesehen"), und dieser
Selektor las ihn. Seit die Kachel dieselben Bilanz-Kaesten
traegt wie das Brett daneben, ist `.e-person__zahl` nur noch
die Zeile fuer veraltete Einschaetzungen -- die Pruefung las
seitdem einen leeren String, ohne dass etwas kaputt war. */
kachel: kachel?.querySelector(".bilanz-zahl__n")?.textContent.trim() || "",
Bis 17.09.2026 ein Satz ("2 von 68 angesehen"), danach ein
Bilanz-Kasten, seit dem 24.09.2026 die Ziffer vor "von 68
angesehen" plus der Ring darueber.
Das ist kein Zufall und kein Pech: Wer eine Kachel umbaut,
verschiebt die Zahl. Die Pruefung muss es merken -- und sie
merkt es nur, weil sie die Zahl VERGLEICHT statt sie bloss zu
lesen. Beim Umbau am 17.09. las genau dieser Selektor
monatelang einen leeren String, ohne dass etwas kaputt war.
DER RING WIRD MITGELESEN. Er ist seit dem 24.09. die groessere
der beiden Darstellungen; bewegte sich nur die Ziffer, stuende
ein Ring bei 3 % ueber einer 46 -- und das faellt niemandem
auf, weil man das eine sieht und das andere liest. */
kachel: kachel?.querySelector(".e-person__stand-zahl")?.textContent.trim() || "",
bogen: kachel?.querySelector(".e-ring__bogen")
?.getAttribute("stroke-dasharray") || "",
kopfZahl: (document.querySelector("#karte .e-karte__stand")?.textContent
.match(/(\d+) von/) || [])[1] || "",
kopf: document.querySelector("#karte .e-karte__stand")?.textContent.trim() || "",
@@ -545,18 +567,62 @@ melde("=== 8. Im Browser ===");
`die Kachel zählt sofort mit (${vorDemKlick.kachel} -> ${nachDemKlick.kachel})`);
ok(nachDemKlick.kachel === nachDemKlick.kopfZahl,
`und nennt dieselbe Zahl wie die Karte (${nachDemKlick.kachel} / ${nachDemKlick.kopfZahl})`);
/* UND DER RING WANDERT MIT. Seine Laenge ist der Anteil in Prozent
(Umfang 100) -- er muss also groesser werden, wenn die Ziffer es
wird. Ein Ring, der stehenbleibt, waere dieselbe zweite Wahrheit
wie die Zahl von vorhin, nur als Bild statt als Text. */
const bogenAus = (x) => Number(String(x).split(" ")[0]);
ok(bogenAus(nachDemKlick.bogen) > bogenAus(vorDemKlick.bogen),
`und der Ring wird voller (${vorDemKlick.bogen} -> ${nachDemKlick.bogen})`);
ok(zahlAus(nachDemKlick.kachel) > 0,
"es ist eine echte Zahl, keine Null — sonst wäre die Gleichheit wertlos");
/* GEGENPROBE ZUM SPRUNG: Auf eine PERSON zu drücken DARF springen --
dort will man zur Karte. Ohne diese Zeile hieße „springt nicht“
vielleicht nur, dass gar nichts mehr scrollt. */
await seite.evaluate(() => window.scrollTo({ top: 900, behavior: "instant" }));
await seite.waitForTimeout(200);
await seite.evaluate(() => document.querySelector(".e-person")?.click());
await seite.waitForTimeout(1400);
const beiPerson = await seite.evaluate(() => Math.round(window.scrollY));
ok(beiPerson !== 900, `beim Öffnen einer Person springt sie sehr wohl (${beiPerson})`);
/* =====================================================================
GEGENPROBE ZUM SPRUNG -- neu gefasst am 24.09.2026
=====================================================================
Sie muss es geben: Ohne sie hiesse "die Seite bleibt stehen"
vielleicht nur, dass ueberhaupt nichts mehr scrollt, und die
Pruefung darueber waere wertlos.
HIER STAND BIS HEUTE DER FALSCHE FALL. Sie klickte eine Kachel an
und verlangte einen Sprung zur Karte -- richtig bis zum
23.09.2026. An dem Tag wurde die Seite nach dem Arbeitsablauf
umgeraeumt: Zwischen Kachel und Karte liegen seither das
Verteil-Formular, der Katalog und die Aufgabenliste. Ein Sprung
zur Karte wuerde also ueber genau die drei Dinge hinwegspringen,
die man nach der Wahl zuerst braucht. Der Sprung wurde deshalb
ABSICHTLICH entfernt (siehe entwicklung.js, "KEIN SPRUNG MEHR").
Die Gegenprobe blieb stehen und war ab da rot -- nicht, weil
etwas kaputt war, sondern weil sie eine Zusage einforderte, die
zurueckgenommen worden ist. Gefunden beim Kachelumbau am
24.09.2026, also einen Tag spaeter; waere sie gruen gewesen,
haette es niemand bemerkt.
DER SPRUNG, DEN ES NOCH GIBT, ist der von aussen: Wer der
Talentseite folgt, kommt mit "?zeigen=person-<nr>" und will genau
diese eine Karte sehen. Daran laesst sich beweisen, dass die Seite
sehr wohl springen KANN -- und zwar an der einzigen Stelle, an der
sie es noch soll. */
const werDenn = await seite.evaluate(() =>
document.querySelector("#personen .e-person")?.dataset.person || "");
ok(werDenn !== "", `eine Kachel zum Anspringen gefunden (Nr. ${werDenn})`);
await seite.goto(`http://127.0.0.1:${PORT}/workspace/entwicklung.html?zeigen=person-${werDenn}`,
{ waitUntil: "networkidle" });
await seite.waitForSelector("#personen .e-person", { timeout: 15_000 });
await seite.waitForTimeout(1600);
const vonAussen = await seite.evaluate(() => ({
y: Math.round(window.scrollY),
karteOffen: !document.getElementById("karte")?.hidden,
wer: document.querySelector('#personen .e-person[aria-pressed="true"]')
?.dataset.person || "",
}));
ok(vonAussen.y > 0,
`von aussen verlinkt springt sie sehr wohl (scrollY ${vonAussen.y})`);
ok(vonAussen.karteOffen && vonAussen.wer === werDenn,
`und zwar zu genau dieser Karte (offen: ${vonAussen.karteOffen}, `
+ `gewaehlt: ${vonAussen.wer})`);
ok(konsole.length === 0,
konsole.length ? "Fehler im Browser: " + konsole[0].slice(0, 90) : "keine Fehler im Browser");