Die dritte und letzte rote Pruefung. Sie meldete zehn Fehler, und
sechs davon waren Fehlalarm.
1. SECHS SEITEN "VON NIRGENDWO VERLINKT"
Gemeldet wurden crew-index, entwicklung, rechte, talente, teamlage und
treff-moderation. Keine davon war verwaist -- man kommt auf jede, indem
man eine KACHEL antippt. Die Kacheln stehen im Server (`ziel:
"talente.html"`), und der wurde nie durchsucht. Der blinde Fleck lag in
der Pruefung.
Abgeleitet statt nachgetragen: Statt die sechs von Hand auszunehmen,
kommen workspace.js und crew-adresse.js als Quellen dazu. Wer morgen
eine Kachel anlegt, ist damit automatisch abgedeckt.
2. FALSCHE ZEILENNUMMERN
Die Ortszeit-Pruefung schnitt Blockkommentare heraus und ersetzte sie
durch EIN Leerzeichen -- ab da zaehlte split("\n") falsch. Gemeldet
wurde "pruef-eskalation.mjs:43", dort steht eine Zeile ueber Kekse. Wer
dem nachgeht, findet nichts, haelt die Pruefung fuer kaputt und sieht
beim naechsten Mal nicht mehr nach.
Mit richtigen Zeilen waren sechs der sieben Funde echt: Sie bauen ihr
Tagesdatum aus toISOString(), also aus UTC. Zwischen Mitternacht und
zwei Uhr liefert das den Vortag -- die Pruefungen waeren tagsueber
gruen und nachts rot gewesen.
Der siebte (pruef-eskalation.mjs:70) rechnet von einem FESTEN Mittag
aus und ist damit sicher; das Muster kann es nur nicht unterscheiden.
Auch umgestellt, damit es nicht beim naechsten Lesen wieder auffaellt.
Neu: server/helfer-tag.mjs -- heuteLokal, tagLokal, tagVon. Nicht aus
workspace.js importiert, weil eine Pruefung, die nur ein Datum
braucht, dafuer keinen Server hochfahren soll. pruef-backstage-import
hatte die Rechnung sogar schon richtig stehen -- und benutzte sie 1270
Zeilen weiter unten trotzdem nicht.
3. TOTES CSS
`.rolle__zeichen .nase` war tot. Beim Nachsehen: `.auge` und `.hell`
daneben auch -- sie wurden nur davon verdeckt, dass die Pruefung den
Klassennamen als TEILZEICHENKETTE gegen den Quelltext haelt, und
"auge" steckt in "Auge", "hell" in "hell". Dutzende Treffer im
Fliesstext deutscher Kommentare. `.fuell` bleibt, die wird benutzt.
Die Schwaeche der Suche steht jetzt an der Stelle notiert.
4. start.css MIT 347 KB
Die Grenze soll verhindern, "dass eine Seite unnoetig viel laedt". Auf
der echten Seite nachgemessen:
start.css auf der Platte 346 KB uebertragen 110 KB (br)
chat.css 59 KB 16 KB
entwicklung.css 33 KB 8 KB
Caddy packt unterwegs. Von start.css sind ausserdem 227 KB KOMMENTAR
(64 %) -- die Pruefung bestrafte genau das, was dieses Haus absichtlich
tut, und haette eine Datei mit 199 KB dichtem CSS durchgewunken.
Dasselbe Argument steht drei Absaetze hoeher schon fuer gestufte
Bilder.
Jetzt zwei Zahlen, weil es zwei Fragen sind: was der BESUCHER laedt
(brotli Stufe 4 -- bei 4 liefert node 111 KB, Caddy 110, jede andere
Stufe waere eine erfundene Zahl) und was ein MENSCH pflegen muss (ohne
Kommentare). Sonst koennte man die erste Zahl klein halten, indem man
immer mehr Prosa schreibt.
MIT GEGENPROBE, in drei Faellen: 281 KB dichtes CSS faellt durch,
404 KB Kommentar gehen durch, und 246 KB sich WIEDERHOLENDES CSS
faellt ebenfalls durch -- sonst koennte man die erste Grenze mit
Wiederholung unterlaufen.
pruef-struktur 0 Fehler (vorher 10)
pruef-eskalation 40, pruef-modi-livecheck 16, pruef-treff-werkzeuge 70,
pruef-backstage-import 160, pruef-css-klassen, pruef-crew-adresse 132
-- alle 0 Fehler
Damit sind alle drei roten Pruefungen gruen.
Co-Authored-By: Claude Opus 5 <[email protected]>
58 lines
2.5 KiB
JavaScript
58 lines
2.5 KiB
JavaScript
/* =====================================================================
|
|
EIN TAGESDATUM IN ORTSZEIT — für Prüfungen (16.09.2026)
|
|
|
|
`new Date().toISOString().slice(0, 10)` ist der bequemste Weg zu
|
|
einem Datum und der falsche. toISOString rechnet in UTC; Server und
|
|
Menschen stehen hier auf Europe/Berlin. Zwischen Mitternacht und
|
|
zwei Uhr morgens liefert die Rechnung deshalb den VORTAG.
|
|
|
|
In einer Prüfung heißt das: Sie ist tagsüber grün und nachts rot,
|
|
ohne dass irgendetwas kaputt ist. Ein Fehlalarm, den man nicht
|
|
nachstellen kann, ist der sicherste Weg, eine Prüfung abzuschalten.
|
|
|
|
---------------------------------------------------------------------
|
|
WARUM NICHT AUS workspace.js
|
|
|
|
Dort stehen `heuteLokal()` und `tagLokal()` schon, mit demselben
|
|
Kommentar — aber wer sie importiert, zieht das ganze Haus mit: die
|
|
Datenbank, die Umstellungen, die Zeitgeber. Eine Prüfung, die nur ein
|
|
Datum braucht, soll dafür keinen Server hochfahren.
|
|
|
|
Dieselbe Rechnung an zwei Stellen ist hier also Absicht, und es ist
|
|
die Ausnahme, nicht die Regel: Es sind vier Zeilen ohne
|
|
Verzweigung, sie können nicht auseinanderlaufen, ohne dass
|
|
pruef-struktur es meldet.
|
|
|
|
---------------------------------------------------------------------
|
|
UND WANN toISOString RICHTIG IST
|
|
|
|
Wenn die Uhrzeit fest auf Mittag steht. `Date.parse("…T12:00:00Z")`
|
|
plus oder minus ganze Tage bleibt in jeder Zeitzone am selben
|
|
Kalendertag — deshalb rechnet der Server mit UTC-Mittag, wenn er
|
|
Fristen VERGLEICHT. Nur beim ANZEIGEN und beim Erzeugen eines
|
|
Tagesdatums gilt die Ortszeit.
|
|
===================================================================== */
|
|
|
|
const zwei = (n) => String(n).padStart(2, "0");
|
|
|
|
/** Der heutige Tag in Ortszeit, als `JJJJ-MM-TT`. */
|
|
export function heuteLokal() {
|
|
const d = new Date();
|
|
return `${d.getFullYear()}-${zwei(d.getMonth() + 1)}-${zwei(d.getDate())}`;
|
|
}
|
|
|
|
/** Derselbe Tag, um `versatz` Tage verschoben. Negativ heißt zurück. */
|
|
export function tagLokal(versatz = 0) {
|
|
const d = new Date(Date.now() + versatz * 86400_000);
|
|
return `${d.getFullYear()}-${zwei(d.getMonth() + 1)}-${zwei(d.getDate())}`;
|
|
}
|
|
|
|
/** Ein beliebiger Zeitpunkt als Tagesdatum in Ortszeit.
|
|
*
|
|
* Für Prüfungen, die von einem FESTEN Zeitpunkt aus rechnen statt von
|
|
* jetzt — dort ist die Zeitzone genauso entscheidend. */
|
|
export function tagVon(zeitpunkt, versatz = 0) {
|
|
const d = new Date(zeitpunkt + versatz * 86400_000);
|
|
return `${d.getFullYear()}-${zwei(d.getMonth() + 1)}-${zwei(d.getDate())}`;
|
|
}
|