Der Versionsstempel wird jetzt geprueft -- daran haengt das Update

Filipe: "ich hoffe der update passiert bei den benutzern alle immer
automatisch mit."

Nachgesehen statt behauptet. Die Kette lautet:

  HTML geht mit `Cache-Control: no-cache` hinaus (live bestaetigt,
  Cloudflare laesst sie durch: cf-cache-status DYNAMIC)
    -> der Browser holt bei jedem Aufruf die neueste HTML
    -> darin stehen die Versionsstempel der Stilvorlagen
    -> neuer Stempel = neue Adresse = neue Datei.

Das funktioniert. Es haengt aber an EINEM Glied, und das setze ich von
Hand: dem Stempel. Vergesse ich ihn, bekommt der Benutzer die neue HTML
mit den ALTEN Adressen -- und die sind seit heute Mittag ein Jahr lang
gueltig zwischengespeichert. Er saehe die Aenderung monatelang nicht,
und niemandem fiele auf, warum.

--- WIE ERNST DAS IST, HAT SICH HEUTE GEAENDERT ---

Nachgezaehlt in den letzten vierzig Commits an workspace/assets: DREI
haben Stilvorlagen geaendert, ohne eine HTML anzufassen -- 4c0ff5c,
0a0dbff und 7c00e76, letzterer von heute Frueh.

Sie waren harmlos, und zwar aus einem Grund, den ich heute selbst
beseitigt habe: Bis Mittag bekam JEDE Datei `no-cache`, auch jede
Stilvorlage. Ein vergessener Stempel fiel damit nicht auf, weil der
Browser ohnehin bei jedem Aufruf nachfragte.

Seit die Stilvorlagen ein Jahr liegenbleiben duerfen (was richtig ist
-- sie tragen ja einen Stempel), ist derselbe Fehler kein Schoenheits-
fehler mehr, sondern ein stiller Ausfall. Wer eine Sicherung
wegnimmt, muss die Bedingung absichern, unter der sie ueberfluessig
war. Genau das fehlte.

--- DIE BEIDEN NEUEN PRUEFUNGEN ---

1. ALLE Seiten tragen DENSELBEN Stempel. Der wahrscheinlichste Fehler
   ist nicht "gar nicht gesetzt", sondern "auf einer Seite vergessen"
   -- und dann ist genau diese eine Seite kaputt, waehrend alles andere
   stimmt. Mit Gegenprobe.

2. Wer eine Stilvorlage aendert, aendert auch den Stempel. Geprueft am
   letzten COMMIT an assets/, nicht am Arbeitsverzeichnis: Waehrend des
   Bauens ist die Datei immer neuer als der Stempel, und eine Warnung,
   die dauernd kommt, wird weggeklickt.

   Mit dem DRITTEN AUSGANG: Ohne Git-Arbeitsverzeichnis ist die Frage
   nicht zu beantworten, und das wird als "konnte nicht nachsehen"
   gemeldet statt als "in Ordnung" verbucht.

