Alles fertig: Konsole montiert, Tageskachel als Instrument, zwei Seiten repariert

DIE KONSOLE -- DREI STUFEN DRAUF

  1. VIER NIETEN in den vier Fasen. Das Einzige, was eine Flaeche
     endgueltig zu einem GEGENSTAND macht, ist die Frage, wie sie
     befestigt ist. Ein Gehaeuse haengt nicht in der Luft.
  2. EINE GEFRAESTE NUT trennt Text von Instrumenten -- dunkel auf der
     Lichtseite, hell auf der Schattenseite. Genau umgekehrt zu einer
     aufgemalten Linie, und deshalb sieht sie nach Material aus.
  3. DIE UHR SITZT IN EINER MULDE statt auf der Platte.

Drei Fehler dabei, alle im Bildschirmfoto gesehen: Die Nieten waren
QUADRATE (eine Hintergrundebene laesst sich nicht runden -- jetzt aus
Radialverlaeufen, die selbst rund sind). Die Mulde lag UEBER der Uhr
und hat die polierte Luenette zu mattem Grau gedaempft (`::after` wird
nach allen Kindern gezeichnet). Und das Raster musste von der
Nieten-Ebene herunter: Eine Ebene hat nur EINE Deckkraft.

DIE TAGESKACHEL "WAS IST DRAN"

Die drei Zeilen sind jetzt MODULE -- Fase, Kantenlicht in der Farbe
ihres Bereichs, Eckwinkel. Sie sind damit kleine Ausgaben derselben
Bauteile, zu denen sie fuehren, was sie ja auch sind. Die ZAHL wurde
zum gefassten Schild wie das Zeichen auf den Kacheln, und zwischen den
Haelften laeuft dieselbe gefraeste Nut wie auf der Konsole.

Ein Rueckschritt dabei, von der Pruefung sofort gemeldet: Ich hatte
die Ziffer weiss gemacht, weil das auf Metall gut aussieht -- damit
war ihre Aussage weg. Die Zahl traegt die Farbe ihres Bereichs und bei
etwas Ueberfaelligem die Warnfarbe; das ist die schnellste Auskunft der
ganzen Kachel. Die Farbe gehoert in die Ziffer, nicht ins Schild.

SPICY MEDIA SIEHT DIE ZAHLEN JETZT NIRGENDS

Vorher nur Kachel und Seite -- die Creator-Zahlen standen weiterhin im
Dashboard, weil das sie ueber eine eigene Schnittstelle holt. Die ist
jetzt zu (404 am Server, nicht in der Oberflaeche). Das Dashboard
bleibt fuer sie stehen: Es faengt den Fehlschlag ausdruecklich ab.
Mit Pruefung und Gegenprobe.

UND ZWEI SEITEN, DIE BEIM ANSEHEN AUFFIELEN

Das ist der Ertrag der Durchsicht jener zwoelf Seiten, die bisher nur
GEPRUEFT und nie ANGESEHEN worden waren:

  * chat.html und uebersicht.html luden kopf.js OHNE wahl.js. Der
    Umschalter "Meine Sicht" fiel dort auf das nackte Systemfeld
    zurueck: 92 x 19 px, grauer Kasten, Systemschrift -- auf allen
    anderen Seiten ist es ein selbst gebautes Bedienelement, hinter dem
    dasselbe Feld unsichtbar bei 2 x 2 px liegt. Kaputt war nichts. Es
    sah nur aus wie aus einem anderen Programm, und genau das findet
    keine Pruefung, die auf Fehlermeldungen achtet.
    Neue Pruefung: Wer kopf.js laedt, muss wahl.js laden -- und vorher.
  * Der Chat-Rahmen gehoerte als einzige grosse Flaeche noch nicht zum
    Modulsystem. Jetzt schon.

