Die Modi-Seite gehoert Dogi und den Modis -- Wand, Zeichen, Reiter

Filipe zum Bildschirmfoto der Zugangswand auf crew.: "alles soll auf
dogfather und die modis perfektionniert werden auf der neuen modi seite."

Dort stand bis eben die gewohnte Wand: Spicy-Media-Logo, "Creator
Workspace", der Satz ueber Manager, Scouts und Creator, fuenf
Rollenkacheln. Fuer einen Modi war davon nichts richtig.

DIE KACHELREIHE FAELLT WEG, und das ist eine Verbesserung: Eine Reihe mit
genau einem Eintrag ist keine Auswahl, sondern eine Huerde -- man muesste
erst daraufdruecken, bevor das Codefeld etwas annimmt. gate.js prueft
jetzt, OB es Kacheln gibt, statt sie vorauszusetzen.

DIE BUEHNE IST AUS DEM VORHANDENEN MOTIV GEBAUT, nicht neu erfunden, und
das ist kein Sparen: Die Anmeldeseite ist eine MECHANIK. Rechts steht im
Bild eine leere Tafel, und gate.css setzt die Karte auf Hundertstel genau
dort hinein. Ein frei erfundenes Bild haette diese vier Zahlen
mitgenommen. Also dieselbe Szene, ueber den Mischmodus "color" ins Blau
umgefaerbt (hue-rotate haette Rot nach Cyan UND Blau nach Gelb gedreht),
Dogi anstelle des Spicy-Medaillons, "TEAM DOGI" darunter.
Gemessen: rote Bildpunkte 18,1 % -> 0,0 %, Karte auf 0 px genau.

NACH DER ANMELDUNG geht es weiter: kopf.js zieht Reitertitel und Zeichen
aus `ich.marke` nach -- "Aufgaben · Team Dogi" statt "· Spicy & Dogi", mit
dem eigenen Symbol. An einer Stelle statt in 30 HTML-Dateien.

DREI FUNDE, DIE NICHT AUS DEM KOPF KAMEN

1. DER KNOPF WAERE SCHLECHTER LESBAR GEWORDEN. Mein erstes Blau endete
   bei #4aa4cf -- weisse Schrift darauf: 2,8 zu 1. Der rot-blaue Verlauf,
   den er ersetzt, haelt ueber seine GANZE Laenge 4,65; er war offenbar
   genau darauf gebaut. Jetzt 5,10 zu 1, am fertigen Bildschirmfoto
   gemessen statt aus einer einzelnen Farbe hergeleitet.

2. DIE NEUE WAND WAR AUCH AUF workspace. ABRUFBAR. Sie liegt als Datei im
   selben Ordner. Aufgefallen ist das, weil der Wortleck-Test sie ueberhaupt
   las -- die Frage WARUM war die Antwort. Ausserhalb von crew. antwortet
   sie jetzt mit 404; auf den Pruefadressen bleibt sie erreichbar, sonst
   koennte die Pruefung sie nicht mehr oeffnen und waere gruen ohne etwas
   zu messen.

3. ZWEI GLEICHE KACHELN AUF DER STARTSEITE, seit dem letzten Deploy live.
   Die Team-Lage-Kachel von heute Mittag hatte Name, Zeichen, Ton UND
   Gruppe einer schon vorhandenen -- fuehrte aber woandershin. Gefunden
   von "jede Kachel hat ihre eigene Farbe (23 Farben auf 24 Kacheln)".
   Jetzt "Eingang", Gruppe Taeglich, neuer Ton 24 (#8a20cf, Abstand 38,5
   im CIELAB-Raum; reines Blau haette 52 gehabt und waere auf dunklem
   Grund am schlechtesten zu fokussieren). Eine Fehlermeldung zeigte
   dadurch auf die falsche Seite -- ebenfalls behoben.
   Und die Pruefung, die es fand, zaehlte nur bereiche.js: Vom Server
   angehaengte Kacheln kannte sie nicht. Sie fragt jetzt beide Quellen.

Der Wortleck-Test meldete ausserdem sieben Fundstellen -- allesamt
Kommentare, die ich beim Bauen selbst geschrieben hatte.

