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
+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,