Der Treff zieht in Team Dogi ein — die dritte Adresse ist wieder weg

Filipe, nachdem er die dritte Wand gesehen hatte: "das soll keine app
für sich sein, dass soll in der crew seite adaptiert werden, da rein
perfektionniert."

WAS VERSCHWINDET: treff.dogfather-universe.com samt Weiche
(treff-adresse.js), Zugangswand, Manifest und acht Bühnenbildern. Kein
DNS-Eintrag, kein zweiter Caddy-Block, kein zweites App-Symbol.

Die Gründe, die DAFÜR sprachen, stehen jetzt als Kommentar in
crew-adresse.js statt als Code -- sie gelten weiter, und beim nächsten
Mal wird jemand dieselbe Idee haben: eine App je Ursprung, und ein
Schloss mehr zwischen der Community und den Daten der Agentur.

WAS DER VERZICHT KOSTET, benannt statt übersehen:
 · Die Community steht vor derselben Wand wie das Team und liest dort
   die Namen der drei Team-Rollen. Filipes Entscheidung auf die Frage:
   vierte Kachel "Community" statt gar keiner Kacheln.
 · Ein Schloss weniger. Was vorher die Adresse getrennt hat, muss jetzt
   jede einzelne Regel halten -- deshalb prüft pruef-treff-werkzeuge
   seit heute zehn Dinge mehr (70 statt 60).

EINE LÜCKE, DIE DABEI AUFGEFALLEN IST -- und die es schon vorher gab:
Ein Mitglied der Community stand in der Auswahl, wen man zu einem
Termin einlädt, wem man eine Aufgabe gibt und mit wem man einen Chat
anfängt. Für DogFather bedeutet fast jede Liste "alle". Jetzt zu, über
eine Hülle (ohneAussen) um die fünf Listen, die von Zusammenarbeit
handeln -- damit sie auch für die Listen gilt, die es noch nicht gibt.
Die Verwaltungsliste in "Personen & Zugänge" zeigt sie weiterhin, sonst
legt er einen Zugang an und der verschwindet im selben Moment.

DREI BEFUNDE AUS DEN PRÜFUNGEN, wieder keiner vom Lesen:
 · Mein eigener Kommentar auf der Wand nannte eine Rolle der Agentur --
   in einer Datei, die jedes Community-Mitglied im Quelltext liest.
   Zum zweiten Mal an einem Tag, und zum zweiten Mal ausgerechnet in
   einem Kommentar, der erklärt, warum man das nicht tut.
 · Die Prüfung "der Satz nennt die Modis" durchsuchte den QUELLTEXT und
   wäre grün geblieben, obwohl der Satz auf dem Bildschirm längst ein
   anderer ist -- sie fand ihn in einem Kommentar. Sie misst jetzt die
   sichtbare Unterzeile.
 · Der erste Entwurf der Adressregel sperrte die Community auch auf
   localhost aus -- eine Bedingung durch AUSSCHLUSS, zum dritten Mal an
   einem Tag. Jede Zeile nennt jetzt die Adresse, FÜR DIE sie gilt.

Und zwei feste Zahlen weniger: Die Kachelreihe wird nicht mehr gezählt,
sondern beim Namen genannt (admin, hand, modi, gast) -- eine Zahl war
dort schon zweimal rot, ohne dass etwas kaputt war. Der App-Name wird
nicht nur geprüft, sondern der UNTERSCHIED zur Agenturadresse.

Die App heißt auf crew. jetzt "DogFather Universe" statt "Team Dogi" --
sie gehört ab heute beiden (Entscheidung Filipe).

Geprüft: rollen 312 · crew-adresse 132 · kalender 104 · sicht 84 ·
modi-verborgen 80 · chat-kanaele 79 · treff-werkzeuge 70 · haus-trennung
62 · treff 58 · chat 48 · treff-seiten 42 · bereiche-lesend 37 ·
start-ansicht 147 · css-klassen 30 · zwischenspeicher 21 · alle-wege 19 ·
rechtetafel 19 -- alles grün.

