Commit Graph
215 Commits
Author SHA1 Message Date
DogFatherGitandClaude Opus 5 de19684883 Jede Seite erklaert sich selbst -- drei Zeilen, und die dritte rechnet sich aus
Filipe: "ich will in jeder seite auch eine kleine detaillierte aber
schnelle erklaerung kurz und knapps noch zu jeder seite."

DREI ZEILEN AUF JEDER DER 25 SEITEN

  WOFUER    was auf dieser Seite steht
  DU TUST   was man hier konkret macht
  MERKE     nur dort, wo es etwas gibt, das man falsch versteht
  SIEHT     wer diese Seite ueberhaupt oeffnen kann

Offen sichtbar und nicht hinter einem Aufklapper: "schnell" war seine
Bedingung, und eine Erklaerung, die man erst aufklappen muss, ist
genau dann nicht da, wenn man sie braucht.

DIE ZEILE "SIEHT" IST GERECHNET, NICHT GESCHRIEBEN

Sie kommt aus der Rechtetafel -- aus derselben, aus der auch die
Schranke ihre Entscheidung holt. Haette ich sie danebengeschrieben,
waere sie beim ersten Umstellen in "Wer sieht was" still falsch
geworden, in einem Satz, der behauptet, wer etwas sieht. Die Pruefung
stellt die Tafel deshalb wirklich um und sieht nach, ob der Satz
mitwandert.

Die Erklaerung haengt hinter derselben Schranke wie die Seite: Wer sie
nicht oeffnen darf, bekommt 404 -- nicht 403, sonst waere dieser Weg
eine Landkarte des Hauses.

Eingebunden ist sie nicht ueber eine Liste von Dateinamen, sondern
ueber "wer kopf.js laedt": die 26. Seite ist damit automatisch dabei.
Fuenf Seiten haben keine Kopfzeile (Chat, Kalender, Start, Team,
Teamlage) -- dort haengt der Kasten an <main>, sonst waeren
ausgerechnet die haeufigsten Seiten lautlos leer geblieben.

ZWEI EIGENE MAENGEL, GEFUNDEN DURCH HINSEHEN, NICHT DURCH DIE PRUEFUNG

Die erste Fassung war gruen -- und stand mitten auf dem Buehnenbild,
mit einem Lichtfleck hinter "SIEHT". Und "Wofuer" sprach fast woertlich
die Unterzeile darueber nach. Beides misst die Pruefung jetzt: Kontrast
mit dem dritten Ausgang ("steht auf der Buehne" ist kein Ergebnis) und
die Wortueberschneidung mit der Unterzeile.

ZWEI BEFUNDE, DIE SCHON VORHER ROT WAREN

1. pruef-tempo-workspace verglich die UNKOMPRIMIERTE Groesse gegen eine
   Grenze, die fuer die Leitung gedacht war -- waehrend der Kommentar
   daneben "das ist, was wirklich ueber die Leitung ging" behauptete.
   Live steht Caddy davor. Nachgemessen an der echten Adresse:
   start.css 345 KB -> 111 KB zstd. Die Pruefung wog also 1,2 MB, wo
   Filipe 500 KB bekommt. Jetzt wird Komprimierbares im Pruefstand
   gzip-gepackt (115 KB gegen 111 KB live -- auf vier Prozent genau),
   geurteilt wird ueber die uebertragene Groesse, berichtet werden
   beide. Dabei prompt in die dokumentierte Falle getappt: `body()` auf
   einen Ereignisstrom endet nie, der Lauf blieb stehen. Jetzt
   ausgenommen, plus Notbremse je Koerper.

2. pruef-ueberlappung konnte seit Tagen nicht mehr zeigen, dass sie
   eine Ueberlappung ueberhaupt findet: Ihre Gegenprobe legt einen Knopf
   auf einen anderen, traf aber 6 px daneben. Zwei Ursachen in einer
   Zeile -- `position: fixed` bezieht sich auf einen Vorfahren mit
   `transform`, und die `transition` der Knoepfe liefert beim sofortigen
   Messen die Lage von vorher. Jetzt `transform` + `transition: none`:
   34x36 px erkannt, 20 Seiten-Breiten-Paare, 0 Befunde.

PRUEFUNGEN: pruef-erklaerung neu mit 44, davon 8 im Browser (Seite mit
und ohne Kopfzeile, Handy, Kontrast, Echo). Mein Schild stand auf
10,88 px und lag unter der Hausgrenze von 11,5 -- gefunden von
pruef-css-klassen, nicht vom Auge.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-14 18:20:30 +02:00
DogFatherGitandClaude Opus 5 e82bf45f0d Ein Zeitraum geht jetzt durch -- als Zeitraum, nicht als Tag
Filipe: "verbesser das, also ich will dass das auch so geht, mach dass
es funktioniert, ich will es so einfach und perfekt wie moeglich. also
sieh zu dass die excel auch so durch geht."

Backstage gibt eine Ausgabe fuer einen ZEITRAUM heraus --
"2026-09-01 ~ 2026-09-13", eine Zeile je Creator, alle Zahlen
aufsummiert. Am Vormittag wurde so eine Zeile abgewiesen. Jetzt geht
sie durch.

DREI WEGE WAEREN MOEGLICH GEWESEN, ZWEI DAVON WAEREN
ZAHLENFAELSCHUNG:
  * auf den ersten Tag schreiben -> dreizehn Tage auf einem Tag; die
    Zahl steht da, sie ist gross, sie sieht richtig aus, und niemand
    kann spaeter sagen, was darin steckt;
  * gleichmaessig verteilen -> erfundene Tage, die es nie gab.
Der dritte ist dieser: den Zeitraum ALS Zeitraum ablegen. Was drinsteht,
ist dann wahr -- und was er nicht sagt (welcher Tag wie lief),
behauptet er auch nicht.

EIGENE TABELLE UND NICHT EIN FELD IN `leistung`: Dort ist der
Schluessel (creator, tag). Ein Zeitraum ab dem 1. September wuerde mit
dem ECHTEN 1. September zusammenstossen, und eine der beiden Zahlen
waere weg. Getrennt kann keines das andere ueberschreiben -- und die
Wochenzahlen bleiben, was sie sind: aus Tagen gerechnet.

Der Schluessel ist (creator, von, bis): Dieselbe Datei zweimal
einzulesen ersetzt denselben Zeitraum, statt ihn zu verdoppeln.

AUF DER SEITE steht ein eigener Block zwischen Woche und Tageszeilen:
die Spanne vorn, die Zahl der Tage als Marke daneben, die Werte
darunter. Dazu EINE Umrechnung, und nur diese: "Ø 4.129 Diamanten pro
Tag" -- als Durchschnitt bezeichnet, nirgends gespeichert. Wer eine
Woche vergleichen will, braucht sie; wer sie fuer einen echten Tag
haelt, hat das Wort nicht gelesen. Darueber steht woertlich, dass diese
Zahlen nicht in die Wochenzahlen eingehen.

MIT DER ECHTEN DATEI GEMESSEN: alle 8 Zeilen gehen durch, 8 als
Zeitraum, 0 abgelehnt. Spanne 01.09.-11.09. = 11 Tage, Diamanten
53.679, Dauer 5171 Minuten.

pruef-backstage-import 86 -> 106. Die Pruefung, auf die es ankommt, ist
nicht "es wird gespeichert", sondern "es wird NICHT in die Woche
gemischt": kein Tag kommt hinzu, die Wochenzahl bleibt Ziffer fuer
Ziffer dieselbe. Dazu die Gegenprobe, dass ein Zeitraum von EINEM Tag
weiterhin ein Tag bleibt -- sonst hiesse alles andere nur, dass jetzt
alles als Zeitraum abgelegt wird.

DREI PRUEFUNGEN GEDREHT, KEINE GELOESCHT: Zwei behaupteten noch die
Ablehnung vom Vormittag. Und tagAusZelle() hat jetzt DREI Ausgaenge
statt zwei (Tag, Zeitraum, Grund) -- geprueft wird, dass nie zwei davon
gleichzeitig kommen. Gaebe es zwei, entschiede jeder Aufrufer selbst,
was Vorrang hat, und der zweite entschiede anders als der erste. Genau
daran ist heute frueh der Zeitraum-Schutz gescheitert.

ZWEI EIGENE MESSFEHLER, beide von der Pruefung gefunden: Ich verlangte
"kein einziger Tag in der Spanne" und uebersah, dass weiter oben schon
ein Tag geschrieben worden war, der hineinfaellt -- gemessen wird jetzt
die VERAENDERUNG. Und ich mass den Zeitraum-Block, waehrend ein anderer
Creator geoeffnet war: keine Frage an die Seite, sondern an die falsche
Person.

Nebenbei zum zweiten Mal heute: eine Versalzeile mit 10,88 px. Auf
.72rem angehoben, bevor pruef-css-klassen sie findet.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-14 16:23:16 +02:00
DogFatherGitandClaude Opus 5 9f277435a5 Reaktionen: Vorschlaege, ganzer Katalog, eigene Favoriten
Filipe: "soll viel besser und geiler sein und man soll auch auswaehlen
koennen, also paar als vorschlaege mit der moeglichkeit andere
auszuwaehlen und als favoriten zu speichern."

Aus einem Streifen mit sechs Zeichen ist eine Karte geworden:
Vorschlaege oben, Suchfeld, darunter der Katalog in sechs Gruppen --
82 Zeichen, jedes mit deutschen Suchwoertern. Wer "feuer" tippt, muss
nicht scrollen.

DREI LISTEN, DREI FRAGEN, und sie werden gern verwechselt:
  KATALOG    Was gibt es?              fest, workspace-reaktionen.js
  VORSCHLAG  Was steht vorn, solange   fest -- bis jemand eigene
             ich nichts gewaehlt habe? Favoriten hat
  FAVORITEN  Was hat DIESER Mensch     in der Datenbank
             sich gemerkt?

Nur der Katalog entscheidet, was ANGENOMMEN wird. Vorschlag und
Favoriten sind Reihenfolge, keine Erlaubnis -- sonst koennte man sich
ueber einen Favoriten etwas erlauben, das im Katalog nicht steht. Die
erlaubte Menge wird aus dem Katalog ABGELEITET; eine zweite Liste
daneben waere die, in der ein Zeichen fehlt, das die Oberflaeche
anbietet.

FAVORITEN HAENGEN AM MENSCHEN, NICHT AM GERAET. Im Browser abgelegt
waeren sie am Handy andere als am Rechner und beim naechsten Loeschen
der Seitendaten weg.

DER STERN SCHALTET EINEN MODUS, statt an jedem Zeichen einen zweiten
Knopf zu haben: Am Handy gibt es kein "daneben zeigen". Im Merk-Modus
faerbt sich die ganze Tafel, damit niemand reagiert, wenn er merken
wollte. Die Tafel bleibt dabei offen -- acht Favoriten waeren sonst
acht Mal Aufmachen -- und die Vorschlagszeile aendert sich sofort mit.

DIE GRENZE SAGT BESCHEID, statt still den aeltesten wegzuwerfen: Wer
einen neunten merken will, bekommt "nimm erst einen weg". Ein Favorit,
der ohne Ansage verschwindet, sieht wie ein Fehler aus.

Eine Selbstpruefung beim Laden meldet doppelte Zeichen im Katalog und
Vorschlaege, die nicht darin stehen -- beides waere in der Tafel still.

pruef-chat-aufloesen 85 -> 115. Gemessen wird, was PASSIERT, nicht dass
es Elemente gibt: dass die Suche wirklich eingrenzt (1 statt 82) und
das Richtige findet, dass ein Fehlgriff "Nichts zu ... gefunden" sagt
statt eine leere Flaeche zu zeigen, und vor allem, dass im Merk-Modus
KEINE Reaktion entsteht -- an der Zahl der Reaktionen gemessen, nicht
an der Absicht.

NEBENBEFUND AUS DER EIGENEN PRUEFUNG: pruef-css-klassen hat meine
Gruppenueberschrift mit 10,56 px abgelehnt (Grenze 11,5). Richtig so --
eine gesperrte Versalzeile ist ohnehin schwerer zu lesen, die darf
nicht auch noch die kleinste sein. Auf .72rem angehoben, statt die
Grundlinie zu verschieben.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-14 14:04:57 +02:00
DogFatherGitandClaude Opus 5 47269bda21 Chat: auf eine Nachricht reagieren, ohne zu antworten
Filipe: "ich will dass man auf die nachrichten auch reagieren kann mit
einem emoji, die nachricht selbst ohne zu antworten."

Neben "antworten" steht jetzt "reagieren". Ein Klick klappt sechs
Zeichen auf, ein zweiter Klick setzt es -- und unter der Nachricht
steht, wer mit was reagiert hat.

EINE FESTE AUSWAHL, KEIN FREIES FELD (👍 ❤️ 😂 😮 🔥 🙏). Drei Gruende,
der erste ist der wichtigste: Eine feste Liste laesst sich pruefen --
was dort nicht drinsteht, kommt nicht in die Datenbank, kein beliebiger
Text, keine 4-KB-Zeichenketten. Zweitens sehen alle dasselbe. Drittens
kann man sechs Zeichen ueberfliegen; eine volle Tafel ist eine
Suchaufgabe, und dann tippt man doch wieder "ok".

DIE LISTE STEHT AUF DEM SERVER und wird an die Oberflaeche geliefert.
Stuende sie im Browser, gaebe es sie zweimal -- und die zweite Fassung
waere die, in der ein Zeichen fehlt, das der Server noch annimmt. Faellt
der Abruf aus, erscheint KEINE Auswahl statt einer mit erfundenen
Zeichen.

DER PRIMAERSCHLUESSEL BEANTWORTET "WIE OFT?": (nachricht, person,
zeichen). Eine Person darf verschiedene Zeichen geben, jedes aber nur
einmal -- und zwar durchgesetzt von der Datenbank, nicht von einer
Abfrage davor, die man vergessen kann. Derselbe Klick noch einmal nimmt
es zurueck; das erspart einen zweiten Weg, den man auch absichern
muesste.

KEIN ZAEHLER IN chat_nachrichten. Eine mitgefuehrte Zahl muesste bei
jedem Hin und Her stimmen und ist genau die Art Angabe, die irgendwann
nicht mehr stimmt und die niemand nachrechnet. Gezaehlt wird beim
Lesen -- in EINER Abfrage fuer alle 200 Nachrichten, nicht je Zeile
eine.

WER ES WAR, STEHT IM TITEL. "Drei Daumen" sagt weniger als "Ayla, Ben
und Cem", und es sind Leute aus demselben Raum.

KEINE BENACHRICHTIGUNG AUFS HANDY. Wer im Raum ist, sieht es sofort;
wer nicht, bekommt nichts. Ein Daumen ist keine Nachricht -- wer dafuer
geweckt wird, schaltet Meldungen ab.

Was NICHT geht: wer nicht im Raum ist (404), ein erfundenes Zeichen
(400), eine zurueckgenommene Nachricht (409). Und mit der Nachricht
verschwinden die Reaktionen (CASCADE).

pruef-chat-aufloesen 59 -> 85. Gemessen wird der BESTAND, nicht die
Antwort -- und im Browser der KNOPF, nicht nur das Recht: dass die
Auswahl aufklappt, sich nach dem Klick von selbst schliesst, die
Reaktion darunter erscheint, als die eigene erkennbar ist und ein Klick
darauf sie wieder wegnimmt.

EINE EIGENE PRUEFUNG WAR ZU SCHWACH: "bei Cem ist ueberall selbst=true"
war trivial wahr, weil es nur EINE Sorte gab. Jetzt bekommt eine andere
Person ein drittes Zeichen, und in derselben Antwort muss eines auf
true und eines auf false stehen. Eine Angabe, die nie `false` sein kann,
sagt nichts.

Im CSS keine vierte Abschrift: "reagieren" haengt an derselben Regel
wie "antworten" -- neben anheften und kopieren waere es die vierte fast
gleiche gewesen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-14 13:46:31 +02:00
DogFatherGitandClaude Opus 5 58932ece8c Excel-Dateien werden gelesen -- und drei Fallen dahinter entschaerft
Filipe: "mach doch bitte so dass man alle dateien hoch laden könne auch
excel dateien. gib gas und krieg das hin."

server/workspace-xlsx.js liest .xlsx mit Bordmitteln: Eine .xlsx ist ein
ZIP mit XML darin, und Node kann beides (`zlib.inflateRawSync`). Kein
zusaetzliches Paket fuer eine Datei mit neun Zeilen.

GEMESSEN AN ZWEI ECHTEN BACKSTAGE-AUSGABEN vom 11. und 12.09.2026, die
auf dem Rechner lagen -- nicht an der Dokumentation. Sie haben mir an
drei Stellen widersprochen, und JEDE davon waere sonst ein stiller
Fehler geworden:

1. DER ZEITRAUM. In "Datenzeitraum" steht `2026-09-01 ~ 2026-09-11`.
   `datumLesen` griff sich davon den ersten Tag -- elf Tage Diamanten
   waeren auf den 1. September gebucht worden. Die Zahl steht da, sie
   ist gross, sie sieht richtig aus, und niemand kann spaeter sagen,
   dass elf Tage darin stecken. Neu: `zeitraumLesen`; eine Zeile mit
   einem Zeitraum ueber mehrere Tage wird abgelehnt UND begruendet
   ("Stell in Backstage den Zeitraum auf EINEN Tag"). Ein Zeitraum von
   einem Tag geht durch.

2. DIE EINHEIT. "LIVE-Dauer" enthaelt `86Std. 10Min. 52Sek.`.
   `zahlLesen` ergab daraus `null` -- die Dauer fiel weg. Bei einem
   anderen Trennzeichen waere es schlimmer gewesen: 86 statt 5171,
   Faktor 60 daneben und plausibel. Neu: `dauerLesen`, versteht die
   deutsche und englische Schreibweise, die Uhrzeitform und weiterhin
   die blosse Zahl.

3. DIE DATUMSSPALTE. `/datum|date|tag|day/i` erklaerte "Tage seit dem
   Beitritt" zur Datumsspalte (Wert "65") und traf in der
   Leistungstabelle "Gueltige LIVE-Gehen-Tage" genauso. Jetzt nur noch
   als ganzes Wort, dafuer mit "zeitraum" -- Backstages Spalte wurde
   bisher nur zufaellig gefunden, weil in "Daten" die Silbe "date"
   steckt.

Gefunden hat das keine Ueberlegung, sondern der ganze Weg einmal mit
der echten Datei durchlaufen.

WEITER GEBAUT:
- Titelzeilen werden uebersprungen: "Creator:innen verwalten" hat in
  Zeile 1 nur "Exportiert am :…", die Ueberschriften stehen darunter.
  Die Regel misst (drei gefuellte Felder UND halb so breit wie die
  breiteste Zeile), statt eine feste Zahl zu nehmen.
- Fehlende Zellen verschieben nichts: Eine leere Zelle steht in der
  Datei gar nicht; wer der Reihe nach liest, verrutscht ab dort jede
  Spalte, und die Zeile sieht voll aus.
- Datums-Seriennummern werden nur umgerechnet, wenn das FORMAT es sagt
  (sonst stuende 46271 in der Vorschau). Der Nullpunkt ist an zwei
  nachschlagbaren Werten festgenagelt.
- Der Backstage-Dialog nimmt die Datei jetzt AUCH -- dort gehoert sie
  hin, denn Filipes Ausgabe enthaelt alle Creator auf einmal. Sie fuellt
  das Einfuegefeld; ab da laeuft derselbe Weg wie beim Einfuegen. Keine
  zweite Fassung derselben Regeln.
- Die alte .xls (BIFF, kein ZIP) wird erkannt und bekommt einen Weg
  gezeigt, statt "ging nicht" zu sagen.

NEU: pruef-xlsx.mjs (60) -- baut seine Dateien selbst (ZIP-Schreiber in
helfer-xlsx-bauen.mjs), damit keine Creator-Daten ins Repo wandern und
auch Faelle pruefbar sind, die es als Datei nicht gibt: kaputtes
Verzeichnis, fehlendes Blatt, abgeschnittene Datei. Jeder davon mit
Gegenprobe, dass die heile Datei durchgeht.

pruef-backstage-import 77 -> 82, dabei zwei Pruefungen GEDREHT: Die
.xlsx bekommt keine Absage mehr, sondern eine Vorschau.

DREI EIGENE FEHLER DABEI, alle von einer Messung gefunden:
- Ich hielt Seriennummer 46264 fuer den 06.09.; es ist der 30.08. Der
  Code hatte recht. Deshalb stehen jetzt zwei nachschlagbare Anker drin.
- Eine Zeile war gruen, weil mein Muster den SPALTENNAMEN
  "Datenzeitraum" traf statt der Begruendung. Jetzt wird auf den Text
  der Ablehnung geprueft.
- Beim Umbau habe ich pruef-backstage-import beschaedigt (ein
  Suchtreffer weiter oben als gemeint) und aus Git zurueckgeholt.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-14 11:35:21 +02:00
DogFatherGitandClaude Opus 5 e3aeeb01cd Rollen wechseln: auch Spicy Media -- und DogFather ist nicht mehr vergebbar
Filipe: "ich will dass die rolle spicy und dogfather, auch die rollen
wechseln koennen wenn die personen schon drin sind. von alle
kategorien, creator, scouts, manager spicy. dogfather soll man nicht
auswaehlen koennen. das ist die einzige die man nicht auswaehlen kann
bitte."

ZWEI AENDERUNGEN, BEIDE IN EINER LISTE (ANLEGBAR):
  admin: alles AUSSER der eigenen Rolle
  spicy: spicy, manager, scout, creator   (vorher ohne spicy)

Weil die Oberflaeche ihre Knoepfe aus derselben Auskunft baut
(`darf_anlegen` in /api/ich), verschwindet DogFather damit von selbst
aus JEDER Auswahl -- beim Anlegen wie beim Wechseln, bei Spicy Media
wie bei DogFather. Eine Liste, zwei Formulare, kein Nachziehen.

WAS DAS BEDEUTET, damit es niemand spaeter sucht: Es laesst sich kein
zweiter DogFather-Zugang mehr anlegen und niemand mehr zu einem
befoerdern. Der bestehende ist durch Sicherung 3 geschuetzt (nie den
letzten herabstufen) und kann nicht versehentlich verschwinden.
Zurueckdrehen laesst sich das nur in ANLEGBAR.

DIE TUER: /verwaltung haengt an nurAdmin, und dort steht jetzt eine
DRITTE enge Ausnahme -- PUT auf genau /personen/<Ziffern>/rolle, fuer
genau die Rollen aus darfRollenWechseln(). Gleiche Bauweise wie die
beiden davor (Liste fuer Spicy Media, Liste fuer die rechte Hand). Was
NICHT mitgeht: Codes, Sperren, Loeschen, Zuteilung, Protokoll.

EINE NEUE SICHERUNG, weil sich die Tuer geoeffnet hat: An einer
DogFather-Zeile aendert nur DogFather. Die bestehenden Pruefungen sehen
auf die ZIEL-Rolle ("darfst du 'manager' vergeben?") -- dass die
BETROFFENE Person DogFather ist, kam darin bis heute nicht vor.
Sicherung 3 haette es heute zufaellig abgefangen, weil es genau einen
gibt; eine Sperre, die nur wegen einer Zahl im Bestand haelt, ist
keine.

DIE OBERFLAECHE: "Rolle aendern" und "Loeschen" hingen an EINER Zeile
(`ich.rolle === 'admin'`). Sie gehoeren nicht zusammen -- Loeschen
bleibt bei DogFather. Und die CSS-Regel, die fuer Spicy Media die ganze
Knopfreihe ausblendete, ist weg: Welche Knoepfe es gibt, entscheidet
jetzt personen.js, und was nicht entsteht, muss man nicht verstecken.

pruef-spicy 62 -> 83. Gemessen wird jede der vier Kategorien EINZELN
(waere nur eine offen, saehe "geht" genauso aus), dazu: admin weder von
Spicy Media noch von DogFather vergebbar, an DogFathers Zeile aendert
sie nichts (und er ist danach nachweislich noch admin), ein Manager
kommt an den Weg nicht, loeschen bleibt zu -- und im Browser, dass der
KNOPF da ist, nicht nur das Recht. Genau daran war heute frueh im Chat
eine Stunde draufgegangen.

Dabei zwei eigene Messfehler gefunden: Die Knoepfe entstehen erst in
einer AUFGEKLAPPTEN Kategorie (vorher zu frueh gemessen), und /api/ich
wird jetzt als Vorbedingung geprueft.

DREI PRUEFUNGEN GEDREHT, KEINE GELOESCHT:
- pruef-personen-formular: 7 Karten, `admin` fehlt (eigene Aussage).
  Die Zeichenpruefung verglich die rechte Hand gegen die Admin-KARTE --
  die es nicht mehr gibt; sie lief gegen `undefined`. Ersatz ist das
  Zeichen selbst, und der Kommentar sagt, dass das schwaecher ist.
- pruef-haus-trennung: Der zweite DogFather entsteht jetzt im Bestand
  statt ueber die Schnittstelle, und DASS die Schnittstelle ihn
  ablehnt, ist der erste Prueffall geworden. Sonst waere "nie den
  letzten DogFather" ab heute ungeprueft -- weil ihre Voraussetzung
  schwerer herzustellen ist.
- pruef-creator-anlegen: aus einer Aussage zwei (die vier sind da UND
  admin fehlt).

Gruen: personen-liste, personen-kachel, verborgen, manager-sicht,
creator-anlegen, haus-trennung, personen-formular, spicy, rollen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-12 00:25:47 +02:00
DogFatherGitandClaude Opus 5 bba3642664 Aus der Probe wird ein Zugang - und die Seite sagt nicht mehr "Agentur"
Die drei offenen Punkte aus Abschnitt 9 des Plans, plus Filipes zweite
Ansage: "auf dieser seite soll nichts stehen von agentur, diese seite
hier ist nur fuer mich meine modis und meine community."

1. PROBE -> ZUGANG (ein Knopf statt eines Satzes)

Auf der Stufe "Probe" stand bisher "Zugang in Personen & Zugaenge
anlegen, Rolle Modi" - und wer das vergass, hatte eine Karte auf "Im
Team" und keinen Menschen darin. Jetzt haengt das Anlegen am Schritt
selbst.

Ueber DENSELBEN Weg wie in "Personen & Zugaenge", nicht ueber einen
zweiten: POST /workspace/api/verwaltung/personen, mit ihrer
Rechtepruefung, ihrem Protokolleintrag und ihrem genau einmal
angezeigten Code. Der Talente-Server legt selbst keinen einzigen Zugang
an, und die Pruefung zaehlt nach, dass es bei einem Weg bleibt.

Der Code steht im gleichen Kasten wie dort - die Gestaltung ist aus
personen.css nach start.css umgezogen, weil talente.html sie sonst nicht
laedt. Ein Geheimnis sieht im ganzen Haus gleich aus. Er steht
ausserhalb der Liste, sonst waere er in dem Moment weg, in dem er
entsteht: wenn die Karte auf "Im Team" springt.

Die rechte Hand bekommt an dieser Stelle KEINEN Knopf, sondern einen
Satz. Ein Knopf, der ihr jedes Mal "darfst du nicht" antwortet, waere
schlechter als gar keiner - er verspricht etwas.

2. DIE EIGENE KARTE (Abschnitt "Deine Karte")

Wer beschrieben wird, darf es lesen - aber erst, wenn ALLE gesetzt
haben (sonst waere die erste Einschaetzung eine Vorgabe fuer die
zweite), und ohne Namen und ohne Anlasstext. Gemessen in beide
Richtungen: vorher nicht sichtbar, nachher sichtbar.

3. DER VORLAGENTEXT

Gebaut aus den angeklickten Merkmalen, in einem Feld zum Aendern, nicht
zum Abschicken. Ohne Merkmale steht auch keines drin.

4. "GILT FUER" SAGT DER SERVER

In bereich.js stand woertlich "Agentur" - richtig auf der
Agenturadresse, falsch auf jeder anderen. Jetzt liefert der Server
`gehoert` ("Der Treff" / "Team Dogi" / "Agentur"); gemessen mit einem
einzigen Menschen auf zwei Adressen.

PRUEFUNGEN: treff 58 -> 66, nachwuchs 69 -> 109, neue-seiten 70 -> 93.
Die Katalogseiten werden jetzt auch mit den Augen der rechten Hand
angesehen - ohne das waere "Deine Karte" nie auf einem Bildschirm
gewesen. Und pruef-neue-seiten wartet nicht mehr 900 ms, sondern bis
sich der Text nicht mehr aendert: Die Karte stand da und wurde
trotzdem als fehlend gemeldet, weil zu frueh gelesen wurde.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 23:13:50 +02:00
DogFatherGitandClaude Opus 5 44e5ace109 "Wer sieht was" auf beiden Adressen — und die Tafel lässt sich umstellen
Filipe: "ich will die kategorie auch auf der team dogi seite für die
dogfather und rechte hand rollen ... und wenn man drauf drückt,
perfektionieren so dass ich die da auch manuell wechseln und speichern
kann."

