Files
dogfather-universe/server/helfer-tag.mjs
T
DogFatherGitandClaude Opus 5 12d4d48975 pruef-struktur: von zehn Fehlern auf null -- vier davon waren keine
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]>
2026-09-16 18:03:50 +02:00

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())}`;
}