Auf dem iPhone trug Team Dogi das Zeichen der Agentur

DIE ZWEITE HAELFTE EINER ENTSCHEIDUNG VOM 10.09.2026
  Der Block, der /workspace/app.webmanifest auf crew.webmanifest
  umbiegt, begruendet sich selbst so: "Sonst hiesse die App auf dem
  Startbildschirm eines Modis 'Creator Workspace' und traege das
  Zeichen mit der Chili -- die zu Spicy Media gehoert, nicht zu
  ihnen."

  Genau das passierte trotzdem -- auf dem iPhone. Android nimmt das
  Symbol aus dem Manifest (crew-192.png, richtig). iOS Safari nimmt es
  NICHT von dort, sondern aus <link rel="apple-touch-icon">, und diese
  Zeile steht in jeder HTML-Datei auf workspace-180.png.

  Gemessen: crew-180.png und workspace-180.png sind verschiedene
  Dateien (30 899 gegen 34 850 Byte). Ein Modi mit iPhone bekam die
  Chili auf den Startbildschirm, derselbe Modi mit Android das richtige
  Zeichen. So etwas faellt beim Ansehen nie auf -- man braeuchte beide
  Geraete nebeneinander.

  Behoben mit derselben Loesung wie beim Manifest: umbiegen an EINER
  Stelle, statt in 37 Dateien eine zweite Zeile zu setzen. Wer eine
  Seite anlegt, schreibt weiterhin workspace-*.png und bekommt auf
  crew. trotzdem das richtige Symbol.

  ABGELEITET, NICHT AUFGEZAEHLT: Umgebogen wird nur, wo es die
  Crew-Fassung wirklich gibt -- gemessen sind das 32, 180, 192, 512 und
  die beiden maskable. workspace-1024.png (TikTok) hat keine und bleibt
  unangetastet; eine kuenftige Groesse kommt von selbst dazu, sobald
  jemand die Datei anlegt.

DREI BEFUNDE VON pruef-struktur, alle aus meiner eigenen Arbeit
  - material.html und willkommen.html hatten weder theme-color noch
    apple-touch-icon. Auf dem iPhone waere das Startbildschirm-Symbol
    ein Bildschirmfoto der Seite gewesen, auf Android die Leiste weiss.
    Beide binden jetzt app.webmanifest statt crew.webmanifest direkt --
    die Adresse biegt es um, und zwei Stellen laufen sonst auseinander.
  - 20 tote CSS-Regeln (.b-analyse*) in entwicklung.css. Am 22.09.
    wurde der Block "Resuemee je Frage" aus dem Skript entfernt, die
    Gestaltung blieb stehen. Das ist nicht nur Ballast auf jeder Seite,
    sondern eine Falle: Wer spaeter .b-analyse im CSS findet, haelt den
    Block fuer lebendig. Vor dem Entfernen geprueft, dass im Bereich
    keine fremde Klasse steht.

EIN RUECKSTAND VOM 21.09. NACHGETRAGEN
  pruef-crew-adresse erwartete vier Rollenkacheln auf der Wand; seit
  die linke Hand dazukam (Commit 21793b6) sind es fuenf. Die Pruefung
  war seitdem rot an einer Stelle, an der NICHTS kaputt war -- und die
  Zeile daneben ("so viele, wie es Rollen auf der Wand gibt") war die
  ganze Zeit gruen und hat den Fehler damit verdeckt.