DIE KACHEL STAND NUR AUF DER AGENTURSEITE. Auf der Team-Dogi-Seite
arbeitet ihr aber täglich; dort nicht nachsehen zu können, wer was darf,
hieße, die Frage an dem Ort zu stellen, an dem man gerade nicht ist. Sie
steht jetzt auf beiden — einmal beschrieben, zweimal benutzt.

ANSEHEN BEIDE, UMSTELLEN NUR DOGFATHER. Die rechte Hand bekommt
dieselbe Tafel und keine Knöpfe; nicht weil das Skript sie versteckt,
sondern weil der Server darf_aendern: false schickt. Wer Rechte vergeben
kann, kann sich Rechte vergeben — diese eine Tür bleibt bei ihm.

WAS GESPEICHERT WIRD, IST NUR DER UNTERSCHIED. In der Datenbank steht
eine Zeile nur, wenn sie vom Grundstand in rechte.js abweicht. Damit
bedeutet der Code weiterhin etwas: Man sieht, was gedacht war, und
daneben, was jemand daraus gemacht hat. "Zurück auf Grundstand" ist ein
DELETE, und eine neue Seite erbt automatisch den Grundstand — eine
vollständige Kopie in der Datenbank hätte sie nicht gekannt und sie wäre
für alle zu gewesen, ohne dass es jemand entschieden hätte.

DREI FELDER SIND FEST: DogFather kann sich die Rechte-, die Personen-
und die Startseite nicht selbst wegnehmen. Eine Einstellung, aus der man
sich aussperren kann, ist keine Einstellung, sondern eine Falle — und
sie wäre genau einen Fehlklick entfernt gewesen.

GESPEICHERT WIRD SOFORT, mit jedem Klick. Kein "Speichern" am Ende: Bei
zweihundert Feldern ist das die Stelle, an der eine halbe Änderung
verlorengeht, und eine halbe Änderung an Rechten ist die gefährlichste
Lage von allen. Rückfrage gibt es nur beim ÖFFNEN — etwas wegzunehmen
sieht sofort jemand, etwas aufzumachen unter Umständen lange niemand.

DER BEFUND, DEN DIE PRÜFUNG GEFUNDEN HAT: Nimmt man einem Modi eine
Seite weg, greift die Schranke sofort — und die KACHEL blieb stehen. Ein
Knopf, der auf die Startseite zurückwirft. Der Satz "Kachel und Tür
gehören zusammen" steht seit dem 06.09. im Code; bis heute war er eine
Bitte an den, der beides pflegt. Jetzt ist er eine Rechnung: Beide
Kachellisten — die des Servers und die im Browser — werden gegen
dieselbe Tafel gefiltert, aus der die Schranke ihre Entscheidung holt.

Geprüft wird nicht, ob die Antwort 200 lautet, sondern ob sich das
VERHALTEN ändert: Der Modi kommt danach wirklich nicht mehr hinein —
mit Gegenprobe davor. Und eine Umstellung überlebt einen Neustart; ohne
tafelLaden() beim Start hätte wieder der Grundstand gegolten, und es
hätte ausgesehen wie vorher.

Geprüft: rollen 315 · start-ansicht 147 · crew-adresse 132 · sicht 84 ·
modi-verborgen 80 · neue-seiten 70 · treff-werkzeuge 70 · nachwuchs 69 ·
treff 58 · rechte-umstellen 46 · entwicklung 40 · css-klassen 30 ·
zwischenspeicher 21 · alle-wege 19 · rechtetafel 19 — alles grün.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 22:42:21 +02:00
DogFatherGitandClaude Opus 5 dfd951861a Entwicklung & Nachwuchs: zwei Kataloge zum Anklicken statt zwei leerer Formulare
Filipe: "ich will dass diese zwei kategorien perfektionniert werden, ich
will dass fertige aufgaben da stehen und so ... so dass dogfather und
rechte hand es so einfach wie möglich haben aber so professionell wie
auch nur möglich."

Bis heute waren beide Kacheln ein leeres Formular: Titel tippen, Art
wählen, Text schreiben. Ein leeres Feld beantwortet keine Frage — es
stellt sie noch einmal.

ENTWICKLUNG: 34 Beobachtungen in fünf Blöcken, vier Antworten je Zeile
(Läuft · Wächst gerade · Da hakt es · Kann ich nicht sagen). Es sind
BEOBACHTUNGEN, keine Eigenschaften — "Absagen kommen rechtzeitig" statt
"ist zuverlässig". Eine Eigenschaft kann man nur bestätigen oder
bestreiten; ein Verhalten kann man gesehen haben oder nicht.

TALENTE: 21 Merkmale in fünf Gruppen, 6 Warnzeichen getrennt geführt,
fünf Trichterstufen mit je GENAU EINEM nächsten Schritt. Eine Liste
wächst und wird nie wieder angesehen; ein Trichter fragt bei jeder Karte
"und jetzt?". Die Standzeit steht dabei — "seit 41 Tagen beobachtet"
ist eine Auskunft über uns, nicht über den Kandidaten.

VIER RIEGEL, JEDER MIT GEGENPROBE:
 · Block 5 ("Wie geht es dir damit?") gehört der Person — lesend UND
   schreibend, auch vor DogFather. Er kommt gar nicht erst aus dem
   Server; Schreiben gibt dasselbe 404 wie ein erfundener Schlüssel.
   Nach außen dringt eine Ampel OHNE Namen, und die schweigt, solange
   das Team so klein ist, dass "jemandem geht es zu viel" dasselbe wäre
   wie ein Name.
 · Der Stand des anderen kommt erst nach dem eigenen Klick — sonst
   klickt man dasselbe. Sichtbar ist nur, DASS es einen gibt: sonst
   sähen "noch niemand" und "du darfst es nicht sehen" gleich aus.
 · "Da hakt es" ohne Anlass wird abgelehnt. "Läuft" nicht — 28
   Pflichtfelder je Person wären das Gegenteil von "so einfach wie
   möglich".
 · Talente gehört DogFather und der rechten Hand. Ein Modi bekommt 404
   auf Seite UND Schnittstelle.

WAS NICHT GEBAUT IST, UND WARUM: keine Punktzahl, kein Durchschnitt,
keine Rangliste, keine Gesamtnote. Eine Zahl über einem Menschen wird
gelesen, verglichen und weitererzählt. Und kein Rot — "da hakt es" ist
eine Beobachtung, kein Alarm.

DER PLAN LAG AN EINER STELLE FALSCH, gemessen statt vermutet: Er sagte
"keine neue Tabelle, der Stand liegt in punkt_stand". Dort ist der
Schlüssel (bereich, schluessel, creator_id) — genau EIN Stand je Punkt
und Person. Zwei unabhängige Augenpaare passen da nicht hinein, ohne
eine lebende Tabelle neu zu bauen. Also eine eigene.

EIN RÜCKSCHLAG, DEN NUR DIE PRÜFUNG GEFUNDEN HAT: Die Liste der
Bretter, die ein Modi oder die rechte Hand öffnen darf, wird aus den
KACHELZIELEN abgeleitet. Als die Kacheln auf die neuen Seiten zeigten,
fielen beide Bretter heraus — und die Seite verlinkte auf ein 404. Kein
Fehler im Riegel, sondern in seiner Quelle.

Dazu zwei kleinere Funde vom Hinsehen statt vom Messen: Die Ampel sagte
"Solange ihr zu 1 seid" (jetzt drei Sätze für drei Lagen), und die
Fußzeile der Talente-Seite lag auf der Bühne — die Kontrastprüfung hatte
sie übersprungen, weil ein Link darin steht. Beide behoben, und die
Prüfung hat den stillen Aussetzer gleich mit verloren.

Geprüft: rollen 314 · start-ansicht 147 · crew-adresse 132 · neue-seiten
70 · nachwuchs 69 · entwicklung 40 · css-klassen 30 · zwischenspeicher
21 · alle-wege 19 · rechtetafel 19 — alles grün.

Was noch fehlt, steht in der Notiz, Abschnitt 9: die eigene Karte für
die Person, der Übergang "Probe" → Zugang, der Vorlagentext zum
Ansprechen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 22:20:09 +02:00
DogFatherGitandClaude Opus 5 1ebaf8a864 Die drei neuen Seiten angesehen — und die Bühne lag hinter der Rechtetafel
Sie waren geprüft und nie ANGESEHEN. pruef-treff-seiten.mjs (42
Prüfungen, 1440 px und 390 px) holt das nach: Steht Text da, sind die
Platzhalter ersetzt, liegt etwas übereinander, schiebt die Seite
seitwärts, ist alles lesbar.

DER BEFUND, DEN KEINE ZAHL GESEHEN HAT: Hinter der Rechtetafel lag die
Bühne — Spicy-Media-Motiv, Neonlicht, Chilischoten — und die Zeilen der
Tabelle standen mitten darin. Die Kontrastmessung war grün, weil sie
gegen #07060f rechnete: Sie hatte den Grund nicht gemessen, sondern
angenommen. Ein grüner Haken über einer falschen Voraussetzung.

Behoben an beiden Enden:
 · Die Abschnitte bekommen eine DECKENDE Fläche — kein Kartenauftritt
   (keine Fase, kein Kantenlicht), nur ein Blatt Papier unter dem Text.
   Der Einwand von vorher (Karten zerteilen einen langen Text) bleibt
   damit gewahrt, die Bühne bleibt ringsum sichtbar.
 · Die Messung bekommt einen DRITTEN AUSGANG: Findet sie über einem Text
   keine deckende Fläche, ist das jetzt ein Fehler ("konnte nicht
   nachsehen") und kein stilles Grün.

Zwei weitere Meldungen waren Messfehler und sind als solche behoben,
nicht weggeklickt:
 · "Meine Sicht" überlappt sich selbst — das ist das <select> für
   Vorleseprogramme, das UNTER dem eigenen Bedienelement liegen MUSS.
   Ausgelassen wird jetzt, was ausdrücklich fürs Auge weggenommen wurde.
 · Die Rechtetafel ragt auf 390 px über den Rand — sie steht in einem
   Schiebekasten, und genau so soll eine Tabelle mit neun Spalten sich
   auf einem Handy verhalten. Gemessen wird jetzt, ob die SEITE schiebt.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 18:04:33 +02:00
DogFatherGitandClaude Opus 5 7b21f247eb Der Treff: eine eigene Tür für die Community, und sie sieht nur, was dasteht
Filipe: "eine community rolle und community kategorie, wo die community
auch dann nur die sieht" · "wieso nur eine kachel — ich will mehrere,
mit mehreren optionen" · "egal welche rolle hinzugefügt wird soll immer
nur das sehen was ich erlaube".

DIE DRITTE ADRESSE. treff.dogfather-universe.com bekommt eine eigene
Weiche (treff-adresse.js), eine eigene Zugangswand, ein eigenes Manifest
und acht eigene Bühnenbilder. Ohne sie stünde dort die Wand der Agentur:
Spicy-Logo, "Creator Workspace", fünf Rollenkacheln mit den Namen Admin,
Manager, Scout, Creator — die komplette Struktur des Unternehmens, vor
der Anmeldung, für jeden mit der Adresse.

Welche Wand zu welcher Tür gehört, steht jetzt in EINER Tafel
(istFremdeWand) statt als Sonderfall im Code. Bei zwei Wänden war ein
Sonderfall richtig; bei drei wären es drei geworden, bei vier sechs.

SIEBEN BRETTER UND EIN ACHTES NUR FÜRS TEAM. Anschlagbrett, Was ansteht,
Der Treff, Wunschliste, Highlights, Regeln & Hilfe, Mitmachen — dazu
"Meldungen & Maßnahmen", das ausdrücklich NICHT in TREFF_BEREICHE steht:
dort wäre es lautlos bei der Community gelandet und hätte ausgesehen wie
die anderen sieben.

WAS AUF DEN BRETTERN PASSIERT: "Will ich auch" (eine Stimme je Person,
erzwungen durch den Schlüssel, nicht durch eine Prüfung) · Anheften,
höchstens drei, gezählt IN der Transaktion · Freigabe vor Sichtbarkeit
für Termine und Highlights, wobei Abwesenheit der Ruhezustand ist ·
Melden mit Pflicht-Grund (DSA Art. 16) · Entfernen mit Grund, der den
Beitrag ÜBERLEBT (DSA Art. 17) · drei Stufen, gerechnet statt
gespeichert · die Bannleiter: Modi bis 7 Tage, dauerhaft nur DogFather
(seine Entscheidung) · "Mitmachen" wird zum Talent, genau einmal.

Der Ausschluss wirkt in sitzungLesen() — also nicht nur beim Schreiben.
Wer ausgeschlossen ist, ist weg, nicht stumm.

ZWEI SEITEN MEHR. treff-regeln.html holt seine ZAHLEN vom Server
(Mindestalter 18, Fristen, Anschläge) — ein Regeltext, der eine andere
Zahl nennt als die Regel, ist schlimmer als keiner. rechte.html rechnet
"Wer sieht was" aus derselben Tafel aus, aus der die Schranke ihre
Entscheidung holt. Die Community steht dort bei 3 von 23.

SECHS BEFUNDE, KEINEN HAT DAS LESEN GEFUNDEN:
 · Ein Modi kam über den verborgenen Zugang in den Treff — die Bedingung
   war durch Ausschluss formuliert und nahm die neue Wand automatisch mit
 · /api/personen gab einem Mitglied Namen und Rolle von DogFather
 · Ein DELETE mit Körper wird von Nodes HTTP-Parser mit einem leeren 400
   abgewiesen, bevor Express ihn sieht (gemessen). Der Grund reist jetzt
   in der Adresse
 · Der Kommentar, der erklärt, warum die Zugangswand keine Rollennamen
   nennt, nannte selbst einen — in einer ausgelieferten Datei
 · Zwei Listen für "welche Seiten sind ohne Anmeldung offen". Sie
   stimmten, weil beide am selben Tag entstanden
 · Ein Portkonflikt, den ich selbst gebaut hatte (4391 gehört
   pruef-chat-aufloesen)

Dazu zwei feste Zahlen abgeschafft (die 20 in pruef-rechtetafel, die
Kachelzahl in pruef-treff) und zwei Werkzeuge, die jetzt SUCHEN statt
aufzuzählen: Der Versionsstempel findet seine Manifeste selbst — das
dritte hätte sonst keinen bekommen, und die neue App hätte bis zu vier
Stunden lang das falsche Zeichen getragen. Das Bildwerkzeug baut beide
Zugangswände aus einer Vorlage mit zwei Werten.

Zwei neue Kacheltöne, gemessen statt gewählt: #2f2f7f (Abstand 31,4 in
Lab) und #7c2771 (29,7). Das schwächste Paar der vorhandenen 34 liegt
bei 24,9.

Geprüft: treff 69 · treff-werkzeuge 60 · rollen 312 · start-ansicht 147 ·
crew-adresse 129 · sicht 84 · modi-verborgen 80 · haus-trennung 62 ·
bereiche-lesend 37 · css-klassen 30 · zwischenspeicher 21 · alle-wege 19 ·
rechtetafel 19 — alles grün.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 17:58:34 +02:00
DogFatherGitandClaude Opus 5 4219ac3f9d Backstage-Fenster: Arbeit zuerst, Anleitung dahinter
Filipe, mit dem Fenster im Bild: "perfektionnier auch diese kachel die
sieht so scheisse aus."

Er hatte recht, und der Grund war nicht die Farbe, sondern die
REIHENFOLGE. Vor dem Feld, in das man einfuegt, standen fuenf lange
Schritte und zwei Absaetze -- rund 1400 px Text, bevor die eigentliche
Arbeit anfing. Wer das Fenster zum zwanzigsten Mal oeffnet, scrollt
jedes Mal an einer Anleitung vorbei, die er laengst kennt; wer es zum
ersten Mal oeffnet, liest eine Wand, bevor er weiss, worum es geht.

Das habe ich selbst gebaut, heute Vormittag, auf den Wunsch "ich
brauch auch eine erklaerung immer dabei". Die Erklaerung war richtig --
ihr Platz war falsch.

JETZT: ein Satz oben, sofort das Feld, dann Tag und Vorschau. Die
ausfuehrliche Anleitung liegt unter einer aufklappbaren Zeile, die
zugeklappt 37 px braucht statt 560.

DIE UEBERSCHRIFTENZEILE BLEIBT OBEN, ausserhalb des Aufklappers. Sie
ist die einzige Angabe, ohne die es gar nicht geht -- den haeufigsten
Fehlgriff hinter einen Klick zu legen waere genau der falsche Tausch.

Nebenbei: Der Erklaersatz zum Tag stand IN der Feldbeschriftung und
machte sie zweizeilig -- eine Beschriftung, die man lesen muss, ist
keine mehr. Er steht jetzt darunter. Das Datumsfeld erbt die Schrift
des Hauses (ohne Angabe nimmt der Browser seine eigene, und das sah
aus wie ein vergessener Rest) und ist auf die Breite gedeckelt, die
ein Datum braucht. Und das Fenster rollt INNEN, damit "Uebernehmen"
immer erreichbar bleibt.

pruef-backstage-import 72 -> 77. Die neuen Zeilen messen die POSITION
in Pixeln, nicht den Text: Die bestehenden Pruefungen lesen
`textContent` des ganzen Dialogs und waeren auch dann gruen, wenn die
Anleitung wieder nach vorn rutscht. Dazu: zugeklappt beim Oeffnen,
Ueberschriftenzeile trotzdem sichtbar, die Zeile nimmt unter 90 px,
und der Aufklapper klappt wirklich auf (ein Aufklapper, der klemmt,
versteckt die Anleitung endgueltig).

Mit SCHIRM=1 legt die Pruefung drei Bilder ab: leer, zugeklappt,
aufgeklappt.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 15:54:25 +02:00
DogFatherGitandClaude Opus 5 f23260dcbb Chat: Gruender duerfen ihre Gruppe oder ihren Kanal aufloesen — und der Umschalter erklaert sich
Zwei Wuensche von Filipe, beide am Neu-Fenster.

1) "ich will eine bessere erklaerung dafuer bitte."
Neben dem Umschalter "Gespraech | Kanal" stand ein Satz ueber das
ANTIPPEN von Personen -- also ueber den naechsten Schritt, nicht ueber
die Wahl, die gerade ansteht. Wer die beiden Woerter zum ersten Mal
sieht, erfuhr nirgends, was sie bedeuten.

Der Unterschied ist nicht "wenige/viele Leute", sondern WONACH der Raum
benannt ist: ein Gespraech nach den Menschen darin, ein Kanal nach
einem Thema. Daran haengt alles Weitere -- dass es einen Kanal je
Zustaendigkeit nur einmal gibt (eindeutiger Index, nachgesehen), dass
sein Name festliegt, dass die Teamleitung immer dabei ist
(kanaeleAngleichen, nachgesehen) und dass Leute wechseln koennen, ohne
dass der Raum ein anderer wird. Genau das steht jetzt da, und nichts
davon ist behauptet.

2) "die person die ihn oeffnet soll auch das recht haben das zu
loeschen und so dass es dan fuer jeden geloescht ist. aber nur die
person die es gruendet."

Ein EIGENER Weg (/ganz), kein Zusatzfeld am bestehenden. Es gibt jetzt
zwei Loeschknoepfe nebeneinander, und sie tun etwas sehr Verschiedenes:
Wegraeumen ist nur bei mir, Aufloesen ist fuer alle und endgueltig. Ein
vergessenes Feld waere genau dieser Unterschied gewesen. Aus demselben
Grund ein anderes Zeichen und eine eigene Warnfarbe -- zwei gleich
aussehende Papierkoerbe waeren eine Falle.

Nur der Gruender, woertlich: nicht die Teamleitung, nicht DogFather,
nicht wer `leitung` in der Gruppe hat. Nicht bei Zweier-Gespraechen --
dort gibt es keinen Gruender, und "niemand nimmt einem anderen die
Unterhaltung weg" gilt weiter.

Reihenfolge beim Loeschen ist nicht beliebig: erst das Live-Ereignis
(chatEreignis liest die Teilnehmer aus der Tabelle -- danach waere die
Liste leer), dann die Zeilen in EINER Transaktion, dann die Anhaenge
von der Platte. Umgekehrt haetten wir bei einem Ruecklauf Nachrichten,
die auf geloeschte Dateien zeigen.

WAS DIE PRUEFUNG GEFUNDEN HAT, BEVOR ES JEMAND GEMERKT HAETTE: Der
Knopf blieb unsichtbar, obwohl das Recht stimmte. Die Oberflaeche holt
den offenen Raum aus dem Nachrichten-Weg, nicht aus der Raumliste --
zwei Wege, ein Raumobjekt, und nur einer kannte das neue Feld. Die
Regel steht jetzt in darfAufloesen() und wird von allen dreien
benutzt: Liste, Nachrichten-Weg und der Loeschweg selbst.

Gefunden hat das die Pruefung, weil sie den KNOPF misst und nicht das
Recht dahinter. Haette sie nur `darf_aufloesen` geprueft, waere sie
gruen gewesen und der Knopf nie erschienen.

NEU: server/pruef-chat-aufloesen.mjs (59 Pruefungen). Sie misst am
BESTAND, nicht an der Antwort: ob der Raum wirklich aus der Datenbank
weg ist, ob keine Teilnehmerzeile liegen blieb, ob der Anhang von der
Platte verschwand -- und mit Gegenprobe, dass der Anhang-Ordner selbst
stehen bleibt. Ohne die waere "Datei ist weg" auch dann gruen, wenn es
sie nie gab; genau das ist beim ersten Lauf passiert (der Upload lief
ins 415, weil ich ihn als Formular statt roh geschickt hatte).

Dazu: Wegraeumen ist NICHT Aufloesen (Ben raeumt weg, Cem hat alles
noch), ein Zweier-Gespraech laesst sich gar nicht aufloesen, ein
Aussenstehender bekommt 404 statt 403, ein zweiter Versuch findet
nichts, und die Zustaendigkeit eines aufgeloesten Kanals wird wieder
frei (sonst haette der eindeutige Index sie dauerhaft blockiert).

Nebenbei: Die drei Kopfknoepfe schoben sich jeder einzeln mit
`margin-left: auto` nach rechts. Bei zwei sichtbaren teilen sich zwei
auto-Raender den freien Platz und reissen sie auseinander -- und WELCHE
sichtbar sind, entscheidet der Server. Jetzt schiebt ein Behaelter
einmal, die Knoepfe stehen beieinander, egal wie viele es sind.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 15:22:09 +02:00
DogFatherGitandClaude Opus 5 14ed467928 Der Weg ueber die TikTok-Datei des Creators ist entfernt
Filipe, mit den drei Knoepfen im Bild: "ich will nur dass wir manager
scouts, dogfather oder spicy sachen eintragen koennen und nicht die
creator. ich will keine daten von denen kriegen, nur wir."

Gebaut am Vormittag, am Nachmittag wieder ausgebaut. Der Weg war
technisch in Ordnung -- und er war der einzige, bei dem ein CREATOR uns
etwas gibt: seine eigene Datenkopie aus der TikTok-App. Genau das soll
nicht sein. Es bleiben die beiden Wir-Wege: die eigene Datei und die
Backstage-Tabelle der Agentur.

VOLLSTAENDIG ENTFERNT, NICHT VERSTECKT:
- beide Schnittstellen (/tiktok-datei und /tiktok-datei/vorschau)
- der Leser workspace-tiktok-datei.js (263 Zeilen)
- Knopf, Fenster, Dateiauswahl, Vorschau, Stilregeln
- der fertige Text, der einen Creator um seine Daten bittet
- der Erklaersatz unter der Knopfreihe

Ein Weg, der nur unsichtbar ist, ist weiterhin ein Weg -- wer die
Adresse kennt, benutzt ihn. Und eine Bitte an einen Creator um seine
Daten soll in diesem Haus nirgends mehr stehen, auch nicht in einem
Fenster, das niemand oeffnet.

GEPRUEFT WIRD JETZT DIE ABWESENHEIT, an drei Stellen: Knopf weg,
Fenster weg, und die Schnittstelle antwortet DOGFATHER mit 404 -- dem
staerksten Zugang, den es gibt. Bekommt er 404, bekommt ihn jeder.
Daneben die Gegenprobe, dass der Backstage-Weg weiterhin mit 200
antwortet; sonst bewiese das 404 nur einen Tippfehler.

pruef-tiktok-datei.mjs (47 Pruefungen) faellt mit dem Weg weg. Die
Zahl sinkt dadurch, und das ist hier richtig: Sie pruefte etwas, das
es nicht mehr gibt. Was bleibt, sind sechs Pruefungen, die das
Fehlen sichern -- pruef-backstage-import 63 -> 66.