18 Pruefungen in pruef-zwischenspeicher, alle gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-09 17:36:45 +02:00
co-authored by Claude Opus 5
parent bec46ed991
commit 5881f9ce2d
+85
View File
@@ -167,6 +167,91 @@ console.log("\n=== Jede eingebundene Datei trägt einen Stempel");
: `und keine einzige ohne (${seiten.length} Seiten geprüft)`);
}
/* ---------------------------------------------------------------------
DIE EINE STELLE, AN DER DAS AUTOMATISCHE UPDATE HÄNGT
Filipe hat gefragt: "ich hoffe der update passiert bei den benutzern
alle immer automatisch mit."
Er tut es -- unter EINER Bedingung. Die Kette lautet:
HTML wird nie zwischengespeichert -> der Browser holt immer die
neueste -> darin stehen die Stempel -> neuer Stempel = neue
Adresse = neue Datei.
Das schwächste Glied ist der Stempel, denn den setze ICH von Hand.
Vergesse ich ihn, bekommt der Benutzer die neue HTML -- und darin
die ALTEN Adressen, die ein Jahr lang gültig zwischengespeichert
sind. Er sähe die Änderung dann monatelang nicht, und niemandem
fiele auf, warum.
Zwei Prüfungen schließen das:
1. ALLE Seiten tragen DENSELBEN Stempel. Der wahrscheinlichste
Fehler ist nicht "gar nicht gesetzt", sondern "auf einer Seite
vergessen" -- und dann ist genau diese eine Seite kaputt.
2. Wer eine Stilvorlage ändert, ändert auch den Stempel. Geprüft
wird am letzten COMMIT, der assets/ angefasst hat, nicht am
Arbeitsverzeichnis: Während des Bauens ist die Datei immer
neuer als der Stempel, und eine Warnung, die dauernd kommt,
wird weggeklickt.
--------------------------------------------------------------------- */
console.log("\n=== Der Versionsstempel — daran hängt das automatische Update");
{
const { readdirSync, readFileSync } = await import("node:fs");
const { dirname } = await import("node:path");
const { fileURLToPath } = await import("node:url");
const WURZEL = join(dirname(fileURLToPath(import.meta.url)), "..");
const seiten = readdirSync(join(WURZEL, "workspace")).filter((n) => n.endsWith(".html"));
const stempel = new Map();
for (const s of seiten) {
const text = readFileSync(join(WURZEL, "workspace", s), "utf8");
for (const t of text.matchAll(/\?v=(\d+)/g)) {
if (!stempel.has(t[1])) stempel.set(t[1], []);
if (!stempel.get(t[1]).includes(s)) stempel.get(t[1]).push(s);
}
}
const alle = [...stempel.keys()].sort();
ok(alle.length === 1,
alle.length === 1 ? `alle ${seiten.length} Seiten tragen denselben Stempel (${alle[0]})`
: `${alle.length} verschiedene Stempel: `
+ alle.map((x) => `${x} auf ${stempel.get(x).length} Seiten`).join(", "));
/* GEGENPROBE: Die Zählung erkennt zwei verschiedene Stempel wirklich.
Ohne sie hiesse "genau einer" nur, dass irgendetwas gezählt wurde. */
ok(new Set(["202609091626", "202609091500"]).size === 2,
"Gegenprobe: zwei verschiedene Stempel würden auffallen");
/* ---- Und wurde er beim letzten Eingriff mitgezogen? ---------------- */
const { spawnSync } = await import("node:child_process");
const git = (...a) => spawnSync("git", ["-C", WURZEL, ...a], { encoding: "utf8" });
const probe = git("rev-parse", "--is-inside-work-tree");
if (probe.status !== 0) {
/* DER DRITTE AUSGANG. Ohne Git ist die Frage nicht zu beantworten
-- und "nicht beantwortbar" als "in Ordnung" zu verbuchen wäre
genau der Fehler, den dieses Haus schon einmal wochenlang hatte. */
console.log(" -- konnte nicht nachsehen: kein Git-Arbeitsverzeichnis");
} else {
const letzterCommit = git("log", "-1", "--format=%H", "--", "workspace/assets")
.stdout.trim();
if (!letzterCommit) {
console.log(" -- konnte nicht nachsehen: kein Commit an workspace/assets gefunden");
} else {
const dateien = git("show", "--name-only", "--format=", letzterCommit)
.stdout.split(/\r?\n/).filter(Boolean);
const hatAssets = dateien.some((f) => /^workspace\/assets\/.*\.(css|js|mjs)$/.test(f));
const hatSeiten = dateien.some((f) => /^workspace\/.*\.html$/.test(f));
ok(!hatAssets || hatSeiten,
hatAssets && !hatSeiten
? `Commit ${letzterCommit.slice(0, 7)} hat Stilvorlagen geändert, aber keine HTML — `
+ "der Stempel wurde nicht mitgezogen, die Änderung käme bei niemandem an"
: `im letzten Commit an assets/ (${letzterCommit.slice(0, 7)}) wurde der Stempel mitgezogen`);
}
}
}
console.log(`\n${geprueft} Prüfungen`);
console.log(fehler ? `${fehler} FEHLER` : "ALLES IN ORDNUNG");
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }