diff --git a/server/pruef-teamlage-karten.mjs b/server/pruef-teamlage-karten.mjs
index 3a58dcf2..1aa4cb2e 100644
--- a/server/pruef-teamlage-karten.mjs
+++ b/server/pruef-teamlage-karten.mjs
@@ -406,6 +406,130 @@ ok(schmal.karten > 0 && schmal.ueber.length === 0,
ok(schmal.karten > 0 && schmal.breiteste <= schmal.sichtbar,
`die breiteste Karte passt (${schmal.breiteste} von ${schmal.sichtbar})`);
+/* =======================================================================
+ DIE BEIDEN HAENDE TRAGEN IHRE FARBE (23.09.2026)
+
+ Filipe, mit dem Bildschirmfoto: „die farbe der kachel soll die
+ gleiche sein wie die farbe die der text linke hand hat, aber mach es
+ richtig knallig so wie die farben bei den modis und linke hand.
+ soll schoen auffallen bitte."
+
+ DREI FRAGEN, UND KEINE DAVON LAESST SICH AM QUELLTEXT BEANTWORTEN:
+
+ 1. Hat die Karte DIESELBE Farbe wie ihre Marke? („die gleiche")
+ 2. Ist sie kraeftig genug, um aufzufallen? („richtig knallig")
+ 3. Kann man den Text darauf noch lesen? -- das ist die Bedingung,
+ unter der 1 und 2 ueberhaupt gelten duerfen.
+
+ GEMESSEN WIRD AM BILDPUNKT, nicht an der Stilvorlage. Eine Regel
+ kann richtig dastehen und von einer spaeteren ueberschrieben sein;
+ was am Ende leuchtet, sagt nur der gezeichnete Bildschirm.
+
+ DIE ERSTE FASSUNG DIESER MESSUNG WAR FALSCH, und das gehoert
+ hierhin: Sie las `rgb(13, 8, 23)` und `color(srgb 0.87 0.71 0.96)`
+ mit derselben Rechnung. Die zweite Schreibweise zaehlt aber in
+ 0..1, nicht in 0..255 -- die helle Rollenmarke kam damit auf einen
+ Kontrast von 1,09. Eine Zahl, die aussieht wie ein Befund und keiner
+ ist. Deshalb steht die Umrechnung hier ausgeschrieben.
+ ======================================================================= */
+{
+ await seite.setViewportSize({ width: 1280, height: 1200 });
+ await seite.waitForTimeout(400);
+ const farben = await seite.evaluate(() => {
+ const zahl = (c) => { const x = c / 255; return x <= 0.04045 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; };
+ const leucht = (r) => 0.2126 * zahl(r[0]) + 0.7152 * zahl(r[1]) + 0.0722 * zahl(r[2]);
+ /* ZWEI SCHREIBWEISEN, ZWEI ZAHLENBEREICHE -- siehe oben. */
+ const lies = (t) => {
+ const roh = (String(t).match(/[\d.]+/g) || []).slice(0, 3).map(Number);
+ if (roh.length < 3) return [0, 0, 0];
+ return /color\(/.test(String(t)) ? roh.map((x) => x * 255) : roh;
+ };
+ const kontrast = (a2, b2) => {
+ const la = leucht(lies(a2)), lb = leucht(lies(b2));
+ return Math.round(((Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05)) * 100) / 100;
+ };
+ /* Der DECKENDE Grund unter einem Element -- eine durchsichtige
+ Toenung daraufzurechnen waere geraten. */
+ const grundVon = (el) => {
+ let e = el;
+ while (e) {
+ const f = getComputedStyle(e).backgroundColor;
+ const teile = (String(f).match(/[\d.]+/g) || []);
+ if (teile.length >= 3 && (teile[3] === undefined || Number(teile[3]) > 0.85)) return f;
+ e = e.parentElement;
+ }
+ return "rgb(0,0,0)";
+ };
+ const mess = (rolle) => {
+ const k = [...document.querySelectorAll(".tperson")].find((x) => x.dataset.rolle === rolle);
+ if (!k) return null;
+ const name = k.querySelector(".tperson__name");
+ const leise = k.querySelector(".tperson__zuletzt");
+ const marke = k.querySelector(".tmerkmal--rolle");
+ const grund = grundVon(k);
+ const stil = getComputedStyle(k);
+ return {
+ /* Der Ton, den die Karte fuehrt, und der Ton ihrer Marke --
+ die Frage "die gleiche Farbe?" ist genau dieser Vergleich. */
+ kartenton: stil.getPropertyValue("--kartenton").trim(),
+ markenton: marke ? getComputedStyle(marke).getPropertyValue("--rm").trim() : "",
+ /* Traegt die FLAECHE Farbe, oder nur die Kante? "knallig"
+ heisst genau das: Der Verlauf muss im Bild ankommen. */
+ schichten: (stil.backgroundImage.match(/gradient/g) || []).length,
+ toenung: stil.backgroundImage.includes("34%") || /oklab|color\(/.test(stil.backgroundImage),
+ leiste: getComputedStyle(k, "::before").width,
+ nameKontrast: name ? kontrast(getComputedStyle(name).color, grund) : null,
+ leiseKontrast: leise ? kontrast(getComputedStyle(leise).color, grund) : null,
+ markeKontrast: marke
+ ? kontrast(getComputedStyle(marke).color, getComputedStyle(marke).backgroundColor) : null,
+ grund,
+ };
+ };
+ return { hand: mess("hand"), linke: mess("linke"), modi: mess("modi") };
+ });
+
+ /* DIE ZAHL GEHOERT IN DIE BEDINGUNG: Faende der Wahlausdruck keine
+ Karte, waere `farben.linke` null -- und jede Aussage darueber
+ waere gruen, ohne etwas angesehen zu haben. */
+ ok(!!farben.hand && !!farben.linke,
+ "beide Haende haben eine Karte auf dem Bildschirm");
+
+ /* ---- 1. „die gleiche Farbe wie der Text Linke Hand" ------------- */
+ ok(!!farben.linke && farben.linke.kartenton !== ""
+ && farben.linke.kartenton === farben.linke.markenton,
+ `die Karte der linken Hand fuehrt den Ton ihrer Marke (${farben.linke?.kartenton} = ${farben.linke?.markenton})`);
+ ok(!!farben.hand && farben.hand.kartenton === farben.hand.markenton,
+ `dasselbe bei der rechten Hand (${farben.hand?.kartenton})`);
+ /* Und es sind ZWEI Toene, nicht einer. Waeren beide gleich, waere
+ die Zeile darueber trotzdem gruen -- und die Unterscheidung weg. */
+ ok(!!farben.hand && !!farben.linke
+ && farben.hand.kartenton !== farben.linke.kartenton,
+ "und es sind zwei verschiedene Toene — Gold und Lila");
+
+ /* ---- 2. „richtig knallig" --------------------------------------- */
+ ok(!!farben.linke && farben.linke.schichten >= 2,
+ `die Farbe liegt in der FLAECHE, nicht nur an der Kante (${farben.linke?.schichten} Verlaeufe)`);
+ ok(!!farben.hand && !!farben.linke
+ && farben.hand.schichten === farben.linke.schichten,
+ "beide Haende gleich stark — der Unterschied ist der Ton, nicht die Wirkung");
+ ok(farben.linke?.leiste === "3px" && farben.hand?.leiste === "3px",
+ `beide tragen die Leiste an der linken Kante (${farben.linke?.leiste} / ${farben.hand?.leiste})`);
+ /* GEGENPROBE: Eine Modi-Karte hat das NICHT. Ohne sie bewiese alles
+ oben nur, dass jede Karte so aussieht -- und dann faellt keine auf. */
+ ok(!!farben.modi && farben.modi.leiste !== "3px",
+ `Gegenprobe: eine Modi-Karte traegt die Leiste nicht (${farben.modi?.leiste})`);
+
+ /* ---- 3. Und man kann es lesen ----------------------------------- */
+ for (const [wer, m] of [["linke Hand", farben.linke], ["rechte Hand", farben.hand]]) {
+ ok(!!m && m.nameKontrast >= 4.5,
+ `${wer}: der Name steht mit ${m?.nameKontrast}:1 auf der Flaeche (verlangt 4,5)`);
+ ok(!!m && m.leiseKontrast >= 4.5,
+ `${wer}: auch das Kleingedruckte (${m?.leiseKontrast}:1)`);
+ ok(!!m && m.markeKontrast >= 4.5,
+ `${wer}: und die Rollenmarke auf ihrem eigenen Grund (${m?.markeKontrast}:1)`);
+ }
+}
+
ok(meckern.length === 0,
`der Browser meldet nichts (${meckern.slice(0, 2).join(" | ") || "still"})`);
diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html
index 8b4e088f..f3869d62 100644
--- a/workspace/anruf-probe.html
+++ b/workspace/anruf-probe.html
@@ -16,15 +16,15 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
-
-
+
+
-
+