Gemessen: pruef-crew-adresse 148/0 (war 147/1, neu: vier Aussagen zum
Startbildschirm-Symbol samt Gegenprobe, dass die Agenturadresse
unveraendert bleibt und Groessen ohne Crew-Fassung nicht umgebogen
werden), pruef-struktur 35/0 (war 32/3), pruef-css-klassen 30/0,
pruef-befinden 116/0, pruef-willkommen 67/0, pruef-installieren 14/0,
pruef-textform 50/0, pruef-zwischenspeicher 27/0.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-22 13:14:19 +02:00
co-authored by Claude Opus 5
parent 80dee4d0c8
commit 1a7d074e94
42 changed files with 690 additions and 619 deletions
+58
View File
@@ -72,8 +72,30 @@
Zugangswand sieht aus wie immer, und der Code stimmt nicht.
===================================================================== */
import { readdirSync } from "node:fs";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
export const CREW_ADRESSE = "https://crew.dogfather-universe.com";
/* WELCHE SYMBOLGROESSEN HAT DIE CREW-APP EIGENS?
Abgeleitet aus dem Ordner, nicht aufgezaehlt: Fuer jede Datei
crew-<X>.png, zu der es auch workspace-<X>.png gibt, kann umgebogen
werden. Einmal beim Start gelesen -- pro Anfrage waere es ein
Dateisystemzugriff fuer eine Antwort, die sich nie aendert. */
const CREW_SYMBOLE = (() => {
try {
const ordner = join(dirname(fileURLToPath(import.meta.url)),
"..", "assets", "img", "app-symbole");
const da = new Set(readdirSync(ordner));
return new Set([...da]
.map((f) => f.match(/^crew-([0-9a-z-]+)\.png$/))
.filter(Boolean)
.map((m) => m[1])
.filter((x) => da.has(`workspace-${x}.png`)));
} catch { return new Set(); }
})();
/* =====================================================================
DAS TEAM VON DOGI -- WELCHE ROLLEN DAZUGEHOEREN
@@ -386,6 +408,42 @@ export function crewWeiche(req, res, next) {
return next();
}
/* DAS SYMBOL AUF DEM IPHONE (22.09.2026) — DIE ZWEITE HAELFTE.
===================================================================
Der Block darueber ist seit dem 10.09. richtig, war aber nur die
halbe Miete, und seine eigene Begruendung sagt, warum: "Sonst
hiesse die App auf dem Startbildschirm eines Modis 'Creator
Workspace' und traege das Zeichen mit der Chili."
Genau das passierte -- auf dem iPhone. Android nimmt das Symbol
aus dem Manifest (also crew-192.png, richtig). iOS Safari nimmt
es NICHT von dort, sondern aus `<link rel="apple-touch-icon">`.
Und die Zeile steht in jeder HTML-Datei auf workspace-180.png.
Gemessen: crew-180.png und workspace-180.png sind verschiedene
Dateien (30 899 gegen 34 850 Byte). Ein Modi mit iPhone bekam die
Chili auf den Startbildschirm; derselbe Modi mit Android das
richtige Zeichen. Beim Blick auf den Bildschirm faellt so etwas
nie auf, weil kaum jemand beide Geraete nebeneinander hat.
DIESELBE LOESUNG WIE BEIM MANIFEST: umbiegen statt in 37 Dateien
eine zweite Zeile zu setzen. Wer eine Seite anlegt, schreibt
weiterhin workspace-*.png -- und bekommt auf crew. trotzdem das
richtige Symbol.
ABGELEITET, NICHT AUFGEZAEHLT: Umgebogen wird nur, wenn es die
Crew-Fassung wirklich gibt. workspace-1024.png (fuer TikTok) hat
keine, bleibt also unangetastet -- und eine kuenftige Groesse
kommt von selbst dazu, sobald jemand die Datei anlegt. */
const symbol = req.path.match(
/^\/assets\/img\/app-symbole\/workspace-([0-9a-z-]+)\.png$/);
if (symbol && CREW_SYMBOLE.has(symbol[1])) {
req.url = req.url.replace(
`/app-symbole/workspace-${symbol[1]}.png`,
`/app-symbole/crew-${symbol[1]}.png`);
return next();
}
/* DIE ZUGANGSWAND GEHOERT DOGI UND DEN MODIS (10.09.2026).
Filipe: "alles soll auf dogfather und die modis perfektionniert
+66 -5
View File
@@ -354,6 +354,50 @@ ok(Array.isArray(mw.icons) && mw.icons.length > 0
ok(mc.start_url === "/workspace/start.html" && mc.scope === "/workspace/",
"crew.: Bereich und Startseite stimmen");
/* ---------------------------------------------------------------------
UND DAS SYMBOL AUF DEM IPHONE (22.09.2026)
---------------------------------------------------------------------
Die Zeilen darueber pruefen das MANIFEST -- daraus nimmt Android sein
Symbol. iOS Safari nimmt es von dort NICHT, sondern aus
`<link rel="apple-touch-icon">`, und die Zeile steht in jeder HTML
auf workspace-180.png.
Bis zum 22.09.2026 war das Manifest deshalb richtig und der
Startbildschirm eines Modis trotzdem falsch -- aber nur auf dem
iPhone. Genau die Sorte Fehler, die beim Ansehen nie auffaellt: Man
braeuchte beide Geraete nebeneinander.
Gemessen wird der AUSGELIEFERTE INHALT, nicht der Pfad. Eine
Umleitung, die auf eine Datei zeigt, die es nicht gibt, waere sonst
gruen. */
console.log("\n--- Das Symbol auf dem Startbildschirm ---");
{
const pfad = "/assets/img/app-symbole/workspace-180.png";
const aufCrew = await hole(pfad, { host: CREW });
const aufWs = await hole(pfad, { host: WS });
const echtCrew = await hole("/assets/img/app-symbole/crew-180.png", { host: CREW });
/* DIE ZAHL GEHOERT IN DIE BEDINGUNG: Waeren beide Antworten leer,
waeren sie auch gleich -- und der Vergleich unten trivial gruen. */
ok(aufCrew.status === 200 && aufWs.status === 200 && echtCrew.status === 200
&& aufCrew.text.length > 1000,
`alle drei Symbole werden ausgeliefert (${aufCrew.text.length} Byte)`);
ok(aufCrew.text === echtCrew.text,
"crew.: hinter apple-touch-icon steckt wirklich das Crew-Zeichen");
/* GEGENPROBE. Ohne sie wuesste niemand, ob die Umleitung ueberhaupt
etwas tut -- waeren beide Dateien identisch, waere die Zeile
darueber auch ohne jede Umleitung gruen. */
ok(aufCrew.text !== aufWs.text,
"workspace.: dort unveraendert das Agenturzeichen — die Umleitung greift also");
/* UND SIE GREIFT NUR, WO ES EINE CREW-FASSUNG GIBT. workspace-1024.png
ist das TikTok-Symbol und hat keine; wuerde es mit umgebogen,
liefe die Anfrage auf eine Datei, die es nicht gibt. */
const tiktok = await hole("/assets/img/app-symbole/workspace-1024.png", { host: CREW });
ok(tiktok.status === 200 && tiktok.text.length > 1000,
`und Groessen ohne Crew-Fassung bleiben unangetastet (1024: ${tiktok.status})`);
}
/* Die Symboldateien muessen es auch wirklich geben -- ein Manifest, das
auf nichts zeigt, faellt sonst erst auf dem Startbildschirm auf. */
let symboleDa = 0;
@@ -408,20 +452,37 @@ ok(!/Creator/i.test(wandCrew.text), "crew.: und vom Creator Workspace auch nicht
"und behauptet nicht mehr, das hier sei nur zum Arbeiten");
}
/* DIE KACHELREIHE HAT SEIT DEM 11.09.2026 VIER EINTRAEGE.
/* DIE KACHELREIHE HAT SEIT DEM 21.09.2026 FUENF EINTRAEGE.
Die Geschichte dieser Zeile ist lehrreich und steht deshalb hier:
Erst gab es keine Kachelreihe (eine Sorte Zugang, eine Reihe waere
eine Huerde gewesen). Dann drei ("3 rollen. dogfather. rechte hand
und modis"). Jetzt vier, weil der Treff hier eingezogen ist.
und modis"). Dann vier, weil der Treff hier eingezogen ist. Jetzt
fuenf -- die linke Hand ist dazugekommen.
GEPRUEFT WIRD NICHT DIE ZAHL, SONDERN WELCHE. Eine Zahl war schon
zweimal rot, ohne dass etwas kaputt war. Die NAMEN dagegen sagen
etwas: Steht dort eines Tages "manager", ist das ein Befund und kein
Umbau. */
Umbau.
NACHGETRAGEN AM 22.09.2026, und der Rueckstand gehoert hierher:
Die Karte "Linke Hand" kam am 21.09. auf die Wand (Commit 21793b6),
diese Erwartung blieb bei vier. Die Pruefung war seitdem rot -- an
einer Stelle, an der NICHTS kaputt war. Eine rote Pruefung, die rot
bleibt, gewoehnt einem das Hinsehen ab; die Zeile darunter ("so
viele, wie es Rollen auf der Wand gibt") war die ganze Zeit gruen
und hat den Fehler damit sogar verdeckt.
Warum die Liste trotzdem stehen bleibt und nicht abgeleitet wird:
Die REIHENFOLGE ist eine Entscheidung (DogFather, rechte Hand, linke
Hand, Modis, Gaeste) und steht sonst nirgends. Abzuleiten hiesse nur,
die Liste woanders hinzuschreiben. Die Zahl daneben ist die
abgeleitete Haelfte -- zwei Fragen, zwei Zeilen. */
const rollenAufWand = [...wandCrew.text.matchAll(/data-rolle="([a-z]+)"/g)].map((m) => m[1]);
ok(JSON.stringify(rollenAufWand) === JSON.stringify(["admin", "hand", "modi", "gast"]),
`crew.: die vier Kacheln in dieser Reihenfolge (${rollenAufWand.join(", ")})`);
const ERWARTETE_REIHE = ["admin", "hand", "linke", "modi", "gast"];
ok(JSON.stringify(rollenAufWand) === JSON.stringify(ERWARTETE_REIHE),
`crew.: die ${ERWARTETE_REIHE.length} Kacheln in dieser Reihenfolge `
+ `(${rollenAufWand.join(", ")})`);
const kachelnCrew = (wandCrew.text.match(/class="rolle"/g) || []).length;
const kachelnWs = (wandWs.text.match(/class="rolle"/g) || []).length;
ok(kachelnCrew === rollenAufWand.length,