Willkommen: eine Seite, die erklaert, was es hier gibt

Auftrag vom 21.09.2026, Abschnitte 7 und 8. Aus der Kachel "Der Treff"
wird die Willkommensseite.

WARUM DAS NICHTS VERLIERT, gemessen am echten Bestand: Das Brett
"treff" hatte NULL Eintraege, der Treff-Chat daneben 29 Nachrichten.
Geredet wird im Chat; das Brett war eine Kachel ohne Inhalt.

DIE SEITE ERKLAERT NICHT "DIE WEBSITE", SONDERN DEINE. Sie baut sich
aus derselben Kachelliste wie die Startseite, durch denselben Filter
(darfSeite). Wer morgen eine Kachel bekommt, bekommt automatisch auch
ihre Erklaerung -- und wer eine nicht hat, liest nicht davon. Eine
Liste von Dingen, die man nicht darf, ist keine Orientierung.

Gemessen: DogFather 30 Kacheln, Modi 25, Community 11 -- und keine
einzige davon ist fuer den Betreffenden gesperrt.

DREI FEHLER, DIE ERST DAS BILDSCHIRMFOTO GEZEIGT HAT:

  body class="gate" ist die ANMELDEWAND (display:flex, zentriert).
  Kopfleiste und Inhalt standen dadurch NEBENEINANDER -- am Handy
  blieben dem Text 260 von 390 Pixeln.

  .huelle gibt es im Haus gar nicht. Der Inhalt stand linksbuendig
  statt mittig, ohne Sicherheitsrand an randlosen Geraeten. Jetzt
  .inhalt wie jede andere Seite.

  Der Text stand direkt auf dem Buehnenbild: Kontrast 1.68:1 am
  Rechner, 2.23:1 am Handy (noetig 4.5). Die Hausregel stand daneben
  in start.css -- "der Text steht auf eigenen Flaechen" -- und diese
  Seite hielt sich als einzige nicht daran. Jetzt 5.19 und 7.73.

UND EIN LECK, ZUM DRITTEN MAL DIESELBE URSACHE:

Die Kachel umzuleiten nahm dem Brett "treff" die Zugehoerigkeit --
TREFF_BRETTER wird aus Kachelzielen abgeleitet. Die Schranke laesst
eine AGENTURROLLE unbesehen durch, wenn ein Brett in keiner Liste
steht: Eine Creatorin konnte das Brett des Treffs lesen.

Behoben, und diesmal dauerhaft laut gemacht: Nachgemessen ist die
Trennung exakt und in beide Richtungen deckungsgleich -- die Bretter
mit `fuerAlle` sind genau die des Treffs plus die Agenturablage. Das
ist eine Eigenschaft des BRETTS und wandert nicht, wenn jemand eine
Kachel umleitet. pruef-treff prueft das jetzt.

Mein erster Entwurf der Regel war zu breit und meldete `content` und
`schutz` -- beides Agenturbretter, die eine Agenturrolle zu Recht
liest. Eine Pruefung, die zu viel meldet, wird abgeschaltet.

AUSSERDEM: 16 Kennungen aus workspace-zuteilung.js hatten keinen
deutschen Satz -- auf dem Bildschirm haette woertlich "nicht_zugeteilt"
gestanden. Gefunden von pruef-meldungen am selben Tag.

Und zwei Erwartungen in pruef-treff abgeleitet statt gezaehlt: die
Zahl der Rollenkacheln auf der Wand (die Anmeldung sucht WHERE rolle=?,
eine Rolle ohne Kachel ist unerreichbar) und "die breite Kachel steht
vorne" ueber die Eigenschaft statt ueber den Namen.

