Commit Graph
258 Commits
Author SHA1 Message Date
DogFatherGitandClaude Opus 5 93c9788782 Telefonieren im Chat -- und die Farben nach Nachbarschaft verteilt
ZWEI SACHEN IN EINEM COMMIT, weil beide aus derselben Nacht stammen.

=== 1. DIE FARBEN: DER RICHTIGE ABSTAND ===

Filipe: "es gibt noch mehr die aehnlich aussehen von den farben also
leg los alle die sich aehnlich sind von den farben wechseln."

Er hatte recht, und mein Denkfehler laesst sich benennen: Ich hatte den
kleinsten Abstand ueber ALLE 37 Paare maximiert -- und der liegt bei 37
Farben zwangslaeufig bei 0,10. Das ist die Packungsgrenze, kein
Versaeumnis.

NUR SIEHT NIEMAND ALLE 37 NEBENEINANDER. Man sieht NACHBARN. Im Browser
gemessen, an der tatsaechlichen Lage auf dem Schirm -- 125 Paare, die
wirklich nebeneinander stehen, 15 davon unter 0,15:

  Creator-Profile / Zahlen      0,1019   beide rosa-rot
  LIVE-Analyse / Technik        0,1030   beide orange
  Wunschliste / Meldungen       0,1032   beide gelbgruen
  Wer sieht was / Entwicklung   0,1039   beide cyan
  Regeln & Hilfe / Mitmachen    0,1047   beide gruen
  Der Treff / Anschlagbrett     0,1070   beide rosa

Die Farben bleiben, ihre ZUTEILUNG aendert sich:

  Nachbarabstand     0,1047 -> 0,2133   (mehr als verdoppelt)
  Nachbarn unter 0,15     6 -> 0

Die Nachbarschaft steht in server/kachel-nachbarn.json, gemessen im
Browser -- nicht aus der Struktur im Quelltext abgeleitet. Die sagt,
was zusammengehoert, nicht was zusammen zu sehen ist.

=== 2. TELEFONIEREN IM CHAT ===

Filipe: "kann man machen dass die modis, rechte hand und ich auch
telefonieren koennen im chat?" ... "was man selbst in die app
reinsetzten kann, nicht meinen pc belastet und trotzdem vielleicht in
gruppe, mit video oder einzelnd."

DER TON GEHT NICHT UEBER DEN SERVER. Direkt von Browser zu Browser
(WebRTC); der Server reicht nur die Verbindungsdaten weiter, ein paar
Kilobyte je Anruf. Zu zweit kodiert jedes Geraet einen Strom und
dekodiert einen -- die Last eines gewoehnlichen Videoanrufs.

KEIN NEUER DIENST. Der Chat hatte bereits alles: `chatEreignis()` fuer
den Hinweg (SSE), Push fuers Klingeln, Raeume mit mehreren
Teilnehmern. Ein eigener WebSocket daneben waere eine zweite
Verbindung fuer dieselbe Frage -- und die zweite wird beim naechsten
Umbau vergessen.

Gebaut: Ton und Video, einzeln und in Gruppe bis GRUPPE_MAX (4),
Klingeln mit Annehmen/Ablehnen, Mikro und Kamera schaltbar,
Gespraechsdauer, Auflegen. Der Chat bleibt daneben benutzbar -- man
schreibt oft, waehrend man spricht.

EIN FUND, DER OHNE PRUEFLAUF LIVE GEGANGEN WAERE: Der Server sperrt
Mikrofon und Kamera per Permissions-Policy auf ALLEN Seiten. Der erste
Lauf meldete "microphone is not allowed in this document" -- der Anruf
haette bei JEDEM versagt, mit einer Meldung, die auf die falsche
Faehrte fuehrt (man sucht an den Browsereinstellungen). Die Sperre
bleibt ueberall und ist an genau EINER Stelle geoeffnet: der
Chat-Seite, und nur fuer sie selbst (`self`, nicht `*`).

NOCH NICHT GEBAUT -- und ausdruecklich nicht heimlich: coturn. Ohne
Vermittlungsserver klappen Anrufe nur im selben Netz. Die Adressen
stehen in den Einstellungen statt im Quelltext; sie lassen sich
nachtragen, ohne eine Zeile zu aendern. Ein oeffentlicher STUN-Dienst
als Standard kam nicht in Frage: Er saehe bei jedem Anruf die
IP-Adressen beider Teilnehmer, und fuer ein Team, das ueber Moderation
und Vorfaelle spricht, ist das keine Kleinigkeit.

server/pruef-anruf.mjs, 40 Pruefungen. Der wichtigste Abschnitt: Wer
nicht in den Raum gehoert, kommt an KEINE Route. Ein Anruf hinterlaesst
keine Spur -- wer mithoert, faellt nicht auf.

Gegenproben, jede zielgenau:
  Empfaengerpruefung der Signalisierung weg -> 1 rot
  Raumpruefung weg                         -> 5 rot (jede Route offen)
  Kopfzeilen-Ausnahme weg                  -> 4 rot

Gruen: anruf, chat, chat-optik, chat-kanaele, css-klassen, namen,
struktur.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-18 10:10:04 +02:00
DogFatherGitandClaude Opus 5 438493c7dc Kacheln: 37 Farben neu gerechnet, und in jeder ein eigenes Universum
Filipe, zwei Wuensche: "ich will das jede kachel eine andere farbe hat
... keine die sich irgendwie aehnlich sind ... richtig geil und
speziell" und "der hintergrund ... soll noch mehr viel mehr nach
universum sein. nicht einfach so paar weisse punkte sondern richtig
geil hochwertiger geiler universum ... in den kacheln ueberall".

BEIDES WAR BERECHTIGT, und beides liess sich messen:

  kleinster Farbabstand    0,0529   (Rueckmeldung / Steckbrief)
  Paare unter 0,10         26 von 666
  schlechtester Kontrast   1,64:1   (Ton 35 -- praktisch unlesbar)
  sieben Toene unter 4,5:1
  Universum                auf GENAU EINER Kachel

WIE DAS PASSIEREN KONNTE, obwohl es ein Farbwerkzeug gab: Es kannte 21
Farben. Seit dem 08.09. waren SECHZEHN von Hand dazugekommen (Ton 22
bis 37) -- jede einzeln plausibel, keine gegen die anderen gerechnet.
Das Werkzeug meldete weiter "0,0973, alle Bedingungen erfuellt" und
meinte einen Stand, den es nicht mehr gab. Dieselbe Krankheit wie eine
abgeschriebene Spaltenliste: Die Zahl wird nicht falsch, sie wird
UNZUSTAENDIG. Es liest die Anzahl jetzt aus den Dateien.

NEU GERECHNET, alle 37 auf einmal:
  kleinster Abstand   0,0529 -> 0,1010   (fast doppelt)
  Paare unter 0,10        26 -> 0
  schlechtester Kontrast 1,64 -> 4,50:1
  Buntheit bis 0,300 statt 0,170, Helligkeit 0,58 bis 0,92

Drei Stellschrauben: Buntheitsgrenze hoch (augenschonend heisst dunkles
Schema und kein Flackern, NICHT blass), Raster von 2 Grad auf 1 Grad
und von fuenf auf zwanzig Helligkeitsstufen, und sechzehn Startpunkte
statt einem. Der Kontrast 4,5:1 bleibt hart -- eine Kachelfarbe traegt
Text.

DAS UNIVERSUM STEHT JETZT IM HINTERGRUND JEDER KACHEL, nicht in einem
Element: Beide Pseudo-Elemente sind vergeben (Leuchtschiene, Glanz),
und ein neues Element muesste an jeder Stelle nachgetragen werden, die
Kacheln baut. Eine Ebene, die man vergessen kann, wird vergessen.

Siebzehn Ebenen: drei nahe Sterne mit Hof, vier mittlere (zwei im
Kachelton), fuenf Staubkoerner, eine Milchstrasse als Schraege, drei
Nebel im Kachelton, ein kuehler Gegenpol, eine Vignette. Die Nebel
tragen `var(--ton)` -- 37 Kacheln sind damit 37 verschiedene Nebel.
Keine Bewegung: 28 driftende Felder waeren 28 Dauerlaeufer auf der
Grafikkarte.

Nach dem ersten Bildschirmfoto nachgeschaerft -- die Sterne lagen bei
6 bis 14 Prozent und waren aus der Naehe nicht zu sehen, genau die
"paar weissen punkte". Der Grund steht in der Kachel selbst: Sie ist
halbdurchsichtig, darunter liegt das Buehnenbild. Ein Sternenfeld muss
sich hier gegen ein FOTO durchsetzen, nicht gegen Schwarz.

NEU: server/helfer-png.mjs -- ein PNG-Leser (zlib, 90 Zeilen). Er
beantwortet die Frage, die aus dem CSS nicht mehr zu beantworten war:
Zwischen Textfarbe und Flaeche liegen jetzt sieben Ebenen plus das
durchscheinende Buehnenbild. Gemessen am Bildschirmfoto: schlechtester
Textkontrast 8,02:1 (Grenze 4,5).

NEU: server/pruef-kachel-universum.mjs, 12 Pruefungen.
DREI ANLAEUFE FUER DIE STERNPRUEFUNG, und die ersten zwei waren gruen
und wertlos:
  1. Ebenen im CSS zaehlen -- `0px` ist auch eine Zahl. Alle Sterne
     auf null: blieb gruen.
  2. Helle Punkte im Bildschirmfoto zaehlen -- die Kachel ist
     halbdurchsichtig, das Foto darunter hat selbst Punktstruktur.
     Gemessen: 459 Punkte mit Sternen, 441 ohne. Vier Prozent sind
     kein Nachweis, sondern Rauschen.
  3. Jetzt die GROESSEN aus dem CSS (>= 0,7 px). Schwaecher, aber
     ehrlich -- und die Gegenprobe greift: 12 -> 0.
Dabei fiel ein eigener Messfehler auf: Der Bereich wurde aus der
Textposition geschaetzt und lag OBERHALB der Kachel. Verraten hat es
die Gegenprobe, die zweimal exakt 153 lieferte -- eine Messung, deren
Ergebnis sich nicht aendert, wenn man das Gemessene entfernt, misst
etwas anderes.

Gegenproben, alle zielgenau:
  zwei gleiche Farben   -> 3 rot      Sterne auf 0px  -> 1 rot
  Nebel ohne Kachelton  -> 1 rot (nach dem Schaerfen: vorher blieb es
                            gruen, weil `--ton` auch im Grundverlauf steht)

Gruen: kachel-universum, css-klassen, start-ansicht, namen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-18 02:55:23 +02:00
DogFatherGitandClaude Opus 5 3d9de349ad Wer sich kuemmert -- an jeder Anfrage und an jedem Kandidaten
Ein Versprechen von frueher, nie gebaut: die Arbeit mit der rechten
Hand teilen. Gemessen: Es gab dafuer NICHTS. Weder an `bewerbungen`
noch an `talent_stufe` stand eine Zustaendigkeit -- beide sehen alles,
niemand ist benannt.

Das ist nicht "geteilt", das ist "jeder dachte, der andere macht es".
Bei einer Anfrage wartet ein Mensch darauf. Bei einem Kandidaten
bleibt er auf seiner Stufe liegen -- die Standzeit an der Karte sagt
zwar, DASS etwas liegt, aber nicht, wer es aufheben sollte.

MAN NIMMT SELBST, MAN BEKOMMT NICHT ZUGETEILT. Ein "DogFather weist
zu" waere eine Rangordnung, und die gehoert hier nicht hin (18.08.2026:
"mich bitte nie wie da hoeher stellen wie andere"). Wer Zeit hat,
uebernimmt; wer keine mehr hat, gibt ab -- mit DEMSELBEN Knopf, wie bei
den Merkmalen und den Probeschritten.

DER FALL, AUF DEN ES ANKOMMT: Eine FREMDE Uebernahme wird mit 409
abgewiesen, nicht stillschweigend ueberschrieben. Sonst nimmt einer dem
anderen die Anfrage aus der Hand, ohne dass es jemand merkt -- und
beide glauben, sie sei erledigt. Wer trotzdem will, laesst erst
abgeben.

DER UNBESETZTE ZUSTAND IST DER AUFFAELLIGE. "Ich kuemmere mich" steht
als Knopf da, "Du kuemmerst dich" als ruhige Zeile, fremdes als
gestrichelter Rahmen ohne Zeigefinger (ein Knopf, der aussieht wie
einer und nichts tut, ist eine Falle). Andersherum waere die Liste ein
Feld aus Namen, in dem die Luecke nicht auffaellt -- und genau die
Luecke ist die Auskunft.

Verglichen wird ueber die NUMMER, nicht ueber den Namen: Zwei Leute
duerfen gleich heissen.

DREI EIGENE FEHLER, alle beim Nachsehen gefunden statt beim Schreiben:

 1. `nurLeitung` HAT AN MEINER ROUTE GEFEHLT. Der Router setzt
    `angemeldet` fuer den ganzen Pfad, `nurLeitung` aber je Route --
    ich hatte nur die Nachbarzeilen ueberflogen. Ohne den Riegel haette
    sich jeder Angemeldete fuer eine fremde Anfrage zustaendig erklaert:
    kein Datenabfluss, aber ein Name an einer Anfrage, der dort nichts
    zu suchen hat -- und sie gilt als betreut, waehrend sich niemand
    kuemmert. Gegenprobe bestaetigt: ohne die Zeile 200 statt 404.
 2. `nummer()` aufgerufen, das es in dieser Datei gar nicht gibt --
    ein Absturz zur Laufzeit, den `node --check` nicht sieht.
 3. Die Pruefung benutzte `json()` und rohe Cookie-Objekte statt der
    Hausmittel `alsJson`/`holen`/`schicken` dieser Datei. Abgeschrieben
    aus der Nachbardatei, in der sie anders heissen.

Und wieder eine Zeile, die ohne Daten gruen war: "um die sich niemand
kuemmert" bestaetigte auch bei LEERER Liste -- `undefined` ist nun
einmal kein Zustaendiger. Die Anzahl gehoert in die Bedingung.

pruef-nachwuchs 244 -> 258, pruef-bewerbung 77 -> 91.
Gegenproben:
  Riegel gegen fremde Uebernahme weg -> 5 rot
  nurLeitung weg                     -> 2 rot (der eigene Fehler)

pruef-nachruesten fuehrt beide neuen Spalten mit.

Gruen: nachwuchs, bewerbung, nachruesten, namen, css-klassen, struktur.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-18 01:47:11 +02:00
DogFatherGitandClaude Opus 5 1a2dfa07f3 Trichter und Entwicklungskarte kennen einander
An der Stufe "Im Team" steht seit jeher zweimal: "ab hier zaehlt die
Entwicklungskarte, nicht mehr diese". Gemessen: Es gab keinen Weg
dorthin. Wer den Satz las, musste die Seite selbst finden und die
Person dort aus einer Liste heraussuchen.

Das ist heute das DRITTE Mal dasselbe Muster -- ein Text verspricht
einen Weg, den es nicht gibt:
  "uebernehmen oder sauber beenden"  -> der Ausgang fehlte
  Kalender zeigt Brettzettel         -> zurueck fuehrte nichts
  "ab hier die Entwicklungskarte"    -> kein Link

HIN: Von der Talentkarte fuehrt ein Weg auf die Entwicklungskarte
GENAU DIESER Person -- ueber `?zeigen=person-<id>`, den Weg, den das
Haus dafuer schon hat (kopf.js), nicht ueber eine zweite Mechanik. Die
Karte ist beim Ankommen offen; ein Link, der auf einer Liste endet, auf
der man die Person wieder sucht, hat nichts erspart.

Der Sprung passiert ERST, wenn alle Kacheln stehen. Waehrend der
Schleife haengt die gesuchte noch nicht im Dokument und hat keine
Position -- ein Sprung dorthin waere einer an den Seitenanfang,
lautlos, und man haelt den Link fuer kaputt.