18 Pruefungen gelaufen, alle gruen. Rechner und Handy angesehen,
dazu Kalender, Chat, Automationen, Uebersicht, Start-Check,
Steckbrief, Bereiche, Profil, Content, Scouting und Report.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-07 14:31:14 +02:00
co-authored by Claude Opus 5
parent 90d5898640
commit 532daa3edf
25 changed files with 526 additions and 209 deletions
+51
View File
@@ -426,6 +426,57 @@ console.log("\n=== Gegenprobe ===");
"aus classList.add(bedingung ? 'a' : 'b') werden beide Klassen gelesen, aber nicht die Variable");
}
/* =======================================================================
WER kopf.js LAEDT, MUSS AUCH wahl.js LADEN
Gefunden am 07.09.2026 beim Durchsehen der Seiten, die bis dahin nur
GEPRUEFT und nie ANGESEHEN worden waren -- chat.html und
uebersicht.html luden kopf.js ohne wahl.js.
Der Umschalter "Meine Sicht" ist auf allen anderen Seiten ein selbst
gebautes Bedienelement (`.wahl2`), hinter dem ein unsichtbares
Systemfeld fuer Vorleseprogramme liegt. Ohne wahl.js faellt kopf.js
auf dieses Systemfeld zurueck: 92 x 19 Pixel, grauer Kasten, weisse
Schrift, Systemschriftgroesse -- gemessen, nicht geschaetzt. Auf den
anderen Seiten misst dasselbe Feld 2 x 2 Pixel bei Deckkraft null,
weil es dort nur noch der Zugaenglichkeit dient.
KAPUTT WAR NICHTS. Der Umschalter funktionierte auf beiden Seiten --
er sah nur aus wie aus einem anderen Programm. Genau diese Sorte
Fehler findet keine Pruefung, die auf Fehlermeldungen achtet, und
auch keine, die Klassennamen zaehlt: Die Klasse `.sicht__feld` ist
NIRGENDS gestaltet und gilt deshalb zu Recht als Struktur-Anker.
Deshalb hier eine Pruefung auf die ABHAENGIGKEIT statt auf die Optik:
Wer das eine laedt, muss das andere laden -- und zwar vorher. */
console.log("\n=== Wer kopf.js laedt, laedt auch wahl.js");
{
const seitenMitKopf = [];
for (const seite of readdirSync(WS).filter((f) => f.endsWith(".html"))) {
const html = readFileSync(join(WS, seite), "utf8");
const skripte = [...html.matchAll(/<script[^>]+src="assets\/js\/([a-z0-9-]+)\.js/g)]
.map((m) => m[1]);
if (!skripte.includes("kopf")) continue;
seitenMitKopf.push({ seite, skripte });
}
ok(seitenMitKopf.length >= 10,
`${seitenMitKopf.length} Seiten laden kopf.js`);
const ohneWahl = seitenMitKopf.filter((s) => !s.skripte.includes("wahl")).map((s) => s.seite);
ok(ohneWahl.length === 0, ohneWahl.length
? `ohne wahl.js: ${ohneWahl.join(", ")}`
: "alle davon laden auch wahl.js");
/* UND ZWAR VORHER. kopf.js fragt beim Aufbau nach dem fertigen
Bedienelement; kommt wahl.js danach, ist es zu spaet. */
const zuSpaet = seitenMitKopf
.filter((s) => s.skripte.indexOf("wahl") > s.skripte.indexOf("kopf"))
.map((s) => s.seite);
ok(zuSpaet.length === 0, zuSpaet.length
? `wahl.js steht zu spaet auf: ${zuSpaet.join(", ")}`
: "und immer VOR kopf.js");
}
/* =======================================================================
KEIN SKRIPT BAUT SICH SEINE EIGENE ROLLENLISTE
+23
View File
@@ -420,6 +420,29 @@ const ruf = async (art, weg, keks, koerper) => {
`DogFather sieht weiterhin beide (${dTitel.length})`);
}
{
/* DIE ZAHLEN SIEHT SIE NIRGENDS (07.09.2026).
Zuerst waren nur Kachel und Seite geschlossen -- die Creator-Zahlen
standen damit weiterhin im Dashboard, weil das sie ueber eine
eigene Schnittstelle holt. Filipe hat entschieden, dass auch das
weg soll.
Geprueft wird die SCHNITTSTELLE und nicht die Oberflaeche: Eine
ausgeblendete Zeile ist keine Sperre. Und mit Gegenprobe, sonst
bewiese die Zeile nur, dass es den Weg gar nicht gibt. */
const beiIhr = await ruf("GET", "/workspace/api/leistung", keksSpicy);
ok(beiIhr.status === 404, `die Zahlen antworten ihr mit 404 (${beiIhr.status})`);
const beiIhm = await ruf("GET", "/workspace/api/leistung", keksDogi);
ok(beiIhm.status === 200, `DogFather bekommt sie weiterhin (${beiIhm.status})`);
/* UND DAS DASHBOARD BLEIBT FUER SIE STEHEN. Das ist der eigentliche
Prueffall: Die Uebersicht holt die Zahlen in einer zusaetzlichen
Abfrage. Faengt sie deren Fehlschlag nicht ab, saehe Spicy Media
statt der Karten eine leere Seite -- eine Sperre, die die halbe
Anwendung mitnimmt, waere schlimmer als keine. */
const dash = await ruf("GET", "/workspace/api/uebersicht", keksSpicy);
ok(dash.status === 200, `ihre Uebersicht kommt trotzdem (${dash.status})`);
/* Und DogFather bleibt der Einzige mit dem letzten Wort. */
const { status } = await ruf("GET", "/workspace/api/verwaltung/personen", keksDogi);
ok(status === 200, `DogFather kommt weiterhin in die Verwaltung (HTTP ${status})`);
+13
View File
@@ -163,6 +163,19 @@ melde("\n=== Eine Kachel, mittig geteilt ===");
lichtDa: v.content !== "none" && v.position === "absolute",
};
});
/* Ein Bild davon, wie sie wirklich aussieht. Prueflaeufe messen
Zahlen; ob eine Flaeche gut aussieht, sieht man nur. Die Aufnahme
kostet nichts und ist bei jeder Gestaltungsaenderung das Erste,
wonach ich sonst von Hand suchen muesste. */
try {
const kasten = await seite.locator("#dran-block").boundingBox();
if (kasten) {
await seite.screenshot({ path: "pruef-tagesblick.png",
clip: { x: kasten.x - 12, y: kasten.y - 12,
width: kasten.width + 24, height: kasten.height + 24 } });
}
} catch { /* ein fehlendes Bild ist kein Befund */ }
ok(rahmen.anzeige === "grid"
&& /polygon/.test(rahmen.silhouette)
&& parseFloat(rahmen.radius) === 0
+28 -1
View File
@@ -44,7 +44,7 @@
import express from "express";
import {
db, protokolliere, echteIp, sitzungLesen, istLeitung,
db, protokolliere, echteIp, sitzungLesen, istLeitung, istSpicy,
sichtbareCreatorIds, ROLLEN_SORTIERUNG,
} from "./workspace.js";
@@ -73,6 +73,33 @@ function gleicheHerkunft(req, res, next) {
leistungRouter.use("/workspace/api/leistung", angemeldet);
/* SPICY MEDIA SIEHT DIE ZAHLEN NIRGENDS (07.09.2026).
Filipe: "bei der spicy rolle, die zahlen diese kategorie nicht
sehen." Zuerst habe ich woertlich nur die KATEGORIE geschlossen --
Kachel und Seite. Auf Nachfrage, was noch offen sei, habe ich selbst
darauf hingewiesen, dass die Creator-Zahlen damit weiterhin im
Dashboard stehen (Diamanten, LIVE-Tage, Verweildauer je Karte);
Filipe hat entschieden, dass auch das weg soll.
DIE SPERRE SITZT AM SERVER UND NICHT IN DER OBERFLAECHE. Eine
ausgeblendete Zeile ist keine Sperre: Wer die Adresse kennt, ruft
die Schnittstelle direkt auf. Hier kommt sie gar nicht mehr an
Daten.
404 statt 403, wie ueberall in diesem Haus: Wer nicht hierher
gehoert, muss nicht erfahren, dass es diesen Bereich gibt.
DAS DASHBOARD BRICHT DADURCH NICHT. Es holt die Zahlen in EINER
zusaetzlichen Abfrage und faengt ihren Fehlschlag ausdruecklich ab
("die Karten stehen auch ohne", uebersicht.js) -- bei ihr fehlen
also die drei Zeilen, alles andere bleibt. Genau deshalb ist diese
eine Zeile hier der ganze Eingriff. */
leistungRouter.use("/workspace/api/leistung", (req, res, next) => {
if (istSpicy(req.person)) return res.status(404).json({ fehler: "nicht_gefunden" });
next();
});
/* ---------- Wer darf was ------------------------------------------------ */
/** Wessen Zahlen darf ich SEHEN? Dieselbe Regel wie überall sonst --