NEBENBEI GEDREHT, NICHT GELOESCHT: pruef-leistung-optik behauptete
noch die Regel vom 07.09. ("beim Manager fehlt die Kachel", "die Seite
weist den Creator ab"). Beide Aussagen sind jetzt umgekehrt und messen
zusaetzlich, was vorher niemand gemessen hat: dass die Creatorin auf
der Zahlen-Seite ihre EIGENEN Zahlen sieht und trotzdem keinen
einzigen Knopf zum Eintragen hat -- beides zusammen, denn "keine
Knoepfe" waere auch auf einer leeren Seite wahr. 56 -> 59.

Nicht von mir, nachgemessen gegen den Stand ohne diese Aenderungen:
pruef-struktur meldet dieselben 6 Fehler (crew-index/teamlage nicht
verlinkt, start.css 348 KB, totes CSS .nase, UTC-Datum).

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 15:02:21 +02:00
DogFatherGitandClaude Opus 5 f171d0cffd Workspace: Anleitung neben beiden Import-Knoepfen
Scouts und Manager sollen nicht raten muessen, woher die Zahlen kommen.

Unter der Knopfreihe steht jetzt dauerhaft (sobald einer der beiden Knoepfe
sichtbar ist), was die beiden Quellen sind: Backstage-Tabelle = Agenturzahlen
fuer alle auf einmal, TikTok-Datei = die Datei, an die nur der Creator selbst
kommt.

Backstage-Dialog: fuenf nummerierte Schritte. Der wichtigste davon ist
"Ueberschriftenzeile mitmarkieren" -- ohne sie kann der Server die Spalten
nicht benennen, und genau das war beim Testen der haeufigste Fehlgriff.
Dazu zwei stille Absaetze: woher die Zuordnung kommt (TikTok-Name im
Steckbrief) und warum das nicht automatisch geht.

TikTok-Dialog: der fertige Text zum Weiterleiten an den Creator, mit
Kopierknopf. Nennt JSON statt TXT (eine TXT-Datei laesst sich nicht
auswerten), die 1-4 Tage Wartezeit, und dass die Datei nur gelesen und
nicht gespeichert wird.

Bewusst KEIN erfundener Klickpfad durch Backstage: TikTok dokumentiert die
Menuenamen nirgends oeffentlich, und eine erfundene Beschriftung ist beim
naechsten Umbenennen schlimmer als keine. Beschrieben wird deshalb, WORAUF
zu achten ist ("die Tabelle mit den Zahlen"), das bleibt wahr.

Der Kopierknopf meldet einen Fehlschlag, statt Erfolg vorzutaeuschen.

pruef-backstage-import: 29 -> 36 Pruefungen, alle gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 13:51:00 +02:00
DogFatherGitandClaude Opus 5 027c372afd Die TikTok-Datei des Creators -- ohne Entwicklerkonto
Filipe: "tiktok entwicklerkonto hab ich nicht und werd ich nicht
bekommen."

Damit sind zwei der drei Wege aus dem Plan vom 10.09. erledigt: Login
Kit und die Datenportabilitaets-API haengen beide an einer App auf
developers.tiktok.com. Sie sind nicht verschoben, sie sind weg.

DER DRITTE BRAUCHT KEINES. Jeder TikTok-Nutzer kann seine eigenen Daten
selbst herunterladen (Profil -> Einstellungen -> Konto -> Deine Daten
herunterladen, Format JSON). Die Datei enthaelt laut TikToks eigener
Datentypen-Liste einen Abschnitt "TikTok LIVE" mit dem Go-LIVE-Verlauf.
Der Creator gibt sie her, mit eigenen Haenden -- legitimer wird es
nicht, und es ist jetzt der einzige verbliebene Weg an TikTok-Daten.

ICH KENNE DAS FORMAT NICHT -- UND BAUE TROTZDEM.
TikTok dokumentiert, DASS es den Verlauf gibt, nicht wie die Schluessel
heissen. Der naheliegende Weg waere, Namen zu raten. Das waere die
schlechteste Loesung: Er fiele bei der ersten echten Datei auseinander,
und zwar STILL -- "0 Eintraege gefunden" sieht aus wie "war nicht live".

Deshalb wird gesucht statt geraten. Der Leser geht die Datei durch,
sammelt ALLE Listen, deren Eintraege ein Datum tragen (gemessen am
INHALT, nicht am Feldnamen), schlaegt eine Zuordnung vor und legt sie
zur Auswahl vor -- mit Anzahl, Zeitraum, Beispielzeile und dem, was
dabei herauskaeme. Bestaetigt wird von Hand. Damit ist der Leser
unabhaengig davon, wie die Felder heissen.

DIE EINHEIT IST DIE FALLE. "83" kann Sekunden, Minuten oder Stunden
sein. Geraten wird NICHT aus der Zahl, sondern aus dem Schluesselnamen
-- und wo der schweigt, aus der Form ("01:23:45" ist eindeutig).
Schweigen beide, kommt null zurueck. Eine Dauer, die um Faktor 60
danebenliegt, sieht richtig aus und ist es nicht.

MEHRERE LIVES AN EINEM TAG SIND EIN TAG: Dauer und Diamanten addiert,
bei den Zuschauern gewinnt die hoehere Spitze -- ein Durchschnitt aus
zwei Streams waere eine Zahl, die es nie gegeben hat.

DIE DATEI UEBERSCHREIBT NICHTS. Anders als der Backstage-Import, der
die Wahrheit der Agentur bringt, ist diese Datei die ZWEITE Quelle. Wo
schon eine Zahl steht -- von Hand oder aus Backstage --, bleibt sie
stehen (COALESCE statt REPLACE). Sonst wuerde ein Dateiupload
stillschweigend die offiziellen Zahlen ersetzen, und niemand wuesste
hinterher, welche gilt.

UND SIE WIRD NICHT GESPEICHERT. Gelesen, ausgewertet, verworfen. In
derselben Datei stehen Direktnachrichten, Such- und Ansehverlauf; die
haben auf diesem Server nichts zu suchen. "Income and Wallet" bleibt
ebenfalls liegen: Diamanten sind Leistung, Auszahlungen sind Gehalt.

GEPRUEFT OHNE ECHTE DATEI -- MIT DREI ERFUNDENEN (47 Pruefungen):
  A  englisch, flach, Dauer in Sekunden
  B  deutsch, verschachtelt, Dauer als "01:23:45"
  C  Sekundenstempel, Dauer in Minuten, andere Namen
  +  eine Datei ganz ohne Verlauf -> muss abgelehnt werden

Eine Pruefung gegen EINE ausgedachte Form wuerde nur beweisen, dass
mein Leser meine eigene Erfindung liest. Drei verschiedene zeigen, dass
er das Prinzip kann und nicht eine Form.

EIN EIGENER FEHLER, von der Pruefung gefunden: Der Nachrichtenverlauf
in Form A hatte nur EINEN Eintrag und fiel damit unter die
Mindestgroesse von zwei. Die Pruefung "der LIVE-Verlauf steht oben"
hatte danach nur einen Kandidaten und bewies gar nichts -- eine
Rangfolge laesst sich nur an mindestens zwei Dingen zeigen. Jetzt sind
es drei Nachrichten, und die Rangfolge ist wirklich gemessen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 12:01:49 +02:00
DogFatherGitandClaude Opus 5 017375d333 Backstage: eine Tabelle einfuegen, alle Creator auf einmal
Filipe: "mach diesen ganzen plan jetzt sofort auf einen schlag fertig."

Das ist Stufe 0 des Plans vom 10.09. -- der Teil, der ohne TikTok
auskommt und deshalb sofort baubar war.

WARUM EINFUEGEN UND NICHT ABRUFEN. Die Recherche vom 10.09. ergab:
TikTok LIVE Backstage hat keine Schnittstelle und keinen Export (zwei
unabhaengige Quellen), und in der offiziellen Scope-Liste von TikTok
gibt es nichts zu LIVE, Diamanten oder Netzwerkdaten. Was es gibt, ist
eine Tabelle im Browser. Also: markieren, kopieren, einfuegen. Kein
Token, kein Zugangsdatum, keine Erweiterung, die Backstages interne
Abfragen mitliest -- letzteres waere ein Verstoss gegen die
Nutzungsbedingungen und riskiert ausgerechnet das Netzwerkkonto.

DER UNTERSCHIED ZUM VORHANDENEN IMPORT ist genau eine Frage: Zu wem
gehoert diese Zeile? Der alte Weg nimmt eine Datei fuer EINEN Creator,
Backstage zeigt ALLE. Zugeordnet wird ueber `personen.tiktok` -- den
oeffentlichen Namen ohne @, den es im Steckbrief laengst gibt. Ohne @,
ohne Gross-/Kleinschreibung, ohne unsichtbare Zeichen aus der
Zwischenablage; faellt das aus, ueber den angezeigten Namen. Beides
ergebnislos -> die Zeile wird GEMELDET, nicht geraten. Eine falsch
zugeordnete Zahl ist schlimmer als eine fehlende, weil die fehlende
auffaellt.

DER TABULATOR WAR DER GANZE KNACKPUNKT. `csvZerlegen` kannte nur Komma
und Semikolon. Eine aus dem Browser kopierte Tabelle ist aber
TAB-getrennt -- ohne diese Zeile waere alles in Spalte 1 gelandet und
die Vorschau haette "keine Datumsspalte" gemeldet: eine richtige
Meldung auf eine falsche Faehrte. Gewaehlt wird jetzt das HAEUFIGSTE
der drei Zeichen, nicht das erste gefundene.

WAS NICHT PASSIERT, und genau das ist geprueft:
  - unbekannte Person -> gemeldet mit Namen, nicht geraten
  - Zeile ohne eine einzige Zahl -> uebersprungen (sie wuerde sonst
    einen echten Tag mit Nullen ueberschreiben)
  - Datum in der Zukunft -> abgelehnt
  - dieselbe Tabelle zweimal -> ersetzt, verdoppelt nicht
  - eine von Hand geschriebene Notiz -> ueberlebt den Import
  - es wird niemand nebenbei angelegt
  - kein Datum in der Tabelle und keines angegeben -> es wird GEFRAGT

NEUE PRUEFUNG (pruef-backstage-import, 29 Pruefungen) mit einer echten,
tab-getrennten Backstage-artigen Tabelle: drei Creator, einer davon
ohne Handle, einer mit abweichender Schreibweise, einer gar nicht im
Haus.

DREI EIGENE FEHLER, alle von der Pruefung gefunden:
  * Die Spaltenerkennung nahm nur EINE Personenspalte. Ein Creator ohne
    Handle fiel als "keine Person in der Zeile" durch, obwohl sein Name
    danebenstand. Jetzt werden beide Spalten gemerkt und je Zeile
    nacheinander versucht.
  * Ein Scout bekam 400 statt 403 -- er kam durch `darfEintragen`
    (das Scouts einschliesst) und scheiterte erst daran, dass er keinen
    der Creator sieht. Richtige Antwort aus dem falschen Grund. Der
    Netzwerk-Weg haengt jetzt an `istLeitung`, genau wie der Knopf.
  * Die Vorschau meldete "2 von 3" statt "3 von 4" -- Folge des ersten
    Fehlers.

Der Fusstext der Seite nannte zwei Wege, es sind jetzt drei. Ein Text,
der etwas anderes sagt als die Software tut, ist schlimmer als keiner.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 11:26:14 +02:00
DogFatherGitandClaude Opus 5 a9dcb8f59a Die Scout-Pipeline: 13 Felder statt 5, und getrennt von Team Dogi
Filipe: "perfektionnier diese kategorien wie die aussehen und was man
da noch alles immer in jeder kategorie eintragen kann. weil man kan da
nichts machen ... und das soll getrennt von der team dogi seite sein."

"MAN KANN DA NICHTS MACHEN" -- MAN KONNTE, UND DAS WAR DAS PROBLEM.
Der ganze Editor lag hinter einem stillen Textknopf namens "Details".
Ein Wort, das Lesen verspricht, an der einzigen Stelle, an der man
aendert. Er heisst jetzt "Bearbeiten", hat eine Kante und ein
aria-expanded. Aktivitaet und Potenzial waren dort ausserdem nur
ANZEIGE -- eintragen liessen sie sich ausschliesslich beim Anlegen.
Jetzt sind es Felder wie alle anderen.

SIEBEN NEUE FELDER, und keines davon ist Schmuck:
  netzwerk      schon bei einer Agentur? Die teuerste Frage der ganzen
                Pipeline -- wer unter Vertrag steht, kann nicht
                uebernommen werden. Steht auf der Karte VOR der
                Prioritaet, rot. "unbekannt" ist eine eigene Antwort und
                nicht dasselbe wie "nein".
  land          DE/AT/CH/LU/andere -- die vier Laender, in denen betreut
                wird, und die Schweiz liegt rechtlich anders als die
                drei EU-Laender (TikTok-Recherche vom 10.09.).
  follower      Reichweite. "12,4k" aus der Zwischenablage wird zu
                12400 -- sonst stuende da eine 12, und das faellt
                niemandem auf.
  woher         wie gefunden
  kontaktweg    wo angeschrieben
  live_zeiten   wann die Person ueblicherweise live ist
  absage_grund  erscheint NUR bei "Abgelehnt" -- ein "warum nicht" an
                einem Kontakt, der gut laeuft, ist eine Frage, die
                niemand gestellt hat.

Gemessen: 13 Felder im Editor statt 5.

DIE STUFEN ERKLAEREN SICH SELBST. Was "Interessiert" von "Gespraech"
unterscheidet, stand bisher nur im leeren Zustand der Seite -- also
genau so lange, bis der erste Kontakt da war. Der Satz steht jetzt an
der Stufe, und beide lesen aus derselben Liste (STUFE_WAS). Dazu eine
Kante im Ton der Stufe; die Farben gab es laengst, benutzt wurde nur
die Zahl.

GETRENNT VON TEAM DOGI -- und das war keine Formsache. `sichtbar()`
gibt fuer jeden mit `siehtAlles` schlicht `1=1` zurueck, und DogFather
hat `siehtAlles` auch auf der crew-Adresse. Die komplette Pipeline des
Workspace waere dort mitgekommen. Jetzt 404 fuer das ganze Modul,
sobald `haus === "crew"` -- nicht gefiltert, sondern nicht vorhanden.
Die Absperrung haengt an der gemeinsamen Schranke und gilt damit auch
fuer jeden Weg, der spaeter dazukommt.

NEUE PRUEFUNG (pruef-scouting-felder, 28 Pruefungen)
Sie misst alle drei Behauptungen: dass die Felder ankommen und
zurueckkommen, dass der Server Unsinn ablehnt (Land ausserhalb der
Liste, erfundene Netzwerk-Angabe, negative Follower) -- mit Gegenprobe,
dass das Richtige durchgeht -- und dass es die Pipeline auf crew. nicht
gibt. Dazu die Oberflaeche: Knopfname, Stufentext, die Fakten auf der
Karte, die Warnung, und die Zahl der Felder im Editor.

ZWEI EIGENE FEHLER AUF DEM WEG, beide von der Pruefung gefunden:
  * `notbremse(240)` -- der Wert ist in MILLISEKUNDEN. Die Pruefung
    brach nach einer Viertelsekunde mit "HING" ab, bevor sie anfing.
  * Der crew-Test meldete 200 und sah wie ein Befund aus. Tatsaechlich
    verwirft `fetch` einen selbst gesetzten `Host`-Kopf (verbotener
    Header) -- die Anfrage war nie auf der crew-Adresse. Jetzt ueber
    node:http, mit Gegenprobe, dass derselbe Weg ohne crew-Kopf
    weiterhin 200 liefert.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 11:17:37 +02:00
DogFatherGitandClaude Opus 5 0ffb9e8781 Die Kategorien in Filipes Reihenfolge -- und das Band jetzt ueberall
Vier Meldungen von Filipe, drei davon erledigt.

1. "DIE DOGFATHER ROLLE SIEHT DIE CREATOR NICHT MEHR" -- NICHTS KAPUTT.
   Nachgestellt mit frischer Datenbank und fuenf Creator: DogFather
   sieht auf allen sechs Seiten mit Creator-Umschalter alle fuenf. In
   der SICHT VON MIESMUSCHEL dagegen steht auf leistung.html und
   profil.html genau einer -- ihr Name. Genau das zeigt sein
   Bildschirmfoto. Er ist noch in der fremden Sicht von gestern.

   MEINE SCHULD, NICHT SEINE. Gestern habe ich das Hinweis-Band
   ausdruecklich nur aufs Handy gelegt, mit der Begruendung, am Rechner
   stehe der Name ja im Umschalter und zwei Anzeigen fuer dieselbe
   Sache seien eine zu viel. Einen Tag spaeter ist er am RECHNER darauf
   hereingefallen, mit sichtbarem Namen im Umschalter UND goldenem
   Rahmen. Damit ist die Begruendung widerlegt -- nicht durch ein
   Argument, sondern durch den Fall. Das Band steht ab jetzt ueberall.

   NEBENBEFUND, NICHT ANGEFASST: Die fremde Sicht greift nur auf der
   Haelfte der Seiten. leistung und profil folgen ihr, bereich, content,
   report und startcheck zeigen weiter alle Creator. Halb umgesetzt ist
   schlechter als gar nicht -- das gehoert entschieden, nicht nebenbei
   geaendert.

2. "RUND UM DAS TEAM UEBER TAEGLICH" -- verschoben, mitsamt dem Absatz,
   der die alte Stelle begruendet hat.

3. "TEAM DOGI UND ENTWICKLUNG GANZ UNTEN, NUR DOGFATHER UND VANVAN".
   `gruppeNach: "Täglich"` -> `"Team & System"`, der letzten Gruppe der
   Liste. Als NAME und nicht als Position: Eine Zahl waere beim
   naechsten Umsortieren still falsch, und still falsch hiesse hier,
   dass privates Material wieder nach oben rutscht.

   DIE SICHTBARKEIT WAR SCHON RICHTIG -- nachgesehen statt angenommen:
   Auf der Workspace-Adresse bekommt die Kacheln nur `admin`. VanVan
   traegt die Rolle `hand` und kann sich dort gar nicht anmelden
   (sitzungPasstZurAdresse weist Team-Dogi-Rollen ab); sie sieht
   dieselben Kacheln auf der crew-Adresse ueber HAND_BEREICHE. Die
   Modis sehen sie nicht -- Entwicklung und Talente stehen nicht in
   MODI_BEREICHE. Am Livesystem geprueft: genau ein admin, eine hand.

   Gemessen kommt fuer DogFather heraus:
     Rund um das Team | Taeglich | Rund um den Creator | Team & System
     | Team Dogi | Entwicklung & Nachwuchs
   Spicy Media sieht dieselbe Folge ohne die letzten beiden, Manager
   und Creator wie bisher.

UND EINE PRUEFUNG, DIE DAS FALSCHE GEMESSEN HAT
pruef-start-ansicht wurde durch die neue Reihenfolge rot -- ohne dass
eine Kachel kleiner geworden waere. Sie las
`querySelector(".kachel__zeichen")`, also die ERSTE Kachel der Seite.
Solange "Taeglich" oben stand, war das zufaellig die grosse
Dashboard-Kachel. Die Pruefung hat damit nie belegt, was ihr Kommentar
behauptet ("die Kacheln sollen spuerbar groesser sein"), sondern nur
"die erste ist die grosse".

Jetzt misst sie die grosse Kachel ausdruecklich UND die kleinste aller
Kacheln, mit eigenen Untergrenzen. Das ist strenger als vorher: Vorher
konnte jede Kachel ausser der ersten beliebig schrumpfen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 11:04:39 +02:00
DogFatherGitandClaude Opus 5 ad47fc2b00 Team Dogi: Sternenfeld auf jeder Kachel, und die Sicht zeigt endlich, was sie verspricht
DER GRUND JEDER KACHEL IM HAUS VON TEAM DOGI

Filipe: "ich will dass die hintergrunde von den kacheln immer unviersum
artig ist, es muss richtig geil sein aber immer so dass man alles noch
gut erkkent. und das IN DER GANZEN WEBSITE VON TEAM DOGI. nur die
kacheln. [...] wichtig ist die form der kacheln soll gleich bleiben."

module.css hat eine kanonische KACHELLISTE -- 48 Klassen, siebenmal in
der Datei, von pruef-css-klassen gegeneinander gehalten. Eine achte
Abschrift in crew-haus.css waere die Sorte Fehler, die nicht auffaellt:
heute vollstaendig, bei der naechsten neuen Kachel lautlos nicht mehr.
Deshalb faerbt crew-haus.css keine einzige Kachel. module.css baut den
Grund jetzt aus vier Werten (--sternenfeld, -mass, -lage,
--modul-schleier), und das zweite Haus setzt nur diese vier um. Damit
hat jede Kachel der ganzen Adresse den Himmel -- auch die, die es noch
nicht gibt. Im Agenturhaus steht `none`: kein Pixel aendert sich.

ZWEI DINGE HAT ERST DIE MESSUNG GEFUNDEN, NICHT DAS NACHDENKEN:

1. Die Nebel standen zuerst oben links. Dort ist aber JEDE Kachel dieses
   Hauses schon von sich aus am hellsten -- ihr eigener Lichtverlauf
   laeuft bei allen aus derselben Richtung (155/150/158 Grad) --, und
   genau dort stehen ueberall die Ueberschriften. Hinter der leisesten
   Textzeile lagen dadurch 2,09 % der Bildpunkte unter 4,5:1; im
   Agenturhaus sind es an derselben Stelle 0,115 %. Nach dem Umzug in
   die beiden gegenueberliegenden Ecken: 0,22 % -- und der Nebel durfte
   dabei KRAEFTIGER werden (.80 statt .62), weil er nicht mehr auf dem
   hellsten Punkt liegt. Besser lesbar und deutlicher zu sehen; das ist
   selten und war hier umsonst zu haben.

2. Kleinere, dafuer hellere Sternkerne waren der falsche Weg: Der
   hellste Punkt blieb fast gleich, der Stern wurde nur unschaerfer.
   Entschieden hat die Deckkraft, nicht die Groesse.

Form unangetastet: Fase, Silhouette und die drei Eckwinkel werden vor
und nach dem Hauswechsel Zeichen fuer Zeichen verglichen.

pruef-kachel-universum.mjs (NEU, 37 Pruefungen, Port 4391) misst an
echten Bildpunkten und fragt nicht nach Durchschnitt allein, sondern
nach dem ANTEIL der Punkte unter 4,5:1 -- das unterscheidet einen Punkt
von einer Flaeche. Zwei Gegenproben: ein zu dunkler Text UND ein zu
heller Nebel muessen durchfallen.

MEINE SICHT -- "GENAU SO WIE SIE ES SEHEN"

Filipe: "oben bei meine sicht soll ich auch die sicht von allen jeden
moment sehen koennen und das genau genau so wie sie es sehen alles.
ausser die kalender daten oder chat daten wo ich nicht mit drin bin.."

Gemessen wurde nicht "mit Umschalter gegen ohne" -- das ist bei duenner
Datenlage ueberall gleich und beweist nichts. Gemessen wurde die
Antwort mit Umschalter gegen die Antwort, die die Person SELBST bekommt.
Das hat sechs Stellen gefunden:

* workspace-zentrale.js las `req.person.sicht` -- ein Feld, das es nicht
  gibt. Der Ausdruck war immer `undefined || req.person`, daneben ein
  ausfuehrlicher Kommentar, der genau das Richtige beschrieb. Die grosse
  Kachel zeigte verlaesslich die eigene Lage, waehrend die Zahlen
  darunter der fremden folgten -- zwei Wahrheiten in einer Kachel. Ein
  Tippfehler in einem Variablennamen macht nichts kaputt; er tut nur
  nichts, und genau deshalb faellt so etwas nie von selbst auf. Die
  Route hatte ausserdem ZWEI Personenvariablen; jetzt hat sie eine.
* sichtPerson() gab die angesehene Person ohne Feld `haus` zurueck --
  und nurHaus()/hausBedingung() fangen beide mit `haus !== "crew"` an.
  Jede fremde Sicht war damit eine Agentursicht: In der Sicht auf einen
  Modi kamen die Dateien, Personen und Berichte des anderen Hauses.
  Das Haus haengt jetzt an der ROLLE, nicht an der Adresse.
* leistung, profil, schulung, fruehwarnung, report und teamlage lasen
  weiterhin den Angemeldeten. Nur LESEN ist umgestellt, nie ein Recht --
  und weil DogFather ohnehin alles sehen darf, kann das nichts oeffnen,
  nur weniger zeigen.

Der Sicht-Umschalter zeichnete ausserdem nur die fuenf Rollen aus
bereiche.js; wer eine sechste hat, stand nicht darin. Dieselbe Luecke
wie in der Chat-Auswahl und der Personenliste, zum dritten Mal. Die
Ueberschrift kommt jetzt vom Server (`gruppe`), der Browser zeichnet,
was ankommt -- auch eine Rolle, deren Namen er nicht kennen darf.

DREI STELLEN FOLGEN BEWUSST NICHT: die Personenliste (aus ihr wird der
Umschalter gebaut -- folgte sie der Sicht, kaeme man aus einer fremden
nicht mehr heraus), die Auswahllisten beim Anlegen (Kategorien,
Empfaenger) und steckbrief/mein (ein Formular, das fremd liest und
eigen speichert, zerstoert Daten).

KALENDER UND CHAT BLEIBEN PRIVAT, auch mit Umschalter -- Termine,
Calls und Wiederholungen lesen ab jetzt immer die eigene Person. Eine
Pruefung musste dafuer umgedreht werden: pruef-sicht verlangte bis
heute das Gegenteil ("dafuer gibt es den Umschalter"). Die Gegenprobe
bleibt dieselbe Frage, nur andersherum -- Patrick selbst MUSS seine
Termine sehen, sonst hiesse "DogFather sieht sie nicht" nur, dass sie
niemand sieht. Dabei fiel auf, dass die Managerin gar keinen Call
hatte: Die Pruefung "bleibt privat" war nicht bestanden, sondern nicht
durchfuehrbar. Antwort darauf sind Daten, keine weichere Bedingung.

Gruen: pruef-sicht 84 (vorher 53), pruef-kachel-universum 37 (neu),
pruef-rollen 282, pruef-crew-adresse 129, pruef-start-ansicht 143,
pruef-kalender 104, pruef-haus-trennung 62, pruef-team-ampel 32,
pruef-team-stufen 26, pruef-css-klassen. Stempel 202609110209.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 02:10:15 +02:00
DogFatherGitandClaude Opus 5 9b47bd3ca0 Entwicklung & Nachwuchs -- zwei Bretter fuer DogFather und die rechte Hand
Filipe: "ich will dass ich genau so eine kategorie habe in der dogfather
und rechten hand rollen, wo wir aufgaben oder bewertungen ueber modis
eingeben koennen. auch fuer zuschauer die vielleicht modis werden
koennten waere auch geil. mach dich schlau informier dich so krass wie
es nur geht, hol die besten der besten und krassesten sachen,
perfektionnier die dan auch alle und dan erst setzt du alles um."

=== WAS DIE RECHERCHE ERGEBEN HAT ===

DREI BEFUNDE HABEN DAS DESIGN BESTIMMT, und der erste hat es fast
umgedreht:

  WARUM MODERATOREN AUFHOEREN (Schoepke-Gonzalez u. a., New Media &
  Society 2024): zwei Hauptgruende -- zu wenig Zeit, und Konflikte im
  Team beziehungsweise schaedliches Verhalten der Leitung. Eine
  Bewertungsfunktion ist damit genau das Werkzeug, mit dem man ein Team
  verliert, wenn man sie als Ueberwachung baut. Das ist kein Bauchgefuehl
  und keine Zimperlichkeit -- es ist der haeufigste gemessene Grund.

  WAS HAELT: Anerkennung. Dank und Rueckmeldung erhoehen die
  Verweildauer messbar; Rollenklarheit senkt Burnout.

  WORAN MAN GUTE MODERATOREN ERKENNT (ModSquad, Kitfox Games,
  Discord-Leitfaeden): nicht an Zahlen. Ruhig bleiben, wenn es hitzig
  wird; von selbst helfen; die Regeln UND die Leute kennen; regelmaessig
  da sein. Ausdruecklich NICHT: "schreibt viel" -- angenehm im Chat zu
  sein ist nachweislich etwas anderes. Und der treffsicherste Weg
  ueberhaupt ist die Empfehlung aus dem Team, gefolgt von einer
  Probezeit.

=== WAS DARAUS GEBAUT WURDE ===

ENTWICKLUNG. Keine Note, sondern eine Aufzeichnung ueber die Zeit, je
Person. Fuenf Arten, und ihre REIHENFOLGE ist Absicht: "Das laeuft gut"
und "Danke dafuer" stehen vorn. Wer ein Formular oeffnet, dessen erstes
Feld "Problem" heisst, schreibt Probleme auf.

"ZU VIEL GERADE" IST DIE WICHTIGSTE ART und die, die es sonst nirgends
gibt. Der haeufigste Grund zu gehen ist Zeitmangel, und der zeigt sich
frueh -- nur schreibt ihn niemand auf, weil es kein Feld dafuer gibt.

TALENTE. Die vier Merkmale sind die aus der Literatur, nicht
ausgedacht, dazu die Empfehlung aus dem Team. Der Status IST die
Probezeit: `offen` heisst beobachtet, `angenommen` heisst angesprochen
-- und was daraus wird, entscheidet sich in "Personen & Zugaenge" mit
einem Zugang auf Stufe "Probe". Eine eigene Kandidatentabelle waere ein
zweiter Ort fuer dieselbe Frage.

DIE BRUECKE. Die Person sieht den Entwicklungs-Bereich NICHT -- eine
halb sichtbare Akte ist schlimmer als eine geschlossene, weil niemand
mehr weiss, was der andere gerade liest. Damit Anerkennung trotzdem
ankommt, laesst sich jeder Eintrag EINMAL als Nachricht in den Chat
schicken, mit Art, Titel und dem, was daraus folgen soll. Danach steht
im Eintrag, wann es geschehen ist: Die Frage "habe ich ihr das
eigentlich schon gesagt?" beantwortet man nach zwei Wochen falsch.

ZWEI KACHELN UND NICHT DREI: Aufgaben an das Team gibt es laengst, mit
Person, Frist und Status. Eine zweite Stelle dafuer waere ein zweiter
Ort, an dem man nachsehen muesste, welche Aufgabe wirklich gilt.

DIE GRUPPE HEISST NICHT "TEAM FUEHREN". Das waere der bequeme Name und
der falsche: Im Haus gilt, dass DogFather nicht ueber seinem Team steht.
"Entwicklung & Nachwuchs" sagt, was drinsteht.

=== KEIN NEUER BAUKASTEN ===

Beides sind BEREICHE wie das Ideen-Board: dieselbe Tabelle, dieselbe
Seite, dieselben Regeln fuers Anlegen, Aendern und Loeschen. Neu sind
eine Spalte (`gesendet_am`) und eine Route. Die Sendefunktion selbst
steht im Chat-Modul und nicht daneben: Ein Zweier-Gespraech darf es nur
einmal geben, die Leseraender muessen mitwandern, Live-Strom und
Benachrichtigung haengen daran -- wer das nachbaut, hat zwei Fassungen,
und die zweite ist die, in der jemand eine Nachricht nicht bekommt.

=== WAS DIE PRUEFUNG GEFUNDEN HAT ===

"Zugeordneter Creator existiert nicht" -- beim Anlegen eines Eintrags
ueber ein Teammitglied. Die Regel verlangte einen Creator; bei
Entwicklung geht es um Menschen aus dem Team. Die Meldung war dabei
selbst irrefuehrend: Die Person existiert sehr wohl, sie ist nur kein
Creator. Beides behoben.

Und meine EIGENE Pruefung von vor einer Stunde wurde rot: Sie verlangte,
dass jede Zusatzkachel in der Gruppe "Team Dogi" steht. Die naheliegende
Reparatur waere gewesen, die Gruppe gar nicht mehr zu pruefen -- das
haette die Aussage weggeworfen. Jetzt steht die erlaubte Liste
ausgeschrieben da: Eine Kachel fuer zwei Menschen darf nicht in einer
Gruppe landen, die alle sehen. Kommt eine dritte Gruppe, wird die Zeile
rot, und das ist Absicht.

Die zwei neuen Farbtoene trennen ueber Saettigung und Helligkeit statt
ueber den Farbwinkel -- bei 25 Toenen ist der Kreis voll, und die
groessten Luecken waeren ein drittes Gruen zwischen zwei vorhandenen.
Bei einer achtundzwanzigsten Kachel brauchen die Kacheln Gruppenfarben
statt Einzelfarben; das steht als Notiz im Quelltext.

pruef-entwicklung 33 (neu) · pruef-start-ansicht 27 Kacheln, sechs
Gruppen · pruef-rollen 278 -> 282 · pruef-modi-checkliste 70 ·
pruef-haus-trennung 62 · pruef-rueckmeldung 30 · pruef-modi-ideen 30 ·
pruef-modi-verborgen 80 · pruef-css-klassen gruen · pruef-modi-wortleck 5.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 01:11:30 +02:00
DogFatherGitandClaude Opus 5 bea1bb7194 Die rechte Hand meldet wie das Team, die Leiste wird ein Universum, sein Kalender bleibt ganz
Drei Wuensche aus zwei Bildschirmfotos und einem Satz.

=== 1. SIE DARF SAGEN, WAS PASST UND WAS NICHT ===

Filipe: "die rechte hand soll bei diesen aufgaben auch wie die modis
sagen koennen ob es passt oder nicht ... die rechte hand ist da um mir
zu helfen aber auch wie die modis um mir zu sagen was passt und nicht
wo die denken bedarf oder nicht. perfektionier das alles."

SIE KONNTE ES NICHT, UND ZWAR AN DREI STELLEN GLEICHZEITIG -- die
zweite und dritte kamen erst zum Vorschein, nachdem die erste behoben
war. Genau deshalb steht "perfektionier das alles" ueber diesem Commit
und nicht "eine Zeile geaendert":

  ERSTENS: Die Frage "an wessen Liste arbeitest du?" kannte nur Creator
  und Modis (dann die eigene). Sie fiel durch beide Zweige und konnte
  ueberall antworten, nirgends urteilen.

  ZWEITENS: Nach der Reparatur durfte sie -- und bekam den KATALOG DER
  CREATOR. Ihre Meldung trug einen Schluessel, den der Eingang gar
  nicht kennt, und wurde dort stillschweigend uebersprungen. Die
  Pruefung meldete "sie darf urteilen (200)" und eine Zeile spaeter
  "ihre Meldung steht NICHT in DogFathers Eingang". Beides stimmte.

  DRITTENS: Der Eingang sammelt aus der Liste der Teammitglieder, und
  die hiess `rolle = 'modi'`. Sie war die Empfaengerin dieser Seite und
  kam auf ihr selbst nicht vor. Wer nicht in der Liste steht, kann
  melden, so viel er will -- es erreicht niemanden.

Jetzt steht sie in derselben Liste (aber `id <> ich`: eine Karte ueber
sich selbst ist kein Ueberblick, sondern ein Spiegel), bekommt
denselben Beobachtungskatalog wie die Modis und meldet in denselben
Eingang. Alle Rollenvergleiche kommen dabei aus der vorhandenen Menge
TEAM_DOGI_ROLLEN statt als zwei Vergleiche danebengeschrieben -- sonst
steht dort beim naechsten Mal einer zu wenig.

=== 2. DIE LEISTE ===

Filipe: "der hintergrund dieser leiste soll extrem speziell aussehen
wie ein universum und soll von lila auf babyblau wechseln, von links
nach rechts ... der husky links soll auch babyblau strahlen und nicht
rot und der rechts lila. dan brauch ich auch noch einen teilen button."

DIE RICHTUNG IST DIE EIGENTLICHE AENDERUNG: Der Schein lief von UNTEN
nach oben (die Glut der Agenturseite, nur in Lila). Jetzt von LINKS
nach rechts, mit zwei Nebeln und sieben Sternen -- als Verlaufslagen
und nicht als Elemente: Sieben Punkte waeren sieben Knoten im Baum auf
jeder der zwanzig Seiten, nur fuer Zierde.

DIE ZEICHEN TAUSCHEN DIE SEITEN. Links stand ein warmes Rot, fest
hingeschrieben in start.css; rechts strahlte der zweite Husky babyblau.
Jetzt umgekehrt -- so hat jede Seite der Leiste beide Farben, statt
dass jede nur eine hat. Beim rechten wird die FUELLUNG mitgetauscht,
nicht nur der Schein: Ein lila Schein um ein blaues Zeichen waere ein
Rand, keine Farbe.

"UEBERTRIEBEN GEIL" HAT EINE GRENZE, und sie ist gemessen, nicht
geschaetzt. Erster Anlauf: .30 -- der Verlauf war zu ahnen, nicht zu
sehen, Kontrast 5,26:1. Zweiter: .40 -- sichtbar, aber 4,79:1 in der
Mitte, bei einer Grenze von 4,5 zu knapp. Jetzt kraeftige Enden und
eine zurueckhaltende Mitte: 5,92 / 5,26 / 7,06:1 an drei Stellen des
Verlaufs, gemessen an echten Bildpunkten. Die Farbe liest das Auge an
den Enden; in der Mitte gewinnt die Lesbarkeit.

DER TEILEN-KNOPF fehlte, weil `DARF_TEILEN` Leitung und Scouts kennt --
die rechte Hand ist keins von beidem. Gefragt wird jetzt nicht nach der
Rolle, sondern nach `ich.marke`: Die setzt der Server genau dann, wenn
jemand zu Team Dogi gehoert. Der Rollenname bleibt damit aus einer
Datei heraus, die jeder herunterlaedt -- und die Frage lautet ohnehin
"gehoert diese Person hierher?".

=== 3. SEIN KALENDER BLEIBT GANZ ===

Filipe: "mein kalender (dogfather) auf dieser seite hier soll komplett
verbunden sein mit dem kalender in der workspace seite ABER NUR IN DER
DOGFATHER ROLLE BEI DOGFATHER: NICHT BEI VANVAN."

Bei Aufgaben, Bereichen und Dateien ist die Haustrennung eine Hilfe --
man will das andere Haus dort gerade nicht sehen. Beim Kalender waere
sie eine Falle: Wer auf der Team-Seite einen Termin eintraegt und die
Haelfte seines Tages nicht sieht, legt ihn auf eine Zeit, in der er
schon woanders sitzt. Ein Kalender, der nur die halbe Wahrheit zeigt,
ist schlimmer als keiner.

Geprueft wird die ROLLE und nicht der Name -- ein Name waere die
Stelle, an der es beim naechsten Menschen bricht.

=== WAS DIE PRUEFUNGEN GEZEIGT HABEN ===

Eine Erwartung war seit Stunden stumm rot: pruef-modi-checkliste
verlangte GENAU EINE Zusatzkachel, und seit dem Ideen-Board sind es
drei. Ich hatte sie nach der Aenderung nicht noch einmal laufen lassen.
Sie zaehlt jetzt nicht mehr auf eine feste Zahl, sondern prueft die
AUSSAGE: Wer welche bekommen soll, bekommt welche -- und jede gehoert
in die Gruppe "Team Dogi". Eine Pruefung, die bei jeder neuen Kachel
rot wird, erzieht dazu, ihr Rotwerden zu ignorieren.

Zwei weitere Erwartungen haben sich gedreht und sind im Quelltext
begruendet: Der Kalender auf crew. zeigt DogFather jetzt alles (die
Pruefung unterscheidet dafuer ER-ja/SIE-nein statt einer einzelnen
Antwort -- das ist mehr, nicht weniger), und "aus dem Eingang
verschwunden" fragt jetzt nach Schluessel UND Person: Seit die rechte
Hand denselben Katalog benutzt, koennen zwei Menschen denselben Punkt
melden, und die Pruefung meldete einen Fehler, den es nicht gab.

Und eine war wertlos: "die rechte Hand sieht den Agenturtermin nicht"
lief gegen einen leeren Kalender -- sie sah ueberhaupt nichts. Sie hat
jetzt zwei eigene Termine, einen aus jedem Haus; erst damit sagt die
Messung etwas.

pruef-modi-checkliste 59 -> 70 · pruef-team-stufen 24 -> 26 ·
pruef-team-ampel 32 · pruef-haus-trennung 61 -> 62 · pruef-rollen 278 ·
pruef-css-klassen gruen · pruef-modi-wortleck 5.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 00:51:56 +02:00
DogFatherGitandClaude Opus 5 a16e4cb337 "Dein Team": neuer Name, ein falsches Schild weniger und ein eigener Grund
Filipe, drei Bildschirmfotos: den Namen der Kachel aendern, "diese zwei
kacheln noch mehr perfektionieren", "veraender den hintergrund von
diesen kacheln komplett", "perfektionnier diese seite einfach komplett".

DER NAME, DRITTE FASSUNG. Zuerst "Team-Lage" -- das klang nach Bericht
UEBER Menschen. Dann "Eingang" -- das beschrieb nur die eine Haelfte
(was hereinkommt) und liess die groessere weg: wer da ist, wer heute
kann, wer was offen hat. "Dein Team" sagt beides und stellt niemanden
ueber jemanden.

DREI SACHEN WAREN NICHT GESCHMACK, SONDERN FEHLER -- und alle drei hat
erst das Nachmessen am fertigen Bildschirm gezeigt:

  UEBER SIEBEN TAGEN STAND "Kann heute". Im Singular, ueber einer
  ganzen Woche. Wer nur die Ueberschrift liest -- und das tut man bei
  einer Zeile in Versalien --, haelt den ganzen Streifen fuer den
  heutigen Tag und liest sechs Kaestchen falsch. Der Satz DARUNTER war
  immer richtig; zwei Aussagen ueber demselben Bild, und die
  auffaelligere war die falsche.

  DIE VIER ZAHLEN BRACHEN 3 + 1. Gemessen: Die Karte ist innen 536 px
  breit, die Regel verlangte je Spalte mindestens 130 px, vier Spalten
  braeuchten 544. Acht Pixel zu wenig. Die Lehre ist NICHT "130 auf 122
  senken" -- das waere dieselbe Rechnung mit einer anderen Zahl. Vier
  Dinge sehen nur in 1x4, 2x2 oder 4x1 richtig aus; 3+1 ist die eine
  Anordnung, die immer falsch wirkt, und eine `auto-fit`-Regel kann
  jederzeit dort landen. Zwei feste Spalten koennen es nicht.

  DER WEG IN DEN CHAT war ein unterstrichener Satz ueber die volle
  Kartenbreite -- er sah aus wie eine Ueberschrift, nicht wie ein Knopf.

DER GRUND DER KARTEN, und hier hat mich das erste Ergebnis widerlegt:
Der Schein aus der oberen Ecke nahm `var(--r)`, die Farbe der STUFE.
Das war logisch und unsichtbar -- bei "Probe" ist sie ein gedaempftes
Grau, und ein Grauschein auf fast Schwarz ist kein Schein. Nach der
Aenderung sah die Karte auf dem Bildschirmfoto genauso aus wie davor.
Jetzt tragen die beiden Ecken die Hausfarben (Lila oben links, Babyblau
unten rechts), dazu ein Lichtstreifen quer und ein Kantenlicht oben.
Die Stufe bleibt, wo sie hingehoert: im Kantenlicht und am Schild.

AUGENSCHONEND BLEIBT PFLICHT: Keine Lage geht ueber 26 %, der
Lichtstreifen liegt bei 3 %, und die hellsten Stellen sitzen in den
ECKEN -- nicht hinter dem Text. Ein Schein hinter einer Zahl macht sie
schwerer lesbar, egal wie schoen er ist.

Dazu: HEUTE ist im Wochenstreifen markiert (sieben gleich aussehende
Kaestchen zwingen sonst dazu, den Wochentag im Kopf auszurechnen), ein
freier Tag hat eine Andeutung statt gar nichts (sieben leere Rahmen
sahen aus wie "noch nicht geladen"), und der Erklaerkasten im Kopf darf
68 statt 44 Zeichen breit sein -- auf einem breiten Bildschirm stand er
als schmale Saeule mit sechs Zeilen zu je vier Woertern neben viel Bild.

WARUM DIE FALSCHE UEBERSCHRIFT UEBERLEBEN KONNTE: pruef-team-ampel
prueft seit dem ersten Tag, dass SIEBEN Tage kommen und der erste heute
ist. Was sie nie angesehen hat, ist der Text darueber -- die Zahl
stimmte ja. Sie prueft ihn ab jetzt, an derselben Stelle wie die Zahl,
damit beide zusammen gelesen werden. Mit Gegenprobe: Die Suche muss das
Wort "heute" auch finden koennen, sonst waere sie gruen, weil sie nie
etwas liest.

pruef-team-ampel 28 -> 32 · pruef-team-stufen 24 · pruef-css-klassen
gruen · pruef-start-ansicht 143 · pruef-rollen 278 · pruef-modi-wortleck 5.

OFFEN GEBLIEBEN und ihm gemeldet: Auf einem 1920er Bildschirm steht der
Inhalt in einer Saeule von rund 1150 px, links und rechts bleibt Bild.
Das ist die Breite ALLER zwanzig Seiten; sie hier allein zu aendern
hiesse, eine Seite anders zu bauen als die anderen neunzehn.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 00:30:18 +02:00
DogFatherGitandClaude Opus 5 be121a483e Rueckmeldung in beide Richtungen (Kapitel 5 und 6)
Filipe: "Nicht nur ich soll meine Modis bewerten oder ihnen Feedback
geben koennen. Auch die Modis sollen mir Feedback geben koennen. Sie
sollen mir beispielsweise sagen koennen: Was koennte ich verbessern?"
Und der Schlusssatz seines Pflichtenhefts: "Es soll nicht nur dazu
dienen, Leistungen zu kontrollieren. Es soll vor allem dabei helfen,
als Team besser zu werden."

EIN BRETT FUER BEIDE KAPITEL, NICHT ZWEI. Kapitel 5 (gegenseitiges
Feedback) und Kapitel 6 (gemeinsame Reflexion) stellen dieselben
Fragen -- "was laeuft gut, was laeuft schlecht, was fehlt" --, einmal
an eine Person und einmal an das Team. Zwei Bretter haetten bedeutet,
dass man beim Schreiben zuerst entscheiden muss, an WEN es geht, bevor
man weiss, WAS man sagen will. Hier ist es umgekehrt: erst die Sache,
dann die Richtung.

DIE NEUN FRAGEN SIND SEINE, wortwoertlich aus dem Pflichtenheft
zusammengezogen: laeuft gut · laeuft nicht gut · unbedingt behalten ·
an DogFather · was dem Team fehlt · Regel aendern · besser organisieren
· Idee · Wunsch fuer spaeter. Sie stehen als feste Faecher da und nicht
als freies Feld -- genau das ist der Unterschied zwischen einer
Sammlung und einem Haufen: Neun Faecher kann man auswerten, tausend
Formulierungen nicht.

KEIN NEUER BAUKASTEN. Die Rueckmeldung ist ein BEREICH wie das
Ideen-Board: dieselbe Tabelle, dieselbe Seite, dieselben Regeln fuers
Anlegen, Aendern und Loeschen, dieselbe Zugangssperre. Ein eigenes
Modul haette all das ein zweites Mal gebraucht -- und die zweite
Fassung waere die gewesen, in der eine Regel fehlt.

DIE EINE NEUE SACHE IST DIE RICHTUNG. Beim Schreiben waehlt man
zwischen "fuers Team" (Vorgabe) und "nur an DogFather". Ohne diese Wahl
haette man eines von beidem verloren: Wer "was koenntest du besser
machen" vor versammelter Mannschaft sagen muss, sagt es nicht -- wer
alles nur unter vier Augen sagen kann, hat kein Team-Gespraech.

UND "NUR DOGFATHER" HEISST NUR DOGFATHER -- die rechte Hand
ausdruecklich nicht. Sie sieht sonst ueberall dasselbe wie er; hier
nicht, weil das Etikett sonst nicht stimmen wuerde. Eine Zusage mit
einer Ausnahme im Kleingedruckten ist keine. Sie schreibt selbst
genauso -- auch ueber ihn.

DIE ZUSAGE STEHT IN sichtbarEintrag(), also in derselben Funktion, durch
die auch das Lesen einer einzelnen Zeile, das Aendern und das Loeschen
gehen. Eine Regel, die nur die Liste filtert, laesst die Zeile ueber
ihre Nummer trotzdem heraus; die Pruefung klopft deshalb auch von
hinten (PATCH und DELETE auf die vertrauliche Zeile: 404, auf die
offene: 200).

`COALESCE(nur_leitung, 0)`: Jede Zeile, die es vor heute gab, hat dort
NULL, und in SQL ist `NULL = 0` nicht falsch, sondern UNBEKANNT. Ohne
den Ersatzwert waere der gesamte alte Bestand von einer Minute auf die
andere unsichtbar gewesen -- und niemand haette es gemeldet, denn ein
leeres Brett sieht nicht nach Fehler aus. Beide Richtungen sind
gemessen.

KEINE ANONYMITAET, und das ist eine Entscheidung, keine Luecke. In
einem Team dieser Groesse waere sie ohnehin keine: An drei Saetzen
erkennt jeder jeden. Ein Versprechen, das nicht haelt, ist schlimmer
als keines.

DER FARBTON DER KACHEL IST AUSGERECHNET, NICHT AUSGESUCHT. Bei 24
vorhandenen Toenen landet ein neuer fast zwangslaeufig neben einem
alten, und zwei Kacheln in FAST derselben Farbe sind schlimmer als in
derselben -- bei gleicher merkt man den Fehler, bei fast gleicher sucht
man ihn. Alle 24 wurden in Farbwinkel umgerechnet; die groesste Luecke
liegt zwischen 90 und 160 Grad und ist 70 Grad breit, mehr als doppelt
so viel wie die naechste. Der neue Ton sitzt in ihrer Mitte, 8,9 zu 1
auf dunklem Grund.

pruef-rueckmeldung 34 (neu) · pruef-rollen 274 -> 277 ·
pruef-start-ansicht zaehlt jetzt 25 Kacheln und 25 Farben (sie zaehlt
selbst, statt eine Zahl festzuhalten -- deshalb blieb sie gruen) ·
pruef-modi-ideen 30 · pruef-modi-verborgen 78 · pruef-css-klassen gruen
· pruef-modi-wortleck 5.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 22:54:04 +02:00
DogFatherGitandClaude Opus 5 72b36d1c31 Ein eigenes Haus fuer Team Dogi -- Lila und Babyblau statt Rot
Filipe, screen1: "die leiste da und alles andere was noch rot ist auf
team dogi seite soll lila werden. richtig geiles lila und babyblau
mischung ueberall."
Und screen2: "ich will doch dass der eingang hier getrennt ist von der
workspace seite ... aber es soll trotzdem so bleiben dass ich die daten
hier und da sehe."

GETRENNT WIRD DAS AUSSEHEN, NICHT DER BESTAND. Dieselbe Datenbank,
dieselben Seiten, dasselbe Programm -- und zwei Haeuser, die man nicht
verwechseln kann. Filipe und die rechte Hand sehen ihre Zahlen
weiterhin auf beiden Adressen.

EINE ZEILE JE SEITE, EINE REGEL IM SERVER. Jede Seite laedt als LETZTE
Stilvorlage `haus.css`. Auf der Agenturadresse ist die leer -- das Haus
dort IST der Grundzustand. Auf crew.dogfather-universe.com biegt die
Weiche genau diesen Dateinamen auf `crew-haus.css` um.

Drei Wege habe ich dafuer verworfen, und jeder hat einen Grund:
  * `data-haus` per JavaScript -> die Seite laedt erst im falschen Ton
    und faerbt sich um. Sichtbar, auf jeder Seite, bei jedem Aufruf.
  * dasselbe Attribut serverseitig in den HTML-Text schreiben -> jede
    HTML-Antwort muesste durch einen Umschreiber statt als Datei
    ausgeliefert zu werden, nur wegen einer Farbe.
  * zwanzig zweite <link>-Zeilen -> die muesste jemand bei jeder neuen
    Seite mitschreiben, und wer sie vergisst, bekommt eine Seite, die
    still zum falschen Haus gehoert.

DAS HAUS SIND FAST NUR VARIABLEN. Wer zwei Dutzend Farbwerte tauscht,
tauscht jede Kachel, jeden Rand, jeden Knopf und jedes Leuchten auf
einmal -- auch an Stellen, die man beim Nachbauen uebersehen wuerde.
Eine Datei, die stattdessen Regel fuer Regel umfaerbt, waere beim
naechsten neuen Bauteil sofort unvollstaendig, ohne dass es auffiele.

WO KEINE VARIABLE STAND, HAT DAS MESSEN SIE GEFUNDEN. Ich habe nicht
im Quelltext gesucht, sondern am fertigen Bildschirm jedes Element nach
Farben abgefragt, bei denen der Rotkanal deutlich ueber den anderen
liegt -- ueber alle Farbquellen, nicht nur `color` und
`background-color`. Erst das brachte die eigentliche Stelle ans Licht:

  DIE KOPFLEISTE HAT EINEN ROTEN VERLAUF. Genau die Leiste aus Filipes
  Bildschirmfoto. Sie glimmt im Agenturhaus wie Feuer -- sein eigener
  Wunsch von screen36, und dort bleibt das auch so. Hier schimmert sie
  jetzt lila, in derselben Bauweise: unten waermer, nach oben dunkel,
  in der Mitte kraeftiger, alles unter 30 % Deckkraft.

Dazu die Fassung der Zentrale (rot->lila, Silber und Babyblau
unberuehrt, Prozentzahlen auf den Punkt gleich -- sie sind am 08.09.
eigens nachgerechnet worden), die Uhr an vier Stellen, das Universum
dahinter, Glocke und Tagesruf, der Schriftzug, und auf der Zugangswand
Knopf, Kachelreihe, Innenglas und Karte.

ZWEI FEHLER, DIE ERST DER BILDSCHIRM ZEIGTE:

  Der Schriftzug wurde zu einem ausgefuellten Balken. `background` ist
  eine Kurzschreibweise und setzt `background-clip` mit zurueck -- und
  genau darueber wird der Text in die Buchstaben ausgestanzt. Jetzt
  `background-image`. Im Quelltext sah die Zeile voellig richtig aus.

  Zwei Regeln wurden geladen und taten nichts: Die Originale stehen
  unter `.kopfleiste .marke__haupt` und `.willkommen > .zuniversum`.
  Wer nur die halbe Kette schreibt, verliert gegen zwei Klassen.

DIE MARKE HAENGT JETZT AN ZWEI DINGEN. `markeFuer()` kannte nur die
Rolle -- und DogFather gehoert nun einmal zur Agentur. Ueber der
Zentrale stand deshalb auch auf der zweiten Adresse gross "SPICY
MEDIA". Jetzt entscheidet auch der Hostname, an EINER Stelle.

WAS WARM BLEIBT, UND WARUM: Warnungen. Eine Warnung ist keine
Verzierung, sondern eine Bedeutung -- faerbt man sie ins Lila der
Seite, sieht "etwas stimmt nicht" aus wie alles andere. Sie wird nur
ins Rosa gezogen, damit sie neben Lila kein Fremdkoerper ist. Ebenso
bleiben die 24 Kachelfarben: dass jede Kachel ihre eigene hat, ist
gepruefte Absicht.

Weisse Schrift auf dem Anmeldeknopf haelt jetzt 6,23 zu 1 statt 5,1 --
an echten Bildpunkten gemessen, nicht an der Farbangabe.

pruef-crew-adresse 123 -> 129 · pruef-crew-wand-bild 45 ·
pruef-css-klassen gruen (prueft ab jetzt das PAAR module.css/haus.css,
nicht mehr eine Datei) · pruef-modi-wortleck 5 · pruef-rollen 274 ·
pruef-start-ansicht gruen · pruef-chat-kanaele 79.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 22:35:14 +02:00
DogFatherGitandClaude Opus 5 d92ba76e33 Kategorie-Kanaele und angeheftete Ankuendigungen (Kapitel 7.2)
Die vier Saetze aus dem Anforderungsdokument, der Reihe nach: Team-
Gruppenchat, Kategorie-Kanaele mit Zugriff fuer Owner und rechte Hand,
private 1:1-Chats OHNE diesen Zugriff, und Pin-Nachrichten an alle.

EIN KANAL IST KEINE VIERTE TABELLE, sondern eine dritte Art Raum
(`art = 'kanal'` neben 'direkt' und 'gruppe'). Damit gilt fuer ihn ohne
eine einzige neue Zeile alles, was schon da ist: Verlauf, Anhaenge,
Suche, Ungelesen-Zaehler, Live-Strom, Wegraeumen. Eine eigene Tabelle
haette all das ein zweites Mal gebraucht -- und die zweite Fassung waere
die gewesen, in der die Zugriffsregel fehlt.

Welche Zustaendigkeit, kommt aus MODI_KATEGORIEN -- derselben Liste, aus
der auch die Aufgaben ihre Kategorie nehmen. Der NAME kommt aus der
Kategorie und ist kein freies Feld: "Clipping" neben "Clipping-Team"
waeren zwei halbe Verlaeufe, und man merkt es erst, wenn jemand die
Antwort im falschen sucht. Ein eindeutiger Teilindex haelt das auch
dann fest, wenn zwei Anfragen im selben Augenblick ankommen.

DIE ZUGRIFFSREGEL STEHT IN istDrin() -- der Funktion, durch die alle
sieben lesenden und schreibenden Wege gehen. In den Routen stuende sie
in sechs davon und in der siebten nicht. Sie gilt AUSDRUECKLICH nur
fuer 'kanal': Zweier-Gespraeche bleiben zu, auch fuer DogFather (so
steht es im Dokument), und Gruppen ebenfalls -- wer eine Gruppe
aufmacht, hat sich fuer einen geschlossenen Kreis entschieden, und den
nachtraeglich still zu oeffnen waere das Gegenteil dessen, was er getan
hat. Wenn Filipe das anders will, ist es eine Zeile -- aber es waere
seine Entscheidung und muesste fuer die Beteiligten SICHTBAR sein.

istDrin() nimmt dafuer die PERSON statt ihrer Nummer und wirft bei
einer Nummer einen Fehler, statt stillschweigend "nein" zu antworten.

HOECHSTENS DREI ANKUENDIGUNGEN je Raum. Nicht eine (Regeln, Live-Plan
und Frist muessen gleichzeitig oben stehen koennen) und nicht beliebig
viele -- eine Pinnwand, die scrollt, ist ein zweiter Verlauf. Der
Aushang hat eine EIGENE Abfrage, weil der Verlauf nur 200 Zeilen
liefert: Eine Ansage von vorletzter Woche waere sonst genau dann weg,
wenn sie am laengsten oben stehen sollte. Wird die Nachricht
zurueckgenommen, faellt sie ab UND gibt den Platz frei.

DREI DINGE, DIE ERST DAS HINSEHEN GEZEIGT HAT:

  Der frisch angelegte Kanal hatte zwei Leute statt vier. Die
  Personenauswahl zeichnete nach der Rollenfolge aus bereiche.js -- wer
  dort nicht steht, wurde NICHT GEZEICHNET. Team Dogi steht dort nicht
  und darf es auch nicht (der Rollenname gehoert in keine Datei, die
  jeder herunterlaedt). Folge: DogFather konnte ueber die Auswahl
  niemandem aus seinem Team schreiben. Der Server schickt die
  Ueberschrift jetzt mit; der Browser braucht dafuer keinen
  Rollennamen. Der Kommentar, der genau davor warnte, stand die ganze
  Zeit darueber.

  Dieser Fehler war nebenbei ein Netz: Was nicht gezeichnet wird, kann
  auch nicht falsch gezeichnet werden. Deshalb ist jetzt gemessen, dass
  ein Manager und Spicy Media Team Dogi gar nicht erst geschickt
  bekommen -- und dabei fiel auf, dass Spicy Media in der EIGENEN
  Auswahl stand: Sobald es jemanden zu verbergen gibt, schreibt
  ohneVerborgene() aus "sieht alles" eine echte Liste, und darin steckt
  man selbst.

  Am Fuss jeder Nachricht stehen jetzt vier Handgriffe statt drei. Bei
  390 px -- der haeufigsten Handybreite -- stand "kopieren" 18 px ueber
  der Blase, bei 320 px 75. Behoben mit `flex-wrap: wrap` und nicht mit
  einer Schwelle: Eine Regel, die misst, bleibt beim fuenften Handgriff
  richtig; eine Zahl nicht. pruef-chat-optik misst es ab jetzt.

NACHGEZOGEN, was pruef-css-klassen an MEINEM letzten Commit fand:
teamlage.html lud kopf.js ohne wahl.js (der Sicht-Umschalter sah aus
wie aus einem anderen Programm -- kaputt war nichts, und genau deshalb
faellt es niemandem auf), und .tampel__tag stand auf 11,2 px. Beides
war schon gepusht, weil ich die Pruefung nicht laufen liess.

pruef-chat-kanaele 73 (neu) · pruef-chat 48 · pruef-chat-ausbau 64 ·
pruef-chat-anhaenge 60 · pruef-chat-optik 24 -> 26 · pruef-css-klassen
gruen · pruef-rollen 274 · pruef-modi-verborgen 78 · pruef-team-ampel 28
· pruef-start-ansicht gruen · pruef-modi-wortleck 5 ·
pruef-zwischenspeicher 21.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 20:18:04 +02:00
DogFatherGitandClaude Opus 5 6b2f34d105 Verfuegbarkeits-Ampel im Eingang -- und eine eigene Gruppe fuer Team Dogi
Filipe: "ich will dass die kacheln von den modis bei der rolle dogfather
eine eigene kategorie haben. damit ich nicht zwischen den kacheln
suchen muss."

DIE AMPEL (Blueprint 7.1). Der Eingang zeigt je Person sieben Tage:
gruen frei, gelb belegt, rot voll ab 180 Minuten. Die Abfrage sammelt
Termine ueber VIER Wege (creator_id, teilnehmer_id, erstellt_von und
die Tabelle termin_teilnehmer) -- ueber nur einen davon waeren die
meisten Termine unsichtbar geblieben und die Ampel dauerhaft gruen.
Sie waehlt NIE titel, beschreibung oder ort: Filipe soll sehen, WANN
jemand kann, nicht WAS die Person vorhat. Belegung ist Arbeitslage,
Inhalt ist privat.

DIE GRUPPE. Die zwei Team-Kacheln standen zwischen einundzwanzig
anderen. Jetzt tragen sie `gruppe: "Team Dogi"` und `gruppeNach:
"Täglich"`; start.js setzt eine so markierte Gruppe direkt HINTER die
genannte statt ans Ende. Ohne das waere sie unten gelandet -- richtig
gruppiert und trotzdem zum Suchen.

Das Ideen-Board ist dabei aus workspace/assets/js/bereiche.js
ausgezogen. Es stand dort mit `rollen: ['admin']` in einer Datei, die
jeder Modi herunterlaedt: die Kachel war unsichtbar, ihr Name nicht.
Jetzt liefert der Server sie, wie den Eingang auch.

DREI FEHLER, DIE DER BILDSCHIRM GEZEIGT HAT, NICHT DER CODE:

  Das Profilbild sprengte die Karte. teamlage.js baute ein blankes
  <img> in `.tperson__zeichen` -- ohne die Klasse `tperson__bild`, die
  es auf 44 px begrenzt. Gemeldet hat es Filipe mit einem Bildschirm-
  foto, nicht eine Pruefung.

  Der Eingang hatte ueberhaupt keine Buehne. `zuSeite()` sucht nur in
  bereiche.js, und die Eingangs-Kachel kommt vom Server -- der Rueck-
  fall war ausgerechnet der Spicy-Wasserfall. Jetzt haengt das Bild an
  `data-buehne="eingang"` im CSS, wo kein Skript daran vorbeikommt.

  Pausierte Mitglieder verschwanden. `WHERE aktiv = 1` versteckte sie
  samt ihrer offenen Meldungen. Jetzt stehen sie hinten, sichtbar
  gekennzeichnet.

DIE ERWARTUNG IN pruef-start-ansicht steht auf FUENF Gruppen, in
ihrer Reihenfolge -- die Position ist hier die eigentliche Aussage.
Eine Gruppe, die ans Ende rutscht, faellt auf dem Bildschirm kaum auf.
Die Kachelzahl blieb bei 24: umgezogen, nichts hinzugefuegt.

pruef-team-ampel 28, pruef-team-stufen 24, pruef-rollen 274,
pruef-crew-adresse 123, pruef-modi-ideen 30, pruef-modi-wortleck 5,
pruef-zwischenspeicher 21, pruef-start-ansicht gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 18:08:27 +02:00
DogFatherGitandClaude Opus 5 449fe35c0a Der Eingang: Mitglieder-Kachel, drei Stufen -- und lesbar statt leer
Zwei Auftraege in einem Zug: "mach weiter" (Blueprint Kapitel 4/4.1)
und, zum Bildschirmfoto der Seite, "das muss viel krasser sein".

KAPITEL 4 -- DIE MITGLIEDER-KACHEL
Der Blueprint nennt: "Name & Foto · Rolle(n)/Kategorie(n) · Status
(aktiv/pausiert) · Anzahl offener Aufgaben · Datum 'Modi seit' ·
Schnellaktionen". Name, Foto und Zahlen standen schon; Status, "dabei
seit", Stufe und ein Knopf zum Schreiben kommen dazu.

KAPITEL 4.1 -- DIE DREI STUFEN
Probe, Standard, Senior. Sie sind eine ARBEITSEINTEILUNG, keine
Rechtegrenze -- was ein Modi darf, haengt an der Rolle; die Stufe sagt,
wo er im Team steht. Gesetzt werden sie nur von DogFather: Der
Blueprint gibt der rechten Hand den gleichen UEBERBLICK, aber
"Verwaltungsrechte optional durch Owner freischaltbar", also aus.
NULL heisst "Probe" und nicht "unbekannt" -- ein dritter Zustand waere
eine Frage, die niemand beantworten kann.

ZWEI ECHTE FEHLER, BEIDE VON DER NEUEN PRUEFUNG GEFUNDEN

1. PAUSIERTE VERSCHWANDEN KOMPLETT. In der Abfrage stand `AND aktiv =
   1`. Wer jemanden pausierte, bei dem verschwand er samt seiner
   OFFENEN RUECKMELDUNGEN aus dem Eingang -- die warteten weiter auf
   eine Antwort, nur sah sie niemand mehr.

2. DER EINGANG HAETTE AUF FRISCHER ANLAGE 503 GELIEFERT. Die
   Checklisten-Tabellen entstehen beim ersten Aufruf einer Checkliste;
   diese Seite liest sie aber auch. Wer sie oeffnete, bevor je jemand
   eine Checkliste angesehen hatte, bekam einen Fehler ohne Erklaerung
   -- auf einer neuen Anlage also beim allerersten Blick. Das Schema
   hat jetzt einen Besitzer, der es herausgibt; ein zweites CREATE
   TABLE waere der Anfang von zwei Schemata gewesen.

"VIEL KRASSER" -- UND ZWAR MIT INFORMATION, NICHT MIT LAERM

  * ZWEI REIHEN STATT EINER. Alle fuenf Kaesten lagen in EINEM Raster
    mit 150 px Mindestbreite: Im Bildschirmfoto stand "Community 12
    von" -- abgeschnitten mitten in der Zahl -- und die laengste Liste
    machte die ganze Reihe so hoch wie sich selbst. Jetzt oben, was
    eine Antwort braucht, darunter das Team; 300 px Mindestbreite.
  * DIE KARTE WAR FAHL, und das war ein Fehler: `--r` fiel auf ein
    helles Grau zurueck, aus dem das Kantenlicht einen Nebel ueber die
    ganze Karte legte. Sie traegt jetzt die Farbe der Stufe -- kein
    Nebel, und man sieht am Rand, wer wo steht.
  * SECHS ZAHLENKAESTEN WURDEN DREI BALKEN. "40 offen" beantwortet
    nicht, wie weit man ist: 40 von 40 ist etwas anderes als 40 von
    100. Gruen (in Ordnung) und Bernstein (zu besprechen) fuellen den
    Balken; die ganze Zeile ist der Weg dorthin.
  * DIE DREI ZAHLEN DER SEITE stehen oben als Zahlen statt in einem
    Satz. Die Warnfarbe erscheint NUR, wenn wirklich etwas wartet --
    eine Null in Bernstein waere ein Alarm ohne Anlass, und ab dem
    dritten Mal sieht man ihn nicht mehr.

GEMESSEN
pruef-team-stufen (neu)  24, mit Gegenprobe: hoch- und zurueckstufen,
                         und dieselbe Stufe zweimal zu setzen darf
                         keine zweite Protokollzeile erzeugen
pruef-rollen            274   pruef-modi-checkliste  59
pruef-zwischenspeicher   21
Ansicht: Rechner 1440 und Handy 412 -- keine Skriptfehler, nichts
ragt seitlich heraus (0 px).

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 16:27:44 +02:00
DogFatherGitandClaude Opus 5 63b3ace3fa Die rechte Hand -- drei Rollen auf der Adresse des Teams
Filipe: "3 rollen. dogfather. rechte hand und modis. perfektionier das."

DIE RECHTE MUSSTE ICH NICHT ERFINDEN. Sie stehen im Blueprint V3.0,
Kapitel 3.1 und in der Sichtbarkeitsmatrix 3.2: "Gleicher Ueberblick wie
Owner. Kann Modis im Alltag koordinieren. Verwaltungsrechte optional
durch Owner freischaltbar." Also: alle Aufgaben, Ideen und Angebote des
Teams, der Eingang samt Entscheidungen, die Checklisten der Modis zum
Ansehen -- aber keine Personenverwaltung (laut Blueprint "optional",
also standardmaessig aus) und keine privaten Kalender oder Einzelchats.

DER EIGENTLICHE UMBAU WAR NICHT DIE ROLLE, SONDERN EINE MENGE.
Bis heute hiess "verborgen" im Code `rolle === "modi"` -- an acht
Stellen. Bei ZWEI verborgenen Rollen ist das genau die Sorte Stelle, die
man an sieben von acht Orten nachzieht; die achte faellt niemandem auf,
weil dort dann einfach jemand sichtbar ist, der es nicht sein sollte.
Ein vergessener Rechteschutz meldet sich nie.

Jetzt lesen alle Regeln aus TEAM_DOGI_ROLLEN: die SQL-Ausblendung
(ohneModi heisst deshalb jetzt ohneTeamDogi), die verborgenen Nummern,
die Marke, die Adressregel, die Schranke beim Anlegen. Eine dritte
verborgene Rolle waere eine Zeile.

Die Menge wohnt in crew-adresse.js und nicht bei den uebrigen Rollen:
workspace.js importiert jene Datei. Andersherum waere es ein Kreis --
Node loest ihn auf, aber mit halb gefuellten Modulen, und das faellt
erst zur Laufzeit auf.

ZWEI LOECHER, GEFUNDEN BEIM SYSTEMATISCHEN NACHLESEN
1. Die Bereichsschranke griff nur bei Modis -- die rechte Hand waere
   ueber die Adresszeile in die Agentur-Ablage gekommen.
2. Ihr Ideen-Board und ihr Angebote-Brett waeren LEER geblieben: Sie
   fiel durch den Team-Zweig hindurch in die Betreuungsregel, die fuer
   sie nichts findet. Derselbe Fehler wie am 01.09. beim Manager und am
   09.09. beim Modi -- und er meldet sich nie, weil ein leeres Brett
   nicht nach Fehler aussieht.

NEBENBEI EINE ALTE SCHWACHSTELLE WEG
gate.js hatte eine zweite Namensliste fuer die Rollen, mit dem Kommentar
daneben, sie sei "genau die Stelle, die beim naechsten Mal wieder
vergessen wird" -- was schon passiert war. Mit zwei Zugangswaenden
haette sie die Namen BEIDER tragen muessen, in einer Datei, die jeder
bekommt. Sie liest den Namen jetzt aus der Kachel, wo er ohnehin steht.

Die Zugangswand hat drei Kacheln: DogFather (Husky), Rechte Hand
(Pfote, neu) und Modi (derselbe Husky, Wunsch vom 09.09.). Die Pfote
liegt am naechsten an "rechte Hand", ohne eine Hand zu sein.

GEMESSEN
pruef-rollen           274 (statt 245; 128 statt 112 Durchgaenge)
pruef-crew-adresse     114   pruef-modi-verborgen     78 (statt 75)
pruef-modi-checkliste   59   pruef-crew-wand-bild     45
pruef-modi-ideen        30   pruef-personen-formular  27 (statt 25)
pruef-modi-katalog      29   pruef-modi-kategorien    25
pruef-zwischenspeicher  21   pruef-modi-livecheck     16
pruef-modi-wortleck      5   pruef-start-ansicht, pruef-bereiche-lesend

Jede gestiegene Zahl hat einen Grund: Die neue Rolle laeuft in DENSELBEN
Listen mit wie die Modis, nicht in eigenen. pruef-modi-verborgen war
vorher gruen, ohne sie ein einziges Mal angesehen zu haben.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 15:18:26 +02:00
DogFatherGitandClaude Opus 5 8bcbd83061 Die Modi-Seite gehoert Dogi und den Modis -- Wand, Zeichen, Reiter
Filipe zum Bildschirmfoto der Zugangswand auf crew.: "alles soll auf
dogfather und die modis perfektionniert werden auf der neuen modi seite."

Dort stand bis eben die gewohnte Wand: Spicy-Media-Logo, "Creator
Workspace", der Satz ueber Manager, Scouts und Creator, fuenf
Rollenkacheln. Fuer einen Modi war davon nichts richtig.

DIE KACHELREIHE FAELLT WEG, und das ist eine Verbesserung: Eine Reihe mit
genau einem Eintrag ist keine Auswahl, sondern eine Huerde -- man muesste
erst daraufdruecken, bevor das Codefeld etwas annimmt. gate.js prueft
jetzt, OB es Kacheln gibt, statt sie vorauszusetzen.

DIE BUEHNE IST AUS DEM VORHANDENEN MOTIV GEBAUT, nicht neu erfunden, und
das ist kein Sparen: Die Anmeldeseite ist eine MECHANIK. Rechts steht im
Bild eine leere Tafel, und gate.css setzt die Karte auf Hundertstel genau
dort hinein. Ein frei erfundenes Bild haette diese vier Zahlen
mitgenommen. Also dieselbe Szene, ueber den Mischmodus "color" ins Blau
umgefaerbt (hue-rotate haette Rot nach Cyan UND Blau nach Gelb gedreht),
Dogi anstelle des Spicy-Medaillons, "TEAM DOGI" darunter.
Gemessen: rote Bildpunkte 18,1 % -> 0,0 %, Karte auf 0 px genau.

NACH DER ANMELDUNG geht es weiter: kopf.js zieht Reitertitel und Zeichen
aus `ich.marke` nach -- "Aufgaben · Team Dogi" statt "· Spicy & Dogi", mit
dem eigenen Symbol. An einer Stelle statt in 30 HTML-Dateien.

DREI FUNDE, DIE NICHT AUS DEM KOPF KAMEN

1. DER KNOPF WAERE SCHLECHTER LESBAR GEWORDEN. Mein erstes Blau endete
   bei #4aa4cf -- weisse Schrift darauf: 2,8 zu 1. Der rot-blaue Verlauf,
   den er ersetzt, haelt ueber seine GANZE Laenge 4,65; er war offenbar
   genau darauf gebaut. Jetzt 5,10 zu 1, am fertigen Bildschirmfoto
   gemessen statt aus einer einzelnen Farbe hergeleitet.

2. DIE NEUE WAND WAR AUCH AUF workspace. ABRUFBAR. Sie liegt als Datei im
   selben Ordner. Aufgefallen ist das, weil der Wortleck-Test sie ueberhaupt
   las -- die Frage WARUM war die Antwort. Ausserhalb von crew. antwortet
   sie jetzt mit 404; auf den Pruefadressen bleibt sie erreichbar, sonst
   koennte die Pruefung sie nicht mehr oeffnen und waere gruen ohne etwas
   zu messen.

3. ZWEI GLEICHE KACHELN AUF DER STARTSEITE, seit dem letzten Deploy live.
   Die Team-Lage-Kachel von heute Mittag hatte Name, Zeichen, Ton UND
   Gruppe einer schon vorhandenen -- fuehrte aber woandershin. Gefunden
   von "jede Kachel hat ihre eigene Farbe (23 Farben auf 24 Kacheln)".
   Jetzt "Eingang", Gruppe Taeglich, neuer Ton 24 (#8a20cf, Abstand 38,5
   im CIELAB-Raum; reines Blau haette 52 gehabt und waere auf dunklem
   Grund am schlechtesten zu fokussieren). Eine Fehlermeldung zeigte
   dadurch auf die falsche Seite -- ebenfalls behoben.
   Und die Pruefung, die es fand, zaehlte nur bereiche.js: Vom Server
   angehaengte Kacheln kannte sie nicht. Sie fragt jetzt beide Quellen.

Der Wortleck-Test meldete ausserdem sieben Fundstellen -- allesamt
Kommentare, die ich beim Bauen selbst geschrieben hatte.

GEMESSEN
pruef-crew-adresse     103   pruef-crew-wand-bild    43 (neu)
pruef-modi-checkliste   59   pruef-modi-verborgen    75
pruef-rollen           245   pruef-zwischenspeicher  21
pruef-modi-wortleck      4   pruef-start-ansicht     gruen

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 13:59:54 +02:00
DogFatherGitandClaude Opus 5 e1608ee783 Das Ideen-Board -- und fuenf Kacheln, die ins Leere fuehrten
KAPITEL 5.6: "Sammelstelle fuer Content-, Live- und Community-Ideen mit
Priorisierung." Fast nichts davon musste neu gebaut werden: `eintraege`
hat Titel, Text, Status und `dringlichkeit` (hoch/mittel/niedrig) -- und
das IST die Priorisierung. Eine eigene Tabelle daneben waere eine VIERTE
Sichtbarkeitsregel gewesen; genau deren Vervielfaeltigung hat heute
schon ein Leck verursacht.

Der Bereich gehoert niemandem einzeln (`ohneCreatorBezug`) -- eine Idee
gehoert der Runde. KEIN `fuerAlle`: Das waere der naheliegende Griff
gewesen und der falsche, denn es heisst woertlich JEDER. Wer die
Sammlung sieht, entscheidet dieselbe Regel wie ueberall.

DER RISKANTE TEIL WAR DIE DATENBANK. Die erlaubten Bereiche stehen als
CHECK-Regel, und SQLite kann die nicht aendern -- die Tabelle muss neu
gebaut werden. Die alte Umstellung fuer 'agentur' schreibt dafuer den
ganzen Bauplan von Hand ab; im Kommentar dort steht, dass dabei schon
einmal drei Spalten vergessen wurden. Statt einer vierten Abschrift ist
die Fassung von heute Morgen jetzt tabellenunabhaengig
(checkListeErweitern): Spaltenliste aus der Tabelle, Sicherung vorher,
Zaehlung innerhalb der Transaktion.

UND DABEI WAERE EIN STILLER TOTALAUSFALL PASSIERT. Das Muster fuer den
Tabellenkopf stand in einem Template-Literal -- dort verschluckt
JavaScript den Backslash, aus `\s` wird `s`, das Muster hiess
"CREATE TABLEs+..." und traf nie etwas. Die Umstellung haette
SCHWEIGEND nichts getan: kein Fehler, kein Hinweis, nur ein Bereich, den
es nie gegeben haette. Im Quelltext war das nicht zu sehen; gefunden hat
es eine Messung. Jetzt steht dort gar kein Muster mehr -- alles vor der
ersten Klammer IST der Tabellenkopf, und das kann man nicht falsch
maskieren.

Die Pruefung baut deshalb eine ECHTE ALTE Tabelle und laesst die
Umstellung darauf laufen. Eine frische Datenbank bringt den Bereich
schon mit -- die Umstellung liefe gar nicht erst an, und alles waere
gruen, ohne das Riskante angesehen zu haben.

=== DER GROESSERE FUND ===

FUENF VON ZEHN MODI-KACHELN FUEHRTEN INS LEERE. Der Server hat eine
Liste, welche Rolle welche Seite oeffnen darf; bereich.html und
profil.html schlossen 'modi' aus. Vier Bereichs-Kacheln und das eigene
Profil leiteten wortlos auf die Startseite zurueck.

Der Rollen-Rundgang meldete sie trotzdem als "ok", und zu Recht: Eine
Umleitung ist kein Fehler. Die Seite laedt, keine rote Konsole, keine
4xx-Antwort. Sie ist nur eine ANDERE. Das ist eine eigene Fehlerklasse
-- nicht "kaputt", sondern "fuehrt woandershin" -- und sie faellt nur
dem auf, der die Anwendung benutzt und merkt, dass ein Knopf nichts tut.

Beinahe waere meine eigene Pruefung darauf hereingefallen: Sie fand auf
der zurueckgeleiteten Startseite das Wort "Ideen-Board" -- den Text der
KACHEL -- und hielt sie fuer das Board. Jetzt steht die Adresse in der
Bedingung.

DIE SPERRE DAGEGEN GILT AB SOFORT FUER ALLE: pruef-rollen klickt fuer
JEDE Rolle jede Kachel durch, die sie angeboten bekommt, und verlangt,
dass sie dort ankommt. Geprueft wird die Zusage der Startseite, nicht
eine Liste daneben -- eine Liste koennte selbst veralten. 113 -> 243
Pruefungen; der Zuwachs ist genau das.

Er hat im ersten Anlauf zwei weitere Loecher gefunden:

  * "Mein Profil" war die falsche Seite. profil.html ist der
    Creator-Entwicklungsplan und antwortet mit 404, wenn die Person kein
    Creator ist. Die eigene Seite heisst steckbrief.html.
  * content.html stand auf `null` ("jede angemeldete Rolle") -- mit der
    neuen Rolle also auch sie. Die Seite laedt, ihre Schnittstelle gibt
    404. Das ist die Kehrseite von "geschuetzt ist die Regel, nicht die
    Ausnahme": Eine NEUE ROLLE erbt jedes `null` automatisch.

Und ein Modi kommt nur in SEINE Bereiche -- sonst waere er ueber die
Adresszeile in der Agentur-Ablage gelandet. Welche erlaubt sind, wird
aus seinen Kacheln abgeleitet statt danebengeschrieben.

=== KLEINERES, ABER SICHTBARES ===

Ueber dem Board stand "Betreuung" -- die Beschriftung fuer Akten, die
UEBER jemanden gefuehrt werden. Eine Sammelstelle ist das Gegenteil.
Aufgefallen auf dem Bildschirmfoto, wie so oft heute.

Der Farbton der Kachel ist nicht nach Gefuehl gewaehlt: Alle 22
vorhandenen waren belegt, also wurde der Abstand zu jedem ausgerechnet
und der genommen, der sich am deutlichsten unterscheidet, ohne grau zu
wirken (#5f8a9f, Abstand 127).

BEINAHE HAETTE ICH EIN LOCH REPARIERT, DAS ES NICHT GIBT: Meine Pruefung
meldete, die Suche verrate die Ideen an Spicy Media. Tatsaechlich fand
sie null Treffer -- die Pruefung hatte ihren EIGENEN Suchbegriff
wiedergefunden, weil die Antwort ihn im Feld `frage` zurueckspiegelt.
Gezaehlt wird jetzt, was gefunden wurde.

pruef-spicy erwartete den alten Wortlaut der Umstellungsmeldung. Sie
nennt jetzt Tabelle und Spalte statt "Rolle"; geprueft wird der Sinn,
nicht der Satz.

GEPRUEFT: pruef-modi-ideen (30, neu), pruef-rollen (243 statt 113),
pruef-modi-verborgen (75), pruef-modi-katalog (29), pruef-spicy (60),
pruef-css-klassen, pruef-start-ansicht.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 02:19:06 +02:00
DogFatherGitandClaude Opus 5 88e2b5cd5d Der Wecker: das Zeitfeld ging auf -- nur ausserhalb des Bildschirms
Filipe: "wenn ich am handy auf den wecker drücke dan sieht man nichts."

Er hat woertlich recht. Der Knopf tut, was er soll, und das Zeitfeld
klappt auf -- es steht nur nicht im Bild. Aufgeklappt gemessen, fuenf
Breiten:

  320 px  Feld bei -127 .. -8    komplett draussen
  360 px  Feld bei -107 .. 12
  390 px  Feld bei  -92 .. 27
  412 px  Feld bei  -81 .. 38
  430 px  Feld bei  -72 .. 47

DER GRUND IST EIN ANKER, DER GEWANDERT IST. `.tagesruf__feld` steht mit
`right: 56px` da -- "56 px nach links vom Knopf". Am Rechner ist das
richtig: Dort sitzt der Knopf am rechten Rand einer breiten Kachel, und
links davon liegt die Luecke zwischen Text und Uhr. Auf dem Handy wird
derselbe Knopf aus dem Fluss genommen und neben die zentrierte Uhr
gehaengt -- er steht dann ganz LINKS, und 56 px weiter links ist kein
Raum mehr, sondern der Bildschirmrand.

Der Abstand stimmte also noch, der Bezugspunkt nicht mehr. Dieselbe
Sorte Fehler wie die feste Umbruchschwelle und die 62 px Kopfhoehe: eine
Zahl, die fuer eine Anordnung ausgerechnet wurde und in der zweiten
still falsch ist.

Es oeffnet jetzt auf dem Handy nach RECHTS statt nach links -- in die
Richtung, in der dort der Platz ist. Das ist keine zweite Zahl, sondern
dieselbe Regel andersherum ("ins Freie oeffnen"). Der linke Rand des
Knopfes ist nie kleiner als 0, das Feld 119 px breit, der schmalste
Bildschirm 320 -- damit liegt es auf jeder Breite im Bild, ohne dass
eine Schwelle stimmen muss. `max-width: calc(100vw - 24px)` als
Sicherung, falls das Feld je breiter wird.

Die Regel steht in heim.css direkt neben der Regel, die den Knopf
verschiebt. Sie gehoeren zusammen: Wer den Anker bewegt, sieht die
Folge in derselben Medienabfrage.

GEPRUEFT WIRD ES JETZT AUCH (pruef-handy, 99 -> 115 Pruefungen). Das
Feld wird dafuer aufgeklappt gemessen, nicht zugeklappt -- ein
verstecktes Feld hat keine brauchbare Lage, und genau die ist die
Frage. Gegenprobe ist die Messung von vorher: Mit demselben Messmittel
lag das Feld bei -92..27, die Bedingung waere rot gewesen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 21:57:11 +02:00
DogFatherGitandClaude Opus 5 6c48579f66 Die Kopfleiste bleibt auch in einer fremden Sicht in EINER Reihe
Filipe, mit Bildschirmfoto aus der installierten App: "es ist noch
nicht alles in einer zeile und irgendwie funktionieren nicht alle
knoepfe."

DER GRUND WAR NICHT DIE BREITE SEINES GERAETS, SONDERN DER ZUSTAND.
In der eigenen Sicht klappt der Umschalter auf 36 px zusammen; sobald
man die Sicht einer anderen Person uebernimmt, stand der Name darin und
er war 152 px breit. Gemessen waren es dann zwei Zeilen bei 320, 360,
390, 412 UND 430 px -- ausnahmslos. Auf seinem Bild stand "Miesmus..."
im Umschalter und der goldene Rahmen um die Seite: er war in einer
fremden Sicht.

MEINE PRUEFUNGEN HABEN DEN FALSCHEN ZUSTAND GEMESSEN. pruef-handy lief
ausschliesslich in der eigenen Sicht und war deshalb gruen, waehrend
es beim Nutzer zweizeilig war. Ein gruener Haken sagt nur, dass die
Bedingung erfuellt war -- nicht, dass sie den Zustand geprueft hat, in
dem der Nutzer ist. Die Pruefung wechselt jetzt selbst in eine fremde
Sicht (92 -> 99 Pruefungen).

WAS SICH AENDERT
- Auf dem Handy ist der Umschalter auch in fremder Sicht ein
  Zeichenknopf: Auge + Anfangsbuchstabe, 46-48 statt 152 px, in der
  ROLLENFARBE der Person, deren Sicht laeuft. Die Farbe kommt aus
  `data-rolle` -- dieselbe Zuordnung, die gate.css ohnehin hat, keine
  zweite Farbliste.
- Der volle Name wandert in ein Band unter die Leiste, zusammen mit
  "Zurueck zu meiner Sicht" als ganzem Satz statt als 28-px-Kreuz. Er
  steht dort GANZ statt als "Miesmus...". Am Rechner bleibt alles wie
  bisher; dort ist Platz.
- Der Rahmen um die Seite nimmt dieselbe Farbe an. Man sieht damit
  nicht nur DASS eine fremde Sicht laeuft, sondern WESSEN.
- Das `:not([data-fremd="ja"])` faellt an beiden Stellen weg. Es war
  der ganze Fehler: eine Regel, die den wichtigeren Fall ausnahm.

UND DER BLOCK FUER SCHMALE GERAETE STAND AN DER FALSCHEN STELLE
Er galt bis 340 px und stand 3600 Zeilen VOR dem 560er-Block -- bei
gleicher Spezifitaet verliert er damit. Gewirkt hat er nur, weil sein
Selektor zufaellig ein `:not()` trug. Jetzt steht er direkt hinter dem
560er und gilt bis 400 px (34 px je Knopf, 4 px Abstand). Damit bleibt
auch bei 360 px auf den UNTERSEITEN alles in einer Reihe -- dort stehen
zusaetzlich der Zurueck-Knopf und die Glocke.

Gemessen nach dem Umbau, eigene und fremde Sicht, Start- und
Unterseite: 360, 390, 412 und 430 px alle einzeilig. Offen bleibt
320 px (iPhone SE 1. Generation bzw. Anzeige-Zoom) -- dort passt es
ohne das Weglassen einer Funktion nicht, das ist eine Entscheidung
und kein Handgriff.

DER SICHERE BEREICH (auf Filipes Zusage)
Jede der 20 Seiten sagt `viewport-fit=cover`, aber im ganzen Workspace
stand kein einziges `env(safe-area-inset-*)`. Sein Android ist NICHT
betroffen (im Bildschirmfoto nachgesehen), ein iPhone waere es: Von
einem 36-px-Knopf blieben unter einer 47 px hohen Statusleiste
rechnerisch 5 px zum Antippen. Einmal zentral benannt (gate.css) und an
den vier Stellen angewandt, wo etwas am Rand klebt: Kopfleiste (oben und
seitlich), Inhalt (seitlich und unten), Speichern-Leiste im Profil,
Chat-Eingabe. Auf Geraeten ohne Aussparung sind alle vier Werte 0.

Nebenbei: chat.js misst die Hoehe ueber der Chatflaeche jetzt
einschliesslich des Bandes -- sonst stuende das Eingabefeld genau um
dessen Hoehe unter dem Bildschirmrand. Derselbe Fehler wie mit den
festen 62 px, nur mit einem anderen Element.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 19:44:25 +02:00
DogFatherGitandClaude Opus 5 d0ac8ee8d1 Das Logo: aus dem Fleck wird wieder ein Hund
Filipe: "kannst du bitte das logo wenn man es installiert auf pc oder
handy und oben rechts in der leiste noch perfektionnieren."

Beide Stellen hatten denselben Fehler, und er war derselbe wie an
mehreren Stellen davor: Der Husky lag als MASKE auf einer Farbflaeche.
Von einer Maske zaehlt nur der Alphakanal, und die Vorlage ist rundum
freigestellt -- uebrig blieb eine geschlossene Flaeche in Hundeform.
Kein Auge, keine Schnauze, kein Ohrinneres. Ein Fleck.

Jetzt liegt an beiden Stellen dieselbe Zeichnung im Mischmodus "screen"
ueber einer stahlblauen Silhouette: Schwarz laesst das Fell dunkel,
Weiss hebt Gesicht, Ohren und Auge heraus. Gleiche Farben, gleicher
Daempfer (.88) -- ein Zeichen, zwei Orte.

App-Symbol ausserdem:
- Die Chili lief mit ihrem Stiel quer ueber den Fang. Sie ist jetzt
  gespiegelt, kleiner und liegt hinter dem Hals.
- Der Hals endete in einer geraden Kante (die Vorlage ist unten
  angeschnitten). Eine zweite Maske blendet ihn aus, statt ihn
  abzuschneiden.
- Der Grund war matschig: Rot und Blau trafen sich diagonal genau dort,
  wo der Kopf steht. Jetzt kaltes Licht oben, warmes unten.
- Unter 64 px faellt die Gesichtszeichnung weg, die Chili aber NICHT --
  klein erkennt man ein Zeichen zuerst an der Farbe.
- Alle Masse haengen an einer Zahl (Groesse der Gruppe), nicht an sechs.

Kopfleiste ausserdem:
- Die Chili links hatte einen BLAUEN Schein -- aus der Zeit, als dort
  der Husky stand. Der Schein ist nie mitgewandert. Jetzt warm.
- `filter` ersetzt, es ergaenzt nicht: Beim Ueberfahren wurde der Schein
  geloescht und das Zeichen dabei flacher statt heller. Behoben.

Damit die Aenderung auch ankommt:
- Der Stempel gilt jetzt auch fuer die App-Symbole und fuer das
  Manifest. Bilder werden einen Tag zwischengespeichert, das Symbol der
  INSTALLIERTEN App gar nicht neu geholt -- ohne Stempel haette niemand
  das neue Zeichen gesehen.
- pruef-zwischenspeicher prueft das (18 -> 21 Pruefungen).

Werkzeuge:
- tools/ausschnitt.mjs (neu): schneidet aus einem Bildschirmfoto ein
  Stueck heraus und vergroessert die PNG-Datei. Noetig, weil eine
  Vergroesserung per CSS-transform den Browser NEU rechnen laesst --
  ich habe damit 264 px beurteilt und geglaubt, es seien 22, und daraus
  den falschen Schluss gezogen, ein Gesicht trage bei 22 px nicht.
- tools/ansicht.mjs: AUSSCHNITT=<selektor> nimmt nur ein Element auf.
- workspace-symbol.mjs: SYMBOL_ZIEL lenkt die Ausgabe um (Entwuerfe
  ansehen, ohne die sechs echten Dateien zu ueberschreiben), und zwei
  Gegenproben pruefen jetzt, dass Gesicht und Chili wirklich zu sehen
  sind -- die alte Pruefung sagte nur "es steht etwas drauf" und haette
  den Fleck anstandslos durchgewunken.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 18:24:20 +02:00
DogFatherGitandClaude Opus 5 bec46ed991 Team-Seite: Kopf und Karten sind jetzt echte Kacheln
Filipe, mit Bildschirmfoto: "perfektionnir das in einer kachel in der
farbe von der kategorie bitte. und die kacheln unten in der seite auch
perfektionnieren und geil machen bitte."

--- DER KOPF ---

Er war eine freistehende Ueberschrift auf dem Buehnenbild. Jetzt ist er
eine Kachel wie jede andere im Haus: gefraeste Fase, Kantenlicht,
Eckwinkel, Raster -- alles aus der Modulliste in module.css, wo
`.t-kachel` seit diesem Commit steht.

DIE FARBE IST NICHT ABGESCHRIEBEN. Die Kachel traegt `data-ton="22"`,
und die Regel dazu steht in start.css -- dieselbe, aus der die Kachel
auf der Startseite ihre Farbe zieht (#ffd166). Es gibt weiterhin genau
EINE Stelle, an der die Farbe dieser Kategorie steht; wer sie dort
aendert, aendert beides. Eine zweite Hexzahl in team.css waere die
naechste gewesen, die auseinanderlaeuft.

Der Grenzsatz ("Termine, Chats und Dateien kommen hier nicht vor")
wechselt von Gruen in denselben Ton: In einer Kachel, die schon eine
Farbe hat, ist eine zweite Farbe daneben eine zweite Aussage.

--- DIE KARTEN UNTEN ---

`.tperson` und `.tl` stehen ebenfalls in der Modulliste. Ein
Manager-Kasten leuchtet damit lila, ein Scout-Kasten gruen, ein
Lueckenkasten rot -- ueber `--ton`, ohne dass eine einzige Farbe hier
ausgeschrieben stehen muss.

DER STREIFEN LINKS IST DAFUER WEG, und das ist kein Verlust: module.css
belegt ::before und ::after selbst (Kantenlicht und Eckwinkel) und
laedt NACH team.css -- ein eigenes ::after waere ohnehin wirkungslos
gewesen. Das Kantenlicht traegt die Rollenfarbe jetzt rund um die ganze
Karte statt auf drei Pixeln links.

DIE KENNZAHLEN BLEIBEN SCHLICHT, und das ist eine Entscheidung: Sie
stehen zu acht in einer Karte. Jede davon mit Fase, Kantenlicht und
Eckwinkel waere ein Schaufenster voller Rahmen und keine Auskunft mehr
-- eine Kachel in der Kachel in der Kachel liest niemand. Sie bekommen
nur die abgeschnittene Ecke aus derselben Formel, damit sie erkennbar
zur Familie gehoeren.

--- EIN FEHLER, DEN NUR DAS HANDY GEZEIGT HAT ---

Der Grenzsatz-Kasten hat `flex: 1 1 300px`. Am Rechner ist das richtig:
Dort ist die Hauptachse waagerecht, und er teilt sich die Breite mit
dem Titel. Am Handy dreht die Reihe auf eine SPALTE -- und derselbe
Wert liess ihn in die HOEHE wachsen. Auf dem Bildschirmfoto stand
danach die halbe Kachel leer.

Ein Flexwert gilt fuer eine Richtung, nicht fuer ein Element. Wer die
Richtung dreht, muss ihn mitdrehen.

--- Pruefung ---

pruef-css-klassen: die Modulliste steht weiterhin siebenmal und
Zeichen fuer Zeichen gleich (jetzt 48 Klassen).

pruef-team, 51 Pruefungen: darunter acht Kontrastmessungen an der
WIRKLICHEN Flaeche -- die Hintergruende haben sich durch den Umbau
geaendert, und eine Kachel mit Raster und Verlauf ist etwas anderes als
ein flacher Kasten. Gemessen jetzt 6,71 bis 15,12:1.

Ausserdem gruen: pruef-handy, pruef-lesbarkeit, pruef-buehne.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 16:26:57 +02:00
DogFatherGitandClaude Opus 5 b45de940e8 Rund um das Team -- die Arbeitslage von Managern und Scouts
Filipe: "so eine kategorie wie ueber die creator will ich dass nur fuer
die spicy und dogfather rolle auch ueber manager und scouts gibt ...
ich will dass es so ultra krass gut ist dass die spicy und dogfather
rolle einen kompletten teil haben mit daten ueber die arbeit von den
manager und scout. keine geheimen sachen also termine, chats und
geheime dateien soll auch so bleiben dass keiner."

--- ZUERST DIE KOPFLEISTE ---

Filipe meldete, die Kopfleiste sei bei DogFather "nicht gemacht".
Nachgemessen auf ALLEN 18 Seiten, in allen fuenf Rollen, bei drei
Breiten: einzeilig, Spanne 4 px. Und die neuen Dateien liegen
nachweislich auf dem Server (a70bc4f, `abmelden__zeichen` in der
ausgelieferten kopf.js). Das Bild war vor dem Ausliefern entstanden.

Die Messung hat aber zwei echte Sachen gefunden, die vorher niemand
gesehen hatte -- beide bei 320 px auf UNTERseiten, wo links der
Zurueck-Knopf und rechts zusaetzlich die Glocke steht: 305 px
gebraucht, 294 verfuegbar. Eine Stufe kleiner (34 px je Knopf, 4 px
Abstand) macht 283 und passt; 34 px bleiben weit ueber den 24 px
Mindestmass fuer ein Beruehrziel.

Ausserdem die Auslieferung geordnet: HTML wird immer nachgefragt,
Dateien mit Versionsstempel duerfen ein Jahr liegenbleiben (vorher
bekam ALLES `no-cache`, also auch jede Stilvorlage bei jedem Aufruf).
sw.js ausgenommen -- er wird ohne Stempel geladen, ein Fehler darin
bliebe sonst ein Jahr stehen.

--- DIE NEUE SEITE ---

workspace/team.html, nur fuer `spicy` und `admin`. Aufbau:

  DIE LUECKEN ZUERST. Creator ohne Betreuung, Scouts ohne Manager,
  Leute ohne einen einzigen Creator -- mit NAMEN, nicht nur als Zahl.
  Eine Kennzahl sagt, wie es laeuft; eine Luecke sagt, wo etwas fehlt,
  und nur das Zweite kann man heute abstellen.

  DANN DIE LAGE in fuenf Zahlen, dann JEDE PERSON EINZELN: betreute
  Creator, laufende und ueberfaellige Aufgaben, in 30 Tagen erledigte,
  Durchlaufzeit, Startcheck-Fortschritt der betreuten Creator,
  LIVE-Tage und Diamanten. Bei Scouts zusaetzlich die Pipeline mit
  Uebernahmequote und Zeit bis zur Uebergabe.

  EIN MANAGER TRAEGT DIE CREATOR SEINER SCOUTS MIT. Ohne das saehe
  einer mit fuenf Scouts aus wie jemand ohne Arbeit.

--- DREI ENTSCHEIDUNGEN, DIE ALLES TRAGEN ---

1. TERMINE, CHATS UND DATEIEN KOMMEN NICHT VOR -- weder Inhalte noch
   Zaehlungen. Ausdruecklicher Wunsch, und der richtige: Ein Kalender
   verraet, wann jemand nicht da war; ein Chatzaehler, mit wem jemand
   oft spricht.

   Das ist keine Zusicherung im Kommentar. pruef-team liest den
   Quelltext von workspace-team.js und schlaegt an, wenn eine dieser
   Tabellen darin auftaucht -- mit Gegenprobe, dass die Suche `aufgaben`
   und `leads` auch wirklich findet. Der Weg ueber die Antwort allein
   waere schwaecher: Ein leerer Testbestand kann ein Feld verstecken.

2. SEGMENTIEREN, NICHT MITTELN. Aus der Recherche zu
   Arbeitslast-Dashboards: Ein Durchschnitt versteckt genau die Person,
   bei der es klemmt. Markiert wird gegen den MEDIAN der eigenen Rolle
   -- ein Manager traegt naturgemaess mehr als ein Scout, und ihn daran
   zu messen waere unfair und nutzlos.

3. ES IST EINE ARBEITSLAGE, KEINE UEBERWACHUNG. Das steht so auf der
   Seite, im Kopf, in einem eigenen Kasten. Wer das nicht dazuschreibt,
   baut ein Kontrollwerkzeug, auch wenn er es nicht wollte. Deshalb
   zeigen die Kennzahlen auf ZUSTAENDE (unbetreute Creator,
   liegengebliebene Kontakte) und nicht auf Anwesenheit oder Fleiss.

--- WAS DIE MESSUNG UNTERWEGS GEFUNDEN HAT ---

* Die Lead-Status hiessen anders, als ich angenommen hatte: "kontakt"
  gibt es nicht. Die CHECK-Bedingung der Datenbank hat es sofort
  abgelehnt -- ohne sie waere "offen" still zu klein gewesen.

* Die Pruefung fand ihr eigenes Hinweisschild: Die Antwort traegt ein
  Feld `ausgenommen: ["Termine","Chats","Dateien"]`, aus dem die Seite
  den Satz baut. Es wird jetzt herausgenommen UND eigens geprueft --
  ignorieren waere bequem gewesen und haette kuenftig jedes Feld unter
  diesem Namen durchgelassen.

* Die Lektion vom Vorlagenbrett gleich mitgenommen: alle Karten haben
  einen DECKENDEN Grund. Eine Karte mit sieben Prozent Farbe auf
  durchsichtigem Grund laesst das Buehnenfoto durch -- dort waren es
  3,61:1. Gemessen jetzt: 6,61 bis 14,80:1. Eine der Regeln hatte den
  deckenden Grund selbst wieder aufgehoben (zwei Regeln, die spaetere
  gewinnt) -- gefunden, bevor es jemand sehen musste.

* "1 Scouts" statt "1 Scout". Eine Kleinigkeit, und das Erste, was
  auffaellt: Eine Seite, die ihre eigene Sprache nicht beherrscht, wird
  auch bei den Zahlen nicht geglaubt.

--- Pruefung ---

server/pruef-team.mjs, neu, 51 Pruefungen, alle gruen. Darunter: alle
fuenf Rollen an Schnittstelle UND Seite (Manager, Scout und Creator
bekommen 404 bzw. eine Umleitung), Spicy sieht VanVan nicht (mit
Gegenprobe an der Personenliste), die Zahlen an einem gebauten
Bestand, acht Kontrastmessungen an der wirklichen Flaeche, Handy.

server/pruef-zwischenspeicher.mjs, neu, 15 Pruefungen: was liegenbleiben
darf und was nicht -- an echten Kopfzeilen gemessen, nicht am
Quelltext. Sie meldete zuerst drei Fehler, und das war sie selbst: Sie
fragte unangemeldet und bekam Umleitungen. Eine Pruefung braucht ihre
Voraussetzung, bevor sie misst.

Ausserdem gruen: pruef-handy (das Handy fand die 320-px-Sache),
pruef-workspace-seiten, pruef-alle-wege, pruef-sicht, pruef-css-klassen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 15:42:14 +02:00
DogFatherGitandClaude Opus 5 a70bc4f235 Kalender: blaettern direkt ueber dem Raster, rot und gruen
Filipe, mit Bildschirmfoto: "ich will dass genau da ueber dem kalender
auch noch buttons sind um den monat zu wechseln, tage wechseln.
perfektionnier mir das bitte. und mach auch die buttons die schon da
sind noch viel klarer bitte und die neuen auch. lass die neuen auch
richtig geil aussehen, die einen rot und die anderen gruen."

--- WARUM DAS EINE ECHTE LUECKE WAR ---

Die Pfeile gab es schon -- oben neben der Ueberschrift, einen halben
Bildschirm ueber dem Raster, das sie bewegen. Wer durch Monate
blaettert, sieht auf das Raster und nicht auf die Ueberschrift; der Weg
dorthin war jedes Mal ein Blicksprung.

Die neuen Knoepfe rufen DIESELBE Funktion (`springen`), sie kopieren sie
nicht. Zwei Fassungen desselben Schritts waeren zwei Gelegenheiten,
dass die eine spaeter anders springt als die andere.

--- BESCHRIFTET, NICHT NUR BEPFEILT ---

Ein Pfeil sagt nicht, WIE WEIT er springt. In der Monatsansicht ist ein
Schritt ein Monat, in der Wochenansicht eine Woche, in Liste und
Zeitstrahl sechs Wochen. Genau das steht jetzt drauf und wird beim
Umschalten mitgefuehrt -- steht "Monat vor" und es springt eine Woche,
ist das schlimmer als gar keine Beschriftung.

"Heute" ist ausgegraut, solange man schon dort steht. Ausgegraut und
nicht versteckt: Sonst springen die drei Knoepfe beim Blaettern in der
Breite. Ein Knopf, der nichts tut, wird sonst einmal gedrueckt und
danach nicht mehr ernst genommen.

--- ROT UND GRUEN, ABER NICHT SIGNALROT ---

Diese beiden Knoepfe stehen den ganzen Tag auf dem Bildschirm. Genommen
sind die Haustoene: das gedeckte Rot der Warnfarbe, das Gruen der
Scout-Rolle. Beide hell genug fuer Schrift auf dunklem Grund, keins
leuchtet.

Die Richtung steckt zusaetzlich in der FORM: Der Pfeil steht links beim
Zurueck und rechts beim Vor. Wer Rot und Gruen nicht unterscheidet --
etwa acht Prozent der Maenner --, liest die Richtung trotzdem.

--- UND DIE VORHANDENEN KNOEPFE ---

Der Ansichts-Umschalter: Die drei nicht gewaehlten Knoepfe waren nackte
Schrift auf dunklem Grund -- sie sahen aus wie Beschriftungen, nicht wie
Schaltflaechen. Wer nicht weiss, dass "Woche" anklickbar ist, klickt
nicht darauf. Sie haben jetzt eine eigene Flaeche; die gewaehlte bleibt
das gebuerstete Metall und hebt sich dadurch sogar deutlicher ab.

Die Filterknoepfe standen auf --text-still, der leisesten Schrift der
Seite -- ausgerechnet an einem Bedienelement. Und "aus" unterschied
sich nur am hohlen Punkt.

--- EIN EIGENER FEHLER UNTERWEGS ---

Am Handy verschwindet das Wort, damit die Leiste nicht umbricht. Der
erste Anlauf liess die Polsterung stehen: Uebrig blieb ein 30 px
breites Pillchen mit einem winzigen Pfeil -- kleiner als das, was man
mit dem Daumen sicher trifft, und die Farbe war darauf kaum noch zu
sehen. Jetzt ein rundes Ziel von 44 px mit einem Pfeil, der die Flaeche
fuellt. Gesehen habe ich das erst auf dem Bildschirmfoto, nicht beim
Schreiben.

--- Pruefung ---

pruef-kalender, elf neue Messungen: beide Knoepfe blaettern wirklich,
die Beschriftung nennt die Schrittweite und folgt der Ansicht
("Monat vor" -> "Woche vor"), "Heute" graut sich richtig aus und wird
wieder anklickbar.

Rot und Gruen werden an ECHTEN Farbwerten geprueft (ueber ein Canvas
zurueckgelesen, weil color-mix() als "color(srgb ...)" herauskommt und
ein Muster ueber die Ziffern Unsinn liest -- derselbe Fehler wie heute
Mittag bei der Personenkachel). Dazu die Gegenprobe, dass die beiden
sich wirklich unterscheiden: Abstand 187.

Ausserdem gruen: pruef-css-klassen, pruef-lesbarkeit, pruef-handy.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 15:05:49 +02:00
DogFatherGitandClaude Opus 5 f3acfab10a Aufgaben: die Bedienung, nicht die Kacheln
Filipe: "ich will dass du dass system jetzt wie die vier kategorien
bedient werden, perfektionnierst ... ich red von den aufgaben. das
system von den aufgaben, die bedienung ... die hauptkachel von der
kategorie nicht veraendern oder anfassen, die bleiben so."

Die vier Kacheln sind unberuehrt. Geaendert ist, was danach kommt.

--- 1. DAS VORLAGENBRETT WAR IM WEG ---

Gemessen am Handy: Der Vorlagenblock fuellte ANDERTHALB BILDSCHIRME,
bevor die erste eigene Aufgabe kam. Und mein eigener Ausbau von Profi
und Meister ein paar Stunden vorher hat ihn noch laenger gemacht --
aus 48 Vorlagen wurden 80.

Das ist die falsche Reihenfolge: Vorlagen holt man selten, das Brett
benutzt man jeden Tag. Der Block bleibt an seiner Stelle (dort gehoert
er hin, weil daraus Aufgaben auf das Brett darunter wandern), ist aber
zugeklappt. Zugeklappt steht dort, WIE VIEL darin liegt -- sonst sieht
er aus wie eine Ueberschrift ohne Inhalt und niemand macht ihn auf.

Wer ihn aufmacht, findet ihn beim naechsten Mal offen: Wer Vorlagen
holt, holt meistens mehrere. Und zugeklappt werden die achtzig Karten
GAR NICHT ERST GEBAUT, nicht nur versteckt.

--- 2. MAN SAH NICHT, WAS MAN SCHON GEHOLT HATTE ---

Dieselbe Vorlage liess sich zweimal uebernehmen, und die Aufgabe stand
dann zweimal auf dem Brett -- ohne jeden Hinweis. Bei achtzig Vorlagen
ueber vier Stufen weiss niemand auswendig, was er letzten Monat schon
geholt hat.

Die Kennung der Vorlage steht jetzt an der Aufgabe (neue Spalte
`vorlage`). Ueber den TITEL zu vergleichen waere die naheliegende
Abkuerzung gewesen -- und faellt in dem Moment um, in dem jemand den
Titel einer uebernommenen Aufgabe aendert.

Uebernommene Karten treten zurueck (nicht: verschwinden -- wer sie
ausblendet, nimmt die Moeglichkeit, sie bewusst noch einmal zu holen),
tragen "schon uebernommen" MIT ZUSTAND, und ihr Knopf heisst
"Nochmal". Darunter steht der Stand: "5 von 7 noch nicht uebernommen."
Es braucht dafuer keine zweite Abfrage -- die Aufgaben liegen ohnehin
im Browser.

--- 3. DRINGEND SCHLAEGT WICHTIG ---

Die Liste war nach PRIORITAET sortiert, dann nach Frist. Auf dem Brett
stand damit eine seit vier Tagen ueberfaellige Aufgabe mit Prioritaet
"niedrig" UNTER einer, die als "hoch" eingetragen ist und erst in
dreissig Tagen faellig wird. Wer die Spalte von oben liest, faengt
dann mit dem Falschen an.

Eine Prioritaet ist eine Einschaetzung von damals, eine
ueberschrittene Frist eine Tatsache von heute. Jetzt: erst was
faellig ist, dann nach Datum, und die Prioritaet entscheidet nur noch
bei gleichem Datum. Die Sortierung steht im SERVER -- Startseite und
Uebersicht lesen dieselbe Liste, und zwei Sortierungen fuer dieselbe
Frage laufen auseinander.

--- 4. "WICHTIG" STEHT JETZT DA ---

Die Prioritaet war ein 3 px breiter Rand links -- direkt neben der
farbigen Kante der Spalte und damit praktisch unsichtbar. Als Wort
steht sie dort, wo man sie liest. NUR bei "hoch" und nur solange
nicht erledigt: Eine Marke an jeder Karte waere keine Marke mehr.

--- Pruefung ---

pruef-aufgaben-vorlagen: zugeklappt als Vorgabe (gemessen wird, dass
die Karten gar nicht gebaut werden), Aufklappen, uebernommene Vorlage
markiert samt Zustand und "Nochmal"-Knopf, Stand darunter, Zustand
ueberlebt das Neuladen -- mit Gegenprobe, dass die uebrigen NICHT
markiert sind.

Dabei fiel eine eigene Nachlaessigkeit auf: Die Pruefung "die Karten
sind gestaltet" mass zu einem Zeitpunkt, an dem es zugeklappt gar
keine Karte gab -- getComputedStyle auf null liefert nichts, und der
Haken wurde rot, ohne dass etwas kaputt war. Sie misst jetzt nach dem
Aufklappen.

pruef-aufgabenbrett: die Sortierung an zwei absichtlich unguenstig
angelegten Aufgaben (ueberfaellig+niedrig gegen fern+hoch), plus die
Gegenprobe, dass bei GLEICHER Frist weiterhin die Prioritaet
entscheidet -- sonst waere die Prioritaet wirkungslos geworden, und
das waere die andere Uebertreibung.

Ausserdem gruen: pruef-css-klassen, pruef-start-ansicht, pruef-uebersicht.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 14:56:40 +02:00
DogFatherGitandClaude Opus 5 38416962b3 Kopfleiste am Handy: alles in einer Reihe
Filipe, mit Bildschirmfoto: "ich will dass es ueberall perfektionniert
wird. ich will dass du das richtig geil machst es soll alles in einer
reihe sein." Auf dem Bild stand "Abmelden" allein in einer zweiten
Zeile, darueber Teilen, Chat, Suche und das Profilbild.

--- GEMESSEN, BEVOR ETWAS GEAENDERT WURDE ---

Bei 390 px, alle fuenf Rollen:

  verfuegbar fuer die rechte Gruppe   275 px
  gebraucht als DogFather             393 px
     (Sicht 150 · Teilen 38 · Chat 37 · Suche 47 · Bild 28 · Abmelden 93)
  gebraucht als Scout/Manager/Spicy   243 px
  gebraucht als Creator               205 px

Der Umbruch war also die richtige Antwort auf ein echtes
Platzproblem. `flex-wrap` misst und rechnet nicht -- das bleibt so.
Geaendert wird der PLATZBEDARF, nicht die Reaktion darauf. Eine
Schwelle, ab der nicht mehr umgebrochen wird, waere wieder eine
Rechnung von gestern: Beim naechsten Knopf staende alles uebereinander.

--- WAS SCHRUMPFT, UND WAS NICHT ---

Die drei Zeichen-Knoepfe waren 38, 37 und 47 px breit -- nebeneinander
sah das unruhig aus. Jetzt alle 36.

"Abmelden" wird auf schmalen Bildschirmen zum Zeichen (93 -> 36). Das
Wort bleibt im aria-label und am Rechner sichtbar: Dort ist Platz, und
ein Wort ist eindeutiger als ein Bild. Der Aufbau steht in kopf.js und
nicht in neunzehn HTML-Dateien -- neunzehn Stellen sind achtzehn
Gelegenheiten, eine zu vergessen.

Der Sicht-Umschalter wird ein Zeichen-Knopf wie die anderen (150 -> 36),
ABER NUR solange die eigene Sicht laeuft. Bei einer fremden behaelt er
den Namen, und dann darf die Leiste auch umbrechen: Dass man fremde
Zahlen ansieht, ist wichtiger als eine gerade Zeile. Das ist der
gefaehrlichste Fall dieser Funktion, und er bleibt unangetastet.

--- ZWEI DINGE, DIE ERST DIE MESSUNG GEZEIGT HAT ---

1. `max-width: 30px` am Umschalter-Kasten wirkte NICHT. Gemessen stand
   da: berechnete Hoechstbreite 30 px, tatsaechliche Breite 104. Der
   Knopf DARIN behielt seine Groesse und schob den Kasten wieder auf.
   Wer nur den Rahmen begrenzt, begrenzt nichts -- die Breite kommt vom
   Inhalt. Jetzt liegt der Knopf unsichtbar UEBER dem Auge: die ganze
   Flaeche ist das Ziel, der Fokusring bleibt, die Breite ist 36.

2. Bei 360 px brach es weiter um, obwohl es rechnerisch passte. Ursache
   war eine eigene Regel bei 380 px, die Marke und Bedienelemente
   ausdruecklich in zwei Zeilen zwang -- richtig, solange die
   Bedienelemente 243 bis 393 px brauchten, falsch seit sie 136 bis 238
   brauchen. Die Schwelle liegt jetzt bei 300 px; darunter gibt es
   Geraete, auf denen es wirklich nicht reicht.

--- Pruefung ---

pruef-handy, 15 neue Messungen (fuenf Rollen x 360/390/412): alle Teile
der Kopfleiste stehen in einer Reihe, Spanne 4 px.

Gemessen wird die ZEILENZAHL ueber die Oberkanten, nicht die Hoehe der
Leiste. Eine Hoehengrenze waere wieder eine Zahl von gestern -- sie
stimmt, bis jemand die Polsterung anfasst. Ob zwei Dinge in derselben
Zeile stehen, sieht man an ihrer Oberkante, und das gilt immer.

Ausserdem gruen: pruef-css-klassen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 14:45:38 +02:00
DogFatherGitandClaude Opus 5 9b1826721b Handy-Mitte, Babyblau und Spicy im Umschalter
Drei Bildschirmfotos, drei Befunde -- und alle drei waren messbar.

--- SCREEN 2: RING UND UHR STANDEN SCHIEF ---

Filipe: "ich will dass auf dem handy die uhr und der kreis ganz oben mit
den erledigten aufgaben, schoen mittig, zentriert sind. die stehen sehr
verzogen von der mitte. das soll bei jedem und jeder rolle verbessert
werden."

Gemessen bei 390 und 412 px, in allen fuenf Rollen, immer dieselbe
Zahl: Ring 31 px nach links, Uhr 31 px nach rechts. Gleicher Betrag,
entgegengesetzte Richtung -- eine Ursache, nicht zwei.

`justify-content: center` zentriert den INHALT der Reihe, und in der
Reihe steht neben dem Instrument noch ein Knopf (Glocke rechts vom Ring,
Wecker links von der Uhr). Zentriert wurde also [Knopf + Abstand +
Instrument] als Block; das Instrument rutschte um die halbe Knopfbreite
zur Seite. Die Knopfbreite steht seit jeher als `--instrument-knoepfe:
62px` in derselben Datei -- 62 / 2 = 31. Die gemessene Zahl war von
Anfang an aufgeschrieben, nur an anderer Stelle.

Der Knopf zaehlt jetzt nicht mehr mit: aus dem Fluss genommen, neben das
zentrierte Instrument gehaengt. NICHT um 31 px verschoben -- das waere
dieselbe Zahl ein zweites Mal, und beim naechsten Knopf waere sie
falsch. Jetzt folgt seine Lage dem Instrument, wie gross das auch ist.

Nachher: 0 px Abweichung, alle fuenf Rollen, beide Breiten.

--- SCREEN 3: DAS BABYBLAU WAR STAHLGRAU ---

Filipe: "die rolle dogfather soll eine uebertrieben geile babyblau
haben." Zum dritten Mal -- und die ersten beiden Male habe ich das
Falsche vergroessert.

Beide Male hatte ich den Abstand zwischen Rot- und Blaukanal im HEXWERT
erhoeht (45 Stufen, dann 86). Diesmal zuerst gemessen, was am Bildschirm
ankommt:

  Die DogFather-Zeile traegt 98,7 % farbige Bildpunkte -- MEHR als jede
  andere Rolle. An der Menge lag es also nie.
  Ihr Mittelwert war rgb(43,62,78): 35 Stufen zwischen Rot und Blau.
  Das ist Stahlgrau.

Die richtige Groesse ist die SAETTIGUNG. In OKLab hatte #9ed3f4 eine
Buntheit von 0,0718 -- der blasseste Wert aller fuenf Rollen. #5fbdff
hat 0,1303, also 81 Prozent mehr. Die Zeile kommt damit auf
rgb(36,60,79), und der mittlere Kanalabstand steigt von 35,2 auf 43,0.

Nachgerechnet, was NICHT verlorengeht: Kontrast auf dem Grund 9,75:1
(vorher 12,49) -- weit ueber den 7 fuer AAA. Abstand zur naechsten
Rollenfarbe 0,1608 in OKLab, vorher 0,1466; die Hausgrenze liegt bei
0,0973. DogFather ist also SICHERER unterscheidbar als vorher.
Gemessen an der echten Flaeche: 8,84:1 und 9,60:1.

--- SCREEN 4: SPICY FEHLTE IM UMSCHALTER ---

Filipe: "ich will da auch noch die spicy rolle sehen und die leute in
der rolle wie die anderen."

Der Sicht-Umschalter fuehrte eine EIGENE Rollenliste -- vier Eintraege,
Spicy Media fehlte. Zum vierten Mal derselbe Fehler: eine zweite
Fassung einer Liste, die es zentral schon gibt. Vorher traf es die
Leitungsliste (ein Set), die Rollennamen (ein Objekt in fuenf
Skripten -- im Chat stand "UNDEFINED" ueber einem Namen) und die
Personenliste.

Jetzt steht dort keine Liste mehr, sondern eine Ableitung aus
`ROLLENFOLGE` und `ROLLEN_GRUPPE`. Kommt eine sechste Rolle, ist sie
ohne eine Zeile Arbeit dabei.

--- Pruefung ---

pruef-handy: zehn neue Messungen (fuenf Rollen x zwei Breiten), alle
0 px. Die beiden fehlenden Rollen sind dafuer in den Testdaten
ergaenzt -- eine Pruefung an drei von fuenf haette "bei jeder Rolle"
nicht belegen koennen.

pruef-sicht: Cigdem als Spicy-Media-Person ergaenzt. Ohne sie waere es
nie aufgefallen -- eine Rolle ohne Leute wird ohnehin weggelassen, und
die alte Zusicherung "Manager, Scouts, Creator" waere weiter gruen
gewesen. Dazu eine Gegenprobe, dass die Reihenfolge WIRKLICH aus der
zentralen Liste kommt und nicht wieder abgeschrieben ist.

pruef-personen-kachel: DogFather-Kontrast neu dabei.
Ausserdem gruen: pruef-css-klassen, pruef-lesbarkeit.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 13:59:53 +02:00
DogFatherGitandClaude Opus 5 d5570ee501 Personenkachel: Rollenfarben, kein Leerband, dunklerer Grund
Filipe, mit Bildschirmfoto: "mach die ganze kachel perfekter
detailliert schoenes. der hintergrund soll auch bissl dunkler sein von
der kachel."

--- 29 PIXEL NICHTS, FUENFMAL UNTEREINANDER ---

Auf dem Bild stand unter jeder zugeklappten Rolle ein leerer Streifen.
Nachgemessen: Abschnitt 74 px, Zeile darin 45 -- 29 px Leerraum.

Sie kamen aus ZWEI Quellen, und nur eine stand in personen.css:
padding-bottom: 14px am Abschnitt, plus margin-bottom: 14px an
.gruppe__kopf aus start.css Zeile 765. Letzteres ist fuer die
freistehenden Abschnitte der STARTSEITE geschrieben, wo unter der
Ueberschrift wirklich gleich Karten kommen. Zugeklappt kommt hier aber
nichts, und dann ist der Abstand Abstand zu nichts.

Beide haengen jetzt am Zustand: offen -> Luft, zu -> keine. Die Kachel
ist damit 383 px hoch statt 293 -- pardon, 293 statt 383.

--- DIE ROLLEN HABEN FARBEN, NUR HIER NICHT ---

Fuenf Zeilen sahen fuenfmal gleich aus. Das Haus fuehrt fuer jede Rolle
eine Farbe (Anmeldeseite, Marken, Bereiche); ausgerechnet in der Liste,
in der es NUR um Rollen geht, hoerten sie auf.

Jeder Abschnitt traegt jetzt `data-rolle`, setzt daraus EIN --r, und
alles Weitere liest davon: der Streifen links, die Anzahl, die
Namenszeichen, der Pfeil, das Licht beim Aufklappen. Und `--ton`, die
Variable, aus der module.css das Kantenlicht jeder Kachel zieht -- die
Personenkarten in einem Manager-Abschnitt sind damit lila statt orange.
Eine Zeile, und der Abschnitt wird ein Stueck.

NEU: WER DRINSTEHT, OHNE AUFZUKLAPPEN. Vier Namenszeichen, ab dem
fuenften "+n". Zugeklappt sagte die Zeile bisher nur, WIE VIELE es
sind; wer wissen wollte, ob Patrick dabei ist, musste aufklappen.

--- DER STREIFEN, DEN getComputedStyle NICHT SIEHT ---

Erster Anlauf: 3 px breit, left: 0, volle Hoehe. Im Bild war nichts.
getComputedStyle meldete trotzdem "3 px, sichtbar, Deckkraft 0,55".

Der Grund steht in module.css: Jede Kachel traegt auf ::before ein
Kantenlicht mit inset: 0 und z-index: 2 -- eine 1,6 px breite Linie
UEBER allen Kindern. Vom Streifen blieben 1,4 px, und die lagen genau
in der Kante. Er sitzt jetzt bei 3 px, gerundet, mit Luft oben und
unten.

Die Pruefung misst ihn deshalb an echten BILDPUNKTEN, und zwar
dieselbe Stelle zweimal: einmal wie sie ist, einmal mit
ausgeschaltetem Streifen. Was sich aendert, IST der Streifen -- und was
sich nicht aendert, ist die Gegenprobe, ohne dass man sie erfinden
muss.

--- UND EINE PRUEFUNG, DIE GRUEN GELOGEN HAT ---

Die Kontrastmessung las die Textfarbe mit
`getComputedStyle(e).color.match(/\d+/g)`. Das geht, solange dort
"rgb(148, 165, 187)" steht. Alle neuen Stellen kommen aus color-mix(),
und Chromium antwortet darauf mit "color(srgb 0.36 0.51 0.42)". Aus
dem Muster fielen "0", "510588", "0" -- die Pruefung meldete
775929299:1 und war gruen.

Die Farbe wird jetzt in ein Canvas GEMALT und als Punkt zurueckgelesen;
das versteht jede Schreibweise, die der Browser versteht. Davor steht
eine Gegenprobe mit zwei bekannten Farben: Stimmt das Messgeraet nicht,
ist alles darunter wertlos. Echte Werte jetzt: 7,95 bis 15,71:1.

--- AM HANDY STAND DER PFEIL IN EINER DRITTEN ZEILE ---

Der Zusatztext bekommt dort eine eigene Rasterzeile -- richtig, er
passt sonst nicht. Der Pfeil bekam dadurch eine dritte und stand mittig
unter dem Text wie ein vergessenes Zeichen: 106 px je Rolle. Er hat
jetzt eine eigene Spalte und ueberspannt beide Zeilen: 75 px, und er
steht da, wo die Hand ihn sucht.

--- Pruefung ---

server/pruef-personen-kachel.mjs, neu, 43 Pruefungen, alle gruen.
Ausserdem gruen: pruef-personen-liste, pruef-css-klassen (die hat die
Namenszeichen bei 10,56 px erwischt, bevor sie jemand lesen musste).
Angesehen bei 1440 px und 390 px, zu und offen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 13:37:28 +02:00
DogFatherGitandClaude Opus 5 14e9bbf7a5 Chat: Fotos und PDFs schicken, Gespraeche wegraeumen
Filipe, mit Bildschirmfoto: "man muss die chats auch geloescht
bekommen!!! am besten waere es auch wenn man da auch im chat pdfs
schicken koennte. pdfs und fotos."

Zwei Entscheidungen vorher abgestimmt, weil sie den Bau bestimmen:
Geloescht wird NUR BEI MIR. Schicken duerfen ALLE im Gespraech, auch
Creator -- anders als in der Dateiablage, wo etwas in einem Bereich
landet, den mehrere sehen. Hier bekommt es genau der, mit dem man
ohnehin gerade spricht.

--- ANHAENGE ---

Drei Wege zur selben Sache, weil Leute unterschiedlich arbeiten: die
Bueroklammer, Hineinziehen und Einfuegen mit Strg+V (der Weg fuer einen
Screenshot -- der liegt in der Zwischenablage und nirgends als Datei).
Alle drei laufen durch dieselbe Funktion; drei Fassungen waeren drei
Gelegenheiten, dass eine die Pruefung vergisst.

Ein Foto wird GEZEIGT, ein PDF wird als Karte ANGEBOTEN. Das ist kein
Schoenheitsunterschied: Ein Bild erkennt man in einer Zehntelsekunde,
ein PDF muss man ohnehin oeffnen -- eine Vorschau davon waere ein
grauer Kasten, der so tut, als koennte man etwas lesen.

DIE SICHERHEIT STEHT IN dateiErkennen(). Dateiname und Content-Type
kommen vom Absender und sind frei erfunden; der Typ wird deshalb aus
den ersten Bytes bestimmt (PNG/GIF/WebP/JPEG/PDF, mit Breite und Hoehe
im selben Durchgang). SVG steht absichtlich NICHT in der Liste -- das
ist XML, das Skripte enthalten darf, ein als Bild getarntes Programm.
Ausgeliefert wird spaeter genau der ERKANNTE Typ, nie der eingeschickte,
dazu nosniff und "default-src 'none'; sandbox".

Auf der Platte bekommt jede Datei einen erzeugten Zufallsnamen, in
einem Ordner ausserhalb des Repos. Zuruecknehmen loescht die Datei
wirklich -- sonst waere sie im Verlauf weg und ueber die Adresse noch
da, also nur der Anschein einer Ruecknahme.

--- WEGRAEUMEN ---

Zwei Spalten in chat_teilnehmer statt einer, wegen eines Randfalls: Bei
einem Gespraech ohne jede Nachricht waere die Grenze 0 -- und 0 heisst
sonst "nie geloescht". geloescht_am unterscheidet die beiden.

Die Grenze wirkt in der Liste, im Verlauf, in der Vorschau, in der
SUCHE, bei den Anhaengen und in der Ungelesen-Zahl. Die Suche ist die
Stelle, an der so etwas typischerweise durchrutscht: aus der Liste weg,
ueber die Suche noch da.

--- DER FUND: 323 PIXEL ---

Ein Bild ist spaeter fertig als der Rest der Seite. Beim Oeffnen springt
der Verlauf ans Ende, dann kommt das Foto an und schiebt alles darunter
weg -- man steht ploetzlich mittendrin, ohne etwas angeklickt zu haben.

Das width/height-Attribut am <img>, wie man es ueberall liest, hilft
hier NICHT: Es gibt nur das Seitenverhaeltnis. Damit daraus eine Hoehe
wird, muss die Breite feststehen -- bei "width: auto" und einem nicht
geladenen Bild ist sie 0. Der Platz wird jetzt am KASTEN reserviert
(aspect-ratio + max-width aus den gemessenen Massen).

Und die Pruefung dazu hatte denselben Fehler wie das Auge: Sie mass in
einem Fenster, in dem das Bild laengst im Zwischenspeicher lag, und
meldete tadellose 0 px. Sie misst jetzt in einem FRISCHEN Browser --
der Fall, um den es geht, ist der erste.

--- SICHERUNG ---

chat-anhaenge/ ist im selben Zug in tools/sicherung-holen.sh
eingetragen, nicht spaeter, wenn es auffaellt: Genau so ist die Luecke
bei den Profilbildern entstanden. tools/wiederherstellung-proben.mjs
bestaetigt: "der Server benutzt 4 Datenordner", keiner fehlt.

--- Pruefung ---

server/pruef-chat-anhaenge.mjs, neu, 60 Pruefungen, alle gruen.
Abschnitt 3 versucht ausdruecklich, hereinzukommen: HTML als bild.png,
SVG als foto.png, SVG als svg, eine Textdatei, ein PNG-Kopf ohne Inhalt
-- alle fuenf mit 415 abgewiesen, ein echtes JPEG danach mit 201
angenommen (sonst bewiese der Block nur, dass gar nichts durchkommt).
13 MB geben 413 mit lesbarem Text, nicht 500.

Konsolenfehler werden nach ZEITPUNKT getrennt, nicht nach Statusnummer:
Was waehrend eines absichtlichen Versuchs entsteht, ist gewollt. Nach
Nummer zu filtern waere bequem und wuerde ab morgen echte 404 mit
verschlucken.

Ausserdem gruen: pruef-chat, pruef-chat-optik, pruef-chat-ausbau,
pruef-css-klassen. Angesehen bei 1440 px und bei 390 px.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 12:51:54 +02:00
DogFatherGitandClaude Opus 5 e28724564a Chat: sechs Ergaenzungen -- und ein Absturz, den nie jemand gesehen hat
Filipe: "die kategorie chat, boah ich will dass du die wirklich ueberall
perfektionierst. wirklich alles was gratis ist und hinzugefuegt werden
kann ohne problem will ich drin haben bitte. ich will das es hoch
profissionel und ultra krass geil ist."

Zuerst Bestand aufgenommen, nicht gebaut: Suche, Ungelesen-Zahlen, die
"ab hier neu"-Linie, Lesestand, Live-Strom, Antworten mit Zitat,
Zuruecknehmen und Enter-zum-Senden gab es schon. Dazugekommen ist, was
gefehlt hat und ohne fremde Bibliothek geht:

1. ADRESSEN SIND ANKLICKBAR. Gebaut als echte Knoten, nie ueber
   innerHTML -- ein Chat ist die eine Stelle, an der jeder schreiben
   darf. Erkannt wird bewusst wenig (http, https, www.): Wer mehr
   erkennt, macht irgendwann aus "z.b." einen Link ins Nichts.
   Satzzeichen am Ende bleiben beim Satz. rel="noopener noreferrer".
2. KOPIEREN je Nachricht, mit Rueckfall auf "Text markieren", wenn der
   Browser die Zwischenablage nicht hergibt.
3. DER VERLAUF REISST NIEMANDEN MEHR WEG. Vorher sprang er bei JEDEM
   Neuzeichnen ans Ende -- wer weiter oben nachlas und dabei eine
   Nachricht bekam, verlor die Stelle. Jetzt bleibt er stehen, und ein
   Knopf sagt, WIE VIEL unten wartet, nicht nur DASS etwas da ist.
4. ENTWUERFE JE GESPRAECH. Wer mitten im Satz wechselt, findet ihn
   wieder. Im localStorage, nicht auf dem Server: Ein Entwurf ist
   nichts, was jemand anders sehen soll. Abgeschickt heisst geloescht.
5. EMOJI-AUSWAHL, dreissig feste Zeichen, eingefuegt an der
   Cursorstelle. Am Handy hat die Tastatur sie ohnehin -- am Rechner
   nicht, und dort sitzt die Betreuung.
6. ZEICHENZAEHLER, sichtbar ab 400 Rest. Die Grenze steht NICHT im
   Skript, sondern kommt aus dem maxlength des Feldes -- zwei Stellen
   fuer dieselbe Zahl laufen auseinander.

--- DER FUND, um den es eigentlich geht ---

Die neue Pruefung hoert auf "pageerror". Damit kam sofort neun Mal
dieselbe Meldung: "Cannot set properties of null (setting 'hidden')",
raumOeffnen, Zeile 278.

Ursache: verlaufZeichnen() leerte den Verlaufskasten mit
`textContent = ''`. Darin liegt aber #verlauf-leer, der Absatz "Links
ein Gespraech auswaehlen". Nach dem ersten Zeichnen gab es ihn nicht
mehr, und raumOeffnen faellt sechs Zeilen weiter darueber.

Die Folge ist nicht die Fehlermeldung, sondern der Abbruch: Beim ZWEITEN
Aufruf liefen history.replaceState, gelesenMelden() und raeumeZeichnen()
nie. Der zweite Aufruf ist der Normalfall -- der Ereignisstrom ruft nach
jedem Verbindungsaufbau genau das, um nachzuholen, was waehrend der
Pause geschrieben wurde. Dieses Nachholen hat nie funktioniert. Von
aussen sah alles normal aus; nur die Konsole wusste Bescheid.

Behoben, indem nur noch die Nachrichten entfernt werden und der Absatz
stehenbleibt. Abschnitt 8 der Pruefung wechselt jetzt dreimal zwischen
zwei Gespraechen OHNE Neuladen und verlangt null Abstuerze.

--- UND EIN ZWEITER, der schon laenger drin war ---

Abschnitt 9 misst den Kontrast an der wirklichen Flaeche (Text kurz
unsichtbar, Flaeche fotografiert). Die Fusszeile jeder Nachricht stand
auf --text-still: auf der eigenen Blase 3,68:1, unter den 4,5:1 fuer
Text dieser Groesse. Aufgefallen ist es nie, weil niemand nachgemessen
hat. Jetzt traegt .chat-nachricht__fuss EINE Farbe (--text-leise,
4,81:1) und Uhrzeit, antworten, zuruecknehmen und kopieren erben sie --
statt vier eigener Angaben, die beim naechsten Mal auseinanderlaufen.

--- Pruefung ---

server/pruef-chat-ausbau.mjs, neu, 64 Pruefungen, alle gruen. Zu jedem
Punkt eine Gegenprobe: kein Link ohne Adresse, keine Auszeichnung aus
<b>/<img onerror>, kein Kopier-Knopf an zurueckgenommenen Nachrichten,
kein Sprungknopf fuer den, der schon unten steht, kein Entwurf nach dem
Abschicken, ein absichtlich zu dunkler Text faellt durch, und ein
absichtlich geworfener Fehler wird bemerkt (sonst waere Abschnitt 10
auch gruen, wenn niemand zuhoert).

Ausserdem gruen: pruef-css-klassen, pruef-chat, pruef-chat-optik.
Angesehen bei 1440 px und bei 390 px.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 12:13:24 +02:00
DogFatherGitandClaude Opus 5 50b60ebe8f Uhr: die Lichtkante leuchtet nur noch von oben
Filipe (screen1): "perfektionnier bitte die stunden. und da sind auch
noch striche die durch die stunden gehen, ist das normal?"

Nein, war es nicht.

DIE URSACHE

Die Lichtkante ist ein Kreis, der gegen seine Bahn versetzt ist -- bei
der Stunde um 2,6 Einheiten nach oben, bei einer Bandbreite von 5,8.
Das ergibt je nach Stelle am Zifferblatt etwas voellig Verschiedenes:

  oben    Der Versatz liegt QUER zum Balken -> echte Oberkante.
  seitlich Der Versatz liegt LAENGS zum Balken -> ein heller Strich
          mitten hindurch. Genau der, den Filipe gesehen hat.
  unten   Es waere eine Unterkante -- die bei Licht von oben gar nicht
          leuchten duerfte.

Mit einem Versatz ist das nicht zu loesen: Ein verschobener Kreis ist an
den Seiten zwangslaeufig tangential zur Bahn. Am 09.09. hatte ich schon
einmal an dieser Stelle nachgebessert (die Achse von seitlich auf
senkrecht gedreht) -- das hat die Kante an den richtigen Ort gebracht,
aber nicht die Frage geloest, was sie dort ueberhaupt zu suchen hat.

DIE LOESUNG

Die Kante bekommt einen Verlauf statt einer festen Farbe und wird zu
den Seiten hin ausgeblendet. Sichtbar ist sie nur im oberen Drittel --
genau da, wo Licht von oben auf einen gewoelbten Ring faellt.

RICHTUNG NACHGEMESSEN, NICHT HERGELEITET. Das SVG traegt
`rotate(-90deg)`; SVG-x zeigt auf dem Bildschirm nach oben, der Verlauf
laeuft deshalb ueber x und nicht ueber y. Dieselbe Drehung hat heute
schon einmal die gesamte Lichtrichtung verdreht -- deshalb steht der
Hinweis direkt am Verlauf.

GEMESSEN, Querschnitt durch den Stundenbalken (28,1 bis 34,9; Mitte
31,5), alle zwoelf Plaetze gezeichnet:

  oben    bei   9,1°  hellste Stelle r=34,4 (164)  Mitte 123  -> 1,33x
  rechts  bei  99,1°  hellste Stelle r=32,4 (118)  Mitte 111  -> 1,06x
  unten   bei 189,1°  hellste Stelle r=33,8 (137)  Mitte 132  -> 1,04x
  links   bei 279,1°  hellste Stelle r=32,7 (124)  Mitte 114  -> 1,09x

Oben sitzt die hellste Stelle auf der AUSSENKANTE (34,4 von 34,9) und
ist ein Drittel heller als der Balken -- eine Kante. An den drei
anderen Richtungen bleibt die Ueberhoehung unter zehn Prozent, der
Strich ist damit weg.

Die Stunde teilt sich den Verlauf mit Sekunde und Minute und ist nur
ueber die Deckkraft schwaecher gestellt. Zwei Verlaeufe fuer dasselbe
Licht waeren zwei Sachen zum Pflegen.

Geprueft: pruef-start-ansicht, pruef-buehne, pruef-css-klassen -- gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 11:43:12 +02:00
DogFatherGitandClaude Opus 5 a116b286cb Aufgaben-Vorlagen: vier Bereiche mal vier Stufen, 48 fertige Aufgaben
Filipe: "ich will dass du die vier klassen ueberall mit aufgaben
perfektionnierst ... ich will dass die 4 kategorien ueberall perfekt
angepasst sind, mit perfekt kategorien und aufgaben."

WAS GEFEHLT HAT, NACHGEMESSEN

Die Tabelle `aufgaben` kannte weder Bereich noch Stufe, und
Aufgabenvorlagen gab es keine. Die Checkliste sagt, WAS sitzen muss --
sie sagt nicht, was jemand als Naechstes TUT. Zwischen "Ton ist der
Grund Nummer eins" und einem Abend, an dem der Ton wirklich besser
wird, liegt eine Aufgabe mit Frist und Verantwortlichem. Die musste
bisher jemand von Hand tippen.

WAS JETZT DASTEHT

  live       12 Aufgaben ·  3 je Stufe
  content    12 Aufgaben ·  3 je Stufe
  technik    12 Aufgaben ·  3 je Stufe
  community  12 Aufgaben ·  3 je Stufe
  zusammen   48

Drei je Feld und nicht zehn: Wer zehn Aufgaben bekommt, macht keine.
Drei sind ein Abend, eine Woche, ein Monat -- und die Fristen sind
entsprechend gestaffelt. Jede Aufgabe bringt ihre Frist als `tage` mit;
eine Aufgabe ohne Frist ist ein Wunsch.

Die Sachaussagen stammen aus derselben Recherche wie die
Checklistenpunkte: Lautheit minus 20 bis minus 24 LUFS, Tonspur
160 kbit/s, Bitrate hoechstens 75 Prozent des Uploads, Ankuendigung
30 bis 60 Minuten vorher, Verweildauer ueber 15 Minuten, Eskalation in
vier Stufen, Intro-Retention ab 70 Prozent.

DER WEG BIS ZUR ECHTEN AUFGABE

`/workspace/api/vorlagen` liefert sie aus, `/uebernehmen` legt sie an --
als Zeile in `aufgaben`, nicht als weiterer Eintrag in `eintraege`. Eine
Aufgabe hat einen Verantwortlichen, eine Frist und einen Status, der
sich bewegt; das ist etwas anderes als eine Notiz. Zwei Orte fuer
dieselbe Sache waeren der Anfang davon, dass sie auseinanderlaufen.

Ohne Creator wird abgelehnt statt herrenlos angelegt. Ein Creator legt
sie immer fuer SICH an, auch wenn er jemand anderen angibt.

AUF DER SEITE

Ein Block ueber dem Aufgabenbrett: zwei Knopfreihen (Bereich, Stufe),
drei Karten mit Titel, Erklaerung, Frist und einem Knopf. Die
Knopfreihen benutzen `.stufenleiter` aus der Checkliste -- dieselbe
Einteilung, dieselbe Darstellung. Eine zweite Optik fuer dieselben vier
Bereiche waeren zwei Sachen zum Lernen statt einer.

ZWEI EIGENE FEHLER, BEIDE VON PRUEFUNGEN GEFUNDEN

1. Ich hatte verlangt, dass die Frist mit der Stufe waechst. Die
   Pruefung schlug fehl: Profi 6,7 Tage gegen Fortgeschritten 7,4. Beim
   Nachsehen war die ERWARTUNG falsch. Eine Profi-Aufgabe ist meist eine
   Messung -- anspruchsvoll, aber an einem Abend erledigt; eine
   Fortgeschrittenen-Aufgabe wie "Saeulen anlegen und drei Wochen
   halten" braucht zwangslaeufig Wochen. Die Stufe sagt, was man KOENNEN
   muss, nicht wie lange es dauert. Geprueft wird jetzt, was wirklich
   gilt: keine Anfaengeraufgabe ueber fuenf Tage, keine Meisteraufgabe
   unter einer Woche.

2. Der Block war zu durchsichtig. pruef-buehne mass den Untergrund als
   rgb(84, 69, 70) -- das Buehnenfoto -- und die Ueberschrift kam auf
   3,61:1 statt 4,5:1. Ein durchsichtiger Kasten hat keinen Untergrund,
   sondern den, der gerade dahinterliegt. Jetzt eine deckende Flaeche
   mit Weichzeichner: 5,21:1.

GEPRUEFT

Neu: server/pruef-aufgaben-vorlagen.mjs, 30 Pruefungen -- Vollstaendigkeit,
der Weg bis zur Aufgabe auf dem Brett des Creators, und sechs
Gegenproben (unbekannte Stufe, unbekannter Bereich, Nummer ohne
Vorlage, ohne Creator, fremder Creator, und ein Creator, der jemand
anderen angibt). Dazu ein Browserteil, der klickt statt nur zu zaehlen.

Ausserdem gruen: pruef-aufgabenbrett, pruef-buehne, pruef-css-klassen,
pruef-handy.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 11:21:54 +02:00
DogFatherGitandClaude Opus 5 0a0dbff384 Fuenf Punkte aus screen1-5: Babyblau, zweite Nut, Spalten, Wasserzeichen, Jadeknoepfe
screen1 -- "da muss mehr babyblau zu sehen sein. da ist ja fast nichts."

  Gemessen als Blaustich (Mittel Blaukanal minus Rotkanal ueber die
  ganze Zeile): DogFather lag bei 7,4 und damit UNTER der roten
  Spicy-Zeile (17,3). Ursache: --dogi-haupt war #c7dcf4, und das hat
  zwischen Rot und Blau nur 45 Stufen Abstand -- im Hexwert ein Blau,
  auf dem Bildschirm ein Weiss.

  Jetzt #9ed3f4 (86 Stufen), dazu eine Schiene, deren Silber nur noch
  ein Spitzlicht am oberen Ende ist, ein breiter babyblauer Schimmer
  und der Name selbst in einem Verlauf von Silber nach Babyblau.
  Blaustich 24,3 -- der hoechste aller fuenf Zeilen, und mit dem
  hoechsten Gruenanteil, also Babyblau und nicht Lila. Abstand zur
  naechsten Rollenfarbe 0,1295 in OKLab (Hausgrenze 0,0973), Kontrast
  12,4:1.

screen2 -- "mach diesen strich der nach oben geht auch links bitte."

  Die Zentrale hat drei Felder, aber nur EINE Nut. Jetzt zwei, aus
  einem Regelsatz -- "genau gleich" heisst hier wirklich gleich und
  nicht gespiegelt: Eine Fraesung in derselben Platte hat bei Licht von
  oben links ueberall dieselbe Flanke.

  Dabei ein echter Fehler gefunden: Die Nut wurde erst bei 620 px
  abgeschaltet (start.css), die dritte Spalte faellt aber schon bei
  1180 px weg (heim.css). Zwischen 621 und 780 px stand sie deshalb als
  freier senkrechter Strich im Bild -- bei 700 px nachgemessen bei
  x = 391, wo sie nichts mehr trennte. Das Abschalten steht jetzt in
  derselben Regel wie der Spaltenwechsel, je einmal fuer 1180 und 780.

screen3 -- "die sollen schön untereinander sein."

  `.gruppe__zahl` trug ein `margin-left: auto` -- geschrieben fuer die
  Startseite, wo im Kopf nur Name, Zahl und Pfeil stehen. Auf der
  Personenseite steht dazwischen noch der Zusatztext, und der Pfeil hat
  sein eigenes auto. Zwei auto-Raender teilen den freien Platz zu
  gleichen Teilen -- also stand die Gruppe [Zahl + Zusatz] mittig, und
  ihre Lage hing an der Laenge des Rollennamens.

  Jetzt vier Rasterspalten. Die Breite der Namensspalte wird an der
  fertigen Liste GEMESSEN und als `--namen-spalte` gesetzt; eine feste
  Angabe waere bis zur naechsten Rolle mit laengerem Namen richtig.
  Spanne von Zahl und Zusatztext: 0,0 px (vorher 11 px). Gegenprobe:
  ohne die gemessene Spalte laufen sie wieder 36,5 px auseinander.

screen4 -- "das symbol rechts in der kachel soll viel groesser sein."

  Zum dritten Mal gemeldet, und zum dritten Mal hatte er recht. Zweimal
  habe ich den KASTEN vergroessert; beide Male hat sich nichts geaendert,
  und ich habe es auf die Kachelhoehe geschoben, statt nachzusehen. Der
  Kasten war 124 px -- das SVG darin 39:

    .kachel[data-gross="ja"] .kachel__svg { width: 39px }   (0,3,0)
    .kachel__wasserzeichen svg            { width: 100%  }  (0,1,1)

  Die erste Regel meint das Hauptsymbol links. Beide SVG tragen aber
  dieselbe Klasse, weil sie aus derselben Funktion kommen -- und die
  fremde Regel war staerker. Dasselbe galt fuer `.kachel:hover
  .kachel__svg` und die Reduced-Motion-Regel; alle drei sind jetzt auf
  `.kachel__zeichen` eingeschraenkt.

  Und es waren WIEDER zwei Fassungen derselben Sache, 3600 Zeilen
  auseinander: Rahmen 78 gegen 70, Zeichen 36 gegen 39. Der Kommentar
  an der spaeteren Stelle behauptete sogar schon, es gebe "EINE
  Fassung". Behauptet war es, gemessen nicht. Die toten sind entfernt.

  Zweitens fuellt die Zeichnung jetzt ihren Kasten: Im 24er-Raster liegt
  sie bei x 4 bis 20, rund 38 Prozent waren leerer Rand.

  Ergebnis: Zeichnung von 26 auf 124 px, samt der 8-Grad-Drehung
  (140 px) vollstaendig in der 152 px hohen Kachel. Deckkraft
  unveraendert bei 0,14 -- er wollte groesser, nicht lauter.

screen5 -- "der abmelde button und teilen button sollen eine richtig
geile gruen haben ... aber so dass es nicht den augen wehtut."

  Teilen #45d6a6, Abmelden #33b394. Beide sind WENIGER gesaettigt als
  das Rot, das vorher dort stand (63 und 55 gegen 100 Prozent) -- die
  Leiste wird ruhiger, nicht greller. Kontrast der Schrift 15,6:1 und
  15,0:1 gegen vorher 13,6:1 und 12,6:1. Chat und Suchen bleiben rot;
  damit trennt die Farbe "das mache ich mit der Seite" von "das mache
  ich mit meinem Zugang".

  Erster Versuch verworfen: Ein Rahmen aus drei Toenen ueber zwei
  Hintergrundlagen machte beide Knoepfe FLAECHIG gruen, weil ich die
  deckende obere Lage durchsichtig gesetzt hatte -- damit deckte sie den
  Rahmenverlauf nicht mehr ab. Im Bildschirmfoto gesehen, nicht in den
  Zahlen: Die Farbwerte waren die ganze Zeit richtig.

Geprueft: pruef-start-ansicht, pruef-buehne, pruef-css-klassen,
pruef-personen-liste -- alle gruen. Jede eigene Messung mit Gegenprobe.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 04:10:44 +02:00
DogFatherGitandClaude Opus 5 74ae4c292e Uhr: Stundenverlauf abgeflacht, Lichtkante auf die richtige Achse gedreht
Filipe: "kontrollier bitte nur noch einmal ab dass keine striche krum
sind, kein runder kreis der schief verlaeuft oder so, perfektionier die
stunden noch bissl auch bitte."

Nachgemessen statt nachgesehen. Drei Funde, zwei davon echt.

1. DIE LICHTKANTE LAG AUF DER FALSCHEN ACHSE.

   Das SVG `.uhr__ring` traegt `rotate(-90deg)`, damit die Ringe oben
   beginnen. Diese Drehung gilt auch fuer einen `translate` darin --
   ein `translateY` erscheint auf dem Bildschirm deshalb als "links".
   Gemessen an den Kaesten stand bei allen vier Lagen dy = 0: Kante
   nach links, Schlagschatten nach rechts, waehrend die Kachel selbst
   ihren Schatten mit `0px 14px` nach unten wirft. Zwei Lichter in
   einem Koerper.

   Sichtbar war es als heller Strich, der bei den oberen Balken LAENGS
   durchlief statt auf der Oberkante zu sitzen -- der "Kratzer", der an
   den Stunden schon zweimal gestoert hat. Die Kante war vorher
   verschmaelert worden; das hat ihn gedaempft, aber nicht beseitigt,
   weil die Ursache die Richtung war und nicht die Breite.

   Jetzt translateX. Nachgemessen: dx = 0, Kante nach oben, Schatten
   nach unten -- dieselbe Lichtrichtung wie der Kachelschatten. Die
   hellste Stelle im Querschnitt liegt bei r = 34,1; rechnerisch soll
   sie bei 31,5 + 2,6 = 34,1 liegen.

2. DIE ZWOELF STUNDENBALKEN WAREN UNTERSCHIEDLICH HELL.

   Ein Verlauf laeuft diagonal ueber die ganze Zeichnung. Auf einem
   durchgehenden Bogen ist das Material; auf zwoelf getrennten Balken
   bekommt jeder eine andere Farbe. Gemessen, beide Faehrten im selben
   Lauf:

     alt   75 bis 145, Faktor 1,93
     neu  114 bis 147, Faktor 1,29

   Der tiefe Stopp #a81f2c traf die Plaetze 0 bis 3 -- die Stunden 1
   bis 4, also genau die Balken, die als erste gezeichnet werden. Ein
   75er neben einem 145er sieht nicht nach Licht aus, sondern nach
   Ausfall. Minute und Sekunde behalten ihren vollen Verlauf: Bei 60
   Gliedern liegen die Nachbarn dicht genug, dass der Wechsel als
   Politur gelesen wird.

3. VIER TOTE BREITENREGELN, die 620 Zeilen spaeter ueberschrieben
   wurden (2,6/3/3,6 statt der gezeichneten 3,2/5/5,8). Sie haben
   nichts kaputtgemacht, aber sie haben mich beim Nachrechnen des
   Kantenversatzes in die Irre gefuehrt -- entfernt, mit Verweis auf
   die eine lebende Stelle. Dabei fiel auf, dass der Versatz der Stunde
   noch mit einer Kantenbreite von 0,9 rechnete, obwohl sie laengst
   0,6 ist: 2,05 statt 2,20.

NICHT KRUMM war der Rest, auch das gemessen: 9 runde Elemente, 0 Eier;
alle 15 Kreise der Uhr auf demselben Mittelpunkt; Kasten exakt
quadratisch; Umfaenge stimmen auf 0,01 Einheiten zum Muster. Die 30
gefundenen Drehungen sind samt und sonders gewollt (Chilis, Husky,
Wasserzeichen -8 Grad).

Geprueft: pruef-start-ansicht, pruef-css-klassen, pruef-buehne -- alle
gruen. Jede Messung mit Gegenprobe.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 03:42:00 +02:00
DogFatherGitandClaude Opus 5 6676998af8 Niemand sieht VanVan ausser DogFather -- plus vier Punkte vom Screen
--- DAS WICHTIGSTE ZUERST: die Verbergungsregel ---

Filipe, ausdruecklich und dringlich: "und noch gaaaaaanz wichtig keiner
soll vanvan sehen ausser ich, ueberall soll keiner vanvan sehen ausser
dogfather."

ES GAB DAVON NUR EINE HAELFTE. In der Personenliste wurde der zweite
Admin-Zugang fuer Spicy Media ausgeblendet (Wunsch vom 31.08.).
Ueberall sonst -- Chat, Kalender, Aufgaben, Dateien, Zentrale -- war er
sichtbar. `sichtbarePersonenIds` hat ihn sogar ausdruecklich JEDER
Rolle gezeigt, weil sie alle Admins einsammelt.

WORAN DIE BEIDEN AUSEINANDERGEHALTEN WERDEN: In der Datenbank tragen
beide die Rolle `admin`, es gibt kein unterscheidendes Feld. Der
Unterschied, den es wirklich gibt, ist das Alter -- DogFather ist der
erste Zugang. Also: der Admin mit der kleinsten Nummer ist DogFather,
alle weiteren sind verborgen. Drei Ausnahmen: DogFather sieht alle,
ein verborgener Zugang sieht sich selbst, und bei nur einem Admin gibt
es nichts zu verbergen.

WARUM AN EINER STELLE UND NICHT IN DEN ABFRAGEN: Allein
workspace-personen.js hat 23 Abfragen auf `personen`. Eine Regel, die
man 23-mal wiederholt, ist 23 Gelegenheiten, sie zu vergessen -- und
beim Vergessen faellt niemand auf die Nase, sondern jemand SIEHT etwas.
Die Regel sitzt deshalb in `verborgeneIds()` und wird ueber einen
MANTEL um die sechs Listenfunktionen gelegt: Diese haben zusammen
achtzehn Rueckgabewege; sie einzeln zu flicken waeren achtzehn
Gelegenheiten, einen zu uebersehen. Die ungefilterten Fassungen
(`...Roh`) werden nicht mehr exportiert -- niemand kann sie
versehentlich benutzen.

`null` HIESS BISHER "SIEHT ALLES". Sobald es etwas zu verbergen gibt,
gilt das nicht mehr: Die Liste wird ausgeschrieben. Das ist strenger,
nicht lockerer.

NEUE PRUEFUNG server/pruef-verborgen.mjs -- sechs Personen (darunter
ein zweiter Admin), fuenf Schnittstellen, jede Rolle einzeln. Sie hat
beim ersten Lauf sofort ein Loch gefunden, das ich sonst nicht bemerkt
haette: Die ZENTRALE holt sich das Haus selbst und ging an allen
Listenfunktionen vorbei -- Spicy Media sah VanVan dort als Segment im
Team-Ring. Und beim Korrigieren der Pruefpfade fiel ein zweites auf:
`darfEintragen` im Kalender liess die Leitung JEDEN eintragen, bevor
ueberhaupt eine Liste befragt wurde. Eine Sichtbarkeitsregel, die nur
beim Lesen gilt und nicht beim Schreiben, hat ein Loch in der Mitte.

Die Pruefung hat eine Gegenprobe: Ein Manager MUSS DogFather in
derselben Liste sehen -- sonst waere "sieht VanVan nicht" auch dann
gruen, wenn die Listen leer zurueckkaemen.

--- screen1 Punkt 1: Silber mit Babyblau ---

"ich will dass diese farbe gemischt wird mit babyblau."

#c7dcf4 statt #d8e0ec -- dieselbe Helligkeit, mit Blaurichtung.
Nachgerechnet bleibt der Abstand zur naechsten Rolle bei 0,1790, immer
noch weiter als das frueher benutzte Babyblau (0,1349). Gemischt ist es
ausserdem SICHTBAR: Die Schiene laeuft von Silber nach Babyblau, und
der Glanz traegt beide Toene. Eine Mischung, die man nur im Hexwert
findet, ist keine.

--- screen1 Punkt 2: das Wasserzeichen ---

"soll viel groesser sein und nicht so abgecuttet sondern gut zu sehen
sein."

NACHGEMESSEN war es auf der Dashboard-Kachel zu 50 Prozent
abgeschnitten, und zwar auf DREI Seiten: 36 px ueber dem oberen Rand,
44 rechts, 60 unten -- 220 px Zeichen auf einer 152 px hohen Kachel.

UND ES GAB ZUM DRITTEN MAL DIESE WOCHE EINE DOPPELREGEL: 3600 Zeilen
unter der sorgfaeltig begruendeten Fassung (156 px bei 0,14) stand eine
zweite (118 px bei 0,085) mit derselben Spezifitaet. Sie gewann, und
die Begruendung oben war wirkungslos. Am 08.09. hatte ich beim
Wasserzeichen schon einmal genau so eine Doppelung gefunden -- und
diese hier uebersehen.

Jetzt eine Fassung, und die Groesse haengt an der KACHELHOEHE: Ein um
8 Grad gedrehtes Quadrat der Seite S braucht S x 1,129 Platz, also
`min(132px, 100% - 30px)`. Nachgemessen 100 Prozent sichtbar statt 50,
bei 0,14 statt 0,085 -- die sichtbare Flaeche hat sich verdoppelt.

--- screen1 Punkt 3: die Personenliste in einer Kachel ---

Die fuenf Rollengruppen standen als fuenf lose Abschnitte frei auf dem
Hintergrundbild. Es ist aber EINE Liste mit fuenf Abschnitten. Jetzt
eine Sammelkachel aus der Modulliste, mit dunklen Fugen statt Luft --
und dunkler als die Karten darin, wie eine Vitrine.

--- screen1 Punkt 4: "Womit meldest du dich an?" ---

Der einzige Satz auf der Anmeldeseite, der eine FRAGE stellt, stand als
graue Feldbeschriftung da. Jetzt gebuerstetes Metall, ein Anschlag aus
drei Kerben in Rot und Babyblau und eine auslaufende Linie -- dieselbe
Sprache wie die Typenschilder im Workspace. Rueckfall vollwertig: Faellt
`background-clip: text` aus, steht dort heller Text.

Geprueft: pruef-verborgen (neu), pruef-rollen, pruef-start-ansicht,
pruef-css-klassen, pruef-workspace-seiten, pruef-buehne, pruef-handy,
pruef-chat, pruef-kalender -- alle in Ordnung.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 03:18:01 +02:00
DogFatherGitandClaude Opus 5 1ad22b55c4 Ring so gross wie die Uhr, Stunden geschaerft, Report-Karten gerade, Schutz wird Magenta
--- screen1: Glocke nach rechts, Ring so gross wie die Uhr ---

"dieser button links vom kreis soll rechts davon sein und der kreis
soll die gleiche groesse wie die uhr haben."

Die KAESTEN waren schon exakt gleich gross (248 x 248, seit gestern aus
einer Variablen). Der gezeichnete Ring aber nicht: Sein aeusserer Bogen
lag bei Radius 128 von 150, plus halbe Strichbreite also bei 132,5 --
88 Prozent des Kastens, gerendert 219 statt 248 px. Die Uhr daneben
fuellt ihren Kasten ganz aus, ihr Leuchtkranz ragt sogar 7 px darueber
hinaus. Zwei gleich grosse Kaesten mit ungleich grossem Inhalt sehen
ungleich gross aus.

Jetzt 145 statt 128 (aussen) und 120 statt 106 (die Segmente) --
dasselbe Verhaeltnis zueinander, nur bis an den Rand. 145 + 4,5 =
149,5 von 150: ein halber Pixel Luft, damit die runde Kappe nicht
abgeschnitten wird.

Die Glocke steht jetzt rechts vom Ring. Damit liegen beide Knoepfe
INNEN, zwischen den Instrumenten und dem Text -- vorher sassen sie an
den beiden Aussenkanten, so weit voneinander entfernt wie moeglich,
obwohl sie dasselbe tun: einstellen, was einen erreicht.

--- screen2: die Stunden ---

"die stunden muss noch perfektionnieren."

DIE LICHTKANTE WAR EIN KRATZER. Sie stand auf 50 Prozent Weiss bei 0,9
Breite. Auf den schmalen Sekunden- und Minutenbahnen ist das eine
Kante; auf dem 5,8 px breiten Stundenbalken war es ein zweiter,
weisser Balken auf dem roten. Der Grund ist Verhaeltnis UND Farbe:
0,9 von 3,2 sind 28 Prozent, 0,9 von 5,8 nur 16 -- aber die Stunde ist
die einzige deckende, kraeftig gefaerbte Bahn, und auf Rot faellt
dasselbe Weiss doppelt so stark auf wie auf Silber. Jetzt 22 Prozent
bei 0,6 Breite.

DER KOPF BLEIBT ROT. Er stand auf #ffd9dd, also fast weiss -- das
aktuelle Glied war zwar das hellste, hatte aber die Farbe seiner Bahn
verloren und sah aus wie ein Fremdkoerper zwischen den roten Balken.
Jetzt ein helles, deutliches Rot: Es hebt sich durch Helligkeit ab,
nicht durch eine andere Farbe.

--- screen3: die Report-Karten stehen gerade ---

"ich will dass alles passt, nicht bedeckt ist, schief steht oder zu
tief oder zu hoch."

NACHGEMESSEN, ALLE 17 KARTEN -- der Befund deckt sich genau mit dem,
was er beschreibt: Name und Zahl lagen 12 bis 28 px auf VERSCHIEDENEN
Hoehen, sie ueberlappten sich waagerecht (gemessener Abstand -183 bis
-524 px), und Karten in derselben Reihe waren verschieden hoch.

DIE URSACHE IST EINE ZEILE: `.kachel__zahl` steht `position: absolute`
bei top 13 / right 13. Auf der Startseite ist das richtig -- gleich
grosse Kacheln, einzeiliger Name. Hier bricht der Name um ("Community:
neue Eintraege"), die Karte waechst nach unten, die Zahl bleibt oben
kleben. Sie war ausserdem fuer die Hoehenrechnung unsichtbar, weshalb
es vorher schon eine `min-height` als Pflaster brauchte.

Jetzt ein echtes Raster: Name links (Zeile 1), Trend darunter, Zahl
rechts ueber beide Zeilen und mittig. `display: contents` auf dem
Wrapper -- so werden seine Kinder selbst zu Rasterfeldern, ohne dass am
HTML etwas geaendert werden muss und ohne dass die Startseite, die
dieselben Klassen benutzt, etwas davon mitbekommt.

Nachgemessen danach: 17 von 17 sauber -- nichts ragt heraus, nichts
ueberlappt, nichts abgeschnitten, kein Versatz ueber 5 px, und keine
Reihe mit ungleichen Hoehen.

--- screen4: Schutz & Regeln wird Magenta ---

"ich will dass die kategorie eine farbe bekommt die extrem krass
auffaellt. diese kategorie ist naemlich seeeehr wichtig."

MAGENTA, WEIL ES DAS EINZIGE IST, DAS ES SONST NICHT GIBT. Rot ist fuer
"ueberfaellig" und Spicy Media vergeben, Babyblau fuer DogFather, Lila
fuer Manager, Gruen fuer Scout, Bronze fuer Creator, Bernstein fuer
"dringend". #ff2fd0 stoesst mit keinem davon zusammen -- es faellt
nicht auf, weil es HELLER ist, sondern weil es einzigartig ist. Das
ist verlaesslicher: Helligkeit konkurriert mit den Nachbarn,
Einzigartigkeit nicht.

Gerechnet wie bei Ton 21: Abstand zum naechsten Nachbarn 0,1305 (die
Grenze im Satz liegt bei 0,0973), Buntheit 0,276 -- die hoechste im
ganzen Satz, das alte Gold lag bei 0,170 --, Kontrast 6,00:1. Von
sieben Kandidaten sind drei an der Abstandsgrenze gescheitert. Das
Saeuregelb #e0ff00 waere lauter gewesen (16,86:1), haette sich aber
mit dem Bernstein von "dringend" und dem Gold der Nachbarkacheln um
dieselbe Wirkung gestritten. Die Kachel bleibt gebaut wie alle
anderen; was sie heraushebt, ist die Farbe, keine Sonderform.

--- Eine Rueckwirkung, die pruef-buehne gefunden hat ---

Die Typenschilder von gestern nutzen `background-clip: text` -- dafuer
MUSS `color: transparent` sein. pruef-buehne las genau dieses `color`,
machte daraus Schwarz und meldete 1,07:1 fuer Text, der hell und gut
lesbar ist. Fuenf Fehlalarme auf drei Seiten.

Eine Warnung, die bei richtiger Arbeit anschlaegt, wird abgeschaltet.
Sie ist deshalb nicht weichgemacht, sondern GENAUER geworden: Bei
Verlaufsschrift zaehlt jetzt der DUNKELSTE Farbstopp der ersten
Hintergrundebene -- der schlechteste Punkt, den es auf dieser Schrift
wirklich gibt. Damit meldet start.html 4,74:1 (noetig 4,5), die
Pruefung findet also weiter die engste Stelle.

UND DIE GEGENPROBE HAT SOFORT EINEN FEHLER IN MEINEM EIGENEN CODE
GEFUNDEN: Ich suchte das Ende der ersten Ebene mit `"),"` -- diese
Zeichenfolge steht aber schon am Ende des ERSTEN `rgb(...)`. Die
Messung las damit immer nur den ersten Stopp und haette einen dunklen
Verlauf fuer hell gehalten. Jetzt wird ueber Klammern gezaehlt. Der
Helfer steht einmal und wird als Quelltext in beide Seiten-Aufrufe
gereicht -- zwei Kopien waeren zwei Gelegenheiten auseinanderzulaufen.

Geprueft: pruef-buehne (mit neuer Gegenprobe), pruef-start-ansicht,
pruef-css-klassen, pruef-handy, pruef-workspace-seiten -- alle in
Ordnung.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 02:58:22 +02:00
DogFatherGitandClaude Opus 5 7de32a5ec7 Punkt 15: Der Chat bekommt Suche, Antworten mit Zitat und die Ungelesen-Linie
Wunsch Filipe: "ich will dass du diese seite viel krasser und
detaillierter machst, ich will dass du dich informierst und alles
reinsetzt was wir noch gebrauchen koennten."

NICHT ALLES, SONDERN WAS TAEGLICH FEHLT. Der Chat konnte schon Raeume,
Verlauf, Gelesen-Stand, Live-Zustellung, Gruppen und Zuruecknehmen.
Drei Dinge fehlten, und jedes davon kostet ohne es echte Zeit:

1. SUCHE IN DEN NACHRICHTEN. Ein Chat ohne sie ist ab dem zweiten
   Monat ein Archiv, in dem man nichts findet. Ein Suchfeld gab es --
   es durchsuchte aber nur die NAMEN der Gespraeche, also die kleinere
   Haelfte. Jetzt durchsucht dasselbe Feld beides und zeigt die
   Fundstellen UNTER der Gespraechsliste: Wer "Patrick" eingibt, will
   vielleicht das Gespraech und vielleicht die Nachricht -- ein
   Umschalter haette ihn zwingen wollen, das vorher zu wissen.

2. ANTWORTEN MIT ZITAT. Zu zweit weiss man meistens, worauf sich etwas
   bezieht. In einer Gruppe laufen drei Faeden parallel, und "ja, mach
   das" kann alles heissen. Das Zitat steht IN der Blase (es gehoert
   zur Antwort, nicht darueber) und fuehrt per Klick zur Stelle.

3. DIE LINIE "AB HIER NEU". Wer nach zwei Tagen zurueckkommt, sucht
   sonst die Stelle, an der er aufgehoert hat, indem er Uhrzeiten
   liest.

BEWUSST NICHT GEBAUT: Anhaenge (dafuer gibt es den Dateien-Bereich mit
Rechten und Ablauf), Reaktionen (eine vierte Sache, bevor die drei sich
bewaehrt haben) und Tipp-Anzeigen (dauernder Verkehr fuer eine
Auskunft, die man in zwei Sekunden ohnehin sieht).

DIE SICHERHEIT DER SUCHE STEHT IM JOIN, nicht in einer nachtraeglichen
Pruefung: `chat_teilnehmer` wird mit der eigenen Personenkennung
verbunden, und was dort nicht drinsteht, kommt gar nicht erst aus der
Datenbank. Ein Filter, der erst hinterher aussortiert, ist eine Zeile
davon entfernt, vergessen zu werden. Ebenso beim Zitat: Worauf
geantwortet wird, muss im SELBEN Raum liegen -- sonst koennte jemand
die Kennung aus einem fremden Gespraech mitschicken, und beim
Empfaenger stuende ein Zitat aus einem Raum, den er nie gesehen hat.

DREI FEHLER, DIE DER DURCHLAUF GEFUNDEN HAT:

1. `ESCAPE '\'` IN EINEM TEMPLATE-LITERAL. Dort ist `\'` eine
   Fluchtsequenz fuer das Anfuehrungszeichen -- SQLite bekam ein
   LEERES Fluchtzeichen und antwortete "ESCAPE expression must be a
   single character". Die Suche war damit komplett tot. Kein
   Syntaxfehler, kein Warnhinweis: Erst der Aufruf mit echten Daten
   hat es gezeigt.

2. DIE MASKIERUNG KANNTE ZWEI VON DREI ZEICHEN. `%` und `_` waren
   dabei, der Backslash nicht -- ausgerechnet das Fluchtzeichen selbst.
   Geprueft wird das jetzt an der ZEILE AUS DER DATEI, nicht an einem
   Nachbau: Mein erster Test hat die Maskierung nachgebaut und dabei
   die Shell-Maskierung mitgeschleppt -- er meldete einen Fehler, den
   nur er hatte.

3. DIE UNGELESEN-LINIE SCHIEN NICHT ZU FUNKTIONIEREN. Sie tat es --
   mein Testaufbau war falsch: Filipes Seite war noch offen, die neuen
   Nachrichten kamen ueber den Live-Strom an und wurden sofort als
   gelesen gemeldet. Es gab schlicht nichts Ungelesenes. Erst als er
   die Seite verlaesst, bevor Patrick schreibt, steht die Linie da --
   und zwar genau vor "Neu von Patrick, eins", und beim zweiten
   Oeffnen ist sie weg.

Der Gelesen-Stand wird deshalb beim OEFFNEN mitgeschickt, bevor er
gesetzt wird -- eine Zeile spaeter waere er immer die letzte Nachricht,
und die Linie staende nie irgendwo.

Ohne Volltextindex, mit Absicht: `LIKE` liest die Tabelle, und bei
einem Team dieser Groesse sind das einige tausend Zeilen. Ein
FTS5-Index waere eine zweite Tabelle, die synchron gehalten werden
muss -- genau daran gehen solche Sachen kaputt. Wenn der Verlauf
sechsstellig wird, ist das der Zeitpunkt dafuer, nicht heute.

Geprueft: pruef-chat, pruef-chat-optik, pruef-css-klassen,
pruef-workspace-seiten, pruef-handy -- alle in Ordnung. Dazu im
Browser durchgespielt: Zitat gesetzt und gelesen, Suche nach
"Bitrate" (1 Treffer), nach "100 %" (1 Treffer -- die Maskierung
haelt), nach Unsinn (0), einbuchstabige Suche (zu kurz), Antwortleiste
mit dem richtigen Namen, Ungelesen-Linie an der richtigen Stelle und
beim zweiten Oeffnen weg.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 02:18:59 +02:00