ZURUECK: Die Entwicklungskarte sagt jetzt, wie dieser Mensch gekommen
ist -- mit dem Namen der Talentkarte und wer ihn eingearbeitet hat.
Beim ersten Beurteilen ist genau das die Frage ("woher kommt der
eigentlich?"), und wer sie nicht beantwortet bekommt, faengt bei null
an, obwohl vier Wochen Beobachtung vorliegen.

NUR DER WEG, NICHT DIE DATEN. Die Merkmale aus dem Trichter hierher zu
kopieren waere bequem und falsch: zwei Kataloge, zwei Fragen (taugt er?
/ wie entwickelt er sich?). Eine Zahl aus dem einen sieht im anderen
aus wie eine Beurteilung und ist keine.

Moeglich wurde beides erst durch `talent_stufe.person_id` von vorhin --
ohne die Verknuepfung gibt es keine Richtung, in die man zeigen
koennte.

pruef-nachwuchs 236 -> 244. Geprueft wird nicht, ob ein Link DASTEHT,
sondern ob man am Ziel ankommt: Karte offen, richtige Person, Kachel
hervorgehoben, Herkunft da, Rueckweg da. Mit Gegenprobe an einer
zweiten Karte, die NICHT aus dem Trichter kam (sonst hiesse "kam ueber
den Trichter" nur, dass ueberall etwas steht).

Gegenproben:
  Sprung ausgebaut    -> 5 rot
  Herkunft ausgebaut  -> 2 rot, genau die beiden richtigen

Und wieder eine Schriftgroesse unter der Hausgrenze (.7rem = 11,2 px),
gefunden von pruef-css-klassen. Zurueckhaltend wird ueber FARBE
gedaempft, nicht ueber Groesse -- das ist der Unterschied zwischen
"leise" und "zusammengekniffen".

Gruen: nachwuchs, entwicklung, sprung, modi-wortleck, namen,
css-klassen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-18 01:01:12 +02:00
DogFatherGitandClaude Opus 5 a435e734c9 Aus dem Talent wird ein Mensch mit Aufgaben
Filipe: "wie talente bewertet werden, aufgaben bekommen, analysiert
werden von vanvan und mir, alles moegliche."

GEMESSEN VOR DEM BAU, und der Befund war groesser als erwartet: Der
letzte Schritt des Trichters legt einen Zugang an -- und die
Verknuepfung wurde NIRGENDS gespeichert. `zugangAnlegen()` gab die
Person zurueck, der Code wurde einmal gezeigt, und danach wusste die
Karte nicht mehr, wer aus ihr geworden ist.

Was dadurch nicht ging:
  - von der Karte zur Person springen
  - dem Neuen aus der Karte heraus seine ersten Aufgaben geben
  - in einem halben Jahr nachsehen, aus welchem Kandidaten eigentlich
    welches Teammitglied wurde

DREI SPALTEN WAEREN ZU VIEL GEWESEN, eine reicht: `talent_stufe.person_id`.
Kein Fremdschluessel auf `personen` -- wird ein Zugang geloescht, soll
die Karte stehen bleiben. Sie erzaehlt, wie jemand gekommen ist, und
das bleibt wahr, auch wenn er wieder geht. Ein CASCADE haette genau
diesen Verlauf mitgeloescht.

NUR SETZEN, NIE LOESCHEN (COALESCE): Sonst verloere die Karte ihren
Menschen, sobald jemand sie auf eine fruehere Stufe zuruecksetzt.

WOMIT ER ANFAENGT. Der Katalog mit 101 Aufgaben in 14 Bereichen gab es
laengst -- nur fuehrte der Weg dorthin ueber eine andere Seite, wo man
die Person heraussuchen und Bereich plus Stufe waehlen musste. Vier
Schritte, die niemand macht, waehrend er gerade jemanden aufnimmt;
dasselbe Muster hat heute schon zu einer Karte auf "Im Team" ohne
Menschen darin gefuehrt. Jetzt steht der Kasten an der Karte, ein Klick
legt einen Bereich an.

ES BLEIBT EIN ANGEBOT, KEINE AUTOMATIK -- Filipes Entscheidung bei der
Live-Checkliste gilt hier genauso: "was ungefragt Dinge anlegt, ist
schwer wieder loszuwerden". Und der Kasten ist ZU, wenn schon Aufgaben
da sind; offen wuerde er zum Nachlegen einladen, und das ist selten
gemeint. Daneben steht, wie viele schon offen sind -- ohne diese Zahl
legt man beim zweiten Hinsehen dasselbe noch einmal an.

pruef-nachwuchs 200 -> 236, davon 14 im Browser (Abschnitt 17 mit
eigenem Browser: der aus Abschnitt 15 lief, bevor es den Kandidaten
ueberhaupt gab -- ein Stand von zwei Abschnitten vorher ist keine
Messung, sondern eine Annahme).

VIER EIGENE FEHLER DABEI GEFUNDEN, drei davon durch die Gegenproben:

 1. `d.angelegt?.length` -- die Antwort ist eine ZAHL, kein Feld. Der
    Knopf haette "6 Aufgaben stehen bereit" gemeldet, auch wenn null
    entstanden sind.
 2. Der "Schritt zurueck" ging auf `probe` -- und der verlangt Buddy
    und Datum. Die Route antwortete 400, die Stufe blieb stehen, und
    die Zeile darunter bestaetigte, dass sich nichts geaendert hat:
    eine Pruefung, die immer gruen ist. Aufgefallen erst an der
    Gegenprobe (COALESCE ausgebaut -> blieb gruen). Eine Gegenprobe
    ist keine Kuer, sie prueft die Pruefung.
 3. Feldnamen `buddy`/`datum` statt `buddy_id`/`erste_schicht` --
    Fehler in der Pruefung, nicht im Code.
 4. Die Rollennamen-Zeile war ZU SCHARF und meldete prompt einen
    Treffer: "Die Modis, die mit ihm gearbeitet haben" aus dem
    Probeplan -- ein Satz, der ueber eine Schnittstelle kommt, die nur
    die Leitung erreicht, und genau dorthin gehoert. Geprueft wird
    jetzt, was hier neu ist; ueber die ausgelieferten DATEIEN wacht
    pruef-modi-wortleck (101 Dateien, mit eigener Gegenprobe).

Gegenproben, jede zielgenau:
  Nummer ungeprueft     -> "erfundene Zugangsnummer wird abgewiesen"
  COALESCE weg          -> "Schritt zurueck nimmt ihr den Menschen weg"
  Person nicht geliefert-> 4 rot

pruef-nachruesten fuehrt die neue Spalte mit -- jede neue Spalte gehoert
in diese Liste, sonst prueft die Datei den Weg von gestern.

Gruen: nachwuchs, nachruesten, modi-wortleck, namen, css-klassen,
struktur.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-18 00:12:14 +02:00
DogFatherGitandClaude Opus 5 5e628e0078 Brett und Kalender kennen einander jetzt in beide Richtungen
Der Kalender zeigt seit heute, was auf den Brettern steht und einen
Termin hat. Die Verbindung war aber EINSEITIG, und beide Halften
fehlten:

  Beim SCHREIBEN konnte niemand wissen, dass ein Tag in der Zukunft den
  Zettel in den Kalender bringt. Das Feld heisst "Datum" und ist mit
  HEUTE vorbelegt -- die Funktion war vorhanden und unauffindbar. Eine
  Funktion, die niemand findet, ist keine.

  Beim LESEN sagte die Karte nichts. Am Fuss stand bloss ein Datum, und
  "24.09.2026" sieht aus wie "17.09.2026" -- obwohl das eine ein Termin
  ist und das andere der Tag, an dem jemand getippt hat.

EINE REGEL, ZWEI VERWENDER -> server/workspace-termin-regel.js.
Der Kalender fragt "welche gehoeren hinein?" (SQL, ganze Tabelle), die
Brettkarte fragt "stehe ICH drin?" (JavaScript, je Zeile). Beide Fassungen
stehen jetzt nebeneinander in EINER Datei, importfrei wie
treff-tabellen.js.

Das ist kein Vorsichtsprinzip, sondern Erfahrung: Zwei Fassungen
derselben Regel sind im Haus dreimal auseinandergelaufen -- die
abgeschriebene Spaltenliste (11.09., drei Spalten samt Inhalt weg), die
zweite Artenliste neben ARTNAME (ein BigMatch liess sich anlegen und
war unsichtbar) und `.teilen` heute frueh.

server/pruef-terminregel.mjs, 35 Pruefungen. Der Kern ist Abschnitt 2:
Er prueft die beiden Fassungen GEGENEINANDER, nicht jede fuer sich --
zwei Pruefungen, die je eine Seite bestaetigen, finden genau diesen
Fehler nicht. Verglichen wird beides: WELCHE Zettel und WELCHER Tag.
Neun Faelle, davon vier, die zu Recht wegbleiben.

Vier Gegenproben, jede in ihre eigene Richtung:
  JS laesst mehr durch -> "die Karte behauptet einen Termin, den der
                           Kalender nicht kennt"
  JS nennt anderen Tag -> "verschiedene Tage: Kalender 22., Karte 17."
  SQL laesst mehr durch-> "steht im Kalender, aber die Karte sagt nichts"
  Marke ausgebaut      -> 0 statt 1

EIN ECHTER FEHLER DABEI BEHOBEN, und er war aelter als diese Arbeit:
Das Formularraster gibt jedem Feld GENAU ZWEI Zeilen (Schild dehnbar,
Eingabe fest 44 px) -- deshalb sitzen die Eingaben auf einer Linie. Ein
Hinweisabsatz erzeugt eine dritte Zeile, und weil das Raster alle
Felder auf gleiche Hoehe dehnt, rutscht ausgerechnet diese Eingabe nach
oben. Gemessen: 328..372 gegen 351..395. 23 px -- genau das, was man
als "verzogen" sieht.

Mit `git stash` getrennt: aufgaben.html war dadurch SCHON VORHER rot
(ein anderes Feld hat dort ebenfalls einen Hinweis), bereich.html hatte
ich neu verursacht. Der Hinweis haengt jetzt absolut unter dem Feld --
beide sind gruen, und zwar an der Wurzel, nicht symptomatisch.
`pointer-events: none`, sonst faengt der Satz Klicks ab, die dem
Element darunter galten.

Am Handy gemessen statt geschaetzt: 0 Ueberschneidungen mit anderen
Feldern. Gegenprobe (row-gap auf 2 px): 1 Ueberschneidung.

Und noch zwei eigene Pruefungsfehler behoben, beide von derselben Sorte:
ein falscher Selektor samt `.catch(() => {})`, der den Fehlgriff
lautlos verschluckte (danach war das Hinweisfeld leer und die Zeile
darunter trotzdem gruen, weil "" nun einmal nicht "ja" ist) -- und die
Marke wurde ueber `textContent` gezaehlt statt ueber ihre Sichtbarkeit.
Aufgefallen ist das am Bildschirmfoto, auf dem ich sie fuer fehlend
hielt; deshalb macht die Pruefung jetzt zusaetzlich einen AUSSCHNITT
der Karte -- auf einem Vollbild von 2000 px ist eine Pille von 28 px
nicht zu beurteilen.

Gruen: terminregel, kalender, formulare, ueberlappung, countdown,
namen, css-klassen, struktur.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 23:53:05 +02:00
DogFatherGitandClaude Opus 5 fabb1f94a8 Kalender: was auf den Brettern steht und einen Termin hat
Filipe, zu einer Clip-Karte: "ich will dass die auch in einer kalender
drin sind, aber ich will dass es richtig geil ist und perfektionier das
bitte."

Gemessen vor dem Bau: /workspace/api/termine lieferte `termine` und
`fristen`. Die Zettel von den achtzehn Brettern kamen nirgends vor --
obwohl `eintraege` seit langem VIER Zeitfelder hat: datum, uhrzeit,
geplant, event_ende.

WELCHE HINEINGEHOEREN, IST DIE GANZE FRAGE -- und sie laesst sich
messen statt raten. `datum` ist ein Pflichtfeld und faellt auf HEUTE
zurueck, wenn niemand eins waehlt. Alle Eintraege hineinzukippen hiesse
also: jeder je getippte Zettel steht an dem Tag, an dem ihn jemand
getippt hat. Nach einem Monat waere der Kalender ein Protokoll und kein
Plan -- und ein Kalender, in dem alles steht, sagt nichts mehr.

GEZEIGT WIRD NUR, WOFUER JEMAND EINE ZEIT BESTIMMT HAT:
  geplant        eine Zusage ("Wird gemacht -- am 24.09.")
  event_ende     ein Zeitraum
  uhrzeit        niemand tippt aus Versehen 20:00
  datum > heute  der Rueckfall ist IMMER heute oder frueher
Erledigtes bleibt draussen. Der vierte Fall ist der wichtigste und der
unauffaelligste: kein neues Feld, keine Umgewoehnung.

RECHTE: dieselbe Funktion wie die Bretter selbst (`sichtbarEintrag`),
nicht eine zweite Meinung. Im Kalender steht nur eine kleine Pille mit
einem Titel -- dass darin ein vertrauliches Vorhaben steckt, faellt
niemandem auf, der nicht danach sucht. Genau so kam am 03.09. eine
Managerin an fremde Aufgabenfristen.

DREI FEHLER AM BILDSCHIRMFOTO GEFUNDEN, nicht an einer Zahl:
  1. Der Brettname stand VOR dem Titel -- aus "Clip am Wochenende"
     wurde "Cli...". Das Etikett verdraengte, was es einordnen sollte.
     Jetzt zweite Zeile: Hoehe ist im Monatsraster der billigere Platz.
  2. Am Handy (45px Zellbreite) wurde daraus ein "Co..." -- Hoehe ohne
     Information. Jetzt eine CONTAINER-Abfrage: entschieden wird nach
     der Breite der ZELLE, nicht des Fensters. Eine Fensterschwelle
     waere wieder die Rechnung von gestern (September, Kopfleiste,
     zweimal).
  3. .64rem = 10,24px -- unter der Hausgrenze 11,5px, gefunden von
     pruef-css-klassen. Gedaempft wird jetzt ueber Farbe und Gewicht,
     nicht ueber Groesse.

EIN ECHTER FEHLER VERHINDERT: In der Listenansicht waeren die Zettel im
Termin-Zweig gelandet -- mit Wecker, "erledigt" und "loeschen". Der
Knopf haette PATCH /api/termine/b12 geschickt: eine Nummer, die es dort
nicht gibt, an eine Schnittstelle, die davon nichts weiss. Still, ohne
Wirkung, ohne Meldung.

DER WEG FUEHRT AUF DEN ZETTEL, nicht nur auf das Brett -- ueber
`?zeigen=` (kopf.js), den Weg, den das Haus dafuer schon hat. Zwischen
zwanzig Eintraegen waere der gesuchte sonst von Hand zu suchen.

pruef-kalender: +25 Pruefungen. Sieben Gegenproben, jede zielgenau:
  Schnitt weg            -> 6 rot   Erledigtes rein      -> 6 rot
  Rechteregel ausgehebelt-> 1 rot   COALESCE weg         -> 1 rot
  Termin-Knoepfe an      -> 2 rot   Container-Regel weg  -> 1 rot
  Sprung-Zweig weg       -> 3 rot

UND SIEBEN FESTE ZAHLEN ABGELEITET. Die alten Pruefungen zaehlten
"alle fünf Einträge", "vier Arten", "vier Filter" -- mit den neuen
Testdaten wurden daraus zehn, und sieben Pruefungen je Bildschirmgroesse
wurden rot, ohne dass am Kalender etwas kaputt war. Mit `git stash`
nachgemessen (ohne meine Aenderung: 0 Fehler), also nicht angepasst,
sondern gerechnet: jede Zahl kommt jetzt aus den Testdaten darueber.

Zwei eigene Pruefungsfehler dabei behoben: ein falscher Umschalter-
Selektor liess `every()` auf einem leeren Feld laufen (gruen ohne
Daten), und die Sichtbarkeit der zweiten Zeile wurde ueber
`textContent` gemessen -- das liefert auch, was `display: none`
ausblendet.

Gruen: kalender, sprung, namen, css-klassen, struktur.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 22:48:38 +02:00
DogFatherGitandClaude Opus 5 e3e015bca4 Kopfleiste: ein Name, der zweimal vergeben war
Filipe zu einem Bildschirmfoto: "was soll das jetzt, wieso sieht das in
gewissen seiten so scheisse aus?!"

Der Teilen-Knopf stand doppelt so hoch wie seine Nachbarn, mit dem
Zeichen UEBER dem Wort statt daneben. Es war kein Gestaltungsfehler,
sondern ein Name: `.teilen` gab es ZWEIMAL --

  gate.css      Knopf der Kopfleiste   inline-flex, waagerecht
  bereich.css   Layout der Teilen-Seite  flex column, 22px, 44rem

Auf den drei Seiten, die beide Dateien laden (bereich, bewerben,
teilen), gewann die spaeter geladene. Der Knopf bekam das Layout einer
ganzen Seite. "Gewisse Seiten" war exakt richtig beobachtet.

DERSELBE NAME KOSTETE AUSSERDEM DEN KNOPF: kopf.js baut ihn nur ein,
wenn `getElementById('teilen')` nichts findet -- ein Schutz gegen
doppelten Einbau. Auf teilen.html steht `<section id="teilen">` aber
schon im HTML. Dort fehlte der Knopf ganz, ohne Spur, ohne Meldung.

REPARIERT ALS REGEL, NICHT ALS EINZELFALL:
  - Was kopf.js in die Leiste haengt, traegt jetzt `kopf-` davor
    (kopf-teilen, kopf-sicht-wahl, kopf-sicht-feld, kopf-fremd-band).
    Eine Seite darf dann heissen wie sie will -- auch "teilen", "chat"
    oder "suchen", und genau diese Woerter braucht als naechstes eine
    Seite.
  - Die Teilen-Seite bekommt eigene Klassennamen (tl-*).

NEU: server/pruef-namen.mjs (12 Pruefungen, ohne Server, <1 s).
Es ist der ZWEITE Namenskonflikt an einem Tag -- der erste war
`.t-schritt` auf der Talente-Seite, gefunden nur durch Zaehlen im
Browser. Beide waren gruen in jeder bestehenden Prueflinie.
Gemessen, um den Schnitt zu finden, der etwas taugt:
  2872 Klasse in zwei geladenen Dateien erwaehnt      -> Rauschen
  1887 davon mit eigener Blockdefinition              -> Rauschen
    12 davon mit widersprechendem `display`
     6 davon ohne `display: none`                     -> geprueft
Mit Gegenprobe, die aus den Dateien ABGELEITET wird (die erste, fest
abgeschriebene Fassung fand nichts, weil die gewaehlte Klasse dort gar
kein `display` setzt -- eine Gegenprobe, die selbst danebenliegt,
beweist nichts).

pruef-kopf-messen: 3 -> 16 Messungen, und drei eigene Fehler behoben,
die alle dieselbe Form hatten -- zu frueh hingesehen:
  1. Sie mass NUR uebersicht.html. Die laedt bereich.css nicht und war
     fuer diesen Fehler blind.
  2. Sie mass nur 320/390/430px. Unter 720px versteckt gate.css das
     Wort "Teilen"; der Knopf bleibt klein, auch falsch angeordnet.
     Filipes Bild war 1366px breit.
  3. Sie wartete 300ms. kopf.js haengt Teile erst nach `/api/ich` ein
     und hat ein Netz bei 1200ms. Zweiter Versuch: warten, bis `#wer`
     Text hat -- SOFORT wahr, dort steht `…` als Platzhalter. Dritter:
     auf Stabilitaet warten -- nach 0ms und 500ms gleich gross, also
     "fertig". Erst die Mindestwartezeit (1200 aus kopf.js plus Luft)
     davor machte die Messung echt.
Bewiesen an der Gegenprobe: mit dem alten Fehler meldet sie jetzt
"kopf-teilen ist 77px -- die anderen im Schnitt 43px", vorher blieb sie
gruen.

Statt einer festen Hoehe wird gefragt, ob EIN Teil aus der Reihe faellt
(> 1,6x der Schnitt seiner Nachbarn). Das waechst mit, wenn die Leiste
groesser wird, und muss bei keinem neuen Knopf nachgezogen werden.

Gruen: namen, kopf-messen, sicht, css-klassen, struktur.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 18:59:19 +02:00
DogFatherGitandClaude Opus 5 e54c6829f1 Talente: der Trichter bekommt einen Ausgang
Gemessen vor dem Bau: talentNaechste kettet aufgefallen -> beobachtet ->
angesprochen -> probe -> imteam, und danach kommt nichts. Eine Suche nach
"beenden|abgesagt|verworfen|archiv" in workspace-entwicklung.js fand
nichts. Der Trichter hatte genau einen Ausgang -- obwohl der Text der
Probe-Stufe woertlich verspricht: "Nach 30 Tagen: uebernehmen -- der
Zugang entsteht dabei -- oder sauber beenden."

Wer nicht passte, blieb also auf seiner Stufe stehen, mit wachsender
Standzeit und rotem "liegt"-Zeichen. Nach einem Jahr hat die Liste mehr
Karteileichen als Kandidaten, und dann schaut niemand mehr hin.

DREI SPALTEN, KEINE NEUE STUFE. Eine neue Stufe haette einen
CHECK-Umbau auf laufenden Daten verlangt -- und eine Auskunft zerstoert:
Die Stufe haelt fest, WO es geendet hat. "Beendet in der Probe" und
"beendet nach dem ersten Hinsehen" sind zwei verschiedene Saetze, und
genau der Unterschied ist die Frage, wenn dieselbe Person in einem
halben Jahr wieder auffaellt.

DER SATZ IST PFLICHT (10 Zeichen, wie beim Ablehnen einer Anfrage) --
aus zwei Richtungen: Nach vorn, weil beim zweiten Anlauf niemand mehr
weiss, was damals war. Nach innen, weil wer schreiben muss, anders
entscheidet als wer klickt. "Passt nicht" hat neun Zeichen.

WIEDER AUFNEHMEN setzt auf "aufgefallen" zurueck -- Menschen aendern
sich, ein Urteil von damals gilt nicht weiter -- und rettet den alten
Satz in die Notiz, statt ihn zu loeschen.

AM BILDSCHIRMFOTO GEFUNDEN, nicht an einer Zahl: Auf einer Karte auf
"Im Team" stand "Nichts mehr zu tun -- der Zugang steht" und direkt
darunter "Passt doch nicht?". Ein Beenden dort haette die Karte
stillgelegt und den ZUGANG offengelassen -- eine halbe Handlung, die
sich wie eine ganze anfuehlt. Jetzt steht dort der Weg zu "Personen &
Zugaenge", und der Server weist es mit 409 ab.

pruef-nachwuchs 152 -> 200, davon 21 im echten Browser (der erste
Browserblick auf diese Seite ueberhaupt -- mit einer Messung, ob Name
und Datum bei 390 px uebereinanderliegen, statt einer Zahl im CSS).
Sechs Gegenproben, jede genau auf ihr Ziel:
  Grenze auf 0          -> 3 rot
  Beendete bleiben drin -> 2 rot
  beendete: []          -> 5 rot
  alter Grund verworfen -> 1 rot
  Serverriegel imteam   -> 5 rot
  Browserzweig imteam   -> 3 rot
Dazu gruen: css-klassen, struktur, entwicklung, uebergang.

Nebenbefund behoben: absage() im Browser warf einen erklaerenden Satz
des Servers lautlos weg und zeigte "Ging nicht." -- die Auskunft war da.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 18:39:06 +02:00
DogFatherGit 3a49e30aa4 Die Probezeit hat einen Inhalt -- und man sieht, wer was gesehen hat
Filipe: "wie talente bewertet werden, aufgaben bekommen, analysiert
werden von vanvan und mir, alles moegliche, wie gesagt ich will hoch
profissionel arbeiten."

WAS GEMESSEN FEHLTE

  Die Stufe "Probe" hatte eine Frist von 30 Tagen, einen Buddy, ein
  Datum -- und einen Satz: "Nach 30 Tagen: uebernehmen oder sauber
  beenden." Worauf diese Entscheidung sich gruenden soll, stand
  nirgends. Eine Probezeit ohne Inhalt ist keine Probe, sondern eine
  Wartezeit; am dreissigsten Tag entscheidet dann das Bauchgefuehl
  dessen, der zuletzt etwas gesehen hat.

  Und: `von_id` stand seit dem Bau in talent_merkmal und wurde nie
  ausgeliefert. Man sah, DASS ein Merkmal gesetzt ist -- nicht, von
  wem. Bei zwei Leuten, die unabhaengig beobachten, ist genau das die
  Auskunft.

DER PROBEPLAN

  Zwoelf Schritte in drei Phasen: mitlaufen -> selbst machen -> allein.
  Die Reihenfolge ist der Punkt (Discord empfiehlt sie so, in der
  Ausbildung heisst sie "see one, do one"). Wer die mittlere Stufe
  ueberspringt, hat am Tag 30 zwei Sorten Kandidaten, die man nicht
  unterscheiden kann.

  JEDER SCHRITT HAT EINEN ZUSTAENDIGEN -- sechs das Talent, drei der
  Buddy, drei die Leitung. Ohne diese Angabe wandern in jeder Probezeit
  dieselben drei an niemanden: Der Buddy denkt, die Leitung macht es.

  KEINE PUNKTZAHL. Am Ende stehen drei Fragen, die ein Mensch
  beantwortet; die Haken sagen nur, ob er genug gesehen hat. Und
  "entscheidbar" haengt an DREI Schritten, nicht an einer Anzahl: Wer
  nie allein gearbeitet hat und wen das Team nie beurteilt hat, ueber
  den weiss man nichts, egal wie viele andere Haken stehen. Neun von
  zwoelf reichen nicht, drei genuegen -- wenn es die richtigen sind.

WAS DAS HINSEHEN GEFUNDEN HAT

  `.t-schritt` gibt es auf dieser Seite schon -- es ist die Zeile mit
  dem naechsten Schritt der Trichterstufe. Meine Regeln standen
  SPAETER in derselben Datei und haetten sie ueberschrieben. Gefunden
  hat das keine Ueberlegung, sondern das Nachzaehlen im Browser: 13
  Elemente mit `.t-schritt`, obwohl der Plan zwoelf hat.

ZWEI PRUEFUNGEN WAREN SCHON VORHER ROT (gemessen mit git stash)

  pruef-schritt (6 rot) und pruef-befinden (4 rot) -- seit den
  Erweiterungen von heute frueh: aus sechs Befinden-Fragen wurden
  zwoelf, aus vier Kategorien sechs, und die Personenkachel zaehlt seit
  heute in Kaesten statt in einem Satz. Die Zahlen standen als feste
  Werte in den Pruefdateien.

  Nicht die Zahlen angepasst, sondern ABGELEITET: aus
  ENTWICKLUNG_BLOECKE und ENTWICKLUNG_PUNKTE.befinden. Eine feste Zahl
  ist eine Rechnung von gestern; wer sie nachtraegt, traegt sie beim
  naechsten Mal wieder nach.

GEPRUEFT

  pruef-nachwuchs 123 -> 152. Vier Gegenproben, jede trifft ihr Ziel:
  Liste auch vor der Probe -> 1 rot, Abhaken ohne Stufenpruefung -> 7
  rot, "entscheidbar" nach Anzahl statt nach den drei -> 3 rot, Name
  nicht mitgeliefert -> 1 rot.

  Dazu gruen: schritt 65, befinden 75, entwicklung 43, uebergang,
  neue-seiten, rechtetafel, css-klassen, struktur, deutsche-texte,
  modi-wortleck.
2026-09-17 16:15:21 +02:00
DogFatherGit 470c65a46b Anfragen fuer Modi: ein Fragebogen, vier Wege, eine Bruecke
Filipe, mit dem Bildschirmfoto des Bretts "Mitmachen": "ich will dass
die leute sich da anonym bei mir melden koennen ... wie ein fragebogen
wieso die person modi werden will warum sie sollte, positiv negative
sachen ... und dan soll ich annehmen ablehnen, in warteschlange stellen
oder sofort kommunizieren koennen. und wenn ich annehme dan soll diese
person automatisch zu talente kategorie weiter geleitet werden."

Seine zwei Entscheidungen auf Rueckfrage: "Vertraulich, aber nicht
namenlos" und "Du und die rechte Hand".

WAS ES GIBT

  15 Fragen in 6 Gruppen, 9 davon Pflicht. Vier davon standen nicht auf
  seinem Zettel und kommen aus der Recherche zu Moderator-Bewerbungen:
  Alter, frühere Sperren, "ein Freund bricht die Regeln - was machst
  du?" und "was kannst du nicht so gut?". Die letzte ist die
  aussagekraeftigste: Wer darauf "nichts" schreibt, hat sich gerade
  selbst beantwortet.

  Vier Wege: Reden - Warteschlange - Annehmen - Ablehnen. "Reden" steht
  vorne, weil die haeufigste richtige Antwort auf eine Bewerbung eine
  Rueckfrage ist und keine Entscheidung; stuende "Annehmen" oben, wuerde
  es geklickt.

  "Sofort kommunizieren" ist ein Satz, den sie liest. Kein Chat: Ein
  Zugang aus der Community steht ausdruecklich in keiner Chatliste
  (AUSSEN_ROLLEN). Der Satz ist damit der einzige Weg, dieser Person
  etwas zu sagen -- deshalb ist er bei "Reden" und "Ablehnen" Pflicht,
  und WELCHE Wege ihn verlangen, steht im Katalog und nicht zweimal.

  Nach "Annehmen" entsteht ein Talent auf der Stufe "Angesprochen". Die
  ersten beiden Stufen fragen, ob ueberhaupt Interesse besteht; wer sich
  selbst meldet, hat das beantwortet.

WAS DABEI HERAUSKAM, DAS NICHT GESUCHT WAR

  aufgaben.js entschied mit `p.rolle === 'modi' || p.rolle === 'hand'`,
  wer eine Katalogaufgabe bekommen kann. Diese Datei ist ohne Anmeldung
  aus dem offenen Netz lesbar -- damit stand der verborgene Zugang darin
  nachzulesen. Jetzt entscheidet es der Server und schickt ein Ja/Nein.
  Gefunden von der Wortleck-Pruefung, nicht vom Auge.

  pruef-struktur meldete teilen.html seit heute frueh als "von nirgendwo
  verlinkt" -- und lag falsch: Auf sie zeigt `share_target.action` im
  Manifest. Die Manifeste sind jetzt Verweisquelle, nicht die eine Seite
  eine Ausnahme.

  Und im Bildschirmfoto stand der Schriftzug der Buehne mitten im Text
  einer Anfrage: `color-mix(..., transparent)` mischt mit DURCHSICHTIG.
  Deckend ist `#ffffff 6%`, so wie es .t-karte macht. Dieselbe Stelle
  hat mich heute schon einmal erwischt.

GEPRUEFT

  pruef-bewerbung 77, davon 14 im Browser. Vier Gegenproben, jede trifft
  genau ihr Ziel: Bruecke ohne "genau einmal" -> 2 rot, Vertraulichkeit
  weg -> 5 rot, Nachricht-Pflicht weg -> 2 rot, Knopf ohne Rollenfrage
  -> 1 rot.

  Dazu unveraendert gruen: rollen 315, modi-verborgen 80, modi-katalog
  49, entwicklung 43, treff, bereiche-lesend, haus-seiten, alle-wege,
  rechtetafel, css-klassen, struktur, deutsche-texte, start-ansicht,
  sicht, aufgabenbrett, womit, kanaele.
2026-09-17 15:58:28 +02:00
DogFatherGitandClaude Opus 5 a0d9dc38e4 Teilen -> Workspace: aus fuenf Schritten wird ein Tipp
SCHRITT 4 AUS DEM VIDEO-PLAN
Filipe postet ein Video auf dem Handy. Bisher: Link kopieren, App
oeffnen, Bereich suchen, Feld finden, einfuegen. Fuenf Schritte, von
denen jeder einzelne der Grund sein kann, es "spaeter" zu machen -- und
spaeter heisst nie.

Jetzt: in TikTok auf "Teilen", DogFather waehlen, uebernehmen. Die neue
Seite workspace/teilen.html ist das Ziel dieses Tipps, eingetragen als
share_target in beiden Manifesten.

DER STOLPERSTEIN, DEN JEDE ANLEITUNG VERSCHWEIGT
Das Teilen-Ziel kennt drei Felder: title, text, url. Man baut es, testet
mit "?url=https://…" und ist fertig.

IM ECHTEN LEBEN KOMMT DER LINK IN `text`. Android-Apps -- TikTok
eingeschlossen -- teilen als reinen Text: "Sieh dir das an!
https://vm.tiktok.com/xyz/" steht dann in `text`, und `url` ist leer.
Wer nur `url` liest, hat eine Seite gebaut, die im Test funktioniert und
auf dem Handy eine leere Maske zeigt. Gesucht wird deshalb in allen drei
Feldern nach einem MUSTER, nicht nach einem Feldnamen -- und ein
Satzzeichen am Ende gehoert nicht zur Adresse.

SIE TRAEGT NICHT VON SELBST EIN. Die Seite kann nicht wissen, ob der
Griff in die Tasche gemeint war. Ein Video, das ungefragt in den
Highlights landet, muss jemand wieder loeschen -- das ist mehr Arbeit
als ein Tipp auf "Uebernehmen". Und wohin ist eine Frage, keine
Annahme: Highlights sind vorausgewaehlt, Treff und Anschlagbrett
stehen daneben.

GET UND NICHT POST. POST braeuchte einen Service Worker, der die
Anfrage abfaengt -- eine Stelle mehr, die kaputtgehen kann, und zwar
genau die unsichtbare: Man tippt auf Teilen und landet auf einer leeren
Seite. Hier wird nur ein Link geteilt, keine Datei.

GESEHEN, NICHT NUR GEZAEHLT
Das Bildschirmfoto auf 390 px zeigte einen Mangel, den keine Zahl
gemeldet haette: Das gewaehlte Ziel hob sich nur ueber Helligkeit ab.
Bei einer echten Wahl ist das zu wenig, und wer Farben schlecht
unterscheidet, sieht gar nichts. Jetzt: farbiger Streifen links,
deutlicherer Grund -- und ein HAKEN, der ohne jede Farbwahrnehmung
funktioniert.

EIN SICHERHEITSFUND NEBENBEI -- UND ER IST DER WICHTIGERE
pruef-alle-wege meldete: Von 126 schreibenden Wegen hatte genau EINER
keine Herkunftspruefung.

    POST /workspace/api/aufbewahrung/jetzt  ->  200

Eine beliebige fremde Seite kann im Browser eines angemeldeten
DogFather ein Formular dorthin abschicken; der Browser gibt das
Sitzungsplaetzchen mit, der Server fuehrt aus. Und ausgerechnet dieser
Weg: aufbewahrungLauf() LOESCHT abgelaufene Daten. Ein Aufruf zur
falschen Zeit loescht wirklich etwas, und im Protokoll sieht es aus,
als haette DogFather es selbst angestossen.

Die anderen 125 Wege hatten den Riegel -- dieser eine wurde beim
Hinzufuegen uebersehen. Genau dafuer geht die Pruefung ALLE Wege durch,
statt einer Liste zu glauben. Behoben, danach: "kein schreibender Weg
nimmt eine fremde Herkunft an".

DIE PRUEFUNG (server/pruef-teilen.mjs, 27 Pruefungen)
Auf 390 px gemessen -- diese Seite wird fast nur dort geoeffnet, eine
Messung auf 1400 px misst etwas, das niemand sieht. Geprueft wird der
Satz mit Link darin, das Satzzeichen am Ende, der Fall ohne Link
(Feld zum Einfuegen statt Fehlermeldung), das Eintragen, die Dublette,
das zweite Brett -- und dass share_target in BEIDEN Manifesten steht.
Ohne den Eintrag erscheint der Workspace gar nicht erst im Teilen-Menue,
und die ganze Seite waere unerreichbar, ohne dass eine der anderen
26 Pruefungen es merkt.

GEGENPROBE: nur `url` lesen statt aller drei Felder -- also genau die
naheliegende Fassung, die im Test funktioniert und auf dem Handy
versagt -> 8 Pruefungen rot.

Stempel 202609171416.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 14:17:16 +02:00
DogFatherGitandClaude Opus 5 d69eb34448 Die Kanalzeile -- und der Kasten, der auf dem Chili-Motiv stand
SCHRITT 3 AUS DEM VIDEO-PLAN: DIE KANALZEILE
Filipe: "fuer meinen Account, dogfather, dann dogfather clips und
hasidog." Sobald Videos aus drei Kanaelen nebeneinander liegen, ist die
erste Frage nicht "welche Art", sondern "von welchem Kanal".

ALS ZWEITE DIMENSION, nicht als weiterer Wert in derselben Leiste. Der
vorhandene Filter ist EIN Wert (Alle / Nur offene / die Arten); wer den
Kanal dort hineinpresst, kann "nur offene Clips von HasiDog" nicht mehr
fragen. Zwei getrennte Reihen zeigen ausserdem, dass es zwei Fragen
sind -- in einer Zeile klickt man das zweite und wundert sich, warum
das erste wieder aus ist.

SIE ERSCHEINT NUR AB ZWEI KANAELEN, und die Kanaele werden aus den
vorhandenen Eintraegen abgeleitet statt aufgezaehlt. Auf einem Brett
ohne Videos steht keine leere Leiste; bei einem Kanal steht kein
Filter, der nichts tut. Ein Knopf, bei dem nichts passiert, kostet das
Vertrauen in den naechsten.

Die drei Toene sind dieselben wie am Zeichen auf der Karte -- wer
"DogFather Clips" in Tuerkis filtert, findet darunter Karten mit
tuerkisem Zeichen. Ungewaehlt bleiben sie gedeckt: drei bunte Knoepfe
nebeneinander waeren eine Ampel, und eine Ampel sagt "gut/schlecht",
wo nur "welcher Kanal" gemeint ist.

DER KASTEN, DER AUF DEM CHILI-MOTIV STAND
Der leere Zustand der Talente-Seite von heute Vormittag hatte nur einen
gestrichelten Rand. Solange dort EIN Satz stand, ging das; jetzt stehen
dort drei Absaetze, fuenf Merkmale und zwei Knoepfe -- und das
Spicy-Media-Motiv mit Chilischoten und Neonlicht schien voll durch den
Text. Lesbar war das nicht, augenschonend erst recht nicht.

DIE WARNUNG STAND 70 ZEILEN WEITER UNTEN in derselben Datei, bei
.t-fuss, und beschreibt exakt diesen Fehler ("Sie stand als einziger
Text der Seite direkt auf der Buehne"). Ich habe sie gelesen und bin
trotzdem hineingelaufen. Ein Kommentar, der vor einem Fehler warnt,
verhindert ihn nicht -- gefunden hat es erst das Bildschirmfoto.

GESEHEN STATT GEZAEHLT (server/bild-stufen.mjs)
Stufenleiter und Talente-Seite waren heute Vormittag nur an Zahlen
geprueft. Das Bild zeigte: die Leiste sitzt sauber in einer Zeile
(1400 px) und in vier auf 412 px, nichts laeuft ueber den Rand, keine
Konsolenfehler -- und den Kasten ohne Grund.

DIE PRUEFUNG (server/pruef-kanalzeile.mjs, 14 Pruefungen)
Sie prueft nicht nur, DASS gefiltert wird, sondern dass das Richtige
uebrig bleibt: "weniger" allein waere auch erfuellt, wenn der Filter
irgendetwas wegwirft. Dazu der zweite Klick (hebt auf) und Abschnitt 4:
Kanal UND Art zusammen -- der eigentliche Grund fuer zwei Reihen.

ZWEI GEGENPROBEN:
  a) Kanalfilter ausgebaut       -> 3 Pruefungen rot
  b) Zeile immer anzeigen        -> 1 rot, genau der Ein-Kanal-Fall

UND ZWEI FEHLER IN DER PRUEFUNG SELBST, beide von mir:
  * Der Kartenselektor traf nichts, und die Messung meldete "0 -> 0".
    Das sah aus wie ein Ergebnis und war keins.
  * Beim Berichtigen machte String.replace aus "$$" ein "$" --
    seite.$$() wurde zu seite.$(). Der Fehler steht woertlich in den
    Hausregeln und hat trotzdem zugeschlagen. Aufgefallen ist er nur,
    weil "undefined" in der Ausgabe stand; "0" waere durchgegangen.
  * Und eine verlorene Escaping-Ebene machte aus /\s+/ ein /s+/ --
    die Pruefung ersetzte jedes "s" durch ein Leerzeichen und las
    "Ca per chläft im Wä chekorb". Sie wurde rot, und das war richtig.

Stempel 202609171407.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 14:08:15 +02:00
DogFatherGitandClaude Opus 5 8f0a184b9f Was DogFather eintraegt, sehen jetzt auch die anderen -- und 113 fertige Inhalte
Vier Bildschirmfotos, vier Auftraege. Vor dem Bauen gemessen
(server/mess-sichtbarkeit.mjs): alle Bereiche, alle vier Rollen.

ZWEI FEHLER, DIE NIEMAND GEMELDET HAETTE
Beide sahen auf DogFathers eigenem Bildschirm vollkommen richtig aus --
und das ist das Tueckische: Ein leeres Brett sieht nicht nach Fehler
aus, sondern nach "da ist eben noch nichts".

1. DIE FREIGABE. "Was ansteht" und "Highlights" zeigen der Community
   nur, was freigegeben ist. Ein aus dem Vorschlagskasten uebernommener
   Eintrag hatte keine Freigabe. Gemessen:

       Brett      DogFather  rechte Hand  Modi  Community
       ansteht        4           4         4        0
       highlight      3           3         3        0

   Filipe konnte fuellen, so viel er wollte -- fuer die Community
   blieben genau die zwei Bretter leer, auf die es ankommt. Wer aus dem
   Team uebernimmt, gibt jetzt zugleich frei: Die Freigabe fragt "hat
   das Team diesen Text gesehen?", und die Antwort ist beim Uebernehmen
   ja. Eine zweite Entscheidung daneben waere keine Sicherheit, sondern
   ein Klick.

2. TEAM_DOGI_ROLLEN IST {hand, modi} -- OHNE "admin". Die
   Sichtbarkeitsregel fuer Team Dogi lautete damit woertlich "Eintraege
   von hand oder modi". Folge: ALLES, was DogFather in Live, Technik,
   Community, Ideen, Angebote oder Rueckmeldung schreibt, war fuer sein
   eigenes Team unsichtbar. Das ist nicht erst seit dem Startkatalog so
   -- der hat es nur sichtbar gemacht, weil vorher ueberall Null stand
   und Null gleich Null aussieht, egal aus welchem Grund.

   Die Liste wird genau dort erweitert, wo es um Sichtbarkeit geht --
   NICHT in TEAM_DOGI_ROLLEN selbst: Diese Menge entscheidet auch,
   welches Haus jemand bewohnt. Ein Eintrag dort haette DogFather
   stillschweigend zur Crew umgezogen.

113 FERTIGE INHALTE IN DEN LEEREN KATEGORIEN
Gemessen waren elf Bereiche ausserhalb des Treffs komplett leer -- fuer
JEDE Rolle. Der Startkatalog kannte nur die sieben Treff-Bretter; die
Oberflaeche war die ganze Zeit bereit, es fehlten nur die Texte.
workspace-arbeit-start.js fuellt neun davon: Live, Content, Technik,
Community, Schutz, Ideen, Rueckmeldung, Angebote, Agentur.

"talente" und "entwicklung" bekommen ABSICHTLICH nichts: Dort waere ein
"fertiger Inhalt" ein erfundener Mensch -- ein Testdatensatz in einem
System, das echte Menschen bewertet. Die Talente-Seite bekommt ihre
Hilfe anders (siehe unten).

DER ENTWICKLUNGSKATALOG: 28 -> 68 PUNKTE, VIERTE STUFE
Filipe: "wieso ist da immer noch nicht perfektionniert wie bei den
anderen mit fortgeschritten und so, und VIIIIIEEEELLLLLL mehr aufgaben."
  * Neue Stufe "Fortgeschritten" zwischen "nach ein paar Monaten" und
    "wofuer man jemanden fragt" -- genau die Mitte fehlte.
  * Stufenleiter als FILTER ueber den Kategorien, wie die Checkliste es
    seit dem 10.09. vormacht. Aus r.erwartung gebaut, nicht aufgezaehlt.
  * Zwei neue Bloecke, die Filipe ausdruecklich wollte: "Clips, Schnitt
    und Kommentare" und "Waehrend der Stream laeuft" -- seine
    Wunschkategorien vom 17.09. ("videos schneide, kommentieren,
    markierungen").
  * Keine Note, keine Punktzahl, keine Rangliste. Unveraendert.

DAS BEFINDEN: 6 -> 12 FRAGEN, UND SIE MELDET SICH VON SELBST
Den 14-Tage-Rhythmus gab es schon -- er wirkte aber nur, WENN jemand die
Seite aufmachte. Wer sie vergisst, wurde nie wieder gefragt: Das war
eine Anzeige, keine Anfrage. Jetzt kommt sie ueber dasselbe Push-System
wie faellige Aufgaben, hoechstens einmal je sieben Tage, und sie fragt
rhythmus() aus workspace-befinden.js -- dieselbe Funktion wie die Seite,
keine zweite Formel daneben.
Sechs neue Fragen zu Erholung, Sinn, Klarheit, Anfeindung, Entwicklung
und dem Blick nach vorn, jede mit ihrer Einordnung.
Und an acht Stellen stand "sechs Fragen" ueber zwoelf Fragen -- wo ein
Skript den Text baut, wird jetzt gezaehlt; in den festen Seiten steht
gar keine Zahl mehr.

DIE TALENTE-SEITE, WENN NIEMAND DARAUF STEHT
Statt "Noch niemand auf der Liste" stehen dort jetzt die fuenf Gruppen
mit ihren 21 Anzeichen -- die gab es laengst, sie waren auf der leeren
Seite nur nie zu sehen. Dazu der Weg in beide Richtungen: woher ein
Talent kommt (der Treff) und wo es endet (die Entwicklung).

DIE PRUEFUNG (server/pruef-alle-sehen-es.mjs, 42 Pruefungen)
Sie prueft BEIDE Haelften von Filipes Satz. Nur zu zaehlen, ob alle
alles sehen, waere gruen, wenn man saemtliche Schranken entfernte --
Abschnitt 4 belegt, dass 19 Bereich-Rollen-Paare zu bleiben und die
Community an keinen der elf Arbeitsbereiche kommt.

ZWEI GEGENPROBEN, weil 42 von 42 im ersten Lauf kein Beweis ist:
  a) "admin" aus der Team-Sicht entfernen  -> 13 Pruefungen rot
  b) Freigabe beim Uebernehmen abschalten  ->  2 rot, genau ansteht
     und highlight
Jede trifft ihr Ziel und nicht alles.

UND EINE LUECKE IN EINER ALTEN PRUEFUNG
pruef-deutsche-texte war gruen -- und hatte die 113 neuen Texte, die 40
neuen Entwicklungspunkte und die 6 neuen Fragen nie gesehen: Sie stehen
in Dateien, die sie nicht kannte. Jetzt 391 statt 174 geprueften
Texten. (Meine erste Untergrenze stand auf 400 und war sofort rot --
geraten statt gemessen.)

Stempel 202609171318.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 13:18:45 +02:00
DogFatherGitandClaude Opus 5 f05783ebc8 Link einfuegen, Video steht in der App -- Stufe A des Video-Plans
Filipe: "damit meine videos auch da auf der app rein kommen ... sobald
ich ein video poste erscheint es sofort in der app fuer die ganze
community ... dass man das Coverbild und den Text sieht ... fuer meinen
Account, dann DogFather Clips und HasiDog."

Der Weg, der HEUTE funktioniert -- ohne Freigabe, ohne Geheimnis, ohne
Wartezeit: Adresse einfuegen, alles andere geht von allein.

  Link -> oEmbed (Titel, Cover-Adresse, Account)
       -> Cover HERUNTERLADEN und bei uns ablegen
       -> Eintrag mit Bild, Text und Knopf zum Video

DAS COVER WIRD KOPIERT, NICHT VERLINKT -- der wichtigste Satz.
TikToks Bildadresse ist signiert und laeuft ab. Heute an einem echten
Video nachgemessen: x-expires = 1789812000, also in 48 Stunden. Wer sie
nur speichert, hat uebermorgen schwarze Kacheln. Beim Bauen merkt man
das nicht und beim Testen auch nicht -- es faellt erst am uebernaechsten
Tag auf, und dann sieht die ganze App kaputt aus.

Deshalb wandert das Bild in dieselbe Ablage wie jeder Anhang und geht
durch dieselbe Bytepruefung. Ein heruntergeladenes Cover ist eine
FREMDE Datei; dass der Typ hier von einem fremden Server behauptet wird
statt vom eigenen Browser, macht ihn nicht glaubwuerdiger.

NUR SEINE EIGENEN KANAELE. Der Account aus der Antwort wird gegen
KANAELE geprueft (kanalVonHandle). Genommen wird author_url (.../@name),
nicht author_name -- der Anzeigename aendert sich, wenn jemand ihn
umstellt. Ein fremdes Video in Filipes Highlights waere nicht bloss
falsch einsortiert, es waere fremder Inhalt unter seinem Namen: 403.

DIE PRUEFUNG SCHALTET TIKTOK AB (server/pruef-video.mjs, 37 Pruefungen)
Ein nachgebauter Dienst auf 127.0.0.1 antwortet wie TikTok, mitsamt
Ablaufstempel. Im letzten Abschnitt wird er ABGESCHALTET. Danach muss
die alte Cover-Adresse ins Leere laufen und unsere weiterhin ein Bild
liefern -- beides wird gemessen, nebeneinander. Waere das Bild nur
verlinkt, waeren beide tot, genau wie uebermorgen im Betrieb.

Die Adresse des Dienstes kommt aus TIKTOK_OEMBED_BASIS. Steht sie nicht
da, gilt TikTok -- kein Verhalten, das sich still aendert. Eine
Pruefung, die das echte TikTok braucht, misst fremde Verfuegbarkeit
statt unseren Code und wird irgendwann rot, ohne dass etwas kaputt ist.

VIER GEGENPROBEN, weil 37 von 37 im ersten Lauf kein Beweis ist:
  a) Cover nicht mehr kopieren      -> 9 Pruefungen rot
  b) author_name statt author_url   -> 22 rot
  c) Bytepruefung entfernen         -> 2 rot (genau Abschnitt 5)
  d) Dublettenpruefung entfernen    -> 4 rot (genau Abschnitt 4)
Jede schlaegt dort an, wo sie soll. Und eine fuenfte Gegenprobe ist ins
Leere gelaufen: Der Patch lief ueber python3, das es hier nicht gibt --
die Datei blieb unveraendert und der Lauf war gruen. Haette ich die
Ausgabe nicht gelesen, haette ich behauptet, die Pruefung koenne rot
werden, ohne sie je rot gesehen zu haben. Der dritte Ausgang, an mir
selbst.

DAZU:
- eintraege.quelle_url / quelle_kanal / quelle_geholt_am (Umstellung)
- KANAELE bekommt handle, dazu kanalVonHandle()
- videoRouter steht VOR bereicheRouter, sonst schluckt /:bereich ihn
- Eingabefeld und Kanal-Knopf in bereich.html/.js, Farben wie bei den
  Aufgaben-Kanaelen
- Stempel 202609171249

Nicht darin: die Kanal-Filterzeile in der Galerie, die Handy-Verknuepfung
(Teilen -> Workspace) und der Zustand "nicht mehr da" fuer geloeschte
Videos. Stufe B (Display API) braucht Filipes Entwickler-Freigabe.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 12:50:42 +02:00
DogFatherGitandClaude Opus 5 79e675b846 Stufe 6 und 7: Der Treff wird ein Gespraech, jedes Brett bekommt seine Form
Damit sind alle acht Stufen des Plans gebaut.

STUFE 6 -- DAS GESPRAECH
"Der Treff -- Hallo sagen, fragen, loben" war eine Liste aus Karten.
Der einzige Bereich, in dem Menschen MITEINANDER reden sollen, zwang
sie, nebeneinander zu reden: Jeder schrieb eine eigene Karte, niemand
antwortete jemandem.

Jetzt: Antworten eingerueckt unter ihrem Beitrag, aelteste zuerst (so
liest man ein Gespraech), mit Namen und Rolle. Das Feld steht immer da
statt hinter einem "Antworten"-Knopf -- ein leeres Feld ist die
deutlichste Einladung, die es gibt. Nur EINE Stufe eingerueckt: Auf
390 px ist bei der zweiten Schluss.

Eine EIGENE Tabelle, kein Eintrag mit "antwort_auf": Eine Antwort hat
keine Art, keinen Zustand, keine Frist und gehoert in keinen Filter.
Als Eintrag gefuehrt haette sie zwanzig immer leere Spalten -- und
tauchte in jeder Zaehlung auf, die Beitraege zaehlt.

Und nicht ueberall: nur Treff und Wunschliste. Aus dem Plan, §9 -- ein
Antwortfeld unter jedem Aushang hiesse, jeder Aushang muss betreut
werden.

ZWEI FEHLER, BEIDE VON DER PRUEFUNG GEFUNDEN

1. EIN PFAD, DER AUSSAH WIE EIN BEREICH.
   `/api/bereich/antwort/:id` lief in die Middleware auf
   `/api/bereich/:bereich` -- "antwort" ist kein Bereich. Fuer
   DogFather ging es (ein frueherer Zweig liess ihn durch), fuer einen
   Modi kam 404. Ein Weg, der je nach ROLLE an voellig anderer Stelle
   scheitert, sucht man lange. Liegt jetzt unter `/api/antwort/:id`.