GEMESSEN
pruef-crew-adresse     103   pruef-crew-wand-bild    43 (neu)
pruef-modi-checkliste   59   pruef-modi-verborgen    75
pruef-rollen           245   pruef-zwischenspeicher  21
pruef-modi-wortleck      4   pruef-start-ansicht     gruen

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-10 13:59:54 +02:00
co-authored by Claude Opus 5
parent 3cda64568d
commit 8bcbd83061
46 changed files with 1669 additions and 286 deletions
+115
View File
@@ -303,6 +303,121 @@ for (const s of mc.icons || []) {
ok((mc.icons || []).length > 0 && symboleDa === (mc.icons || []).length,
`crew.: alle ${symboleDa} Symbole werden auch ausgeliefert`);
/* =====================================================================
DIE ZUGANGSWAND
Filipe am 10.09.2026: "alles soll auf dogfather und die modis
perfektionniert werden auf der neuen modi seite." Bis dahin stand auf
crew. die gewohnte Wand -- Spicy-Media-Logo, "Creator Workspace",
fuenf Rollenkacheln. Fuer einen Modi war davon nichts richtig.
Zwei Dinge werden hier gemessen, und das zweite ist das wichtigere:
dass die ALTE Wand unangetastet blieb.
===================================================================== */
console.log("");
console.log("--- Zwei Waende ---");
const wandCrew = await hole("/workspace/", { host: CREW });
const wandWs = await hole("/workspace/", { host: WS });
ok(wandCrew.status === 200, "crew.: die Zugangswand kommt (keine Weiterleitungsschleife)");
ok(wandWs.status === 200, "workspace.: die Zugangswand kommt");
ok(/Team&nbsp;Dogi|Team Dogi/.test(wandCrew.text), "crew.: dort steht Team Dogi");
ok(/DogFather/.test(wandCrew.text), "crew.: und DogFather daneben");
ok(!/Spicy/i.test(wandCrew.text), "crew.: von Spicy Media steht dort nichts mehr");
ok(!/Creator/i.test(wandCrew.text), "crew.: und vom Creator Workspace auch nicht");
ok(/die Modis/.test(wandCrew.text), "crew.: der Satz nennt DogFather und die Modis");
/* Die Kachelreihe ist weg -- auf einer Adresse mit genau einer Sorte
Zugang waere sie eine Bedienhuerde, keine Auswahl. */
const kachelnCrew = (wandCrew.text.match(/class="rolle"/g) || []).length;
const kachelnWs = (wandWs.text.match(/class="rolle"/g) || []).length;
ok(kachelnCrew === 0, `crew.: keine Rollenkacheln (gezaehlt: ${kachelnCrew})`);
ok(kachelnWs === 5, `workspace.: dort weiterhin fuenf (gezaehlt: ${kachelnWs})`);
ok(/SpicyMedia/.test(wandWs.text), "workspace.: die alte Wand ist unveraendert");
/* Auch der ausgeschriebene Weg. Ihn zu vergessen waere nicht
aufgefallen -- im Alltag tippt ihn niemand. */
const wandCrewLang = await hole("/workspace/index.html", { host: CREW });
ok(wandCrewLang.status === 200 && /Team Dogi|Team&nbsp;Dogi/.test(wandCrewLang.text),
"crew.: auch /workspace/index.html fuehrt zur neuen Wand");
/* ---------------------------------------------------------------------
DIE ZWEITE WAND GIBT ES NUR AUF crew.
Sie liegt als Datei im selben Ordner wie alles andere. Ohne Sperre
koennte sie jeder unter ihrem Dateinamen aufrufen -- auch auf
workspace. -- und saehe dort eine Anmeldeseite, die es dort nicht
geben soll.
------------------------------------------------------------------ */
/* ZWEI NUMMERN, EINE AUSSAGE. Auf workspace. antwortet die Sperre mit
404 "gibt es nicht". Auf der Hauptseite und www. kommt schon der
Umzugs-Zwischenschritt vom 06.09.2026 davor und beantwortet den
GANZEN Pfad /workspace mit 410 "gab es, ist absichtlich weg".
Erwartet werden deshalb beide -- was zaehlt, ist: kein Inhalt und
keine 200. Auf eine der zwei Nummern zu bestehen hiesse, eine
fremde, aeltere Entscheidung nachtraeglich zu einem Fehler zu
erklaeren. */
for (const [name, host] of [["workspace.", WS], ["die Hauptseite", HAUPT], ["www.", "www." + HAUPT]]) {
const a = await hole("/workspace/crew-index.html", { host });
ok(a.status === 404 || a.status === 410,
`${name}: die zweite Wand gibt es dort nicht (${a.status})`);
ok(!/Team Dogi/.test(a.text), `${name}: und ihr Inhalt kommt auch nicht durch`);
}
/* Doppelte Schraegstriche haben diese Schranke im Haus schon einmal
umgangen (04.09.2026, //workspace/start.html kam mit 200). */
const schraeg = await hole("/workspace//crew-index.html", { host: WS });
ok(schraeg.status === 404 || !/Team Dogi/.test(schraeg.text),
`workspace.: auch mit doppeltem Schraegstrich nicht (${schraeg.status})`);
/* GEGENPROBE: Auf crew. und auf den Pruefadressen bleibt sie erreichbar
-- sonst haette ich sie fuer alle gesperrt, auch fuer die Pruefung,
die sie im Browser ansieht. Die waere dann gruen und wertlos. */
const dortSchon = await hole("/workspace/crew-index.html", { host: CREW });
ok(dortSchon.status === 200, "crew.: dort gibt es sie natuerlich");
const lokalSchon = await hole("/workspace/crew-index.html", { host: LOKAL });
ok(lokalSchon.status === 200, "127.0.0.1: und auf den Pruefadressen auch");
/* ---------------------------------------------------------------------
WAS gate.js AUS DEM HTML BRAUCHT -- auf BEIDEN Seiten.
Es gibt jetzt zwei Wanddateien und ein gemeinsames Skript. Wer nur
eine anfasst, macht die andere kaputt, und zwar lautlos: Ein
fehlendes Element ist im Browser ein `null`, der Fehler steht in der
Konsole und sonst nirgends. Deshalb wird beides gegen dieselbe Liste
gehalten.
------------------------------------------------------------------ */
const GEBRAUCHT = ["formular", "code", "auge", "fehler", "hinweis", "knopf", "fuer"];
for (const [name, wand] of [["crew.", wandCrew], ["workspace.", wandWs]]) {
const fehlend = GEBRAUCHT.filter((id) => !wand.text.includes(`id="${id}"`));
ok(fehlend.length === 0,
`${name} die Wand hat alle ${GEBRAUCHT.length} Elemente, die gate.js sucht`
+ (fehlend.length ? ` -- es fehlen: ${fehlend.join(", ")}` : ""));
ok(wand.text.includes("knopf__text") && wand.text.includes("buehne__bild"),
`${name} auch die beiden Klassen, die gate.js anspricht`);
}
/* ---------------------------------------------------------------------
Die Buehne.
------------------------------------------------------------------ */
ok(/crew-gate-\d+\.webp/.test(wandCrew.text), "crew.: die eigene Buehne ist eingebunden");
ok(!/buehne\/gate-\d+\.webp/.test(wandCrew.text), "crew.: die alte Buehne nicht mehr");
ok(/buehne\/gate-\d+\.webp/.test(wandWs.text), "workspace.: dort weiterhin die alte");
ok(/crew-32\.png/.test(wandCrew.text) && /crew-180\.png/.test(wandCrew.text),
"crew.: eigenes Zeichen im Reiter und auf dem Startbildschirm");
/* Ein Verweis beweist nicht, dass die Datei da ist. */
const buehnen = [...new Set(wandCrew.text.match(/assets\/img\/buehne\/crew-gate-[a-z0-9-]+\.webp/g) || [])];
let buehnenDa = 0;
for (const b of buehnen) {
const a = await hole("/workspace/" + b, { host: CREW });
if (a.status === 200) buehnenDa++;
}
ok(buehnen.length >= 8 && buehnenDa === buehnen.length,
`crew.: alle ${buehnenDa} von ${buehnen.length} Buehnenbildern werden ausgeliefert`);
/* =====================================================================
DIE GEGENPROBE