Kundenportal war nicht installierbar: Manifest hinter der Zugangswand

Live gemessen nach dem Deploy: Symbole 200, portal.webmanifest 302 auf
zugang.html. Der Browser bekam HTML statt JSON und bot "App
installieren" gar nicht erst an -- die ganze Arbeit am Symbol waere
fuer das Portal wirkungslos geblieben, ohne dass irgendwo etwas rot
geworden waere.

Das ist zum DRITTEN Mal derselbe Fehler an derselben Stelle
(app.webmanifest, verwaltung.webmanifest, jetzt portal.webmanifest).
Zweimal stand die Begruendung danach im Code -- beim dritten Mal wurde
sie trotzdem uebersehen. Ein Kommentar verhindert nichts.

Deshalb zusaetzlich eine Pruefung in pruef-struktur.mjs: Jedes Manifest
unter /webdesign/ MUSS in der Ausnahmeliste von webdesign-gate.js
stehen. Gegengeprobt -- Eintrag entfernt, Pruefung schlaegt an.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-05 11:56:43 +02:00
co-authored by Claude Opus 5
parent 7fe6a51233
commit 37c2930af0
2 changed files with 67 additions and 1 deletions
+43
View File
@@ -298,6 +298,49 @@ const BEKANNT_TOT = [".content-wurzel", ".code-feld"];
: `kein neues totes CSS (${BEKANNT_TOT.length} bekannte Reste stehen bewusst)`);
}
/* ---------- 9. Kommt jedes Manifest auch WIRKLICH an? --------------------
Ein Manifest kann fehlerfrei im Repo liegen und trotzdem nie beim
Browser ankommen -- wenn eine Zugangswand davorsteht und HTML statt
JSON zurueckgibt. Dann bietet der Browser "App installieren" gar
nicht erst an, und niemand merkt etwas: Die Datei ist ja da.
Genau das ist DREIMAL passiert (webdesign/app.webmanifest,
verwaltung.webmanifest, portal.webmanifest). Zweimal stand die
Begruendung danach im Code -- und beim dritten Mal wurde sie trotzdem
uebersehen. Ein Kommentar verhindert nichts; eine Pruefung schon.
Geprueft wird gegen die Ausnahmeliste in webdesign-gate.js: Jedes
Manifest unter /webdesign/ MUSS dort stehen. */
console.log(`
=== Manifeste hinter der Zugangswand ===`);
{
const tor = join(SERVER, "webdesign-gate.js");
const torText = existsSync(tor) ? readFileSync(tor, "utf8") : "";
ok(torText.length > 1000, "webdesign-gate.js gelesen");
const manifeste = [];
const suche = (ordner, vorn) => {
for (const n of readdirSync(ordner, { withFileTypes: true })) {
if (n.name.startsWith(".") || n.name === "node_modules") continue;
const rel = vorn ? `${vorn}/${n.name}` : n.name;
if (n.isDirectory()) { if (rel === "webdesign") suche(join(ordner, n.name), rel); continue; }
if (n.name.endsWith(".webmanifest") || n.name === "manifest.json") manifeste.push(rel);
}
};
suche(REPO, "");
const hinterWand = manifeste.filter((m) => m.startsWith("webdesign/"));
ok(hinterWand.length >= 2, `${hinterWand.length} Manifeste unter /webdesign/ gefunden`);
const fehlend = hinterWand.filter((m) => !torText.includes(`"/${m}"`));
ok(fehlend.length === 0,
fehlend.length
? `NICHT in der Ausnahmeliste von webdesign-gate.js: ${fehlend.join(", ")} `
+ `— der Browser bekaeme HTML statt JSON und boete "App installieren" nicht an`
: `alle ${hinterWand.length} stehen in der Ausnahmeliste`);
}
/* ---------- Gegenprobe --------------------------------------------------- */
console.log(`\n=== Gegenprobe (muss anschlagen) ===`);
+24 -1
View File
@@ -495,7 +495,30 @@ export function webdesignGate(req, res, next) {
drei Verknüpfungen. Keine Kunden-, Projekt- oder Preisdaten. Wer
es liest, erfährt, dass es eine Verwaltung GIBT — was die
Zugangswand ohnehin verrät. */
pfad === "/webdesign/verwaltung.webmanifest"
pfad === "/webdesign/verwaltung.webmanifest" ||
/* Das Manifest des Kundenportals (05.09.2026). ZUM DRITTEN MAL
derselbe Fehler an derselben Stelle -- und diesmal stand die
Begründung schon direkt darüber.
Das Portal bekam im Zuge der neuen App-Symbole ein eigenes
Manifest; vorher lief es unter dem der Webdesign-Seite und trug
deshalb deren Namen und deren Symbol. Die neue Datei wurde
angelegt, eingebunden, ausgeliefert -- und in diese Liste
einzutragen vergessen.
Live gemessen, nicht vermutet: Symbole 200, Manifest 302 auf
zugang.html. Der Browser bekam HTML statt JSON und bot "App
installieren" gar nicht erst an. Die ganze Arbeit an dem Symbol
wäre für das Portal wirkungslos geblieben, ohne dass irgendwo
etwas rot geworden wäre.
Unbedenklich aus demselben Grund wie die beiden darüber: Name,
Farben, Symbolpfade. Keine Kunden-, Projekt- oder Preisdaten.
MERKE: Wer unter /webdesign/ eine Datei anlegt, die der BROWSER
selbst holen muss (Manifest, Service Worker, Symbol), muss sie
hier eintragen. Sonst liegt sie da und kommt nie an. */
pfad === "/webdesign/portal.webmanifest"
) {
return next();
}