2. UND EIN ECHTES LOCH.
   Die Loeschregel hiess `!darfSchreiben(req.person, "treff")` -- also
   "wer schreiben darf", und das duerfen Gaeste ab der Stufe "dabei".
   JEDER GAST HAETTE JEDE FREMDE ANTWORT LOESCHEN KOENNEN.

   Gefunden hat es eine Pruefung mit einer FALSCHEN Erwartung: Sie
   verlangte, dass ein Modi keine fremde Antwort loeschen kann. Das war
   falsch -- er moderiert ja --, aber der Weg dorthin hat das echte
   Problem freigelegt. Jetzt entscheidet TREFF_TEAM_ROLLEN.

   Der Gast-Fall ist ueber HTTP nicht messbar (er kommt nur ueber die
   crew-Adresse herein, und den Host-Kopf kann fetch nicht setzen).
   Statt stillschweigend zu ueberspringen prueft die Pruefung die REGEL
   selbst -- und dass die Route wirklich diese Menge benutzt.

STUFE 7 -- JEDES BRETT BEKOMMT SEINE FORM
- "Regeln & Hilfe" ist ein DOKUMENT: Sprungmarken oben, vier
  Abschnitte (Regel, Was passiert wenn, Hilfe, Haeufige Frage). Man
  schlaegt es im Streitfall auf und will FINDEN, nicht scrollen.
  scroll-margin-top, sonst verschwindet die angesprungene Ueberschrift
  unter der Kopfleiste und der Sprung sieht aus wie ins Leere.
- "Anschlagbrett" zeigt grosse AUSHAENGE statt Zeilen -- gemessen
  21 px Titel statt 17. Ein Aushang zwischen dreissig anderen ist kein
  Aushang.
- "Mitmachen" gruppiert nach Art, die drei Schritte zuerst.

UND EINE SCHRIFT, DIE ZU KLEIN WAR: Die Rollen-Marke an einer Antwort
stand auf 11,2 px, die Hausgrenze liegt bei 11,5. Die Grenze anzuheben
waere der bequeme Weg gewesen -- und ab da haette pruef-css-klassen
nichts mehr gehalten.

NEU: pruef-gespraech (27 Pruefungen)
pruef-treff-start jetzt 34 (Stufe 7 mitgeprueft)
Alle Community-Pruefungen gruen: gespraech 27, treff-start 34,
kreislauf 23, countdown 22, wunschliste 30, galerie 26, bremse 16,
treff 66, bereiche-lesend, css-klassen, deutsche-texte 12.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 12:12:21 +02:00
DogFatherGitandClaude Opus 5 b396e548ab Stufe 8: Der Kreislauf -- ein Wunsch kommt als Clip zurueck
Bisher waren die acht Bretter acht Silos. Ein Wunsch wurde angenommen,
irgendwann passierte etwas im Stream, irgendwann lag ein Clip bei den
Highlights -- und nichts davon wusste voneinander. Wer den Wunsch
geschrieben hatte, erfuhr NIE, dass er erfuellt wurde.

    Wunsch  ->  Termin bei "Was ansteht"  ->  Clip bei "Highlights"

Das ist der Unterschied zwischen einem Briefkasten und einer Community.
Jemand schreibt einen Wunsch und sieht ihn vier Wochen spaeter als Clip
wieder -- mit seinem Namen daneben.

ZUM DRITTEN MAL LAG DER PLAN DANEBEN. Dort stand "`aus_eintrag_id`
gibt es in der Tabelle bereits". Gibt es -- an den AUFGABEN. Die
Eintraege hatten nichts dergleichen. Dreimal an einem Tag, und jedes
Mal hat es das Messen gefunden, nicht das Nachdenken.

EINE HANDLUNG, KEIN AUSWAHLFELD. Der Zusammenhang entsteht durch
"daraus wird ein Termin" -- als Knopf an dem Wunsch, um den es geht.
Wer ein Formular ausfuellt, denkt nicht an den Wunsch von letzter
Woche, und ein Auswahlfeld mit vierzig Eintraegen benutzt niemand.

Die Kette steht auf beiden Karten: "Aus Wunschliste: ... von Lena"
(ruhig, es ist Herkunft) und "Daraus wurde: Highlights ..." (gruen, das
ist die Nachricht, auf die jemand gewartet hat).

ON DELETE SET NULL, nicht CASCADE: Wird der Wunsch geloescht, bleibt
der Clip. Er ist ja trotzdem passiert.

UND DIE PRUEFUNG VON STUFE 2 HAT STUFE 5 ERWISCHT.
Der Startkatalog stand ueber dem Countdown und schob die Antwort auf
"wann ist der naechste Stream" von 458 px auf 1488 px -- aus dem
ersten Handybildschirm heraus. Gefunden hat das nicht das Auge,
sondern das Abnahmekriterium aus §7 des Plans, das seit heute Vormittag
in pruef-countdown steht.

  DIE REGEL DARAUS: Ein WERKZEUG (fuer das Team) draengt nie eine
  ANTWORT (fuer alle) nach unten.

Der Countdown steht jetzt ganz oben, noch vor den Filtern -- gemessen
342 px statt 458.

NEU: pruef-kreislauf (23 Pruefungen)
Lena schreibt einen Wunsch, daraus wird ein Termin, daraus ein
Highlight. Geprueft: Der Titel wandert mit, der NAME wandert mit, beide
Enden sehen die Kette, Lena sieht sie auch (ein Kreislauf, den nur das
Team sieht, ist keiner), zweimal derselbe Weg verdoppelt nichts -- und
die Gegenprobe, dass ein ANDERER Weg vom selben Wunsch sehr wohl geht.

Und wohin sie NICHT fuehrt: nicht in die Content-Planung eines
Creators. Dort steht Arbeit, die die Community nichts angeht.

pruef-countdown 22, pruef-treff-start 27, pruef-wunschliste 30,
pruef-galerie 26, pruef-treff 66, pruef-bremse 16, pruef-css-klassen:
alle gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 11:59:17 +02:00
DogFatherGitandClaude Opus 5 7701f5e5e5 47 fertige Inhalte statt acht leerer Bretter
Filipe, mit drei Bildschirmfotos nebeneinander -- Der Treff, das
Anschlagbrett, Was ansteht, alle drei mit demselben grauen Kasten:

  "ich meine alle kategorien sehen einfach so scheisse und leer aus,
   ich will fertige sachen schon drin wo auch die community und alle
   anderen benutzen koennen"

Er hat recht, und das ist mein Fehler: Es stand in MEINEM Plan, §5.1
-- "Acht leere Seiten sind schlimmer als keine." Ich habe es
aufgeschrieben und danach fuenf Stufen lang Technik gebaut.

Dreimal derselbe Satz auf drei Bildschirmen sieht nicht nach "neu" aus,
sondern nach defekt.

WAS JETZT BEREITLIEGT (47 Eintraege)
  Regeln & Hilfe   15   das Nachschlagewerk: sechs Regeln, drei
                        Folgen-Erklaerungen, drei Hilfen, drei Fragen
  Mitmachen        11   der Weg in drei Schritten, vier Aufgabengebiete,
                        vier ehrliche Fragen ("Was habe ich davon?")
  Der Treff         6   Gespraechsanfaenge, auf die man in einem Satz
                        antworten kann
  Anschlagbrett     5   Willkommen, Ablauf, wo was hingehoert, Danke
  Wunschliste       4   Beispiele, die zeigen, wie ein guter Wunsch
                        aussieht
  Was ansteht       4   Terminvorlagen
  Highlights        2   was hier hingehoert

NICHT AUTOMATISCH BEIM START. Ein Text, den niemand gelesen hat,
stuende sonst als Ansage des Teams auf einer oeffentlichen Seite.
"Bleibt fair" klingt harmlos, bis jemand fragt, was das im Streitfall
heisst -- und dann muss dahinterstehen, WER es gemeint hat. Uebernehmen
ist eine Entscheidung; automatisch fuellen waere eine Behauptung. Und
jeder Text laesst sich vorher aendern.

ZWEI BEREICHE SIND KEIN KATALOG, SONDERN FERTIGE SEITEN: "Regeln &
Hilfe" und "Mitmachen" sind Nachschlagewerke, keine Feeds. Ein leeres
Regelwerk ist schlimmer als gar keins -- im Streitfall hat dann niemand
etwas in der Hand. Die Regeln sagen ausserdem jeweils, was PASSIERT,
nicht nur was verboten ist, und die Hilfe nennt die Telefonseelsorge.

UND JEDER BEREICH SAGT JETZT SEINEN EIGENEN SATZ, wenn er leer ist:
"Gerade gilt nichts Besonderes. Das ist eine gute Nachricht." /
"Noch hat niemand Hallo gesagt. Sei der Erste -- ein Satz reicht."

DIE FALLE, DIE ICH MIR SELBST GEBAUT HATTE: Die Bremse aus Stufe 4
zaehlt zehn Beitraege je Stunde. Wer fuenfzehn Regeln uebernimmt,
haette nach der zehnten eine halb gefuellte Seite und die Meldung, er
habe zu viel geschrieben -- genau die Sorte Sicherung, die das richtige
Verhalten bestraft und deshalb abgeschaltet wird. Das Uebernehmen ist
eine einzelne Handlung des Teams und geht nicht durch die Bremse; die
Pruefung weist beides nach.

NEU: pruef-treff-start (27 Pruefungen)
Der Katalog selbst (jede Art gibt es im Bereich, jeder Text sagt mehr
als sein Titel, kein Titel doppelt, echte Umlaute), das Uebernehmen
(einzeln, alle, zweimal verdoppelt nichts), die Verborgenheit, die
sieben verschiedenen Leertexte -- und im Browser: elf Vorschlaege,
ein Klick, elf Eintraege, Katalog verschwindet.

pruef-treff 66, pruef-bremse 16, pruef-deutsche-texte 12,
pruef-bereiche-lesend, pruef-css-klassen: gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 11:51:15 +02:00
DogFatherGitandClaude Opus 5 4b14906371 Stufe 5: Highlights als Galerie -- und ein enger Weg fuer Bilder
Aus dem Plan im Vault. "Eure Clips und Bilder" zeigte Textkarten mit
einem Anhang darunter. Ein Bild als Anhang unter einer Ueberschrift ist
kein Highlight -- dieser Bereich lebt vom Sehen. Jetzt steht das Bild
OBEN, der Text ist Bildunterschrift.

ZWEI DINGE WAREN ANDERS ALS IM PLAN

1. "Anhaenge sind schon da" stimmte nicht. Sie hingen an AUFGABEN
   (`dateien.aufgabe_id`); ein Eintrag konnte gar kein Bild tragen.
   Neue Spalte `eintrag_id`.

2. UND DER WICHTIGE, ein Sicherheitsthema: Alles in dieser Ablage geht
   bewusst als DOWNLOAD hinaus (`application/octet-stream`,
   `Content-Disposition: attachment`). Eine hochgeladene HTML- oder
   SVG-Datei wuerde sonst im Browser als Seite DIESER Domain laufen --
   mit Zugriff auf die Sitzung. Eine Galerie braucht also einen
   eigenen, engen Weg, keine Lockerung der alten Regel.

DIE FRAGE "IST DAS EIN BILD?" DARF NICHT `dateien.typ` BEANTWORTEN.
Diese Spalte traegt den vom Browser BEHAUPTETEN Typ
(`req.get("content-type")`) -- wer hochlaedt, bestimmt ihn selbst. Eine
Galerie, die ihm glaubt, liefert auf Zuruf alles inline aus. Erkannt
wird deshalb an den ERSTEN BYTES: PNG, JPEG, GIF, WEBP.

SVG IST AUSDRUECKLICH NICHT DABEI. Es ist ein Bildformat UND kann
Skript enthalten -- genau die Luecke, gegen die die Regel gebaut wurde.
Ein Format, das beides ist, gehoert nicht in die Ausnahme.

Kein Bild heisst 404, nicht 415: Eine eigene Antwort waere die Auskunft
"diese Nummer gibt es, sie ist nur kein Bild", und die laesst sich
durchzaehlen.

WESSEN REGEL GILT: Ein Bild am Community-Beitrag folgt dem BEITRAG,
nicht der Dateiablage. Deren Regel haengt an Creator-Zuordnungen, und
ein Gast hat keine -- er saehe sonst nie ein Highlight, obwohl es fuer
ihn gemacht ist.

NEU: pruef-galerie (26 Pruefungen)
Der Beweis steht in zwei Zeilen: Am Beitrag haengen VIER Dateien --
zwei echte PNGs, ein SVG und eine HTML-Datei, die sich als
"image/png" ausgibt. Im Raster stehen ZWEI. Die anderen beiden holt
der Browser, bekommt 404, und der error-Handler raeumt sie weg: kein
leerer Rahmen, kein kaputtes Symbol.

Dazu die Gegenprobe in die andere Richtung -- ein echtes PNG, das sich
als "text/plain" ausgibt, geht durch. Ohne sie hiesse "404" nur, dass
der Weg immer ablehnt. Und die Konsolenpruefung laesst genau die zwei
gewollten 404 zu und nichts sonst; ein pauschales "Konsole egal" haette
jeden echten Fehler mitversteckt.

EIN EIGENER FEHLER: Mein Test-PNG war kein dekodierbares Bild, nur ein
Dateikopf. Der Browser konnte es nicht zeichnen, der error-Handler
raeumte es weg, und die Pruefung fand im Raster nichts. Fehler in der
Pruefung, nicht im Haus -- aber ein nuetzlicher: Er hat nebenbei
gezeigt, dass ein kaputtes Bild keinen leeren Rahmen hinterlaesst.

pruef-anhaenge 37, pruef-treff 66, pruef-bereiche-lesend,
pruef-css-klassen: gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 11:43:40 +02:00
DogFatherGitandClaude Opus 5 670940bd3a Stufe 4: eine Bremse -- und eine stille Sperre, die es nicht gibt
Aus dem Plan im Vault. Diese Stufe steht dort bewusst VOR Galerie und
Gespraech: Mehr Sichtbarkeit heisst mehr Angriffsflaeche, und ein
Bereich, der waechst und keine Bremse hat, waechst genau einmal.

DER TREFF HATTE SCHON MEHR, ALS MEIN PLAN ANNAHM
Stufen (WER schreiben darf: neu, dabei, stamm) und Massnahmen (wer
NICHT MEHR darf: Hinweis, Pause, Ausschluss). Gefehlt hat die Frage
dazwischen: WIE SCHNELL. Ein Stammgast konnte in einer Minute vierzig
Beitraege absetzen -- aus Aerger, aus Versehen oder per Skript.

DIE STILLE SPERRE IST VERWORFEN -- nach einer Messung, nicht nach
einem Gefuehl. `gast` ist eine Rolle mit Zugangscode, es gibt KEINE
Selbstanmeldung. Wer ausgeschlossen wird, kann sich nicht neu
anmelden. Damit loest ein Shadowban ein Problem, das dieses System
nicht hat; er bliebe ein Werkzeug, das Menschen taeuscht, ohne etwas
zu verhindern. Steht jetzt in §9 des Plans: was wir NICHT bauen.

DIE BREMSE: 10 Beitraege je Stunde und Person, nur auf den
Community-Brettern. Keine neue Tabelle -- die Antwort steht schon in
`eintraege`, eine Zaehlung ueber die letzte Stunde genuegt. Eine eigene
Tabelle waere ein zweiter Ort fuer dieselbe Wahrheit und muesste
zusaetzlich aufgeraeumt werden.

Die Absage sagt, WANN es weitergeht ("In 37 Minuten"). Ohne Zeitangabe
probiert jemand im Minutentakt weiter -- genau die Last, die man
verhindern wollte.

MEIN ERSTER ENTWURF BREMSTE DIE FALSCHE ARBEIT: Er zaehlte ALLE
Eintraege. Eine Creatorin mit zehn Content-Ideen haette danach im Treff
nichts mehr schreiben koennen. Eine Bremse, die das richtige Verhalten
bestraft, wird abgeschaltet -- und ist ab da wirkungslos.

DIE TEAM-SICHT: "Was hereinkommt", ganz oben auf der Moderationsseite,
vor den offenen Meldungen. Eine Meldung setzt voraus, dass jemand etwas
GESEHEN hat -- und wer acht Bretter durchklicken muss, tut das nicht
achtmal am Tag. Eine Zeile je Beitrag statt einer Karte: Hier
ueberfliegt man, man liest nicht. Der Inhalt steht auf dem Brett; eine
Vorschau waere eine zweite Stelle, an der derselbe Beitrag steht.

NEU: pruef-bremse (16 Pruefungen)
Die Grenze wird aus dem Code GELESEN, nicht abgeschrieben -- sonst
misst die Pruefung beim naechsten Anpassen etwas anderes als der
Server tut. Dazu die drei Fragen: Greift sie? Trifft sie die richtige
Arbeit (Content bleibt offen, das zweite Treff-Brett nicht)? Und laesst
sie den normalen Fall in Ruhe? Gegenprobe: Beitraege auf vorgestern
zurueckdatiert -- danach muss es sofort wieder gehen.

pruef-treff 66, pruef-wunschliste 30, pruef-countdown 22,
pruef-bereiche-lesend, pruef-css-klassen: gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 11:35:30 +02:00
DogFatherGitandClaude Opus 5 7eec2edf3f Stufe 3: Die Wunschliste bekommt einen Rang und einen Weg
Aus dem Plan im Vault. Eine Wunschliste ohne sichtbare Erfuellung ist
ein Briefkasten ohne Postbote -- nach dem dritten unbeantworteten
Wunsch schreibt niemand mehr.

ZWEIMAL LAG MEIN PLAN DANEBEN, beide Male zu pessimistisch:
- Die Sortierung nach Stimmen GAB es schon, seit dem 11.09.
- Die Datenbank erlaubte 'angenommen' und 'abgelehnt' laengst in ihrer
  CHECK-Regel; nur die Pruefung im Server liess sie nicht durch. Die
  Tabelle war der Logik voraus.

Auch ein Plan von gestern Nacht ist eine Bestandsliste und altert.

WAS DAZUGEKOMMEN IST
- Vier Zustaende JE BEREICH statt zwei global: Offen -> Wird gemacht
  -> Gemacht, dazu "Diesmal nicht". Eine gemeinsame Liste haette
  "Diesmal nicht" auch an einem Schutzvorfall erlaubt, und dort
  bedeutet es nichts.
- Ein geplanter Tag dazu: "Wird gemacht" allein ist ein Versprechen,
  "Wird gemacht -- am 24.09." ist ein Termin.
- Der Rangbalken. Eine Rangfolge sieht man erst, wenn der ABSTAND
  sichtbar ist: 12 Stimmen neben 14 sehen sonst aus wie 1 neben 40.
  Fuer ein Vorleseprogramm spricht er in Worten.
- Entschiedenes rutscht nach unten, wird aber NICHT geloescht. Gerade
  der erfuellte Wunsch ist der Beweis, dass sich Schreiben lohnt.

"DIESMAL NICHT" IST DER WICHTIGSTE DER VIER, und es ist bewusst nicht
rot. Ein Nein ist eine Antwort, Schweigen ist keine -- aber wer ein
rotes Schild an seinem Wunsch sieht, schreibt keinen zweiten.