Geprueft: pruef-willkommen 66/0 (neu), pruef-treff 80/0 (war 59 ok /
13 FEHL), pruef-buehne fuer die neue Seite 10/0, pruef-meldungen 8/0,
pruef-css-klassen 30/0, pruef-rechtetafel 19/0.
This commit is contained in:
2026-09-22 00:00:14 +02:00
parent b506c7f533
commit 66789aabcd
48 changed files with 1853 additions and 519 deletions
+117 -8
View File
@@ -251,8 +251,22 @@ melde("=== 1b. Eine Wand für beide ===");
ok(wand.code === 200 && /Team Dogi|Team Dogi/.test(wand.text),
`die Wand von Team Dogi steht (${wand.code})`);
const kacheln = [...wand.text.matchAll(/data-rolle="([a-z]+)"/g)].map((m) => m[1]);
ok(kacheln.length === 4 && kacheln.includes("gast"),
`vier Kacheln, eine davon die Community: ${kacheln.join(", ")}`);
/* ABGELEITET, NICHT GEZAEHLT (berichtigt 21.09.2026).
----------------------------------------------------------------
Hier stand `kacheln.length === 4`. Am 21.09. kam die linke Hand
dazu, und die Zeile wurde rot, obwohl die Wand richtig war.
Die eigentliche Aussage ist auch eine andere und wiegt schwerer:
Die Anmeldung sucht `WHERE rolle = ?`. Eine Rolle OHNE Kachel
kommt damit ueberhaupt nicht herein -- der Zugang existiert, und
niemand kann ihn benutzen. Geprueft wird deshalb, dass jede Rolle
dieser Adresse ihre Kachel hat. Das kann nicht veralten. */
const sollRollen = [...w.TREFF_ROLLEN];
const ohneKachel = sollRollen.filter((r) => !kacheln.includes(r));
ok(ohneKachel.length === 0, ohneKachel.length === 0
? `jede Rolle dieser Adresse hat ihre Kachel: ${kacheln.join(", ")}`
: `OHNE KACHEL und damit unerreichbar: ${ohneKachel.join(", ")}`);
ok(kacheln.includes("gast"), "die Community ist eine davon");
ok(kacheln[kacheln.length - 1] === "gast",
"und sie steht zuletzt -- wer täglich kommt, findet oben, was er täglich braucht");
@@ -334,12 +348,16 @@ let namen = [];
rechnet zusaetzlich nach, ob daraus ein Loch entsteht. */
ok(namen.join(" | ") === erwartet.join(" | "),
`und zwar diese: ${namen.join(", ")}`);
/* DIE BREITE KACHEL STEHT VORNE, und das bleibt eine echte Aussage:
Das Raster hat drei Spalten, "Der Treff" ist doppelt breit. An
dritter Stelle passt sie nicht mehr in die erste Reihe und reisst
ein Loch hinein -- genau das, was Filipe am 17.09. auf dem
Bildschirmfoto gesehen hat. */
ok(namen[0] === "Der Treff", `und „Der Treff“ steht vorne (${namen[0]})`);
/* UEBER DIE EIGENSCHAFT, NICHT UEBER DEN NAMEN (berichtigt
21.09.2026). Hier stand `namen[0] === "Der Treff"`. Am 21.09.
wurde aus der Kachel die Willkommensseite, und die Zeile wurde
rot, obwohl das Raster stimmte. Gemeint war nie der Name, sondern:
die DOPPELT BREITE Kachel steht vorne. Genau das wird jetzt
gefragt. */
const breite = bereicheFuer({ rolle: "gast" }).filter((k) => k.gross);
ok(breite.length === 1, `genau eine Kachel ist doppelt breit (${breite.length})`);
ok(namen[0] === breite[0]?.name,
`und sie steht vorne (${namen[0]})`);
/* NICHTS VOM TEAM. Der eigentliche Zweck dieses Abschnitts: Eine
Kachel des Teams bei der Community waere lautlos falsch -- sie
saehe aus wie die anderen, und erst beim Klicken sagte der Server
@@ -849,6 +867,97 @@ melde("=== 7. Das Wort für „Gilt für“ kommt vom Server ===");
"und der Sucher findet so ein Wort auch wirklich");
}
/* =====================================================================
KEIN BRETT DARF ZWISCHEN DIE REGELN FALLEN (21.09.2026)
=====================================================================
Dreimal derselbe Fehler, dreimal derselbe Hergang:
19.09. Die Kachel "Regeln & Hilfe" bekam ein neues Ziel.
`regeln` fiel aus TREFF_BRETTER -- und war fuer die
Community 404, obwohl treff-regeln.html darauf verweist.
20.09. Dasselbe noch einmal, bei MODI_BEREICHE_ERLAUBT.
21.09. Die Kachel "Der Treff" wurde zur Willkommensseite.
`treff` fiel heraus -- und diesmal ging es in die andere
Richtung: Die Schranke laesst eine AGENTURROLLE unbesehen
durch, wenn ein Brett in keiner Liste steht. Eine
Creatorin konnte das Brett des Treffs lesen.
DER GEMEINSAME KERN: Die Schranke kennt drei Toere -- Treff-Bretter,
Bretter mit eigener Kachel, Bretter hinter einer Seite. Ein Brett,
das durch KEINES davon abgedeckt ist, faellt nicht etwa heraus,
sondern DURCH: Fuer eine Agenturrolle endet der Weg bei
`return next()`.
Genau das wird hier gezaehlt. Nicht "ist treff drin" -- das waere
die Reparatur von gestern -- sondern: faellt IRGENDEIN Brett durch
alle Regeln? Wer morgen eine Kachel umleitet, bekommt es damit
gesagt, statt es zu verschenken.
===================================================================== */
melde("\n--- Kein Brett faellt zwischen die Regeln ---");
{
const bModul = await import("./workspace-bereiche.js");
const alleBretter = Object.keys(bModul.BEREICHE || {});
ok(alleBretter.length > 10,
`${alleBretter.length} Bretter angesehen`);
/* Die Tore der Schranke, aus dem Code geholt statt abgeschrieben. */
const durchTreff = new Set(w.TREFF_BRETTER);
const durchKachel = w.MODI_BEREICHE_ERLAUBT;
/* DIE EHRLICHE REGEL, GEMESSEN STATT GERATEN.
----------------------------------------------------------------
Mein erster Entwurf fragte "haengt dieses Brett an irgendeiner
Regel" -- und meldete sofort `content` und `schutz`. Beides sind
AGENTURBRETTER ("Content-Ideen", "Schutz & Regeln"), die eine
Agenturrolle zu Recht liest. Die Zeile war also zu breit und
haette zwei Fehlalarme dauerhaft festgeschrieben. Eine Pruefung,
die zu viel meldet, wird abgeschaltet -- dann haelt sie gar
nichts mehr.
Nachgemessen ist die Trennung exakt und in BEIDE Richtungen
deckungsgleich: Die Bretter mit `fuerAlle` sind genau die des
Treffs, plus die Agenturablage. Das ist eine Eigenschaft des
BRETTS und wandert nicht, wenn jemand eine Kachel umleitet --
genau der Unterschied, an dem es dreimal gescheitert ist. */
const fuerAlle = Object.entries(bModul.BEREICHE)
.filter(([, v]) => v && v.fuerAlle).map(([k]) => k);
ok(fuerAlle.length >= 7, `${fuerAlle.length} Bretter stehen allen offen`);
/* Die Agenturablage ist der eine gewollte Fall: Sie steht allen
offen, aber im ANDEREN Haus. Sie namentlich auszunehmen ist etwas
anderes als eine Liste zu pflegen -- es ist eine Ausnahme, die
man sieht. */
const GEMEINSCHAFT = fuerAlle.filter((b) => b !== "agentur");
const ungeschuetzt = GEMEINSCHAFT.filter((b) => !durchTreff.has(b));
ok(ungeschuetzt.length === 0, ungeschuetzt.length === 0
? `alle ${GEMEINSCHAFT.length} Bretter des Treffs stehen in TREFF_BRETTER`
: `NICHT GESCHUETZT -- eine Agenturrolle kaeme hinein: ${ungeschuetzt.join(", ")}`);
/* UND DIE ANDERE RICHTUNG: Nichts darf in TREFF_BRETTER stehen, das
dort nicht hingehoert -- sonst spannte die Liste einen Schutz ueber
ein Brett, das der Agentur gehoert, und sperrte sie aus. */
const zuviel = [...durchTreff].filter((b) => !GEMEINSCHAFT.includes(b));
ok(zuviel.length === 0, zuviel.length === 0
? "und nichts Fremdes steht darin"
: `ZUVIEL in TREFF_BRETTER: ${zuviel.join(", ")}`);
/* UND EIN MODI MUSS SIE AUCH OEFFNEN KOENNEN. Dieselbe Falle, zweite
Liste: `MODI_BEREICHE_ERLAUBT` wird ebenfalls aus Kachelzielen
abgeleitet und verliert ein Brett, sobald eine Kachel umzieht. */
const fuerModiZu = GEMEINSCHAFT.filter((b) => !durchKachel.has(b));
ok(fuerModiZu.length === 0, fuerModiZu.length === 0
? "und ein Modi kommt in jedes davon hinein"
: `fuer einen Modi gesperrt: ${fuerModiZu.join(", ")}`);
/* GEGENPROBE: Wuerden diese Zeilen ein ungeschuetztes Brett
ueberhaupt sehen? Ein erfundener Name steht in keiner Menge und
muss deshalb auffallen. */
const erfunden = "brett-das-es-nicht-gibt";
ok(!durchTreff.has(erfunden) && !durchKachel.has(erfunden),
"und ein Brett ohne Schutz wuerde hier wirklich auffallen");
}
melde("");
console.log(`${geprueft} Pruefungen, ${fehler} Fehler`);
console.log(fehler === 0 ? "ALLES IN ORDNUNG" : "NICHT IN ORDNUNG");