Die 58 bei pruef-treff sind elf weniger als gestern: Mit der dritten
Adresse fallen ihre 26 Weichen-Prüfungen weg, ersetzt durch 10 für die
eine Wand plus die neuen in 7b.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-11 18:38:05 +02:00
co-authored by Claude Opus 5
parent 1ebaf8a864
commit 39dd666b17
47 changed files with 856 additions and 987 deletions
+13 -42
View File
@@ -61,35 +61,6 @@ const SZENE = join(QUELLE, "gate-spicy-dogfather.jpeg");
const DOGI = join(QUELLE, "dogfather-husky.png");
const ZIEL = process.env.BUEHNE_ZIEL || join(WURZEL, "workspace", "assets", "img", "buehne");
/* ZWEI TUEREN, EIN WERKZEUG (11.09.2026).
Der Treff bekommt seine eigene Zugangswand, und sie braucht ihr
eigenes Motiv -- nicht weil sie anders aussehen soll, sondern weil
in diesem Bild "TEAM DOGI" EINGEBRANNT ist. Die Community traegt
diesen Namen nicht; auf ihrer Tuer stuende sonst der Name eines
Bereichs, zu dem sie nicht gehoert.
WARUM KEINE ZWEITE DATEI: Eine Kopie dieser 520 Zeilen haette die
drei Gegenproben mitkopiert -- und beim naechsten Nachbessern waere
genau eine der beiden verbessert worden. Hier aendern sich zwei
Dinge, also sind es zwei Werte und kein zweites Werkzeug.
DIE FARBE BLEIBT DIESELBE, und das ist eine Entscheidung, keine
Bequemlichkeit: Gemessen liegt der naechstbeste eigene Farbton
(Tannengruen) 60 Lab-Einheiten vom Marineblau entfernt -- er waere
also klar unterscheidbar gewesen. Nur haette der Treff damit wie ein
DRITTES Haus ausgesehen, neben Spicy Media und Team Dogi. Er ist
aber kein drittes Haus, sondern eine zweite Tuer in demselben:
"lila und babyblau ueberall" (Filipe, 10.09.2026). Unterschieden
werden die Tueren durch das WORT darauf, nicht durch die Farbe --
so, wie man es in einem Gebaeude auch macht.
node tools/crew-buehne.mjs
WAND_TEXT="DER TREFF" WAND_PRAEFIX=treff-gate node tools/crew-buehne.mjs
*/
const WAND_TEXT = process.env.WAND_TEXT || "TEAM DOGI";
const WAND_PRAEFIX = process.env.WAND_PRAEFIX || "crew-gate";
for (const q of [SZENE, DOGI]) {
if (!existsSync(q)) { console.error(`Fehlt: ${q}`); process.exit(1); }
}
@@ -324,14 +295,14 @@ async function bauen({ breite, ausschnitt = null, guete = 0.92, dunkel = 0.08,
g.restore();
}
/* ---- 5. Der Name auf der Tuer --------------------------------- */
/* ---- 5. "TEAM DOGI" ------------------------------------------- */
const schriftHoehe = Math.round(zh * 0.072);
g.save();
g.textAlign = "center";
g.textBaseline = "alphabetic";
g.font = `800 ${schriftHoehe}px "Segoe UI", system-ui, sans-serif`;
/* 0,955 lag halb unter dem Bildrand -- im Bildschirmfoto war von
dem Namen die untere Haelfte abgeschnitten. Jetzt so weit
"TEAM DOGI" die untere Haelfte abgeschnitten. Jetzt so weit
herauf, dass die Unterlaengen noch auf dem Wasser stehen. */
const ty = zh * 0.915;
/* Erst ein kalter Schein darunter, dann die Schrift in Metall --
@@ -339,7 +310,7 @@ async function bauen({ breite, ausschnitt = null, guete = 0.92, dunkel = 0.08,
g.shadowColor = "rgba(70,150,220,0.85)";
g.shadowBlur = schriftHoehe * 0.9;
g.fillStyle = "rgba(10,25,45,0.9)";
g.fillText(a.text, mx, ty);
g.fillText("TEAM DOGI", mx, ty);
g.shadowBlur = 0;
const metall = g.createLinearGradient(0, ty - schriftHoehe, 0, ty);
metall.addColorStop(0, "#ffffff");
@@ -347,7 +318,7 @@ async function bauen({ breite, ausschnitt = null, guete = 0.92, dunkel = 0.08,
metall.addColorStop(0.55, "#7ea6c6");
metall.addColorStop(1, "#e8f2fa");
g.fillStyle = metall;
g.fillText(a.text, mx, ty);
g.fillText("TEAM DOGI", mx, ty);
g.restore();
/* ---- 6. Vignette und ein Hauch Dunkel ------------------------- */
@@ -393,7 +364,7 @@ async function bauen({ breite, ausschnitt = null, guete = 0.92, dunkel = 0.08,
dogiKasten,
};
}, { szene: szeneDaten, dogi: dogiDaten, breite, ausschnitt, guete, dunkel, vignette,
ohneDogi, tafel: TAFEL, text: WAND_TEXT });
ohneDogi, tafel: TAFEL });
return { ...roh, puffer: Buffer.from(roh.bild.split(",")[1], "base64") };
}
@@ -468,17 +439,17 @@ let gebaut = 0;
console.log("\n--- Quer ---");
for (const b of [960, 1280, 1600, 1920, 2560]) {
const r = await bauen({ breite: b, guete: 0.93, dunkel: 0.08, vignette: 0.26 });
writeFileSync(join(ZIEL, `${WAND_PRAEFIX}-${b}.webp`), r.puffer);
writeFileSync(join(ZIEL, `crew-gate-${b}.webp`), r.puffer);
gebaut++;
if (r.rotAnteil > 0.01) maengel.push(
`${WAND_PRAEFIX}-${b}: noch ${(r.rotAnteil * 100).toFixed(1)} % rote Bildpunkte -- Umfaerbung hat nicht gegriffen`);
`crew-gate-${b}: noch ${(r.rotAnteil * 100).toFixed(1)} % rote Bildpunkte -- Umfaerbung hat nicht gegriffen`);
if (r.tafelMittel > 46) maengel.push(
`${WAND_PRAEFIX}-${b}: die Tafel ist zu hell (${r.tafelMittel.toFixed(1)}) -- die Karte braucht einen ruhigen Grund`);
`crew-gate-${b}: die Tafel ist zu hell (${r.tafelMittel.toFixed(1)}) -- die Karte braucht einen ruhigen Grund`);
if (r.tafelStreuung > 34) maengel.push(
`${WAND_PRAEFIX}-${b}: in der Tafel ist zu viel Muster (Streuung ${r.tafelStreuung.toFixed(1)})`);
`crew-gate-${b}: in der Tafel ist zu viel Muster (Streuung ${r.tafelStreuung.toFixed(1)})`);
console.log(` ${WAND_PRAEFIX}-${b}.webp`.padEnd(30)
console.log(` crew-gate-${b}.webp`.padEnd(30)
+ `${(r.puffer.length / 1024).toFixed(0)} KB · ${r.breite}x${r.hoehe}`
+ ` · Rot ${(r.rotAnteil * 100).toFixed(2)} %`
+ ` · Tafel ${r.tafelMittel.toFixed(1)}/${r.tafelStreuung.toFixed(1)}`);
@@ -500,11 +471,11 @@ for (const b of [440, 580, 900]) {
ausschnitt: [0.13, 0.02, 0.32, 0.98], guete: 0.88,
dunkel: 0.22, vignette: 0.30,
});
writeFileSync(join(ZIEL, `${WAND_PRAEFIX}-hoch-${b}.webp`), r.puffer);
writeFileSync(join(ZIEL, `crew-gate-hoch-${b}.webp`), r.puffer);
gebaut++;
if (r.rotAnteil > 0.01) maengel.push(
`${WAND_PRAEFIX}-hoch-${b}: noch ${(r.rotAnteil * 100).toFixed(1)} % rote Bildpunkte`);
console.log(` ${WAND_PRAEFIX}-hoch-${b}.webp`.padEnd(30)
`crew-gate-hoch-${b}: noch ${(r.rotAnteil * 100).toFixed(1)} % rote Bildpunkte`);
console.log(` crew-gate-hoch-${b}.webp`.padEnd(30)
+ `${(r.puffer.length / 1024).toFixed(0)} KB · ${r.breite}x${r.hoehe}`
+ ` · Rot ${(r.rotAnteil * 100).toFixed(2)} %`);
}