UND AUF DEM BILDSCHIRMFOTO STAND "WAS IHR EUCH WUENSCHT".
Die Umlaut-Pruefung von gestern Nacht sah es nicht: Sie kannte die
Kataloge und die festen Seitentexte, aber nicht die
Bereichseinstellungen, aus denen JEDE Ueberschrift und jede
Art-Beschriftung kommt. Sechs Stellen ("Fuer den Stream", "Wie es hier
laeuft", "Haeufige Frage", "Ich haette Lust" ...).

Gefunden hat sie kein Gedankengang, sondern ein Blick auf das fertige
Bild. Die Wortliste hatte ausserdem Loecher -- "wuensch" fehlte
schlicht; 23 Stuecke nachgetragen. pruef-deutsche-texte deckt jetzt
auch die 120 Beschriftungen der Bereiche ab (9 -> 12 Pruefungen), mit
einer Gegenprobe auf genau den Satz, der heute Morgen durchrutschte.

NEU: pruef-wunschliste (30 Pruefungen)
Der aelteste Wunsch bekommt die meisten Stimmen -- genau der Fall, der
eine Sortierung nach Datum entlarvt. Dazu: alle vier Zustaende setzen,
ein erfundener nicht, "abgelehnt" am Anschlagbrett ABGELEHNT, der
geplante Tag, die Balkenbreiten (100/33/0 %), und dass der gemachte
Wunsch weiter in der Liste steht -- nur nicht mehr oben.

pruef-countdown 22, pruef-treff 66, pruef-bereiche-lesend,
pruef-deutsche-texte 12: gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 11:28:37 +02:00
DogFatherGitandClaude Opus 5 77db1bcc2e Stufe 2: "Wann ist der naechste Stream?" steht jetzt oben
Aus dem Plan im Vault. Bei "Was ansteht" gibt es genau EINE Frage, die
ein Zuschauer hat -- und sie stand in Zeile vier einer Liste wie jede
andere Angabe auch.

Jetzt ganz oben, gross:

    ALS NAECHSTES
    in 12 Std 15 Min
    Abendstream
    17.09.2026 um 23:30 Uhr
    2 weitere Termine danach

Darunter wird die Liste zum ZEITSTRAHL: Heute und morgen · Diese Woche
· Spaeter · Ohne Datum · Vorbei. Vergangenes steht unten, nicht
dazwischen -- ein abgelaufener Termin zwischen kommenden liest sich wie
ein Fehler.

DER PLAN VERSPRACH ETWAS, DAS DIE DATEN NICHT HERGABEN.
"in 3 Std 12 Min" -- aber `eintraege.datum` ist ein TAG, und die
Pruefung im Server lehnte eine Uhrzeit ausdruecklich ab
(`^\d{4}-\d{2}-\d{2}$`). Ein Stundencountdown war unmoeglich.

Das ist die uebliche Sorte Planungsluecke: Sie steht nicht im Plan, sie
steht in der Datenbank. Neue Spalte `uhrzeit`, OPTIONAL -- viele
Termine haben keine ("diese Woche", "im Oktober"), und ein Pflichtfeld
haette dafuer eine erfundene erzwungen. Ohne Uhrzeit zaehlt der
Countdown in Tagen, und "morgen" ist eine ehrliche Antwort.

Der Ton folgt der NAEHE, nicht der Wichtigkeit: Was gleich anfaengt,
ist waermer. Das ist die einzige Information, die eine Farbe hier
tragen kann, ohne zu behaupten, ein Termin sei "besser" als ein
anderer. Kein Blinken, keine Animation -- auf dieser Seite steht
niemand unter Zeitdruck, er will es nur wissen.

NEU: pruef-countdown (22 Pruefungen)
Das Abnahmekriterium aus dem Plan, in Pixeln gemessen: Die Antwort MUSS
im ersten Bildschirm stehen (gemessen 458 px von 844) und groesser sein
als jede Fliesstextzeile (27 px). Dazu: Uhrzeit setzen, wiederfinden
und wieder ENTFERNEN; vier unmoegliche Zeiten; der Zeitstrahl mit
"Vorbei" ganz unten; und der leere Fall, in dem ein SATZ dasteht statt
einer leeren Flaeche.

UND EIN EIGENER FEHLER, gefunden von der eigenen Gegenprobe: Der
Testtitel war "X" -- ein Zeichen, der Server verlangt zwei. Vier
"wird abgelehnt"-Haken waren damit halb aus dem falschen Grund gruen.
Aufgefallen ist es nur, weil die Gegenprobe ("der gueltige Fall muss
durchgehen") danebenlag. Ohne sie haette die Pruefung vier Haken
gesetzt und nichts geprueft.

pruef-treff 66, pruef-bereiche-lesend, pruef-css-klassen gruen -- die
anderen sieben Bretter teilen sich diese Datei.

Der Plan im Vault fuehrt jetzt einen Abschnitt 12: "Was beim Bauen
herauskam, das im Plan nicht stand". Plaene altern, Befunde nicht.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 11:17:01 +02:00
DogFatherGitandClaude Opus 5 e4d11caeb0 Community-Kacheln: das Loch, die Zwillinge, die unsichtbaren Farben
Filipe, mit einem Bildschirmfoto: "das wie es jetzt ist ist es einfach
total scheisse ... gerade einfach nur dahin geknallt und drauf
geschissen". Er hatte in allen drei Punkten recht, und alle drei sind
messbar.

1. DAS LOCH IM RASTER -- eine Zeile Reihenfolge
Drei Spalten, "Der Treff" doppelt breit -- aber an DRITTER Stelle. Nach
zwei normalen Kacheln war noch EINE Spalte frei, er passte nicht und
rutschte eine Reihe tiefer. Genau das ist die Luecke auf dem Foto.

  DIE REGEL, und sie gilt fuer jedes Raster im Haus: Eine breite Kachel
  gehoert an den ANFANG. Steht sie hinten, faellt die Luecke in die
  MITTE -- und eine Luecke in der Mitte sieht kaputt aus, eine am Ende
  sieht grosszuegig aus.

Jetzt: Treff (2 Spalten) + Anschlagbrett fuellen Reihe 1, drei weitere
Reihe 2, der Rest Reihe 3. Fuer DogFather und die Modis geht es genau
auf, 3 x 3. Und es stimmt auch inhaltlich: Der Treff IST das Herz
dieses Bereichs.

2. ZWEI KACHELN, EIN SYMBOL
"Regeln & Hilfe" und "Meldungen & Massnahmen" trugen beide `schutz` --
im Quelltext zweimal, nebeneinander, auf dem Schirm nicht zu
unterscheiden. Meldungen bekommt `startcheck`, die abgehakte Liste:
Bei Regeln steht, was GILT. Hier steht, was daraus WURDE.

3. DIE FARBEN WAREN DA UND KAMEN NICHT AN
Die sieben Toene sind laengst klar verschieden (#cc9451, #668e6e,
#cc92c6, #656a9e ...). Der Grund stand direkt daneben:
`.kachel:hover::before` und ein ausfuehrlicher Kommentar sprechen von
einer Schiene, die "heller wird und weiter in die Platte strahlt" --
nur hatte `.kachel::before` ausser einem Uebergang KEINEN Inhalt. Das
Element wurde beim Umbau am 07.09. entfernt, seine Hover-Regeln blieben
stehen. Seither trug den Ton nur ein Verlauf, der bei 58 % verschwunden
ist; unter dem Buehnenbild reicht das nicht.

Das hier ist deshalb kein neuer Einfall, sondern das Wiedereinsetzen
dessen, womit der Rest der Datei ohnehin rechnet. Drei Pixel, oben,
nach rechts auslaufend -- Farbe an der Kante unterscheidet, Farbe auf
der Flaeche blendet.

NEU: pruef-kachelraster (15 Pruefungen)
Ein Loch wird nicht angesehen, sondern gerechnet:

  belegte Zellen = Kacheln + 1 je doppelt breiter
  kleinstmoegliche Reihen = aufgerundet (Zellen / Spalten)

Mehr Reihen als das heisst: irgendwo liegt eine Zelle leer, die es
nicht muesste. Eine Luecke am ENDE faellt bewusst heraus. Dazu: jedes
Zeichen genau einmal (erkannt am SVG-Pfad, nicht an einem Namen -- den
gibt es im DOM nicht), jede Kachel mit Schiene, acht verschiedene
Toene. Und die Gegenprobe in beide Richtungen: die ALTE Reihenfolge
MUSS ein Loch melden, die neue nicht.

ZWEI EIGENE FEHLER DABEI, beide durch Messen gefunden:
- Ich hielt ein Vollbild-Foto fuer den Beweis, dass keine Kacheln da
  sind -- sie blenden sich beim Hereinscrollen ein. Die Pruefung
  scrollt jetzt erst hin.
- Ich erwartete sieben Kacheln fuer einen Modi. Er moderiert, also
  sieht er acht. Der Code hatte recht, meine Annahme nicht.

pruef-treff hat die Reihenfolge festgehalten und ist rot geworden --
genau ihre Aufgabe. Erwartung nachgezogen, mit dem Grund daneben.
pruef-kachel-universum 37, pruef-haus-seiten 34, pruef-treff 66,
pruef-css-klassen und pruef-start-ansicht: gruen.

Der ausfuehrliche Plan fuer den ganzen Bereich liegt im Vault:
"02 Projekte/Community-Bereich - Plan zur Perfektion" (fuenf
Durchgaenge).

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 10:25:04 +02:00
DogFatherGitandClaude Opus 5 b66fc379c8 Drei Accounts, eine Aufgabenliste: der Kanal
Filipe: "ich hab ja auch 2 neben account, hasidog und dogfather clips."
Der Arbeitsplatz wusste davon nichts -- es gab genau eine Welt, und die
hiess nirgends.

DAS WAR KEIN FEHLENDES FELD, SONDERN EINE MEHRDEUTIGKEIT.
"Schneide drei Ausschnitte" ist bei drei Accounts keine Aufgabe,
sondern eine Frage. Wer sie bekommt, muss nachfragen -- oder raet.
Raet er falsch, ist die Arbeit nicht halb getan, sondern am falschen
Ort, und das faellt erst auf, wenn jemand hinsieht.

WAS DAZUGEKOMMEN IST
- KANAELE in workspace.js (DogFather, HasiDog, DogFather Clips), jeder
  mit einem Satz, der ihn erklaert. Ein Auswahlfeld mit drei Namen und
  ohne ein Wort dazu ist eine Ratefrage fuer jemanden, der neu ist.
- Spalte `kanal` an den Aufgaben, per ADD COLUMN: kein Tabellenneubau,
  keine CHECK-Regel, alte Zeilen bleiben leer.
- Auswahl in beiden Formularen, ein farbiges Zeichen auf der Karte
  (gedeckte Toene -- auf dem Brett stehen bis zu vierzig Karten).

LEER IST EIN GUELTIGER ZUSTAND, kein fehlender. Vieles gilt fuer alles:
eine Absprache im Team, ein Zugang, eine Auswertung. Ein Pflichtfeld
haette dafuer einen falschen Kanal erzwungen, und ein falscher Eintrag
ist schlechter als ein leerer. Deshalb steht dort "Für alle" und kein
Strich.

WARUM EINE LISTE IM QUELLTEXT UND KEINE TABELLE
Sonst gilt hier: Eine abgeschriebene Liste altert. Diese ist keine
Abschrift -- sie laesst sich aus nichts ableiten, weil sie eine
Tatsache ueber Filipes Betrieb ist. Einen Kanal dazuzunehmen ist eine
Zeile. Sobald sich das oefter aendert als ein paarmal im Jahr, gehoert
sie in die Verwaltung; vorher waere das eine Oberflaeche fuer drei
Zeilen.

NEU: pruef-kanaele (21 Pruefungen)
Vier Fragen, und die dritte wird gern vergessen: Kann man ihn setzen?
Faellt ein erfundener auf? Erfaehrt jemand, der ihn nicht benutzen
darf, dass es ihn gibt? Und laesst er sich wieder ENTFERNEN -- ein
Feld, das `""` als "unveraendert" behandelt, macht aus einem
Loeschversuch ein Nichts-Tun, ohne Fehlermeldung.

Abschnitt 6 fragt die Datenbank selbst. Ohne ihn koennte alles gruen
sein, obwohl der Wert nur durch die Auskunft zurueckgereicht wird.

pruef-aufgabenbrett, pruef-modi-katalog 49, pruef-modi-kategorien 25
und pruef-css-klassen unveraendert gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 03:01:27 +02:00
DogFatherGitandClaude Opus 5 fa8e86ad81 Die Personenkacheln der Entwicklung im Hausstil
Filipe, mit zwei Bildschirmfotos nebeneinander: "wieso ist diese seite
noch nicht im stil und perfektioniert wie die auf screen2 ... aber so
dass ich die leute in einer kachel aussuchen kann alle einzel."

Der Unterschied lag NICHT im Aufbau -- der stimmte -- und auch nicht
am Inhalt: Die 28 Punkte sind laengst ganz auf Modi-Arbeit gebaut (Im
Chat 8, Wenn es eng wird 7, Im Team 7, Wie viel von selbst 6, dazu
sechs Fragen an einen selbst). Es waren zwei andere Dinge:

1. DIE ZAHLEN WAREN GRAUE TEXTZEILEN
Drueben stehen sie als abgesetzte Kaesten mit grosser Ziffer und
eigenem Ton. `bilanz-zahl` liegt in start.css und gehoert dem ganzen
Haus -- es wird jetzt benutzt statt nachgebaut. Ein Nachbau laeuft
auseinander, sobald jemand eins von beiden anfasst.

Aus "0 von 28 angesehen" werden drei Kaesten wie auf der Checkliste:
angesehen / noch offen / verschieden gesehen. Die ersten beiden teilen
dasselbe Ganze, die dritte ist das Ergebnis dieser Seite -- wo zwei
Leute dasselbe sehen, gibt es nichts zu besprechen.

2. EINE ANGEKLICKTE PERSON SAH AUS WIE EINE NICHT ANGEKLICKTE
Die Kachel war ein Knopf ohne Zustand. Man klickte jemanden an, die
Karte ging auf -- und oben blieb alles gleich. Wer scrollte, wusste
nicht mehr, wen er offen hat. Jetzt `aria-pressed`, damit es auch ein
Vorleseprogramm sagen kann, und eine gedaempfte Umrandung. Die Reihe
heisst "Person waehlen" wie auf dem Aufgabenbrett.

Nebenbei: Der Ton des ersten Kastens springt auf gruen, sobald nichts
mehr offen ist -- sonst saehe eine fertig angesehene Person aus wie
eine halbe.

NEU: pruef-entwicklung-kacheln (15 Pruefungen)
Nicht "sieht gleich aus" -- das laesst sich nicht messen -- sondern
was das Aussehen traegt: Benutzt die Kachel den Hausbaustein oder
einen Nachbau (und steht nichts Selbstgebautes daneben)? Ergibt
angesehen + noch offen die Gesamtzahl, die die Auskunft selbst nennt?
Und die Gegenprobe zur Auswahl: VOR dem ersten Klick darf keine
Kachel gewaehlt sein, danach genau eine, und beim naechsten Klick
wandert sie, statt sich zu sammeln.

pruef-entwicklung 43 und pruef-css-klassen unveraendert gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 02:41:41 +02:00
DogFatherGitandClaude Opus 5 3a86b13de1 Drei Zahlen, die etwas anderes zaehlten, als sie sagten
Weiter an derselben Stelle wie der Ring: Nicht umbauen, was gut ist --
suchen, wo eine Beschriftung etwas anderes behauptet, als darunter
gerechnet wird. Drei Funde, alle auf der Startseite.

1. "HEUTE" WAR ZWEIDEUTIG
Die erste Zahl unter dem Ring heisst "heute" und zaehlt TERMINE.
Solange der Ring die Uhrzeit zeigte, fiel das nicht auf. Seit er
"Heute geschafft" heisst und AUFGABEN zaehlt, standen zwei
verschiedene "heute" uebereinander -- ein Widerspruch, den der
vorherige Commit erst erzeugt hat. Heisst jetzt "Termine heute".

2. "KOMMT NOCH" ZAEHLTE STUNDEN, NICHT TERMINE
`mitTermin` ist eine Menge von STUNDEN -- fuer den Ring richtig, er
faerbt Stundensegmente. Als Zahl daneben war es falsch: Drei Termine
um 20 Uhr ergaben "1 kommt noch". Eine zu kleine Zahl meldet niemand;
man verlaesst sich darauf und wundert sich spaeter.

3. DIE KACHELZAHL SAGTE VORLESEND "OFFENE PUNKTE"
Sie summiert HINWEISE: bei Aufgaben "2 ueberfaellig" + "2 heute
faellig" = 4. Im Block darunter steht "6 Offen". Beides richtig -- nur
das Wort "offen" machte daraus einen Widerspruch, und wer die Seite
vorgelesen bekam, hoerte eine Zahl offener Aufgaben, die es nicht
gibt. Jetzt: "Aufgaben: 4 Sachen liegen an".

NICHT GEAENDERT, OBWOHL ICH ES VORGESCHLAGEN HATTE:
Die sieben Zaehler bleiben, auch wenn mehrere Null sind. Im Code steht
Filipes Anweisung vom 08.09. daneben ("diese beiden kategorien sollen
bei jedem in jeder rolle gleich sein"), samt der Erfahrung, dass das
Ausblenden schon einmal dazu fuehrte, dass Spicy Media als Einzige
etwas anderes sah. Der leere Zustand wird bereits gedaempft statt
entfernt -- das ist die bessere Loesung und sie war schon da.

pruef-zentrale-ring jetzt 14 Pruefungen (vorher 10), darunter drei
Termine in DERSELBEN Stunde -- der Fall, der 1 statt 3 ergab. Dazu die
Gegenprobe, dass jemand ohne Termine dort auch null sieht.
pruef-start-ansicht und pruef-tagesblick unveraendert gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 02:28:46 +02:00
DogFatherGitandClaude Opus 5 78b64f6eca Auf dem Brett steht jetzt Deutsch, nicht ASCII
Unter jeder Kategorie stand eine Erklaerung ohne Umlaute:
"Was im Livechat passiert, waehrend gesendet wird. Loeschen,
stummschalten, begruessen, deeskalieren." Elf der vierzehn Kategorien
und alle drei Stufen waren betroffen, dazu vier Stellen mit zwei
Bindestrichen statt eines Gedankenstrichs.

Entstanden ist es beim Schreiben ueber Hilfsskripte, die an Umlauten
scheitern -- fuer einen Kommentar gleichgueltig, fuer einen Satz, den
ein Mensch liest, ein Fehler. Gesehen hat es keine Pruefung: Der Text
war inhaltlich richtig, der Katalog vollstaendig, alles gruen.
Aufgefallen ist es auf einem Bildschirmfoto.

NEU: pruef-deutsche-texte (9 Pruefungen)
Sieht 174 Katalogtexte und 28 ausgelieferte Seiten durch. Bewusst eine
Liste von Wortstuecken statt eines Musters aus Buchstabenfolgen: "ue"
ist in "Feuer" und "neue" richtig, "ss" in jedem zweiten Wort. Die
Liste ist ein Netz, kein Beweis, und der Kopf der Datei sagt das.

Die Skripte bleiben absichtlich aussen vor. Ausprobiert: Dieselbe
Liste schlaegt dort 71 Mal an und kein einziges Mal zu Recht -- es
sind Feldnamen, Stilklassen und Adressen, die ASCII sein MUESSEN.
Eine Warnung, die immer kommt, ist keine Warnung mehr. Ihr sichtbarer
Text wird deshalb am fertigen Bildschirm geprueft, ueber innerText.

AUSSERDEM, auf demselben Bildschirmfoto gefunden:
Die Fusszeile der Vorlagenkarten war eine starre Flex-Zeile. Bei einer
schon uebernommenen Aufgabe stehen dort drei Dinge statt zwei, und
"Frist: in 2 Tagen" brach mitten im Wort auf drei Zeilen um. Keine
neue feste Breite dagegen, sondern flex-wrap plus nowrap -- eine
Regel, die misst, statt einer Zahl, die beim naechsten Element wieder
faellig waere.

UND EINE LEHRE ZUM MESSEN: Die erste Fassung dieser Pruefung zaehlte
element.getClientRects(). Sie blieb gruen, auch mit dem Fehler wieder
eingebaut -- ein Flex-Kind wird zum Block und liefert immer genau ein
Rechteck. Gefunden hat das nur die Gegenprobe. Gemessen wird jetzt
ueber einen Bereich um den Textknoten.

Das Bildschirmfoto landet ausserdem dort, wo die Zeile darunter es
ansagt (server/), nicht im Arbeitsverzeichnis.

pruef-modi-katalog 49 (vorher 45), pruef-deutsche-texte 9,
pruef-css-klassen, pruef-struktur, pruef-vorlagen,
pruef-aufgaben-vorlagen: alle ohne Fehler.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-16 23:22:05 +02:00
DogFatherGitandClaude Opus 5 76fa8b95fc Beim Verteilen sehen, wer schon wie viel hat
Weiter an derselben Sache: die Kategorien, aus denen Aufgaben an das
Team gehen.

ZWEI DINGE WAREN UNBEQUEM:

Die Person kam aus dem Formular GANZ OBEN auf der Seite. Man waehlt
sie dort, scrollt herunter zum Vorlagenbrett und drueckt "Uebernehmen"
-- und wer das nicht weiss, bekommt "Bitte zuerst eine Person waehlen"
und sucht, wo.

Und beim Vergeben sah man nicht, wer schon wie viel offen hat. Das ist
die wichtigere Haelfte: Zu wenig Zeit ist in den Untersuchungen zu
Moderatoren der meistgenannte Grund fuers Aufhoeren, und die Person,
die verteilt, ist die einzige, die das verhindern kann. Dafuer muss
die Zahl dort stehen, wo entschieden wird -- nicht auf einer
Auswertung, die man hinterher aufruft.

Jetzt steht ueber den Aufgaben eine Reihe mit den Namen des Teams und
der Zahl daneben. Ein Klick, und die uebernommenen Aufgaben gehen
dorthin; das Formular oben bleibt als Rueckfall, damit der bisherige
Weg weiter funktioniert.

KEINE SCHWELLE, KEINE WARNFARBE AUF DER ZAHL. Was "zu viel" ist, haengt
vom Menschen ab -- eine feste Grenze waere geraten, und geraten ist bei
dieser Frage schlimmer als nichts. Was NICHT geraten ist: dass etwas
ueberfaellig liegt. Nur das wird markiert, und zwar gedeckt. Ein
Warnton an einem Namen liest sich sonst wie ein Vorwurf gegen die
Person, dabei ist es eine Auskunft ueber die Verteilung.

Ohne eine einzige neue Abfrage: Die Personen und ihre Aufgaben liegen
im Browser ohnehin schon. Ein zweiter Abruf waere ein zweiter Weg, auf
dem eine andere Liste herauskommen kann.

  server/pruef-modi-katalog.mjs   45 Pruefungen (vorher 36), 0 Fehler

  Der neue Abschnitt meldet sich als DogFather an -- der bisherige
  Browserteil ist ein Modi, und der sieht diese Auswahl gar nicht. Er
  drueckt wirklich: Marina waehlen (9 offen), eine Aufgabe uebernehmen,
  nachsehen ob sie bei ihr liegt (9 -> 10). Ein Knopf, den niemand
  betaetigt hat, ist kein geprueter Knopf.

  Und er prueft die Gegenrichtung mit: Ein Creator und eine Managerin
  stehen NICHT zur Auswahl -- sie arbeiten im anderen Haus.

  pruef-aufgabenbrett, pruef-sicht, pruef-womit 41, pruef-css-klassen
  -- alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-16 19:21:38 +02:00
DogFatherGitandClaude Opus 5 4802954263 Der Aufgabenkatalog fuers Team: Kategorie mal Stufe, 88 Aufgaben
Filipe: "perfektionniere die kategorien wo ich aufgaben an die modis
verteile und so, ich will dass du alles was es gibt auf der welt durch
gehst und wie bei den aufgaben wo sie fuer mich haben auch mit
kategorien und vielen aufgaben."

ERST GEZAEHLT, WAS DA WAR. Es gab einen Katalog: 60 Eintraege in neun
Phasen. Wem sie gehoerten:

  DogFather                13
  DogFather & rechte Hand  12
  rechte Hand              14
  --------------------------------
  zusammen                 39 von 60

Zwei Drittel des "Modi-Katalogs" waren Aufbauarbeiten fuer Filipe
selbst. Nur 20 Eintraege waren wirklich Arbeit fuer jemanden im Team.
Und die Verteilung ueber die vierzehn Kategorien war schief: Planung
10, Events 1, Wachstum 1, Branding 1, Sonstiges 0.

Der Aufbauplan ist nicht falsch, nur etwas anderes -- er bleibt unter
`aufbauplan` erhalten. Ihn zu loeschen hiesse, 60 durchdachte Schritte
wegzuwerfen, weil sie am falschen Platz standen.

NEU: 88 Aufgaben in KATEGORIE mal STUFE, dieselbe Form wie bei den
Creator-Vorlagen. Wer eine Aufgabe vergibt, denkt "Frida macht Chat"
und nicht "wir sind in Phase 3".

  Chat 11, Team 8, Community/Events/Clipping/Technik je 7,
  Social/Planung/Organisation je 6, Kommunikation/Analyse/Wachstum/
  Branding je 5, Sonstiges 3 -- keine Kategorie mehr leer.

  Drei Stufen: neu dabei (24), eingearbeitet (35), erfahren (29).
  Eine Aufgabe der Stufe "erfahren" an einen Neuen zu geben ist kein
  Kompliment, sondern ein Ueberfallen.

UND DIE VIERZEHN KATEGORIEN HABEN JETZT EINEN SATZ. Vorher standen da
vierzehn nackte Namen -- "Organisation" und "Planung" nebeneinander,
ohne dass jemand sagt, was worin gehoert. Dann landet dieselbe Aufgabe
beim einen unter Planung, beim anderen unter Organisation, und jede
Auswertung darueber ist wertlos. Jetzt: Planung ist, was NOCH NICHT
ist; Organisation, was bereits ist, in Ordnung zu halten.

RECHERCHIERT, NICHT AUSGEDACHT (Quellen im Kopf des Katalogs):
Twitch und Discord zu dem, was ein Moderator tatsaechlich tut; TikTok
LIVE im Besonderen (gefilterte Kommentare, Gaesteverwaltung, Regeln zu
Beginn, Matches, Geschenke ohne Betteln); Community-Arbeit zu Rhythmus,
Vertretung und Monatsrueckblick. Dazu die Burnout-Forschung, die schon
in "Wie geht's dir?" steht -- deshalb stehen unter "Team" Aufgaben, die
zu wenig Zeit und Streit frueh sichtbar machen.

WAS DABEI BEINAHE SCHIEFGEGANGEN WAERE, und was es gefunden hat:

  Das Uebernehmen griff noch auf MODI_KATALOG zu -- die alten Phasen.
  Der Browser schickt die Nummer aus der AUSGELIEFERTEN Liste zurueck.
  Ein Klick auf "Uebernehmen" haette damit eine voellig andere Aufgabe
  angelegt, und zwar eine, die es gibt: keine Fehlermeldung, nichts
  Rotes, nur die falsche Aufgabe auf dem Brett. Gefunden hat das
  pruef-modi-katalog, die an der verschwundenen Phase abgestuerzt ist.

  Der Knopf "Alle N uebernehmen" schickte die Stufe nicht mit. Er sagte
  "Alle 4 uebernehmen" und haette elf angelegt -- das merkt man erst
  auf dem Brett.

  Und der Satz ueber dem Brett sagte weiterhin "Nach Etappen sortiert".
  Gesehen im Bildschirmfoto der Pruefung, nicht im Code.

  server/pruef-modi-katalog.mjs   36 Pruefungen, 0 Fehler
  Neu darin: jede Kategorie muss belegt sein (mindestens drei), jede
  Stufe auch, keine Kennung doppelt -- und JEDER TEXT MUSS BEGRUENDEN.
  Die letzte Zeile hat zwei meiner eigenen Texte als zu duenn erwischt.

  pruef-modi-kategorien 25, pruef-aufgabenbrett, pruef-vorlagen,
  pruef-css-klassen, pruef-struktur -- alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-16 19:05:34 +02:00
DogFatherGitandClaude Opus 5 12d4d48975 pruef-struktur: von zehn Fehlern auf null -- vier davon waren keine
Die dritte und letzte rote Pruefung. Sie meldete zehn Fehler, und
sechs davon waren Fehlalarm.

1. SECHS SEITEN "VON NIRGENDWO VERLINKT"

Gemeldet wurden crew-index, entwicklung, rechte, talente, teamlage und
treff-moderation. Keine davon war verwaist -- man kommt auf jede, indem
man eine KACHEL antippt. Die Kacheln stehen im Server (`ziel:
"talente.html"`), und der wurde nie durchsucht. Der blinde Fleck lag in
der Pruefung.

Abgeleitet statt nachgetragen: Statt die sechs von Hand auszunehmen,
kommen workspace.js und crew-adresse.js als Quellen dazu. Wer morgen
eine Kachel anlegt, ist damit automatisch abgedeckt.

2. FALSCHE ZEILENNUMMERN

Die Ortszeit-Pruefung schnitt Blockkommentare heraus und ersetzte sie
durch EIN Leerzeichen -- ab da zaehlte split("\n") falsch. Gemeldet
wurde "pruef-eskalation.mjs:43", dort steht eine Zeile ueber Kekse. Wer
dem nachgeht, findet nichts, haelt die Pruefung fuer kaputt und sieht
beim naechsten Mal nicht mehr nach.

Mit richtigen Zeilen waren sechs der sieben Funde echt: Sie bauen ihr
Tagesdatum aus toISOString(), also aus UTC. Zwischen Mitternacht und
zwei Uhr liefert das den Vortag -- die Pruefungen waeren tagsueber
gruen und nachts rot gewesen.

Der siebte (pruef-eskalation.mjs:70) rechnet von einem FESTEN Mittag
aus und ist damit sicher; das Muster kann es nur nicht unterscheiden.
Auch umgestellt, damit es nicht beim naechsten Lesen wieder auffaellt.

Neu: server/helfer-tag.mjs -- heuteLokal, tagLokal, tagVon. Nicht aus
workspace.js importiert, weil eine Pruefung, die nur ein Datum
braucht, dafuer keinen Server hochfahren soll. pruef-backstage-import
hatte die Rechnung sogar schon richtig stehen -- und benutzte sie 1270
Zeilen weiter unten trotzdem nicht.

3. TOTES CSS

`.rolle__zeichen .nase` war tot. Beim Nachsehen: `.auge` und `.hell`
daneben auch -- sie wurden nur davon verdeckt, dass die Pruefung den
Klassennamen als TEILZEICHENKETTE gegen den Quelltext haelt, und
"auge" steckt in "Auge", "hell" in "hell". Dutzende Treffer im
Fliesstext deutscher Kommentare. `.fuell` bleibt, die wird benutzt.
Die Schwaeche der Suche steht jetzt an der Stelle notiert.

4. start.css MIT 347 KB

Die Grenze soll verhindern, "dass eine Seite unnoetig viel laedt". Auf
der echten Seite nachgemessen:

  start.css        auf der Platte 346 KB   uebertragen 110 KB (br)
  chat.css                         59 KB                16 KB
  entwicklung.css                  33 KB                 8 KB

Caddy packt unterwegs. Von start.css sind ausserdem 227 KB KOMMENTAR
(64 %) -- die Pruefung bestrafte genau das, was dieses Haus absichtlich
tut, und haette eine Datei mit 199 KB dichtem CSS durchgewunken.
Dasselbe Argument steht drei Absaetze hoeher schon fuer gestufte
Bilder.

Jetzt zwei Zahlen, weil es zwei Fragen sind: was der BESUCHER laedt
(brotli Stufe 4 -- bei 4 liefert node 111 KB, Caddy 110, jede andere
Stufe waere eine erfundene Zahl) und was ein MENSCH pflegen muss (ohne
Kommentare). Sonst koennte man die erste Zahl klein halten, indem man
immer mehr Prosa schreibt.

MIT GEGENPROBE, in drei Faellen: 281 KB dichtes CSS faellt durch,
404 KB Kommentar gehen durch, und 246 KB sich WIEDERHOLENDES CSS
faellt ebenfalls durch -- sonst koennte man die erste Grenze mit
Wiederholung unterlaufen.

  pruef-struktur          0 Fehler (vorher 10)
  pruef-eskalation 40, pruef-modi-livecheck 16, pruef-treff-werkzeuge 70,
  pruef-backstage-import 160, pruef-css-klassen, pruef-crew-adresse 132
  -- alle 0 Fehler

Damit sind alle drei roten Pruefungen gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-16 18:03:50 +02:00
DogFatherGitandClaude Opus 5 0852723493 Der Nebel lag dort, wo der Text steht
pruef-kachel-universum war rot mit drei Meldungen. Die zweite rote
Pruefung von dreien.

ERST DIE FRAGE, OB ES DRIFT IST ODER VON ANFANG AN SO WAR: Die Pruefung
und das Sternenfeld kamen im selben Commit (ad47fc2). Dort laufen
lassen -- alles gruen, Kachelzeile 0,017 % auf 11610 Bildpunkten. Heute
2,372 % auf 6282. Die gemessene Flaeche hat sich HALBIERT.

Das war der Hinweis: Es wird eine andere Kachel gemessen. Der Waehler
nimmt die erste (`.kachel .kachel__unter`), und die war damals die
grosse Dashboard-Kachel (645 px breit), heute ist es "Team-Lage" (349
px). Die Reihenfolge hat sich zwischendurch geaendert.

WARUM DAS EINEN UNTERSCHIED MACHT: Die beiden Nebel sind auf
`100% 100%` skaliert, sie wachsen also mit der Kachel. Der babyblaue
sass bei `at 12% 88%` -- unten links. Auf einer schmalen Kachel liegt
genau dort die Unterzeile; auf der doppelt so breiten verteilt sich
derselbe Nebel ueber die ganze Breite und faellt nicht auf.

Der Kern ist jetzt tiefer in die Ecke geschoben (`at 10% 104%`, Ellipse
etwas flacher). Der Verlauf laeuft weiterhin quer durch die Kachel, die
Sterne sind unveraendert -- nachgesehen im Bild, nicht nur gemessen.

  Kachelzeile   2,372 %  ->  0,000 %   (Mittel 6.93 -> 7.28)
  Personenzeile 0,253 %  ->  0,253 %   (unveraendert, nichts kaputt)

UND EINE PRUEFUNG, DIE SEIT WOCHEN GAR NICHT LIEF. Die Zeile "dort
steht kein Stern" hing an `if (zwischenraum)`, und `zwischenraum` war
`null`, seit die grosse Kachel an Platz zwei steht: Sie faengt eine
Zeile tiefer wieder bei x=140 an, also gab es keinen Spalt zwischen
den ersten beiden. Ein uebersprungener Test beweist nichts -- und
gemeldet hat er nur, dass er nichts messen konnte.

Beim Wiederbeleben stellte sich heraus, dass er die falsche Frage
stellte: Er verlangte, dass der Grund zwischen den Kacheln "ruhig" ist
(Spanne <= 12). Das ist eine Aussage ueber das HINTERGRUNDFOTO der
Seite, und ein Foto darf helle Stellen haben -- gemessen 27, ohne dass
etwas kaputt war. Die eigentliche Frage ist eine andere: Liegt das
Sternenfeld wirklich nur auf den Kacheln?

Jetzt wird derselbe Fleck zweimal gemessen, mit und ohne Sternenfeld:

  Mittel 42,7,12 -> 42,7,12   hellster 69,14,17 -> 69,14,17

Bildpunkt fuer Bildpunkt identisch. Das beantwortet die Frage
unabhaengig davon, was auf dem Foto zu sehen ist.

  pruef-kachel-universum   37 Pruefungen, 0 Fehler (vorher 3)
  pruef-css-klassen, pruef-neue-seiten 97 -- 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-16 17:24:48 +02:00
DogFatherGitandClaude Opus 5 8e140724f2 Der Rollenname steht in keiner ausgelieferten Datei mehr
pruef-modi-wortleck war rot und meldete 17 Fundstellen -- seit Wochen,
bei jedem Lauf. Eine Warnung, die immer kommt, wird ueberlesen, und
dann auch die echte.

ERST GEMESSEN, OB DIE REGEL UEBERHAUPT NOCH GILT. Seit dem 11.09. gibt
es die eigene Adresse crew. mit einem offenen Modi-Knopf an der Wand --
es waere gut moeglich gewesen, dass die Pruefung etwas bewacht, das es
nicht mehr gibt. Sie gilt: pruef-modi-verborgen setzt mit 80 Pruefungen
durch, dass ein Manager keinen Modi sieht.

UND DABEI KAM ETWAS SCHLIMMERES HERAUS. Auf der echten Seite gemessen:

  /workspace/start.html                 302   (Anmeldung noetig)
  /workspace/assets/js/talente.js       200   25 KB Quelltext
  /workspace/assets/js/chat.js          200   85 KB
  /workspace/assets/css/entwicklung.css 200   34 KB

Jede Datei unter workspace/ ist OHNE JEDE ANMELDUNG aus dem offenen
Netz abrufbar. Der verborgene Zugang stand also nicht in einer Datei,
die "jeder herunterlaedt, der angemeldet ist" -- sondern in einer, die
man einfach abrufen kann.

Die Rollentabelle in workspace.js sagt seit dem 11.09. genau das
Richtige dazu: "Der Name steht hier und NICHT in einer Datei, die jeder
herunterlaedt -- ausgeliefert wird er nur an den, der ihn selbst
traegt, und an die, die ihn sehen duerfen." Danach ist jetzt gebaut,
ueberall:

  - talente.js hatte `rolle: 'modi'` fest im Text, dazu den Namen im
    Codekasten und im Rechtevergleich. Die Seite FRAGT ihn jetzt ab;
    /talente/lage liefert ihn, und die Route geht nur an DogFather und
    die rechte Hand.
  - Der Regeltext des Treffs nennt den Namen weiterhin -- Filipe hat am
    11.09. ausdruecklich gewaehlt, dass die Community ihn sieht. Er
    kommt jetzt als DATEN mit der Antwort, nicht als fester Text.
  - Das Feld hiess selbst `modi_frist_tage`. Das Muster \bmodi\b trifft
    das nicht, weil danach ein Unterstrich folgt -- ein Leck durch eine
    Luecke im Muster, nicht durch eine Entscheidung. Heisst jetzt
    `pause_frist_tage`.
  - Die uebrigen elf Fundstellen waren Kommentare. Umformuliert, ohne
    dass sie weniger erklaeren.

Ergebnis: 17 -> 0. Ohne Ausnahmeliste, ohne die Pruefung zu entschaerfen.

ZWEI LOECHER, DIE ICH DABEI SELBST GERISSEN HAETTE:

  darfAnlegen wurde aus `lage` gerechnet -- aber ichHolen() laeuft VOR
  laden(), also war `lage` noch null. Der Wert waere dauerhaft falsch
  gewesen und der Knopf nie erschienen. Jetzt ist es eine Frage statt
  eines Wertes, beantwortet beim Zeichnen. Gefunden beim Nachsehen der
  Reihenfolge, nicht im Testlauf -- deshalb steht die Frage ab jetzt in
  pruef-uebergang.

  Und im HTML des Treffs steht als Ersatzfassung "jemandem aus dem
  Team". Kommt der Name nicht an, bleibt sie stehen, die Seite sieht
  vollkommen richtig aus, und niemand merkt es. Ein Platzhalter "…"
  waere aufgefallen; eine richtige Ersatzfassung faellt nicht auf.
  pruef-neue-seiten prueft jetzt, dass wirklich der Name dasteht.

  pruef-modi-wortleck        0 Fehler (vorher 17 Fundstellen)
  pruef-uebergang 65 (vorher 61), pruef-neue-seiten 97 (vorher 93)
  pruef-modi-verborgen 80, pruef-nachwuchs 123, pruef-treff 66,
  pruef-treff-werkzeuge 70, pruef-css-klassen -- alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-16 16:59:34 +02:00
DogFatherGitandClaude Opus 5 8fc1ac7a7a Alles aus der Excel-Datei -- und der Fund, der alles blockiert haette
Filipe: "ich will dass alles von der excel datei genommen wird.
perfektionnier das, aber wenn ich dir runter lade soll alles notiert
und angezeigt werden." Dazu eine echte Ausgabe als Vorlage.

DER SCHWERSTE FUND STECKTE VOR DEN DATEN, NICHT IN IHNEN.

Seine Ausgabe "Creator_innendaten" hat DREI Spalten, die nach Person
aussehen: "Creator*in-ID", "Creator*innen-Anmeldename" und "Agent".
`personSpaltenRaten` nahm die erste mit dem Wort "creator" darin --
die ID. Danach wurde nach einem Creator namens "700001" gesucht.
Nachgemessen an seiner echten Kopfzeile: handle = KEINE, name =
"Creator*in-ID". Diese Datei haette KEINE EINZIGE Zeile zugeordnet,
mit einem Hinweis ("steht bei keinem Creator im Feld TikTok"), der in
die voellig falsche Richtung zeigt.

Jetzt ist "Anmeldename" der Handle, eine Kennnummer ist fuer beide
Spalten ausgeschlossen, und "creator" allein reicht nicht mehr als
Namensspalte -- sonst haette weiter hinten "Neue*r LIVE-Creator*innen"
(Wert: "Nein") die Stelle uebernommen. An fuenf Kopfzeilen gemessen.

UND DANN: NICHTS FAELLT MEHR WEG.

41 Spalten in der Datei, acht werden gedeutet. Die restlichen 33 --
letzter Monat, fuenf Prozentwerte, Matches, Multi-Gast-LIVEs, Fanclub,
Graduierungs- und Stufenstatus -- wurden lautlos weggeworfen.

KEINE 33 NEUEN SPALTEN, sondern eine Zeile je Spalte mit dem NAMEN als
Schluessel. Eine abgeschriebene Spaltenliste hat in diesem Haus schon
zweimal Daten gekostet und waere beim naechsten Backstage-Update
falsch. Gegenprobe in der Pruefung: eine erfundene Spalte
("Sternenstaub pro Woche") kommt genauso durch -- es wird also keine
Liste gepflegt, die Datei entscheidet.

An SEINER echten Datei gemessen, ohne sie irgendwo hineinzuschreiben:
40 von 41 Spalten gespeichert (die 41. ist leer), Zeitraum 01.09.-
13.09. erkannt, 32 als Zahl, 8 als Text.

UND EIN MESSFEHLER, DER LEHRREICH IST: Meine erste Pruefung meldete
"zugeklappt ist die Liste 141 px hoch", im Bildschirmfoto war dort
nichts. An einem Miniaturfall nachgemessen: getBoundingClientRect,
offsetHeight, offsetParent und getClientRects liefern bei einem
<details> in BEIDEN Zustaenden identische Werte -- Chromium verbirgt
den Inhalt mit content-visibility:hidden, und das behaelt die letzte
Ausmessung. Nur checkVisibility() kann es unterscheiden. Die Messung
log, nicht die Seite.

pruef-backstage-import 160 (war 133), pruef-xlsx 75,
pruef-leistung-optik 59, pruef-leistung, pruef-css-klassen und
pruef-auskunft (46, DSGVO -- die neue Tabelle ist automatisch dabei,
weil die Auskunft ihre Liste aus PRAGMA foreign_key_list ableitet):
alle gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-16 01:46:07 +02:00
DogFatherGitandClaude Opus 5 984f0dd7a9 Die Zeitraeume bekommen eine Tafel -- und die Zahl, die fehlte
Filipe: "das muss viel geiler aussehen bitte. ich will dass es auch
seeeehr gut erkennbar ist, genau wie der text drueber. mach das bitte
alles so dass es mega speziell, hochwertig und lesbar ist."

DAS EIGENTLICHE PROBLEM WAR LESBARKEIT, nicht Geschmack. Im
Bildschirmfoto gemessen: Ueberschrift und Erklaersatz standen direkt
auf der Buehne -- einem Foto mit hellrotem Berg. Und die Karte griff
nach `--flaeche-tief`, einer Variablen, die es im ganzen Haus nicht
gibt; gegriffen hat der Ersatzwert mit 72 % Deckung, also kam der Berg
mit. Eine Variable, die nirgends steht, faellt nicht auf.

Jetzt sitzt alles in EINEM Koerper: vierfarbige Fassung, deckendes
Innenglas mit Messraster, die Zeitraeume als eingelassene Felder mit
dunklen Fugen. Das ist nicht neu erfunden, sondern die Rollenkachel der
Anmeldeseite -- ein Haus, eine Handschrift. Typenschild und Hauptzahl
in gebuerstetem Metall, mit vollwertigem Rueckfall.

"GUELTIGE LIVE-GEHEN-TAGE" WURDE BIS HEUTE WEGGEWORFEN. Datenbank,
Anzeigefeld und Importzeile waren da -- nur `spaltenRaten` hatte kein
Muster dafuer. Am 14.09. wurde das alte `/tag/` reparirt, das die
Spalte faelschlich zur Datumsspalte machte; die Reparatur hat den
falschen Empfaenger entfernt und keinen richtigen bestellt. Die
Pruefdatei SCHICKTE den Wert seit dem 14.09. und hat nie nachgesehen,
ob er ankommt. Jetzt steht er als Streifen da, in genau so viele
Kaestchen geteilt, wie der Zeitraum Tage hat.

ZWEI KLASSEN IM WAEHLER, mit Grund: `.spannen__schild` allein (0,1,0)
kam gegen `.inhalt .feldschild` aus start.css (0,2,0) nicht an -- im
Browser gemessen war weder `display: flex` noch die Farbe da.

UND EINE ZEITBOMBE ENTSCHAERFT: pruef-backstage-import rechnete
"morgen" mit `toISOString()` (UTC), der Server mit Ortszeit. Um 00:40
Berlin war das hier berechnete "morgen" in Wahrheit HEUTE -- die
Gegenprobe "ein Datum in der Zukunft wird abgelehnt" fiel taeglich
zwischen Mitternacht und zwei Uhr um. Alle drei Tage werden jetzt aus
einer Stelle abgeleitet.

Gemessen statt behauptet: 43 258 Bildpunkte hinter Ueberschrift und
Satz abgetastet, kein einziger rot. Gegenprobe mit weggenommenem
Innenglas: 2 857 rote -- die Messung kann Rot also sehen.

pruef-backstage-import 133 (war 127), pruef-xlsx 75 (war 67),
pruef-css-klassen, pruef-leistung-optik 59, pruef-leistung: alle gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-16 00:59:51 +02:00
DogFatherGitandClaude Opus 5 04f87603f6 Was dein Verlauf sagt -- die Analyse
Filipe: "mach mir auch eine analyse, mach eine perfektion draus. eine
professionelle auch mit infos und so aus aller welt was tiktok angeht.
ich will dass es perfekt ist!!!!"

SIE WIRD GERECHNET, NICHT GESPEICHERT. Kein Feld, keine Tabelle, keine
Note -- sie entsteht bei jedem Abruf neu aus dem Verlauf dieser einen
Person und verlaesst das Haus damit genauso wenig wie er.

DREI DINGE, DIE SIE TUT:

  1. Sie nennt das MUSTER, nicht den Einzelwert. "Da hakt es" in einer
     Runde ist ein schlechter Tag. Dasselbe in zwei Runden ist etwas
     anderes -- und genau das ist in der Forschung das Warnzeichen.
  2. Sie ordnet ein. Zu JEDER der sechs Fragen ein belegter Befund aus
     der Moderationsarbeit, damit niemand denkt, er sei der Einzige.
  3. Sie sagt, was hilft -- aber nur dort, wo es etwas zu tun gibt. Ein
     Rat an einer Stelle, die laeuft, ist Laerm und entwertet die
     anderen fuenf.

UND EINES, DAS SIE NICHT TUT: bewerten. Keine Punktzahl, kein Score,
kein Ampelgesicht. Eine Zahl ueber das eigene Befinden laedt dazu ein,
sie zu verbessern statt ehrlich zu antworten -- und ab da misst die
Abfrage nur noch sich selbst.

RECHERCHIERT, NICHT AUSGEDACHT. Die sechs Fragen standen schon auf der
richtigen Spur; die Quellen bestaetigen sie und liefern die Einordnung:

  "Zu wenig Zeit" und "Streit im Team" sind die zwei meistgenannten
  Gruende, warum freiwillige Moderatoren aufhoeren -- noch vor den
  Inhalten. Anschluss ans Team ist der staerkste einzelne Schutzfaktor.
  Bei bezahlten Moderatoren, auch bei TikTok, sagen ueber 80 % der
  Befragten, ihr Arbeitgeber muesse mehr fuer ihre psychische
  Gesundheit tun.

    https://news.umich.edu/online-content-moderators-likely-to-experience-burnout-u-m-study-suggests/
    https://discord.com/safety/understanding-and-avoiding-moderator-burnout
    https://restofworld.org/2025/tiktok-moderators-turkey/
    https://www.japantimes.co.jp/news/2025/07/04/world/science-health/content-moderators-mental-trauma/
    https://arxiv.org/pdf/2502.06985

Die drei wichtigsten stehen als Verweis unter der Analyse. Ein Satz
ueber "die Forschung" ohne Quelle ist eine Behauptung -- und bei diesem
Thema waere das der Moment, an dem man der ganzen Seite nicht mehr
glaubt.

Im Bildschirmfoto gesehen und behoben: Der Satz oben und die
Quellenzeile standen direkt auf der Buehne, also auf einem Foto. Die
Quellenzeile ist die kleinste Schrift der Seite. Dieselbe Antwort wie
heute Mittag bei der Entwicklungskarte -- keine hellere Schrift,
sondern etwas Deckendes darunter.

  server/pruef-befinden.mjs   75 Pruefungen (vorher 48), 0 Fehler
  Darunter: aus "neu" wird nach der dritten Runde "dauerhaft", jeder
  der sechs Befunde ist ein ANDERER (kein Satz, der zu allen passt),
  DogFather bekommt seine eigene leere Analyse, und im Protokoll steht
  weiterhin nichts davon -- weder die Analyse noch ein Anlass.

  pruef-css-klassen, pruef-entwicklung 43 -- 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 17:38:57 +02:00
DogFatherGitandClaude Opus 5 a919bc8720 Die Reaktionstafel landete in der Spalte des Namenskreises
Filipe, mit einem Bildschirmfoto: "was ist das den fuer eine scheisse
verbesser das sofort." Darauf ein dreissig Pixel schmaler Streifen,
sechs Zeichen untereinander, ein Rollbalken daneben.

.chat-nachricht ist ein RASTER aus zwei Spalten: dreissig Pixel fuer
den Kreis mit den Initialen, der Rest fuer die Blase. Ein Kind ohne
Spaltenangabe wird automatisch in die naechste freie Zelle gesetzt --
und das ist die Spalte des Kreises. `width: min(330px, 100%)` machte
daraus brav 30 Pixel, und die Zeichen stapelten sich.

UND WARUM ES NIEMANDEM AUFGEFALLEN IST: Bei der EIGENEN Nachricht
entfaellt der Kreis, das Raster hat dann nur eine Spalte, die Tafel
bekam die volle Breite. Die Pruefung vom 14.09. hat genau diesen Fall
gemessen -- nachgemessen heute: selbst=ja, eine Spalte, 611 px. Sie
war gruen, waehrend es bei JEDER fremden Nachricht kaputt war.

Und sie hat ausserdem nur Anwesenheit geprueft ("gibt es die
Elemente", "sucht die Suche") -- nie Geometrie. Eine dreissig Pixel
breite Tafel besteht jede dieser Zeilen.

Jetzt gemessen, und zwar in BEIDEN Faellen: Breite, ob die sechs
Vorschlaege auf EINER Zeile stehen, und ob die Tafel neben dem Kreis
steht statt darunter. Dafuer schreibt der Testraum jetzt auch eine
Nachricht von jemand anderem -- ohne die gab es dort nur eigene.

GEGENPROBE (Reparatur kurz entfernt, gemessen, wieder eingesetzt):

  ohne  30 px, 6 Zeilen, +0 px   <- genau das Bildschirmfoto
  mit   330 px, 1 Zeile, +39 px

  server/pruef-chat-aufloesen.mjs   125 Pruefungen (vorher 119)
  pruef-chat-optik, pruef-chat, pruef-css-klassen -- alle in Ordnung

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 17:31:35 +02:00
DogFatherGitandClaude Opus 5 5707e22b45 Die Seite springt nicht mehr -- und die Kachel zaehlt mit
Zwei Meldungen von Filipe, und sie gehoeren zusammen: Er hat beides am
selben Klick gemerkt.

  "immer wenn ich auf was drücke dan geht das fenster wieder hoch. die
   seite soll sich nicht immer wieder bewegen wenn ich auf was drücke."

  "und wieso steht bei vanvan 0 von 28 obwohl ich alle durch habe."

DER SPRUNG: In karte() stand ein scrollIntoView OHNE Bedingung -- und
die Funktion wird an vier Stellen gerufen. Beim Oeffnen einer Person
ist es richtig; nach dem ersten Klick auf einen Punkt, beim Aufklappen
aller Kategorien und nach dem Anlegen eines Schritts ist es falsch. Man
tippt unten auf "Läuft" und steht wieder ganz oben. `springen` ist
jetzt Vorgabe NEIN, und genau eine Stelle sagt ja.

Und selbst ohne Sprung bewegte sich die Seite: Der Neuaufbau aendert
die Hoehe der Karte (eine Zeile "Schritt läuft" kommt dazu), der
Browser behaelt nur die Pixelzahl. Die Hoehe wird deshalb gehalten.

"Alle aufklappen" holt die Karte gar nicht mehr neu -- Aufklappen ist
eine Sache der Anzeige, dafuer braucht es den Server nicht.

DIE NULL: Die Kachel kommt aus /entwicklung/lage -- EINMAL, beim Laden
der Seite. Die Karte holt ihren Stand bei jedem Oeffnen neu. Wer 28
Punkte durchklickt, sieht in der Karte 28 von 28 und auf der Kachel
darueber die Zahl von vorhin. Zwei Wahrheiten auf einem Bildschirm, und
die falsche steht oben.

Die Liste NICHT neu zu holen ist Absicht -- jeder Neuaufbau bewegt die
Seite, und darueber ging die andere Meldung. Stattdessen wandert die
Zahl mit, zusammen mit dem Kopf der Karte und den Koepfen der
Kategorien ("3 / 7", "2 x hakt").

WAS DIE PRUEFUNG AN MIR SELBST GEFUNDEN HAT, dreimal:

  - Sie mass nach dem Sprung aufs Aufgabenbrett weiter und verglich
    zwei leere Texte. Zwei leere Texte sind gleich und beweisen nichts
    -- gemeldet hat es die Zahl in der Bedingung daneben.
  - Danach verglich sie Fridas Kachel mit Riekes Karte und meldete
    einen Unterschied zwischen zwei verschiedenen Menschen. Beinahe
    haette ich einen Fehler gesucht, den es nicht gab.
  - Und "wo etwas hakt, steht es im Kopf" waere ab heute auch ueber
    vier VERSTECKTEN Hinweisen gruen gewesen: Der Hinweis steht jetzt
    immer im Baum, damit er nachgezogen werden kann, ohne den Kopf neu
    zu bauen. Jetzt wird auf sichtbar geprueft, nicht auf vorhanden.

  server/pruef-schritt.mjs   65 Pruefungen (vorher 57), 0 Fehler
  Beide Meldungen werden am selben Klick nachgestellt: Hoehe und Zahl
  vorher merken, EINMAL druecken, beides nachsehen. Mit Gegenprobe --
  auf eine Person zu druecken DARF springen, sonst hiesse "springt
  nicht" nur, dass gar nichts mehr scrollt.

  pruef-css-klassen, pruef-entwicklung 43, pruef-neue-seiten 93 -- 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 17:25:29 +02:00
DogFatherGitandClaude Opus 5 45f5a35afe Die Kategorien lassen sich auf- und zuklappen
Filipe: "mach das viel geiler alles bitte, ich will auch dass man die
kategorien von den fragen, also die liste auf und zu druecken kann mit
einem button."

ACHTUNDZWANZIG PUNKTE OFFEN SIND RUND ZWEI METER SEITE. Man scrollt,
verliert die Stelle und macht es beim naechsten Mal gar nicht mehr.

  - Jede Kategorie hat einen Knopf. Ein Klick wechselt nur DIESEN
    Abschnitt; die Karte wird nicht neu geholt, sonst springt die Seite
    bei 28 Punkten unter den Fingern weg.
  - Der Zustand liegt im Skript, nicht an den Elementen: Nach dem
    ersten Klick auf einen Punkt zeichnet die Karte sich neu (erst
    danach darf der Stand der anderen ausgeliefert werden). Am Element
    klappte dabei alles wieder zu -- mitten in der Arbeit.
  - Welche zuerst offen steht, ist die eigentliche Entscheidung: die
    erste, in der noch etwas fehlt. Alle zu hiesse jedes Mal suchen,
    alle auf waere der Zustand von vorher.
  - Der Kopf sagt ZUGEKLAPPT, was drin ist: "2 / 8" und, wenn etwas
    hakt, "1 x hakt". Eine zugeklappte Kategorie, die nichts sagt,
    klappt man einmal auf und danach nie wieder zu.
  - Daneben "Alle aufklappen" / "Alle zuklappen" fuer den Durchgang.

WAS DAS BILDSCHIRMFOTO AUSSERDEM GEZEIGT HAT, und was ich im Code nicht
gesehen haette: Die Karte hatte gar keine eigene Flaeche. "Frida · Modi
· 2 von 28 angesehen" lag quer ueber dem Spicy-Media-Schriftzug, der
Knopf darunter ueber einer Chilischote. Genau der Fall, fuer den die
Kontrastmessung ihren dritten Ausgang hat ("konnte nicht nachsehen") --
ueber einem Foto laesst sich Lesbarkeit nicht ausrechnen. Die Antwort
darauf ist keine hellere Schrift, sondern eine deckende Flaeche.

Und der Hinweis "(bei 'Da hakt es' noetig)" stand bisher 28 Mal da,
auch an Punkten, an denen nichts hakt. Ein Satz, der ueberall steht,
wird nirgends gelesen. Jetzt meldet sich das Feld erst, wenn es
gebraucht wird -- mit Rahmen in derselben Farbe wie die Antwort, und
der Mauszeiger springt hinein.

Beim Nachsehen im Bild gefunden: "2 von 28 angesehen" stand danach
zweimal auf demselben Bildschirm. Zweimal dieselbe Zahl laesst einen
ueberlegen, ob es zwei verschiedene sind.

  server/pruef-schritt.mjs   57 Pruefungen (vorher 46), 0 Fehler
  Der Knopf wird wirklich gedrueckt -- ein Knopf, den niemand betaetigt
  hat, ist kein geprueter Knopf.

  pruef-css-klassen, pruef-entwicklung 43, pruef-neue-seiten 93,
  pruef-nachwuchs 123 -- alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 14:40:11 +02:00
DogFatherGitandClaude Opus 5 418b6211e2 Ein Hinweis auf eine Seite, die es hier nicht gibt, ist kein Hinweis
Filipe, mit dem Bildschirmfoto auf crew.: "wieso steht es noch da?" --
"1 Punkt im Start-Check braucht Handlung", mit einem Pfeil auf eine
Seite, die seit einer Stunde dort gesperrt ist.

MEIN FEHLER VON HEUTE MITTAG. Ich hatte die Seiten gesperrt und
ausdruecklich dazugeschrieben "nur die Seiten, nicht die
Schnittstellen" -- und dabei uebersehen, dass es eine DRITTE Stelle
gibt. Die Hinweise auf der Startseite sind keine Seite und keine
Schnittstelle, sondern eine Liste von VERWEISEN. Der Satz im Kommentar
klang vollstaendig und war es nicht.

Nachgesehen, wer sonst noch Seitenziele ausliefert, statt zu raten:

  workspace-hinweise.js   alle 16 Hinweise, ueber dazu()   -> behoben
  workspace-suche.js      jeder Treffer traegt ein Ziel    -> behoben
  workspace-push.js       Benachrichtigungen tragen eines  -> OFFEN

Die ersten beiden bekommen dieselbe Regel wie die Seiten, nicht eine
zweite: gehoertAufDieseAdresse(). Was hier keine Seite hat, bekommt
hier auch keinen Hinweis und keinen Treffer. Bei der Suche fallen leere
Gruppen mit weg (eine Ueberschrift ohne Treffer sieht aus, als waere
etwas kaputt) und `gesamt` wird danach abgeleitet, sonst nennt die Zahl
Treffer, die gar nicht dastehen.

DIE ADRESSE IST IMMER DIE ECHTE: Beide Stellen benutzen `req.sicht ||
req.person`. Der Sicht-Umschalter aendert, WESSEN Zahlen dastehen --
nicht, auf welcher Wand man steht. Das Haus kommt deshalb aus
req.person.

PUSH BLEIBT OFFEN, und zwar bewusst: Eine Benachrichtigung entsteht,
wenn niemand auf einer Adresse steht. Sie geht an ein GERAET, und das
oeffnet die Adresse, als die es installiert wurde. Das ist eine andere
Frage als diese hier, und eine halbe Antwort waere schlechter als
keine. Gehoert eigens angesehen.

Was die Gegenprobe gefunden hat -- an mir selbst, zweimal:

  Der erste Entwurf der Pruefung legte die Tabelle `startcheck` mit
  erfundenen Spalten selbst an. Die echte war laengst da, das
  IF NOT EXISTS schwieg, der INSERT scheiterte. Die Pruefung haette
  gemeldet, der Hinweis stehe nirgends -- richtig und wertlos.

  Und "kein Suchtreffer zeigt dorthin" stand ueber NULL Treffern. Jetzt
  wird erst nachgewiesen, dass die Suche denselben Menschen auf der
  Agenturadresse wirklich findet (1 Treffer -> profil.html).

  server/pruef-haus-seiten.mjs   34 Pruefungen (vorher 24), 0 Fehler
  pruef-sicht, pruef-haus-trennung 66, pruef-betreuung,
  pruef-manager-sicht 43 -- alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 14:30:31 +02:00
DogFatherGitandClaude Opus 5 44a6b7cb83 Auf der Team-Adresse gibt es die Agenturseiten nicht
Filipe, mit dem Bildschirmfoto des Start-Checks auf crew.: "das gibt
es in der app nicht, dass ist nur auf der workspace app aber nicht
hier."

ES WAR GROESSER ALS DIESE EINE SEITE. Gemessen, bevor gebaut:

  DogFather    12 Seiten ohne Kachel erreichbar, 10 davon Agentur
               (Automationen, Content, Scouting, Reports, Zahlen,
               Team, Calls, Creator-Profil, Dashboard, Start-Check)
  rechte Hand   5, davon 3 Agentur
  ein Modi      6, davon 3 Agentur -- auch der Start-Check

Die Haustrennung vom 10.09. entscheidet, WAS jemand sieht: sie filtert
Daten und Kacheln. Sie entschied nie, welche SEITEN es auf einer
Adresse gibt. Die Rechtetafel wiederum kennt nur Rollen, keine
Adressen. Zwischen beidem lag das Loch -- und der Start-Check sagte
dort "Es gibt noch keinen Creator", weil ihm die Haustrennung alle
Daten wegnimmt. Eine Seite, die laedt und leer ist, sieht aus wie ein
Fehler.

DIE REGEL WIRD ABGELEITET, NICHT GEPFLEGT: Welche Seiten zu dieser
Adresse gehoeren, steht schon in den KACHELN, die dieselbe Adresse
dieser Person zeigt. Dazu drei Seiten, die in jedem Haus dazugehoeren
und keine Kachel haben (start, treff-regeln, entwicklung). Sie altert
sicher -- eine neue Agenturseite ist dort automatisch zu, eine neue
Crew-Seite ohne Kachel faellt beim ersten Klick auf.

UND SIE AENDERT KEINE RECHTE. Was jemand DARF, steht weiter allein in
rechte.js; diese Regel beantwortet, ob es das hier ueberhaupt gibt.
Nur die Seiten, nicht die Schnittstellen -- die filtern seit dem 10.09.
selbst ueber person.haus.

DREI PRUEFUNGEN, DIE VORHER SCHON ROT WAREN, nachgemessen gegen den
Stand von heute frueh (2712473), damit ich sie nicht mir selbst
zuschreibe -- und zwei davon repariert:

  pruef-treff       Sie fragte "enthaelt die Antwort irgendein
                    gefuelltes Feld" und wurde rot, als das
                    Aufgabenbrett die drei Aufwandsstufen mitzuliefern
                    begann. Die sagen ueber niemanden etwas. Eine
                    Warnung, die immer kommt, wird ueberlesen -- also
                    praeziser statt lauter: Ein Datensatz hat eine id,
                    ein Vokabular einen schluessel und keine.
  pruef-neue-seiten War gruen und wurde durch MEINE Arbeit rot: Mit
                    dem Umzug der sechs Fragen blieben bei 390 px noch
                    14 Textstuecke statt der geforderten 15 -- alle
                    lesbar. Die Zahl auf 14 zu setzen waere derselbe
                    Fehler mit einer anderen Zahl gewesen; die Aufgabe
                    ("die Seite hat wirklich gerendert") erledigt zwei
                    Zeilen hoeher schon die Zeichenzahl.
  pruef-kachel-universum, pruef-struktur, pruef-modi-wortleck
                    unveraendert rot, nicht von hier -- offen.

Ausserdem: "wenn alle 1 sie gesetzt haben" auf der eigenen Karte. Das
ist keine Auskunft, sondern eine Rechnung -- derselbe Fall wie "vor 0
Tagen" heute frueh. Zwei Lagen, zwei Saetze.

  server/pruef-haus-seiten.mjs   24 Pruefungen, 0 Fehler (Port 4422)
  pruef-crew-adresse 132, pruef-modi-verborgen 80, pruef-haus-trennung 66,
  pruef-treff 66, pruef-treff-werkzeuge 70, pruef-neue-seiten 93,
  pruef-befinden 48, pruef-schritt 46 -- alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 14:19:15 +02:00
DogFatherGitandClaude Opus 5 c615eab236 Entwicklung: aus einer Beobachtung wird ein Schritt
Filipe: "ich will die noch viel besser, perfektionniert, viel geiler
und krasser. es soll so einfach wie moeglich sein fuer jeden."

Die Karte konnte bisher genau eines: festhalten, dass etwas hakt --
mit Anlass, das war schon richtig. Danach passierte nichts. Beim
naechsten Oeffnen stand dieselbe Beobachtung da, nur aelter.

Die Quellen zur laufenden Entwicklungsbegleitung sagen zweierlei: weg
von der Bewertung, hin zum Gespraech -- und ein Entwicklungsplan wirkt
dann, wenn er an einer ECHTEN Aufgabe haengt. Nicht "daran arbeiten
wir", sondern etwas mit Verantwortlichem und Frist.

Also: An einem Punkt, der hakt, steht ein Knopf. Er legt eine Aufgabe
auf dem Brett an -- Titel = der Punkt, der Anlass wandert in die
Beschreibung (ohne ihn waere es ein Vorwurf), verantwortlich ist der
Mensch selbst, Frist in 14 Tagen. Die Karte zeigt danach, dass ein
Schritt laeuft, und verweist auf ihn.

UND DANN SCHLIESST SICH DER KREIS: Ist der Schritt erledigt, sagt die
Karte das und bittet, noch einmal hinzusehen. Das ist der Rhythmus,
den die Quellen meinen -- keine Bewertung einmal im Jahr, sondern eine
Runde, die zu Ende geht. Danach geht derselbe Punkt wieder.

Die Riegel: nur aus dem EIGENEN "da hakt es" (aus dem eines anderen
hiesse, in seinem Namen zu handeln), nur ein offener Schritt je Punkt,
nur Leitung, und ein Punkt aus Block 5 sieht von aussen aus wie ein
erfundener. Im Protokoll steht, DASS -- nie der Anlass.

NEBENBEFUND, beim Uebernehmen der Schreibweise gefunden: aufgaben.html
#a<nummer> stand an DREI Stellen im Haus (bereich.js, report.js, jetzt
die Entwicklungskarte) und wurde von keiner gelesen -- das Brett kannte
nur ?zeigen=, und eine Karte mit ihrer Nummer als Anker gab es nicht.
Wer draufdrueckte, landete auf dem Brett und suchte von Hand. Jetzt
tragen die Karten ihre Nummer, und das Brett hebt genau die eine
hervor. Alle drei Verweise funktionieren damit.

Und was die Pruefung an sich selbst gefunden hat: Ich habe die rechte
Hand ueber die Adresse von DogFather gerufen. Sie bekam 401 -- und WEIL
sie nichts setzen konnte, ging ein zweiter Test aus dem falschen Grund
durch. Ein gruener Haken ueber einer Leere.

  server/pruef-schritt.mjs    46 Pruefungen, 0 Fehler (Port 4421)
  pruef-uebergang 61, pruef-nachwuchs 123, pruef-entwicklung 43,
  pruef-uebernahme 39, pruef-aufgabenbrett, pruef-css-klassen -- 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 14:03:03 +02:00
DogFatherGitandClaude Opus 5 b85740dc20 Talente: der Uebergang, an dem die meisten verlorengehen
Filipe: "ich will dass du die 2 kategorien perfektionnierst. ich will
die noch viel besser, perfektionniert, viel geiler und krasser. es
soll so einfach wie moeglich sein fuer jeden."

Die AUSWAHL war der gut gebaute Teil dieser Seite: 21 Merkmale, sechs
Warnzeichen, ein Trichter mit Standzeiten. Die Stelle, an der Teams
tatsaechlich Leute verlieren, liegt dahinter -- zwischen dem "ja" und
der ersten echten Schicht. Wer zusagt und danach zwei Wochen nichts
hoert, hat innerlich schon abgesagt, und auf der Karte steht weiter
"angesprochen".

In der Beschreibung der Stufe "Probe" stand seit dem ersten Tag
"fester Buddy". Ein Feld dafuer gab es nicht. Ein Versprechen im Text
ist keine Eigenschaft des Systems -- erst eine Regel, die NEIN sagen
kann, ist eine.

Ab jetzt:

  - Auf die Probe kommt niemand ohne einen Namen und ein Datum. Die
    Absage sagt, welches von beiden fehlt, und die Karte bleibt dabei
    stehen, wo sie war.
  - Die Karte zeigt beides: wer einarbeitet, wann die erste Schicht
    ist -- in einem Satz, den man laut vorlesen kann ("Erste Schicht
    ist morgen."). Ein Termin weiter als 14 Tage ist erlaubt, wird
    aber benannt.
  - Drei Dinge fuer den ersten Tag stehen auf der Probekarte: was
    gilt, was du darfst, wen du fragst. Keine Haken -- der Buddy soll
    sie lesen, nicht abarbeiten.
  - Buddy und Termin lassen sich spaeter aendern, OHNE die Standzeit
    zurueckzusetzen: Sie ist die Auskunft ueber uns, nicht ueber den
    Kandidaten.
  - Wer geht, ist kein Buddy mehr -- stillgelegt wie geloescht. Die
    Karte sagt dann "bitte neu bestimmen" und ist am Rand markiert.

Recherche (Quellen im Kopf von workspace-talent-punkte.js): Discord
nennt Buddy und Mentoring als die beiden Trainingswege, die
funktionieren; aus der Freiwilligenarbeit kommt dieselbe Aussage mit
Zahlen. Und: Am ersten Tag braucht jemand drei Dinge, nicht dreissig.

Was die Pruefung gefunden hat: buddy_weg fragte "buddy_id gesetzt UND
Person weg" -- damit war der zweite Weg blind. Wird ein Mensch
geloescht, setzt ON DELETE SET NULL die Spalte auf NULL, die Karte sah
unauffaellig aus, und eine laufende Probe stand ohne jeden Buddy da.

  server/pruef-uebergang.mjs   61 Pruefungen, 0 Fehler (Port 4420)
  pruef-nachwuchs 123, pruef-entwicklung 43, pruef-css-klassen -- 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 13:55:26 +02:00
DogFatherGitandClaude Opus 5 d4730deb30 Wie geht's dir? bekommt eine eigene Seite
Filipe, zum Bildschirmfoto der Kachel: "ich will dass du diese seite
perfektionnierst den gerade wenn ich drauf druecke geht die
entwicklungsseite auf."

Der Fehler war schlimmer als ein falscher Verweis. Auf der Kachel
steht "die Antworten sieht nur du" -- und sie oeffnete eine Seite
voller Namen und Beobachtungen ueber ANDERE Menschen. Wer ihr glaubt
und drauftippt, sieht im ersten Moment das Gegenteil dessen, was
draufsteht.

Jetzt: eine Seite, ein Zweck.

  workspace/befinden.html + assets/js/befinden.js   die eigene Seite
  server/workspace-befinden.js                      Rhythmus + Verlauf
  entwicklung.html                                  nur noch ein Verweis

Was die Recherche zu Puls-Abfragen ergeben hat (Quellen im Kopf des
Moduls): kurz halten (fuenf bis fuenfzehn Fragen -- sechs bleiben
sechs), WIEDERHOLEN (zweiwoechentlich), und der VERLAUF ist die
Auskunft, nicht der Einzelwert. Bisher beantwortete man die sechs
Fragen einmal, und die Antwort stand fuer immer -- ein Befinden von
vor drei Monaten ist keine Auskunft mehr, sondern ein Andenken.

Der Verlauf gehoert ihr allein: eigene Tabelle, kein von_id, kein
anderer Weg im Haus liest sie. Im Protokoll steht nur, DASS eine
Runde war, nie was darin stand. Die Ampel zaehlt weiterhin nur den
aktuellen Stand und kennt keine Namen.

Zwei Dinge, die erst die Pruefung gefunden hat:

  - Wer die neue Seite oeffnete, ohne dass vorher jemand die
    Entwicklungsseite besucht hatte, bekam "no such table" und eine
    503. entwicklung_stand wird beim ersten Aufruf angelegt, nicht
    beim Start. Die Tabelle wird jetzt angefordert, nicht ein zweites
    Mal abgeschrieben.
  - pruef-entwicklung suchte die Kachel ueber ziel ===
    "entwicklung.html" und hat den gemeldeten Fehler damit
    mitgetragen. Sie sucht jetzt die eigene Seite -- und prueft
    zusaetzlich, dass keine Kachel mehr ersatzweise dorthin fuehrt.

Ausserdem weg: die tote Funktion meins() in entwicklung.js (sie
zeichnete in drei Stellen, die es nicht mehr gibt) und der Titel
"Wie geht's dir?", den diese Seite fuer einen Modi trug -- er
versprach etwas anderes als die Seite zeigt, also derselbe Fehler
wie an der Kachel.

  server/pruef-befinden.mjs   48 Pruefungen, 0 Fehler (Port 4419)
  pruef-entwicklung           43 (vorher 40), 0 Fehler
  pruef-nachwuchs 123, pruef-rechtetafel 19, pruef-rechte-umstellen 46,
  pruef-css-klassen -- alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 13:45:56 +02:00
DogFatherGitandClaude Opus 5 2712473f16 Womit anfangen? -- Stufe 9 ist damit vollstaendig
Letztes Stueck aus dem Plan zur Perfektion: "Wichtig-vs-Aufwand im
Report".

DIE FRAGE, DIE EINE AUFGABENLISTE NICHT BEANTWORTET

Ein Brett mit dreissig offenen Karten sagt, WAS zu tun ist. Es sagt
nicht, WOMIT man anfaengt. "Wichtig" allein hilft dabei nicht: Sind
acht Karten wichtig, ist keine davon die erste.

Die zweite Angabe, die dafuer fehlte, ist der AUFWAND -- eine Spalte,
mehr nicht. "Wichtig" gibt es schon, das ist die Prioritaet; es wird
kein zweites Feld dafuer erfunden.

VIER FELDER, UND JEDES SAGT, WAS ZU TUN IST

  wichtig + klein   SOFORT      in einer halben Stunde erledigt, und es zaehlt
  wichtig + gross   EINPLANEN   braucht einen Termin, keinen guten Willen
  normal  + klein   NEBENBEI    wenn zwischendurch Luft ist
  normal  + gross   SPAETER     ehrlich: das wird gerade nichts

Die Namen sind Handlungsanweisungen, keine Etiketten. "Quadrant 2" sagt
niemandem, was er tun soll.

OHNE SCHAETZUNG VERSCHWINDET NICHTS

Der Aufwand ist freiwillig -- und laesst sich zuruecknehmen. Aufgaben
ohne Schaetzung landen deshalb nicht stillschweigend irgendwo, sondern
in einer eigenen, klar benannten Gruppe: "noch nicht eingeschaetzt".
Eine Uebersicht, die einen Teil der Arbeit unsichtbar macht, ist
schlimmer als keine -- man verlaesst sich darauf und uebersieht genau
das, was fehlt. Die Pruefung zaehlt deshalb nach, dass die Summe der
Felder die Summe der offenen Aufgaben ist.

DREI STUFEN, NICHT FUENF. Fuenf klingen genauer und sind es nicht:
Niemand unterscheidet verlaesslich zwischen "eher mittel" und "eher
gross". Drei kann man ohne Nachdenken vergeben, und nur was ohne
Nachdenken geht, wird auch gepflegt.

KEINE CHECK-LISTE IN DER DATENBANK. Die erlaubten Werte stehen in
workspace-womit.js; eine CHECK-Liste daneben waere eine zweite
Wahrheit, die beim naechsten Wert ueber einen Tabellenneubau
nachgezogen werden muesste -- und dabei sind im Projekt schon dreimal
Spalten verlorengegangen. Geprueft wird beim Schreiben, an der Stelle,
die die Liste kennt. Die Oberflaeche baut ihre Auswahl ebenfalls aus
dieser Liste, statt drei <option>-Zeilen zu fuehren.

PRUEFUNGEN: pruef-womit neu mit 41, davon 10 im Browser. Darunter die
Zeile, die zaehlt: nichts verschwindet.

STUFE 9 IST DAMIT DURCH: Idee -> Aufgabe, Dateifassungen, Anhaenge an
Aufgaben, Eskalationsstufe, Wichtig-vs-Aufwand.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 13:29:39 +02:00
DogFatherGitandClaude Opus 5 2d5972f45f Wie lange geht das schon so -- Eskalation statt eines Schalters
Stufe 9 aus dem Plan: "Eskalationsstufe sichtbar". Damit ist Stufe 9
bis auf einen Punkt durch.

DER MANGEL, GEMESSEN

"Ueberfaellig" war ein Schalter: an oder aus. Eine Aufgabe, deren Frist
gestern lief, sah genauso aus wie eine, die seit drei Wochen liegt --
dasselbe Wort, dieselbe Farbe, derselbe Platz.

Damit verliert das Wort seine Bedeutung. Stehen auf einem Brett zwanzig
Karten "ueberfaellig", sagt keine davon mehr etwas; man ueberliest sie
alle, auch die, die seit einem Monat blockiert.

ZWEI VERSCHIEDENE FRAGEN, DIE NICHT VERMISCHT WERDEN DUERFEN

  FRIST UEBERSCHRITTEN   Es war etwas versprochen, der Termin ist
                         vorbei. Eine Tatsache.
                         faellig (ab 1 Tag) -> liegt (ab 3) -> haengt (ab 8)

  NICHTS PASSIERT        Keine Frist, aber seit 14 Tagen hat niemand
                         die Karte angefasst. Eine Beobachtung.

Die erste ist haerter und steht vorn. Eine Aufgabe ohne Frist ist nicht
"zu spaet" -- sie ist nur still. Beides in einen Topf zu werfen hiesse,
jemandem einen gebrochenen Termin vorzuwerfen, den er nie zugesagt hat.
Deshalb ist "still" auch farblos gezeichnet, gestrichelt statt gefuellt.

DAS IST KEINE MAHNUNG

Dieselbe Haltung wie bei der Standzeit im Talente-Trichter: Die Zahl ist
eine Auskunft ueber UNS, kein Vorwurf an eine Person. Deshalb steht
nirgends ein Name, und die hoechste Stufe heisst "haengt", nicht
"versaeumt".

DIE SCHWELLEN SIND GESETZT, NICHT GEMESSEN -- und das steht so im Code:
unter 3 Tagen reicht ein Wochenende; ab 3 ist es ein Zustand; ab 8 (ueber
eine Woche) kommt es ohne Hilfe auch naechste Woche nicht dazu. Aendert
sich eine Zahl, aendert sie sich an einer Stelle, und die Oberflaeche
zieht mit -- sie bekommt das WORT vom Server.

AM SERVER GERECHNET. Startseite, Brett und Uebersicht lesen dieselbe
Liste. Drei Stellen, die dieselbe Frage selbst beantworten, geben
irgendwann drei Antworten -- genau der Fehler, der im Projekt schon bei
der Rollenreihenfolge und beim Wort "Agentur" passiert ist.

DIE FARBE IST NICHT DIE AUSKUNFT: In jedem Kaestchen steht ein Wort
("liegt seit 5 Tagen"), nicht nur ein roterer Punkt.

PRUEFUNGEN: pruef-eskalation neu mit 40, davon 6 im Browser. Gemessen
wird an den GRENZEN, nicht in der Mitte -- jede Schwelle dreimal: einen
Tag davor, genau darauf, einen Tag danach. Die wichtigste ist die erste:
am Tag der Frist ist nichts ueberfaellig. Wer bis zum 15. Zeit hat, ist
am 15. puenktlich; eine Eskalation, die einen Tag zu frueh anschlaegt,
verliert genau das Vertrauen, das sie braucht.

Die Pruefung benutzt einen FESTEN Zeitpunkt als Eingabe, keine
Wanderuhr -- sonst misst sie irgendwann das Gegenteil.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 13:22:55 +02:00
DogFatherGitandClaude Opus 5 1386534051 Anhaenge an Aufgaben -- ohne eine zweite Dateiablage
Stufe 9 aus dem Plan. Eine Aufgabe "Vertrag pruefen" ohne den Vertrag
daneben ist eine Aufforderung zum Suchen.

KEIN ZWEITER HOCHLADEWEG

Dateien leben in der Dateiablage -- mit ihrer Sichtbarkeit, ihren
Freigaben, ihren Fassungen und ihrem Protokoll. Ein eigener Weg an der
Aufgabe waere eine zweite Ablage mit einer zweiten Rechtelogik gewesen,
und die zweite ist immer die, die etwas durchlaesst.

Deshalb nur eine Spalte: Die Datei WEISS, zu welcher Aufgabe sie
gehoert. Hochgeladen wird ueber denselben Weg wie immer, mit einem Kopf
mehr. Alles andere bleibt, wo es schon richtig ist -- die Anhaenge
tragen deshalb auch ihre Fassungsnummer und die Warnung "nicht mehr
aktuell" mit, ohne dass dafuer eine Zeile geschrieben werden musste.

DER RIEGEL

Waere `x-aufgabe` ungeprueft, waere der Kopf ein Weg, die Existenz
fremder Aufgaben zu erfahren -- man muesste nur Zahlen durchprobieren.
Geprueft wird deshalb gegen dieselbe Schranke wie fuer die Datei
selbst: `darfCreator`, die eine Stelle im Haus, an der diese Frage
beantwortet wird. Eine eigene Herleitung hier waere eine zweite Meinung
darueber gewesen. (Erster Anlauf: genau so eine Herleitung, mit einer
Funktion, die gar nicht importiert war.)

Gemessen: Ein Scout darf an die Aufgabe SEINER Creatorin, an die eines
fremden Creators nicht -- mit wortgleicher Absage wie bei einer
erfundenen Nummer. Der Unterschied waere sonst die Auskunft. Und es
bleibt auch keine lose Datei liegen: Die Pruefung findet vor dem ersten
Byte statt.

ON DELETE SET NULL, NICHT CASCADE

Der wichtigste Teil der Spalte: Wer eine Aufgabe loescht, will die
Aufgabe loeschen, nicht den Vertrag, der daran hing. Die Datei verliert
nur ihren Bezug und steht danach wieder in der Ablage. Gemessen.

EIN EIGENER FEHLER, GEFUNDEN BEIM MESSEN

Der Verweis am Anhang zeigte auf /workspace/api/dateien/:id -- den es
gar nicht gibt, der Weg heisst /inhalt. Die Pruefung ruft ihn jetzt
wirklich auf und erwartet 200, statt nur die Adresse zu vergleichen.

PRUEFUNGEN: pruef-anhaenge neu mit 37, davon 8 im Browser.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 13:12:41 +02:00
DogFatherGitandClaude Opus 5 478a2895b5 Dateifassungen: die alte Fassung sieht man ihr an
Stufe 9 aus dem Plan: "Dateiversionen statt Ueberschreiben".

GEMESSEN, BEVOR ETWAS GEBAUT WURDE -- DER PLAN LAG DANEBEN

Ueberschrieben wurde nie: `name_datei` ist eindeutig und zufaellig,
jedes Hochladen legt eine neue Zeile an. Der wirkliche Mangel ist ein
anderer, und er ist gefaehrlicher als Ueberschreiben:

  Zwei Dateien gleichen Namens standen BEZIEHUNGSLOS nebeneinander. Die
  alte kann "freigegeben" sein, die neue "entwurf" -- und wer die Liste
  ansieht, laedt die freigegebene herunter. Also die falsche. Kein
  Fehler, keine Meldung, nur die alte Fassung in der Hand.

WAS JETZT PASSIERT

Beim Hochladen erkennt der Server die Vorgaengerin selbst: gleicher
Originalname, gleicher Creator-Bezug, und sie darf nicht schon ersetzt
sein. An der Datei steht danach "Fassung 2"; an der alten steht "nicht
mehr aktuell".

  AUTOMATISCH, NICHT GEFRAGT -- eine Abwaegung: Wer die Verknuepfung
  vergisst, hat zwei Dateien ohne Zusammenhang, und irgendwann laedt
  jemand die alte herunter. Wer sie faelschlich bekommt, SIEHT das
  sofort und loest sie mit einem Klick. Der stille Schaden ist groesser
  als der sichtbare.

  BEI ZWEIFEL WIRD NICHT GERATEN. Gibt es zwei unersetzte Dateien
  gleichen Namens, bleibt die neue eigenstaendig.

  LOESEN GEHT NUR AN DER AKTUELLEN FASSUNG. Wer eine ueberholte loest,
  macht daraus eine zweite aktuelle -- und hat das Problem zurueck.

  DIE NUMMER IST GERECHNET, NICHT GESPEICHERT. Eine Spalte "version"
  muesste beim Loeschen einer mittleren Fassung nachgezogen werden, und
  genau das vergisst man. Faellt die erste weg, zaehlt die zweite
  wieder als erste -- richtig, denn mehr weiss das System dann nicht.

  EIN RING IN DEN DATEN HAELT DIE SEITE NICHT AN. Kann ueber die Wege
  hier nicht entstehen, aber ein Fehler anderswo koennte ihn erzeugen,
  und ein Stillstand ist schlimmer als ein Fehler. Gemessen: 1 ms.

ZWEI SITZUNGEN IM SELBEN VERZEICHNIS

Der vorige Commit (d2210fd, aus einer anderen Sitzung) hat mit
`git add -A` meine damals noch unfertige Spalte `dateien.ersetzt_id`
mitgenommen -- sie steht dort unter einer Ueberschrift, die nichts
damit zu tun hat. Niemand hat etwas falsch gemacht; die Sitzungen
konnten voneinander nicht wissen. Aufgefallen ist es, weil der
Versionsstempel ploetzlich 347 statt 372 Verweise meldete und ich dem
Rueckgang nachgegangen bin.

PRUEFUNGEN: pruef-fassungen neu mit 37, davon 6 im Browser.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 12:58:26 +02:00
DogFatherGitandClaude Opus 5 d2210fdd77 Der Erklaerkasten auf jeder Seite ist weg
Filipe, mit dem Kasten im Bild: "das muss sofort weg. ueberall das ist
scheisse."

Entfernt, nicht ausgeblendet:
  - workspace/assets/js/erklaerung.js
  - server/workspace-erklaerung.js samt Router-Einbindung in index.js
  - server/pruef-erklaerung.mjs
  - der Stilblock in start.css
  - die Skript-Zeile auf allen 25 Seiten

AUSGEBLENDET WAERE KEIN ENTFERNEN. Der Weg haette weiter geantwortet,
das Skript waere weiter geladen worden, und beim naechsten Umbau waere
der Kasten irgendwo wieder aufgetaucht. Was weg soll, wird weggenommen.

NACHGEMESSEN STATT ANGENOMMEN:
  - kein Verweis auf die geloeschten Dateien mehr im Repo,
  - der Server startet ohne Fehler (frische Datenbank, Protokoll leer),
  - keine Reste (erkl__, erklaerung.js) in Seiten oder Stilvorlagen.

Vier andere Pruefungen nennen ebenfalls "Erklaerung" -- sie meinen
ANDERE: den Satz im Neu-Fenster des Chats, die Stufen-Seite, die
Rollenkarten. Die bleiben unberuehrt; nachgesehen, nicht vermutet.

pruef-workspace-seiten, pruef-css-klassen und pruef-lesbarkeit laufen
gruen. Die Zahl der Pruefungen sinkt um die der geloeschten Datei --
das ist hier richtig: Sie prueften etwas, das es nicht mehr gibt.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 12:52:13 +02:00
DogFatherGitandClaude Opus 5 d76d9aa5da Aus einer Idee wird Arbeit -- mit einem Knopf statt mit Abtippen
Stufe 9 aus dem Plan zur Perfektion: "Idee -> Aufgabe/Termin".

WARUM DAS MEHR IST ALS EINE BEQUEMLICHKEIT

Das ganze Haus steht auf einem Satz: "Was hier nicht steht, passiert
nicht." Ein Ideenbrett, aus dem keine Aufgabe werden kann, ist der eine
Ort, an dem dieser Satz nicht gilt -- dort steht etwas, und passieren
tut es trotzdem nicht. Wer eine Idee umsetzen wollte, tippte sie ein
zweites Mal ab. Und was man abtippt, tippt man irgendwann nicht mehr ab.

DREI ENTSCHEIDUNGEN

  GENAU EINMAL. Ein zweiter Versuch fuehrt nicht zu einer zweiten
  Aufgabe, sondern zum Verweis auf die vorhandene (409). Gefragt wird
  an der AUFGABE, nicht an der Idee: Dort steht die Tatsache, und sie
  kann nicht auseinanderlaufen.

  DIE IDEE BLEIBT STEHEN. Sie wird nicht verschoben und nicht geloescht
  -- wer nachsieht, was aus einem Gedanken geworden ist, soll den
  Gedanken noch finden, und daneben die Antwort.

  DIE AUFGABE WEISS, WOHER SIE KAM. `aus_eintrag_id` mit echtem
  Fremdschluessel, nicht als Text im Beschreibungsfeld. Ein Verweis, den
  nur ein Mensch lesen kann, ist kein Verweis. ON DELETE SET NULL, nicht
  CASCADE: Wird die Idee geloescht, bleibt die Arbeit.

NICHT AUS JEDEM BRETT

Aus einem Beitrag im Treff wird keine Aufgabe. Was jemand aus der
Community schreibt, gehoert ihm; daraus stillschweigend Arbeit zu
machen waere eine Verwendung, mit der er nicht rechnet. Welche Bretter
es sind, entscheidet der Server -- die Oberflaeche fragt nach, statt
eine zweite Liste zu fuehren.

WAS ABSICHTLICH NICHT MITWANDERT: die Frist. Eine Idee hat keinen
Termin; wer ihr beim Uebernehmen automatisch einen gaebe, erfaende ihn.
Die Dringlichkeit wandert dagegen mit -- dieselben drei Stufen.

ZUSTAENDIG IST, WER UEBERNIMMT, nicht wer die Idee aufgeschrieben hat.
Eine Aufgabe, die jemandem ohne sein Zutun zugeteilt wird, wird nicht
angefangen.

ZWEIMAL AM FALSCHEN ORT GELANDET

Der Knopf stand erst in `if (lage.team)`, dann immer noch innerhalb von
`if (treffBrett && lage)` -- also beide Male ausgerechnet am Treff und
an keinem Arbeitsbrett. Gefunden hat das beide Male die Pruefung im
Browser ("0 Knoepfe auf dem Ideenbrett"), nicht das Lesen. Jetzt steht
er in der allgemeinen Knopfreihe, hinter `darfEintragen()` -- eine
Uebernahme ist ein Schreibvorgang.

Und die Gegenprobe zur Brettliste lief anfangs ins Leere: Sie fragte
nach `BEREICHE[b].treff`, ein Merkmal, das es nicht gibt, und fand null
Treff-Bretter -- eine Gegenprobe, die nichts gegenprueft. TREFF_BRETTER
steht in workspace.js.

PRUEFUNGEN: pruef-uebernahme neu mit 39, davon 4 im Browser (der Klick
muss eine Aufgabe in der DATENBANK erzeugen, nicht nur eine Meldung).

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 12:25:36 +02:00
DogFatherGitandClaude Opus 5 b9f261bbac Das Mindestalter wird eingeloest statt behauptet -- Stufe 8 ist damit durch
Auf der Regelseite des Treffs steht seit dem 11.09. "ab 18". Geprueft
wurde es nirgends: MINDESTALTER war ein Text auf einer Seite, sonst
nichts. Eine Regel, die nur dasteht, ist keine -- im Streitfall ist sie
sogar schlechter als keine, weil man sie versprochen hat.

DIE FRAGE STEHT AN DER TUER

Ein Community-Mitglied bestaetigt beim ERSTEN Hereinkommen, mindestens
18 zu sein. Danach nie wieder.

  An der Tuer und nicht auf einer Seite dahinter: Eine Sperre auf den
  Brettern liesse sich ueber eine andere Adresse umgehen und muesste
  auf jeder kuenftigen Seite mitgedacht werden. Die Tuer gibt es genau
  einmal.

  Ein EIGENER Fehler (400 alter_offen), nicht "ungueltig": Hier ist der
  Code richtig. Wer dieselbe Antwort bekaeme wie bei einem Tippfehler,
  tippte seinen Code immer wieder neu ein, und es wuerde nie besser.

  Und es zaehlt NICHT als Fehlversuch. Sonst sperrt sich jemand mit dem
  richtigen Code nach acht Anlaeufen selbst aus.

  Nur die Community: Wer zum Team gehoert, hat seinen Zugang von
  DogFather persoenlich bekommen -- da ist die Frage vorher geklaert.

NUR EIN ZEITSTEMPEL, KEIN GEBURTSDATUM

Gebraucht wird die Antwort auf "hat bestaetigt, und wann" -- nicht der
Geburtstag. Ein Geburtsdatum waeren mehr Daten fuer dieselbe Auskunft,
und Datenminimierung gilt auch fuer das eigene Nachweisbeduerfnis. Eine
Spalte, mehr nicht.

DIE RECHTSGRUNDLAGE FOLGT AUS DER ROLLE -- UND WIRD NICHT GESPEICHERT

Ein Modi arbeitet hier (Vertrag), ein Community-Mitglied ist freiwillig
da (Einwilligung). Was sich ableiten laesst, bekommt keine Spalte:
sonst gaebe es zwei Wahrheiten, von denen eine veraltet, sobald jemand
die Rolle wechselt. Sie steht jetzt in jeder Auskunft (Art. 15 Abs. 1
lit. a) und im Loeschkonzept.

MINDESTALTER ZIEHT INS IMPORTFREIE BLATT

Die Tuer braucht die Zahl jetzt auch, und ein Import zwischen
workspace.js und workspace-treff.js waere ein Kreis -- genau der Grund,
aus dem treff-tabellen.js existiert. Die Zahl steht weiterhin an EINER
Stelle; der Regeltext bekommt sie unveraendert.

EIN EIGENER FEHLER, GEFUNDEN VON DER PRUEFUNG

Ich hatte `export { MINDESTALTER } from "./treff-tabellen.js"` benutzt --
eine Durchreiche. Der Name ist damit fuer IMPORTEURE da, aber nicht in
der Datei selbst. Die Regelroute benutzt ihn selbst und lief in einen
ReferenceError, und zwar erst beim Aufruf. pruef-alter hat es gesehen,
nicht das Auge.

VIER PRUEFUNGEN MUSSTEN NACHZIEHEN

pruef-treff, pruef-treff-werkzeuge, pruef-auskunft und pruef-neue-seiten
melden sich als Community an. Sie schicken das Haekchen jetzt mit --
aber NUR fuer 'gast'. Ginge es immer mit, koennte keine Pruefung mehr
sehen, ob der Server es fuer das Team ueberhaupt ignoriert.

PRUEFUNGEN: pruef-alter neu mit 35, davon 7 im Browser. Darunter die,
die man vergisst: Wird beim ZWEITEN Mal wieder gefragt? (nein) -- denn
eine Abfrage, die jedes Mal kommt, wird weggeklickt, ohne gelesen zu
werden, und bestaetigt ab da nichts mehr.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 01:09:52 +02:00