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:
+117
-8
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user