Commit Graph
100 Commits
Author SHA1 Message Date
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 4a440e42d8 Die Community-Texte sind auf DogFather bezogen
Filipe, mit einem Bildschirmfoto der fertigen Vorschlaege im Treff:
"die sachen sollen immer auf mich bezogen sein bitte. ich, dogfather
bin der mittelpunkt immer."

Er hatte recht, und es war MESSBAR: 47 Eintraege, "DogFather" kam
FUENFMAL vor, ein namenloses "wir" sechzehnmal. Das las sich wie der
Community-Bereich von irgendwem.

Jetzt 39 von 52 (75 %) -- und die vier Bretter, die die Community
wirklich sieht, zu 100 %: Treff, Anschlagbrett, Wunschliste,
Highlights. Dazu fuenf neue Eintraege, die es vorher gar nicht gab
("Wer ist DogFather ueberhaupt?", "Was soll Casper mal machen?",
"Mehr mit Casper", "Die drei Kanaele", "Ein Ausschnitt fuer die
Clips").

Aus "Was sollen wir im naechsten Stream machen?" wird "Was soll
DogFather im naechsten Stream unbedingt machen?". Aus "Sag Hallo -- wie
bist du hier gelandet?" wird "ueber welchen Kanal bist du gekommen?"
-- und nennt die drei beim Namen.

UND ES WIDERSPRICHT DER ANDEREN REGEL NICHT.
Filipe am 18.08.2026: "mich bitte nie wie da hoeher stellen wie andere,
ich bin genau so viel wert wie die andere." Das galt dem TEAM --
Manager, Scouts, Modis. Hier geht es um die Community, und die ist
wegen seiner Streams da. Wo das Team in diesen Texten vorkommt, steht
es weiter auf Augenhoehe: Es moderiert, es entscheidet im Alltag
selbst, es wird nicht als Gefolge beschrieben. In "Wer entscheidet
das" steht beides nebeneinander.

WARUM EINE QUOTE UND NICHT "JEDER TEXT":
Bei der Telefonseelsorge oder "Melden ist kein Petzen" waere ein
eingebautes "DogFather" aufgesetzt. Ein Text, der den Namen trotz
allem traegt, ist schlechter als einer ohne. Deshalb 60 % als Grenze
und 100 % dort, wo es um seine Streams geht.

pruef-treff-start jetzt 41 Pruefungen, mit Gegenprobe in beide
Richtungen: Ein anonymer Satz MUSS erkannt werden, ein bezogener darf
nicht faelschlich anschlagen.

pruef-deutsche-texte 12 gruen -- die neuen Texte tragen echte Umlaute.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 12:30:32 +02:00
DogFatherGitandClaude Opus 5 4bd19a4096 Die Community-Rolle laesst sich endlich anlegen
Filipe: "und wieso kann ich immer noch keine community rolle
erstellen?"

Nachgemessen statt geraten: Die Auskunft schickte "gast/Community" als
waehlbare Rolle mit, die Oberflaeche baute den Knopf daraus -- und das
Anlegen antwortete 400 "Unbekannte Rolle." Genau so reproduziert.

DIE URSACHE: EINE LISTE, ZWEI FRAGEN
Die Pruefung las `ROLLEN`, und `ROLLEN` ist `ROLLEN_REIHE` -- die
SORTIERREIHENFOLGE. Dort fehlt "gast" mit Absicht; der Kommentar in
workspace.js sagt es woertlich ("steht mit Absicht NICHT in der Liste,
sie faellt ans Ende").

`ROLLEN_REIHE` beantwortet "in welcher Reihenfolge", nicht "welche gibt
es". Genau davor wird in diesem Haus an zehn Stellen gewarnt -- und
hier stand es vier Zeilen ueber der Stelle, an der es passiert ist.

Gefragt wird jetzt `darfAnlegen` -- dieselbe Auskunft, aus der die
Oberflaeche ihre Knoepfe baut. Damit koennen die beiden nicht mehr
auseinanderlaufen.

ZWEI NEBENBEFUNDE, beide groesser als der gemeldete Fehler:

1. DIE ALTE PRUEFUNG LIESS "admin" DURCH. `ROLLEN_REIHE` enthaelt sie.
   Filipes Regel vom 11.09. ("dogfather soll man nicht auswaehlen
   koennen, das ist die einzige die man nicht auswaehlen kann") stand
   nur in ANLEGBAR -- und die wurde hier nicht gefragt. Es liess sich
   also ein zweiter DogFather-Zugang anlegen.

2. DIESELBE ZEILE STAND EIN ZWEITES MAL, beim Rollenwechsel. Auch eine
   bestehende Person liess sich nicht zu "Community" machen. Dort stand
   die richtige Pruefung (`darfAnlegen`) schon direkt darunter -- die
   falsche davor kam ihr nur zuvor. Und sie antwortete gespraechiger
   (403 "Diese Rolle vergibst du nicht." gegen 400 "Unbekannte
   Rolle."); wer durchprobiert, haette daran ablesen koennen, welche
   Rollen es gibt. Jetzt beide Faelle wortgleich.

   Gefunden hat das nicht das Lesen, sondern die neue Pruefung: Ihre
   Suche nach der alten Zeile reichte in die Nachbarroute hinein.

NEU: pruef-rollen-anlegen (11 Pruefungen)
Sie schreibt keine Liste ab, sondern holt sich die Rollen aus
`darfAnlegen` -- derselben Quelle wie Route und Oberflaeche -- und legt
JEDE davon wirklich an. Eine eigene Liste waere eine dritte gewesen und
damit dieselbe Falle noch einmal.

Dazu die Gegenproben: eine erfundene Rolle, eine leere, und ein zweiter
DogFather -- alle drei abgelehnt.

pruef-rollen 315, pruef-personen-formular 36, pruef-personen-liste,
pruef-rechtetafel 19: gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 12:24:11 +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 3ebe87611e Dreizehn fortgeschrittene Aufgaben -- und die ersten, die es ohne den Kanal nicht geben konnte
Filipe: "ich will auch dass es fortgeschrittene aufgaben gibt."

88 -> 101 Aufgaben, Stufe "Erfahren" von 29 auf 42. Kein doppelter
Schluessel, kein Text unter der Laenge, die `pruef-modi-katalog`
verlangt (der Text muss BEGRUENDEN, nicht den Titel wiederholen).

DER PUNKT IST NICHT DIE ZAHL, sondern dass mehrere davon vorher gar
nicht formulierbar waren. Erst seit es Kanaele gibt, kann eine Aufgabe
lauten:

  "Denselben Moment fuer zwei Kanaele verschieden schneiden --
   was auf dem Hauptkanal als Rueckblick funktioniert, braucht bei
   Clips einen haerteren Einstieg."

  "Einen Monat lang nichts vom Hauptkanal spiegeln -- erst wenn der
   Nebenkanal sich allein traegt, weiss man, ob er ein Kanal ist oder
   ein Echo."

  "Die Kanaele in einer Tabelle nebeneinanderstellen -- einzeln
   angesehen waechst jeder irgendwie."

Dazu Sachen, die eine erfahrene Person von einer eingearbeiteten
unterscheiden: messen, was ein Ausschnitt an ZEIT kostet; denselben
Ausschnitt zweimal mit anderem Anfang veroeffentlichen; eine Woche
planen, in der DogFather nicht da ist; jedem Kanal einen festen Kopf
geben.

Die feste Zahl in pruef-modi-katalog ist mitgezogen (88 -> 101). Sie
bleibt bewusst fest: Eine Zahl, die sich selbst nachzaehlt, merkt
nicht, wenn etwas herausfaellt.

pruef-modi-katalog 49 und pruef-deutsche-texte 9 gruen -- die neuen
Texte tragen echte Umlaute, nicht ae/oe/ue.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 03:08:24 +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 b57b9cebb5 Der Ring oben zeigt Arbeit statt der Uhrzeit
Auf der Startseite von Creator, rechter Hand und Modis ist der Ring das
groesste Element, ganz oben. Er rechnete:

    prozent = (aktuelle Stunde - 6) / 18

...und nannte das "Tag geschafft". Um 9 Uhr also 17 %, um 23 Uhr 94 %
-- unabhaengig davon, ob jemand etwas getan hatte.

Aufgefallen auf einem Bildschirmfoto: Bei einer Modi stand "0 % TAG
GESCHAFFT", waehrend sie ueberhaupt nichts offen hatte. Beide Angaben
waren fuer sich richtig und zusammen Unsinn -- und es war das Erste,
was sie sah.

JETZT ZAEHLT ER ARBEIT. Nenner ist, was heute auf dem Tisch liegt:
heute faellig ODER laenger offen. Die naheliegende Rechnung ueber "nur
heute faellig" waere derselbe Fehler noch einmal gewesen -- bei drei
ueberfaelligen Sachen haette der Ring "nichts faellig" gemeldet.
Zaehler ist, was HEUTE fertig wurde (erledigt_am), nicht was irgendwann
abgehakt wurde. Liegt nichts an: voller Ring, und der Titel sagt es in
Worten statt nur eine 100 zu zeigen.

Gemessen danach, dieselbe Seite: "33 % Heute geschafft", darunter
"2 Sachen sind ueberfaellig -- das zuerst". Die Seite erzaehlt jetzt
eine Geschichte statt zweier.

NEU: pruef-zentrale-ring (10 Pruefungen)
Drei Lagen, drei Menschen: etwas anliegend und teils fertig / nichts
anliegend / drei ueberfaellige und nichts fertig. Dazu zwei
Abgrenzungen (morgen faellig und vorgestern erledigt duerfen nicht
mitzaehlen) und die Gegenprobe: zwischen zwei Abfragen wird eine
Aufgabe fertig gemacht, der Ring MUSS springen -- er tut es, 0 % -> 33 %.
Der letzte Abschnitt rechnet die alte Uhrzeit-Formel mit und meldet,
falls der Ring je wieder auf ihren Wert faellt.

NEU: mess-startseite -- ein Messwerkzeug, kein Pruefwerkzeug
Es sagt nicht richtig/falsch, sondern wie viel da ist: Seitenlaenge in
Handy-Bildschirmen, Bedienelemente, Woerter, Ring, je Rolle, mit
echten Aufgaben statt im leeren Zustand. Gemessener Stand:

    admin 7,0 Schirme / 58 Bedienelemente   hand    5,7 / 43
    modi  5,0 / 37                          manager 4,9 / 38
    scout 4,5 / 34                          creator 4,3 / 32

pruef-sicht, pruef-verborgen, pruef-modi-verborgen und
pruef-haus-trennung laufen unveraendert durch -- die neue Abfrage
folgt der fremden Sicht ueber dieselbe Variable wie der Rest.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-17 02:21:12 +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 99f96553c5 Eine Benachrichtigung muss irgendwohin fuehren
Der letzte offene Punkt aus dem Umbau vom 15.09.: Seitdem entscheidet
die Adresse, welche Seiten es gibt -- fuer Seiten, Hinweise und
Suchtreffer ist das umgesetzt, fuer Push war es das nicht. Und der
Grund stimmte: Eine Benachrichtigung entsteht, wenn NIEMAND auf einer
Adresse steht. Sie geht an ein Geraet, und das oeffnet die Adresse, als
die es installiert wurde.

DIE FRAGE LAESST SICH TROTZDEM BEANTWORTEN -- nur nicht ueber die
Adresse, sondern ueber den MENSCHEN. Wer im Team ist (rechte Hand,
Modi), kommt NUR auf crew. herein; das steht in
sitzungPasstZurAdresse und gilt in beide Richtungen. Fuer ihn gibt es
die Agenturseiten nirgends -- auf keinem Geraet, in keiner
installierten App.

Erst gemessen, welche Ziele es ueberhaupt gibt und wer sie bekommt:

  aufgaben.html   an den Verantwortlichen -- kann ein Modi sein, und
                  die Seite gibt es auf crew.           in Ordnung
  calls.html      an die TERMIN-TEILNEHMER              <- der Fall
  kalender.html   dieselben Empfaenger, Seite gibt es   in Ordnung
  scouting.html   nur an Scouts                         in Ordnung
  start.html      ueberall                              in Ordnung

Ein Modi, der als Teilnehmer in einem Call steht, bekam also einen
Hinweis auf eine Seite, die es fuer ihn nicht gibt.

UND DIE BENACHRICHTIGUNG WIRD NICHT UNTERDRUECKT. Das ist die
eigentliche Entscheidung: Er SOLL erfahren, dass der Call gleich
anfaengt -- er soll nur nicht auf einer Seite landen, die ihn
weiterleitet. Statt der Seite kommt die Startseite; dort steht, was
ansteht. Eine Weiterleitung ins Leere sieht aus wie ein Fehler, eine
Startseite nicht.

An EINER Stelle, durch die jede Benachrichtigung geht. DogFather und
Spicy Media arbeiten in beiden Haeusern -- fuer sie bleibt jedes Ziel,
das es in einem der beiden gibt; welches Geraet sie in der Hand
halten, weiss hier niemand, und die Seitenschranke faengt den Rest ab.

`benachrichtige` gibt jetzt zurueck, WOHIN wirklich geschickt wurde.
Sonst muesste eine Pruefung die verschluesselte Nachricht aufmachen,
um es zu erfahren -- das beweist pruef-push-weg mit einem nachgebauten
Browser bereits, und zweimal dieselbe Maschinerie waere die zweite,
die veraltet.

  server/pruef-push-ziel.mjs   10 Pruefungen, 0 Fehler (Port 4423/4424)
  Mit Gegenprobe in beide Richtungen: aufgaben.html und befinden.html
  bleiben stehen (sonst hiesse "wird zur Startseite" nur, dass jedes
  Ziel dorthin faellt), eine Managerin wird weiterhin zu den Calls
  geschickt, und ein echter Push-Dienst zaehlt mit, dass die acht
  Nachrichten auch wirklich rausgegangen sind.

  pruef-push, pruef-push-weg, pruef-glocke -- alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-16 18:43:08 +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
DogFatherGitandClaude Opus 5 6643e530a8 Auskunft auf Knopfdruck -- und die Quellenliste pflegt sich selbst
Zweite Haelfte von Stufe 8, Art. 15 DSGVO. Jeder Mensch hier darf
wissen, was ueber ihn gespeichert ist: DogFather, die rechte Hand,
jeder Modi, jede Creatorin -- und jedes Mitglied der Community.

DIE LISTE DER QUELLEN WIRD ABGELEITET, NICHT GEPFLEGT

Eine Auskunft, die eine Tabelle vergisst, ist schlimmer als keine: Sie
ist eine falsche Aussage ueber die Daten eines Menschen. Eine
handgeschriebene Liste "wo Personendaten liegen" waere in dem Moment
falsch, in dem jemand eine Tabelle dazubaut -- und genau diese Bauart
ist im Projekt schon dreimal schiefgegangen.

Deshalb fragt das Modul die Datenbank selbst: `PRAGMA foreign_key_list`
liefert jede Spalte, die auf `personen` zeigt. Gemessen: 62 Spalten in
38 von 42 Tabellen.

VIER SPALTEN ZEIGEN AUF ETWAS, OHNE ES ZU SAGEN

Es gibt genau vier Spalten im Haus, die auf `_id` enden und keinen
Fremdschluessel deklarieren:

  eintraege.saeule_id          keine Person
  treff_entfernt.eintrag_id    keine Person
  protokoll.person_id          IST eine Person
  treff_entfernt.autor_id      IST eine Person

Beide Personenspalten haben denselben Grund, keinen Fremdschluessel zu
haben: Sie sollen eine geloeschte Person ueberdauern. Sie stehen
namentlich im Modul -- und pruef-auskunft schlaegt an, sobald eine
fuenfte dazukommt, die niemand eingeordnet hat. Die Liste ist damit
klein genug, um richtig zu sein, und kann nicht heimlich veralten.

ZWEI DINGE STEHEN NIE DRIN

  Zugangsgeheimnisse (Hash, Salt, Kennung) -- Risiko ohne Nutzen.
  Andere Menschen -- wer eine Massnahme gesetzt hat, ist dessen Datum,
  nicht meines. Eine Regel fuer alle Tabellen, keine Ausnahmeliste:
  Steht in einer Zeile ueber mich die Nummer eines anderen, wird daraus
  "eine andere Person". Meine eigene bleibt stehen, sonst waere die
  Auskunft unbrauchbar -- und genau das ist die Gegenprobe dazu.

DER KNOPF STEHT AUF ZWEI SEITEN

Steckbrief und Treff-Regeln -- die beiden Seiten, die einem Menschen
selbst gehoeren. Die Community hat keinen Steckbrief; ohne die zweite
Stelle haette ausgerechnet die groesste Gruppe mit den wenigsten
Rechten auch dieses nicht. Die Pruefung liest das aus der Rechtetafel
nach, statt es zu behaupten.

Die Datei entsteht im Browser aus der Antwort -- es bleibt also nichts
auf dem Server liegen. Wer ueber wen Auskunft gezogen hat, steht im
Protokoll: Eine vollstaendige Sammlung der Daten eines Menschen ist das
Empfindlichste, was dieses Haus herausgibt.

NEBENBEI GEFUNDEN

Ich hatte `.block__kopf` und `.block__frage` geliehen -- die stehen in
automation.css, und keine der beiden Seiten laedt die. Der Kasten waere
ohne Abstaende dagestanden. Gefunden von pruef-css-klassen, nicht vom
Auge. Jetzt eigene Klassen in start.css.

PRUEFUNGEN: pruef-auskunft neu mit 46.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 01:00:11 +02:00
DogFatherGitandClaude Opus 5 e975983ad1 Das Loeschkonzept ist kein Dokument, sondern eine Tabelle, die sich durchsetzt
Stufe 8 aus dem Plan zur Perfektion: "Loeschkonzept je Datenart ·
IP-Adressen im Protokoll nach 30 Tagen weg. Je mehr Daten, desto teurer
das Nachholen."

WARUM NICHT ALS NOTIZ

Ein Loeschkonzept als Dokument ist nach dem ersten neuen Feld falsch,
und niemand merkt es. workspace-aufbewahrung.js ist beides: die
Uebersicht, was wie lange aufgehoben wird -- UND das Programm, das es
tut. Was dort nicht steht, wird nicht geraeumt; was dort steht, wird
geraeumt.

GEMESSEN, BEVOR ETWAS GEBAUT WURDE

42 Tabellen durchgesehen. Drei halten IP-Adressen:

  versuche.ip    wird beim Anmelden im Fenster geraeumt        ok
  sitzungen.ip   nur beim Abmelden -- ABGELAUFENE Sitzungen
                 standen ewig da, samt IP und Browser          Luecke
  protokoll.ip   wurde nirgends geraeumt, wuchs ewig           Luecke

Zwei echte Luecken also, nicht fuenf vermutete.

DREI SORTEN EINTRAG, UND DIE DRITTE IST DIE WICHTIGSTE

  raeumen   Diese Datei loescht selbst.
  fremd     Eine andere Stelle loescht -- hier wird nur GEZAEHLT.
            Bricht die andere Stelle, steht die Zahl trotzdem da.
  bleibt    Wird absichtlich aufgehoben, mit Begruendung.

Ein Loeschkonzept, das nur Loeschungen auffuehrt, ist ein halbes: Die
begruendete Aufbewahrung ist der Teil, nach dem gefragt wird. Jede
Zeile nennt Frist, Zweck, Rechtsgrundlage und Wirkung.

SICHTBAR, NICHT NUR WIRKSAM

Auf automation.html -- dort steht alles, was ohne Zutun laeuft, und
genau das ist es. Bei jeder Zeile die Zahl, wie viele Datensaetze sie
gerade betrifft, und ein Knopf "Jetzt aufraeumen", damit es kein
schwarzer Kasten ist. Die Sorte steht als WORT daneben, nicht nur als
Farbe.

BEI ETWAS, DAS LOESCHT, IST DIE WICHTIGERE HAELFTE: WAS ES NICHT LOESCHT

Zu jeder Loeschung eine Gegenprobe:

  IP nach 30 Tagen weg        -> und die von vor 29 Tagen bleibt
  IP weg                      -> und die ZEILE bleibt (nur das Feld)
  abgelaufene Sitzung weg     -> und die gueltige bleibt
  abgelaufene Sitzung weg     -> und ich bin danach noch angemeldet

Die letzte ist die unbequemste und die wichtigste: Ein Aufraeumlauf,
der die eigene Anmeldung mitnimmt, wirft im Betrieb alle hinaus -- und
zwar einmal taeglich. Dazu: ein zweiter Lauf muss NICHTS mehr finden
(sonst waere "aufgeraeumt" nicht von "nichts getan" zu unterscheiden),
und eine Zaehlung ueber eine fehlende Tabelle ergibt `null`, nicht 0.

NEBENBEI: EINE EIGENE DOPPLUNG VON GESTERN

Drei der Seitenerklaerungen sagten in "Wofuer" und "Du tust" fast
dasselbe (report 80 %, treff-regeln 67 %, startcheck 50 %). Gestern
hatte ich nur den Fall geprueft, an dem ich mich verbrannt hatte --
"Wofuer" gegen die Unterzeile -- und die naheliegendere Dopplung
uebersehen. Jetzt gemessen, schlechtester Wert 25 %.

PRUEFUNGEN: pruef-aufbewahrung neu mit 41, davon 7 im Browser
(der Knopf muss eine Zahl wirklich fallen lassen, und die IP muss
danach in der Datenbank weg sein). pruef-erklaerung 44 -> 47.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 00:36:57 +02:00
DogFatherGitandClaude Opus 5 4571b15494 Die Wochenzahlen erklaeren sich -- und die Zeitraum-Karte bekommt eine Rangfolge
Zwei Bildschirmfotos, zwei Sachen.

1) "wieso werden die zahlen oben nicht ausgefuellt von der excel datei?"

Weil kein einziger Tag erfasst ist -- die Backstage-Ausgabe enthielt
einen Zeitraum, und aus einer Summe ueber dreizehn Tage laesst sich
nicht ablesen, wie ein einzelner Tag lief.

Das stand nirgends. Stattdessen standen dort sieben Karten mit "0" und
"wie in der Vorwoche": Das sieht aus wie ein Fehler, und die Frage
entsteht genau an dieser Stelle. Also steht die Antwort jetzt auch
dort -- nicht in einer Notiz, nicht in einem Hilfetext.

UND SIE NENNT DEN WEG, nicht nur den Grund: "In Backstage den Zeitraum
auf EINEN Tag stellen, herunterladen, hier einlesen -- je Tag einmal."
Ein Hinweis ohne Ausweg ist eine Sackgasse mit Erklaerung.

Sobald EIN Tag da ist, verschwindet der Kasten und die Karten kommen
zurueck. Genau das ist die Gegenprobe; ohne sie hiesse alles andere
nur, dass die Karten jetzt immer weg sind.

2) "das muss viel geiler aussehen und viel klarer."

Er hatte recht: Die erste Fassung war eine Liste ohne Rangfolge --
Spanne, Diamanten, LIVE, Follower, alles gleich gross, nichts sprang
heraus. Wer draufschaut, will ZWEI Dinge in einer halben Sekunde
wissen: WELCHER Zeitraum und WIE VIELE Diamanten.

Jetzt: die Spanne als Ueberschrift, die Zahl der Tage als Marke
daneben, die Diamanten gross mit dem Schnitt direkt darunter, alles
Uebrige unter einem Strich. Links eine Kante in der Hausfarbe -- sie
sagt "andere Sorte Zahl", ohne dass ein Wort dafuer noetig waere. Das
ist wichtig: Wer einen Zeitraum fuer einen Tageswert haelt, rechnet mit
ihm weiter.

GEMESSEN IN PIXELN, NICHT NACH GEFUEHL: Die Hauptzahl muss mindestens
1,6-mal so gross sein wie ein Nebenwert (gemessen: 30 px zu 15 px),
sonst ist es wieder eine Liste. Eine Pruefung, die "sieht gut aus"
sagt, sagt nichts.

pruef-backstage-import 118 -> 127. Der leere Zustand wird HERGESTELLT
und nicht abgewartet -- eine Pruefung, die auf einen Zustand hofft,
prueft irgendwann gar nichts mehr.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-14 20:05:06 +02:00
DogFatherGitandClaude Opus 5 0d3a4b78cd Zwei Befunde aus dem Handy-Lauf -- und eine Regel, die ihre eigene Ausnahme nicht kannte
Filipe hat die beiden breiten Sichtpruefungen freigegeben. pruef-handy
meldete vier Fehlschlaege, pruef-lesbarkeit war gruen.

BEIDE BEFUNDE WAREN NICHT VON MEINER AENDERUNG -- gemessen, nicht
vermutet: crew-index.html laedt weder kopf.js noch erklaerung.js, und
mein Commit hat dort nur die Versionsnummer angefasst. Die betroffene
Regel steht seit dem 27.08.2026 so da.

1. ZU KLEINE SCHRIFT AUF DER ZUGANGSWAND VON TEAM DOGI

   `.marke` stand auf schmalen Bildschirmen auf .68rem = 10,88 px und
   damit unter der Hausuntergrenze von 11,5 px -- betroffen waren die
   Woerter "DogFather" und "Team Dogi". Das ist die erste Seite, die ein
   neuer Modi ueberhaupt sieht, und sie wird mit dem Daumen bedient.
   Jetzt .72rem = 11,52 px, dieselbe Hebung wie seinerzeit in heim.css.

   Die Grundlinie in pruef-css-klassen wird MITGEZOGEN (43 -> 42):
   Sonst duerfte der Fortschritt lautlos wieder verlorengehen, und eine
   Grundlinie, die nur nach oben nachgibt, ist keine.

2. DIE BERUEHRZIEL-REGEL ZITIERTE WCAG 2.5.8, ABER NICHT IHRE AUSNAHME

   Gemeldet wurden die zwei Verweise im Fliesstext der Treff-Regeln
   ("Der Treff", "Regeln & Hilfe", je 20 px hoch). 2.5.8 nimmt genau das
   aber ausdruecklich aus: "Inline: The target is in a sentence or its
   size is otherwise constrained by the line-height of non-target text."

   Sie auf 24 px zu bringen hiesse, die Zeilenhoehe eines Absatzes zu
   sprengen -- also einen Text kaputtzumachen, um eine Regel zu
   erfuellen, die diesen Text gar nicht meint. Die Ausnahme ist eng
   gefasst: nur <a>, nur wirklich inline, und nur wenn im selben Absatz
   auch Text steht, der nicht zum Link gehoert. Ein allein stehender
   Link bleibt ein Beruehrziel.

   UND DIESE DATEI HATTE BIS HEUTE GAR KEINE GEGENPROBE. Sie konnte
   also nie zeigen, dass sie ein zu kleines Ziel ueberhaupt bemerkt --
   erst recht nicht, seit die Regel eine Ausnahme hat. Jetzt in beide
   Richtungen: ein allein stehendes 20x20-Ziel MUSS auffallen, ein
   gleich grosser Verweis im Satz darf es NICHT.

PRUEFUNGEN: pruef-handy 136 -> 138 (vier Fehlschlaege behoben, zwei
Gegenproben dazu), keine einzige weniger. pruef-lesbarkeit gruen
(12 s). pruef-css-klassen, pruef-erklaerung und pruef-neue-seiten nach
der gate.css-Aenderung noch einmal gelaufen, alle gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-14 19:49:41 +02:00
DogFatherGitandClaude Opus 5 de19684883 Jede Seite erklaert sich selbst -- drei Zeilen, und die dritte rechnet sich aus
Filipe: "ich will in jeder seite auch eine kleine detaillierte aber
schnelle erklaerung kurz und knapps noch zu jeder seite."

DREI ZEILEN AUF JEDER DER 25 SEITEN

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

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

DIE ZEILE "SIEHT" IST GERECHNET, NICHT GESCHRIEBEN

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

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

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

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

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

ZWEI BEFUNDE, DIE SCHON VORHER ROT WAREN

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-14 18:20:30 +02:00
DogFatherGitandClaude Opus 5 0cce22c08c Der Einzel-Import kennt den dritten Ausgang jetzt auch
Nach dem Umbau von heute Nachmittag habe ich nachgesehen, WER
tagAusZelle() sonst noch ruft -- und genau dort die naechste Luecke
gefunden, bevor sie jemanden getroffen hat.

DIE FUNKTION HAT SEIT HEUTE DREI AUSGAENGE (Tag, Zeitraum, Grund).
Gekannt hat den dritten nur der Backstage-Weg. Im Einzel-Import stand
weiterhin `gelesen.tag` -- bei einem Zeitraum `undefined`:

  VORSCHAU:    `undefined > heute` ist false, die Zeile faellt durch
               und landet mit `tag: undefined` in der Liste.
  SCHREIBWEG:  `if (!tag)` greift, die Zeile wird still uebersprungen.

Die Vorschau haette also eine Zeile versprochen, die danach nirgends
steht. Zwei Aussagen ueber dieselbe Datei, die einander widersprechen,
und beide sehen fuer sich plausibel aus -- das ist der Unterschied, den
niemand bemerkt.

Das ist an diesem Tag die FUENFTE Wiederholung derselben Sache: eine
Regel, mehrere Aufrufer, und einer kennt sie nicht. Ein dritter Ausgang
taugt nur, wenn ihn ALLE Aufrufer kennen.

Jetzt legt auch der Einzel-Import einen Zeitraum in leistung_zeitraum
ab -- dieselbe Tabelle, dieselbe Regel, dieselbe Anzeige. Und die
Dauer-Einheit gilt dort ebenfalls; sie fehlte in der Vorschau noch.

DIE MELDUNG SAGT JETZT, WAS ANGEKOMMEN IST: "1 Zeitraum uebernommen"
statt "1 Tage uebernommen". Bei einer Backstage-Ausgabe ueber zwei
Wochen haette man sie sonst in der Tagesliste gesucht und nicht
gefunden.

pruef-backstage-import 106 -> 118. Die Pruefung, auf die es ankommt,
vergleicht VORSCHAU UND ERGEBNIS: Was die Vorschau verspricht, muss
danach dastehen -- genau die Aussage, die vorher falsch gewesen waere.
Dazu, dass in der Vorschau die Spanne steht und kein leerer Tag, und
die Gegenprobe, dass eine echte Tagesdatei weiterhin als Tage durchgeht.

ZWEI EIGENE FEHLER DABEI: Ich habe `.length` auf eine Zahl angewendet
(`fehlerhaft` ist eine Anzahl, keine Liste) -- immer `undefined`, immer
rot. Und zum zweiten Mal heute den Absolutwert gemessen, wo die
Veraenderung gehoert: Lumi hatte aus einem frueheren Teil der Pruefung
schon eine Tageszeile in derselben Spanne.

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

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

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

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-14 16:23:16 +02:00
DogFatherGitandClaude Opus 5 0207b05da6 Die Rechte Hand steht ueber den Modis -- sortiert statt geschrieben
Filipe, mit dem Bildschirmfoto: "rechte hand soll immer ueber modi
stehen bitte."

DIE REIHENFOLGE STAND AN ZWEI STELLEN, und die zweite war falsch
herum: ROLLEN_REIHE hatte die Rechte Hand laengst vor den Modis (und
die SQL-Sortierung leitet sich daraus ab) -- aber `zusatzrollen` in
workspace-personen.js schrieb sie von Hand, und dort kam Modi zuerst.
Genau diese Liste baut die Abschnitte auf der Personenseite und die
zusaetzlichen Knoepfe im Anlegen-Formular.

Das ist an diesem Tag das VIERTE Mal dieselbe Sache: eine Aussage,
zwei Listen, und die zweite ist die, die abweicht. Vorher: der
Zeitraum-Schutz (an einer von drei Stellen), die Dauer-Einheit
(dieselbe), das Recht zum Aufloesen (Liste kannte es, Nachrichtenweg
nicht).

Deshalb wird jetzt SORTIERT und nicht geschrieben: Die Liste geht durch
ROLLEN_REIHE. Wer die Reihenfolge aendern will, aendert sie dort --
und alles andere zieht nach, statt nachgezogen werden zu muessen. Was
in ROLLEN_REIHE nicht vorkommt (heute "gast"/Community), wandert ans
Ende statt stillschweigend nach vorn.

pruef-haus-trennung 63 -> 66. GEPRUEFT WIRD DIE REIHENFOLGE, NICHT DIE
ANWESENHEIT: "beide sind da" waere auch dann gruen gewesen, wenn sie
vertauscht sind -- und genau das war der Fall. Dazu eine Zeile, die
nachweist, dass die Reihenfolge wirklich aus ROLLEN_REIHE kommt und
nicht nur zufaellig stimmt; sonst haette jemand sie auch von Hand
andersherum schreiben koennen: richtig im Ergebnis, falsch im Aufbau,
und beim naechsten Mal wieder auseinander.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-14 13:46:31 +02:00
DogFatherGitandClaude Opus 5 6ed61a6b3d Die Zeitraum-Regel galt nur an einer Stelle -- Filipe fand die andere
"jetzt hab ich eine hochgeladen ber sehe sie nicht."

WAS PASSIERT IST, aus der Datenbank gelesen und nicht vermutet: Seine
Backstage-Ausgabe lief durch den EINZEL-Import ("Aus Datei einlesen")
und schrieb genau eine Zeile -- creator_id 2, Tag 2026-09-01, alle
Werte 0, Quelle "import", erfasst 11:52. Unsichtbar war sie aus zwei
Gruenden: Der 1. September liegt 13 Tage zurueck (die Liste zeigt
sieben), und es stand nichts darin.

DREI FEHLER AUF EINMAL, und alle drei waren meine:

1. DER ZEITRAUM-SCHUTZ STAND NUR IM BACKSTAGE-WEG. Ich hatte ihn heute
   frueh gebaut, gemessen, geprueft -- und an genau einer von drei
   Stellen eingesetzt. "2026-09-01 ~ 2026-09-11" wurde im Einzel-Import
   weiterhin zum 1. September.

   Das ist an diesem Tag das DRITTE Mal dieselbe Sache: eine Regel,
   zweimal aufgeschrieben, und die zweite Abschrift ist die
   unvollstaendige. Jetzt steht sie EINMAL in `tagAusZelle()` und wird
   dreimal benutzt. Sie liefert immer genau eines von beidem: Tag oder
   Grund -- nie beides, nie keines.

2. DIE DAUER-EINHEIT FEHLTE DORT EBENFALLS. Auch das hatte ich nur im
   Backstage-Weg eingesetzt.

3. DIE DATEI GEHOERTE GAR NICHT DORTHIN. Sie enthaelt ALLE
   Creator:innen; der Einzel-Import schreibt auf EINE Person. Es gab
   keine Fehlermeldung -- es passierte nur nichts Sichtbares, und das
   ist die schlechteste aller Antworten.

   Jetzt erkennt der Weg eine Namensspalte mit mehreren verschiedenen
   Eintraegen und sagt: "In dieser Datei stehen 3 verschiedene Creator
   (Spalte ...). Dieser Weg schreibt auf EINE Person. Nimm
   'Backstage-Tabelle einfuegen'." Mit Gegenprobe, dass eine Datei mit
   EINEM Creator weiterhin durchgeht.

pruef-xlsx 60 -> 67, pruef-backstage-import 82 -> 86.

NEBENBEFUND AUS DER EIGENEN PRUEFUNG: Mein Testfile fuer den
Einzel-Import hatte selbst zwei verschiedene Creator -- die neue Sperre
hat es sofort abgewiesen. Das war ihr erster echter Treffer, und es
zeigt, dass ich den Weg beim Schreiben der Pruefung selbst falsch
verstanden hatte. Jetzt steht dort, wofuer er da ist: eine Person,
mehrere Tage.

Die Zeile vom 1. September steht noch in der Datenbank. Sie zu
entfernen ist Filipes Entscheidung, nicht meine.

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

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

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

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-14 11:35:21 +02:00
DogFatherGitandClaude Opus 5 6973eda30b Notiz an der Rollenliste: die drei Team-Dogi-Rollen stehen dort bewusst
Beim Messen der neuen Auswahl fiel auf, dass in DogFathers Liste auch
"hand", "modi" und "gast" stehen -- Rollen aus dem anderen Haus. Wer
damit auf workspace. jemanden umstellt, schiebt ihn dorthin: Er faellt
aus der Agenturliste und kommt an dieser Adresse nicht mehr herein.

Filipe wurde ausdruecklich gefragt und hat entschieden: so lassen.

Nur ein Kommentar, keine Codeaenderung. Er steht da, weil der Fall
sonst beim naechsten Aufraeumen wie ein Versehen aussieht -- und weil
der symmetrische Filter (wie er fuer das Crew-Haus schon existiert)
die naheliegende "Verbesserung" waere. Zwei Pruefungen halten den Stand
fest; wer ihn aendert, macht dort rot.

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

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

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

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-12 00:25:47 +02:00
DogFatherGitandClaude Opus 5 1ab2729e47 Die rechte Hand steht ueberall an zweiter Stelle - und im Kalender ueberhaupt
Filipe, mit Bildschirmfoto der Liste "Wen gehst du durch?" (Diene, Dogi,
VanVan - alphabetisch, die rechte Hand ganz rechts): "rechte hand soll
immer als erstes sein. ueberall. wie in dem sinne soll sie ganz links
sein. ausser bei personen und zugaenge soll sie ueber jedem aber unter
dogfather sein. ich will dass auch ueberall immer nach der hirarchie
gearbeitet wird."

EINE REIHENFOLGE, NICHT ZWEI REGELN

ROLLEN_REIHE in workspace.js ist jetzt:
  Spicy Media > DogFather > Rechte Hand > Manager > Scout > Creator > Modi

Er hat zwei Faelle beschrieben, aber es braucht nur eine Reihenfolge: In
den Team-Listen kommt DogFather gar nicht vor (er beurteilt, er wird
nicht beurteilt) - dort steht sie dadurch automatisch ganz vorn. In
"Personen & Zugaenge" steht er drin, also steht sie dort hinter ihm.
Zwei Sonderfaelle waeren zwei Stellen, an denen es auseinanderlaeuft.

Dass Spicy Media davor bleibt, ist seine ausdrueckliche Entscheidung auf
Nachfrage. 'gast' steht bewusst nicht in der Liste und faellt ans Ende.

ROLLEN_SORTIERUNG (der SQL-Ausdruck) wird jetzt aus ROLLEN_REIHE
ABGELEITET statt danebengeschrieben. Bis heute stand die Reihenfolge
zweimal da; beim Hochziehen der rechten Hand haetten beide geaendert
werden muessen. Eine Liste, die niemand pflegt, kann nicht veralten -
derselbe Grundsatz wie beim Spaltenverlust vom 06.09.

WAS DABEI AUFFIEL, OHNE DASS JEMAND DANACH GESUCHT HAT

Der Server sortierte laengst richtig. DREI Auswahllisten im Browser
haben seine Reihenfolge wieder verworfen und nach einer eigenen Liste
mit fuenf Agentur-Rollen neu gezeichnet - Team Dogi kommt darin nicht
vor und DARF es nicht (bereiche.js laedt jeder herunter).

  - Chat-Auswahl und Sicht-Umschalter: Team Dogi landete in einem
    Nachzuegler-Block ganz unten, hinter jedem Creator.
  - Teilnehmerwahl im Kalender: dort gab es nicht einmal einen
    Nachzuegler-Block. Die rechte Hand und die Modis standen GAR NICHT
    zur Auswahl. DogFather konnte sein eigenes Team zu keinem Termin
    einladen, und auf dem Bildschirm sah das vollkommen normal aus.

Das ist derselbe Fehler zum vierten Mal (Chat 10.09., Personenliste
10.09., Sicht-Umschalter 11.09., Kalender 11.09.). Deshalb keine vierte
Einzelreparatur, sondern eine Stelle: window.Bereiche.gruppieren()
gruppiert in genau der Reihenfolge, in der der Server die Menschen
schickt - ohne einen einzigen Rang zu kennen. Fehlt der Helfer, wird
eine Gruppe mit allen gezeichnet: nicht schoen, aber sichtbar, und
niemand verschwindet. Der Kalender-Weg schickt die Ueberschrift jetzt
mit, wie der Chat es laengst tut.

PRUEFUNGEN

  pruef-nachwuchs   109 -> 123 (Abschnitt 12: die Reihenfolge, mit der
                    Gegenprobe, dass sie NICHT alphabetisch ist -- Rieke
                    steht alphabetisch hinten, mit "Anna" waere jede
                    Zeile gruen ohne etwas zu messen)
  pruef-dabei-optik misst die Wahl jetzt im Browser: ist Team Dogi
                    ueberhaupt da, und steht es vorn
  pruef-rollen      315 (vorher 312), 423 s gemessen. Die Notbremse lag
                    bei 480 s und hat angeschlagen - kein Haenger,
                    sondern zu wenig Luft, seit die rechte Hand vier
                    Kacheln mehr hat. Jetzt 900 s, mit der Messung
                    daneben und dem Hinweis, beim naechsten Mal nicht
                    die Zahl zu erhoehen, sondern nachzusehen.

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

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

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

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

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

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

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

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

3. DER VORLAGENTEXT

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

4. "GILT FUER" SAGT DER SERVER

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 22:20:09 +02:00
DogFatherGitandClaude Opus 5 93ba881b18 Entwicklung & Nachwuchs steht auf der Team-Seite über "Rund ums Live"
Filipe, mit zwei Bildschirmfotos: "mach nur die kategorie auf screen1
über die kategorie von screen2."

gruppeNach half hier nicht -- das gilt nur für die Zusatzkacheln der
Agenturseite. Auf der Team-Adresse kommen die Kacheln aus der Hauptliste,
und dort ist die Reihenfolge der Gruppen die Reihenfolge der Kacheln.

Eingefügt wird deshalb VOR der ersten Kachel der Gruppe "Rund ums Live"
-- nach dem Namen, nicht nach einer Position. "An Stelle 7 einfügen"
wäre beim nächsten Umsortieren still falsch, und still falsch heißt
hier: eine Kategorie rutscht irgendwohin, ohne dass es jemand merkt.
Findet sich die Gruppe nicht, wird angehängt statt weggelassen.

Auf der Agenturseite ändert sich nichts: Dort bleiben die beiden
Kacheln ganz unten, weil dort private Aufzeichnungen über Menschen
stehen. Zwei Adressen, zwei Plätze, beide entschieden.

Geprüft: start-ansicht 147, unverändert grün.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 18:44:02 +02:00
DogFatherGitandClaude Opus 5 39dd666b17 Der Treff zieht in Team Dogi ein — die dritte Adresse ist wieder weg
Filipe, nachdem er die dritte Wand gesehen hatte: "das soll keine app
für sich sein, dass soll in der crew seite adaptiert werden, da rein
perfektionniert."

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 17:58:34 +02:00
DogFatherGitandClaude Opus 5 47a91e9708 Die goldene Regel: was nicht in der Tafel steht, ist verboten
Filipe: "egal welche rolle oder person hinzugefuegt wird soll immer nur
das sehen wass ich erlaube. mehr nicht. soll nichts so sein dass wenn
mann eine rolle oder jemanden hinzufuegt dass er dan alles sieht."

DER BEFUND -- GEZAEHLT, NICHT GESCHAETZT

NEUN von zwanzig Seiten standen auf `null`, und `null` hiess "jede
angemeldete Rolle": Start, Uebersicht, Aufgaben, Chat, Kalender,
Dateien, Calls, Start-Check, Wissen. Eine neue Rolle erbte sie alle,
ohne dass jemand etwas erlaubt haette.

UND EIN ZWEITES LOCH, das ich vorher nicht gemessen hatte: Die Schranke
las `const erlaubt = GESCHUETZT[pfad]` und prueffte `if (erlaubt && ...)`.
Eine Seite, die GAR NICHT in der Tabelle stand, ergab `undefined`, fiel
durch dieselbe Bedingung und war damit ebenfalls fuer jede angemeldete
Rolle offen. Am 11.09.2026 betraf das keine einzige Seite (nachgezaehlt:
22 Dateien = 20 Eintraege + 2 Zugangswaende) -- aber jede NEUE waere so
entstanden.

Die Rolle wird im Haus an 74 Stellen in 20 Modulen abgefragt, und die
Endzweige widersprechen einander: Aufgaben enden mit `default: 0=1`
(sieht nichts), Bereiche und Dateien fallen in "eigene plus betreute".
Drei Module, drei Antworten auf dieselbe Frage.

WARUM NICHT "DIE LISTE DURCHGEHEN"

Das waere die naheliegende Antwort und die falsche. Im Code stand seit
dem 10.09. genau dieser Satz -- "Wer eine Rolle hinzufuegt, muss diese
Liste durchgehen" -- und einen Tag spaeter standen immer noch neun
Seiten auf `null`. Ein Satz, der sich auf ein Gedaechtnis verlaesst, ist
keine Sicherung. Dazu: eine vergessene Erlaubnis MELDET SICH NIE. Die
Seite laedt ja. In der anderen Richtung ist es schlimmer -- eine Seite,
die zu viel zeigt, sieht aus wie eine Seite, die funktioniert.

WAS JETZT GILT

server/rechte.js traegt die Tafel, `darfSeite()` liest sie, und sie
kennt zwei Antworten: Seite in der Tafel UND Rolle darin -> ja. Alles
andere -> nein. Kein `null`, kein `undefined`, kein Zweig, der etwas
durchlaesst.

DIE TABELLE IST UMGEZOGEN, NICHT NEU GESCHRIEBEN. In ihren Kommentaren
steckt das Gedaechtnis des Hauses -- jede Zeile traegt ein Datum und
einen Satz von Filipe ("nimm die kategorie zahlen bei jedem weg", "die
manager sollen diese kategorien garnicht sehen", "ich will dass die
rechte Hand auch alle sieht"). Die wegzurefactoren waere der teuerste
Fehler dieses Umbaus gewesen.

VERHALTENSGLEICH FUER DIE SIEBEN VORHANDENEN ROLLEN. Die neun
`null`-Seiten tragen jetzt alle sieben Namen. Eine Umkehrung, die
nebenbei Rechte entzieht, waeren zwei Aenderungen in einer -- und man
wuesste hinterher nicht, welche etwas kaputtgemacht hat. Enger stellen
ist ein eigener Schritt.

pruef-rechtetafel.mjs (NEU, 19 Pruefungen, Port 4397) macht daraus eine
Garantie statt einer Absicht:

  * Jede Rolle braucht einen Eintrag -- sonst rot. Man kann eine Rolle
    nicht mehr hinzufuegen, ohne zu entscheiden, was sie sieht.
  * Jede Seite braucht einen Eintrag -- verglichen gegen das
    DATEISYSTEM, nicht gegen eine zweite Liste. Eine neue Seite ist
    damit erst einmal fuer NIEMANDEN offen statt fuer alle.
  * Eine Phantomrolle kommt auf keine der zwanzig Seiten.
  * Gegenprobe: jede ECHTE Rolle kommt irgendwo hin (spicy 18, admin 20,
    manager 17, scout 16, creator 15, hand 13, modi 11) -- sonst waere
    die Zeile darueber auch gruen, wenn schlicht alles zu waere.
  * Am Server: eine Seite ohne Eintrag wird abgewiesen statt
    ausgeliefert, und alle 20 Seiten der DogFather-Rolle liefern wirklich.
  * Zerstoerende Probe ganz am Ende (die Lektion vom 09.09.: in der
    Mitte verbiegt sie alles danach).

ZWEI EIGENE FEHLER UNTERWEGS. `node --check` meldete "Syntax in
Ordnung", das Modul lud aber nicht -- beim Umzug war eine Konstante
verlorengegangen. Syntax ist kein Beweis. Und ein Kommentar behauptete
danach noch das Alte ("eine neue Seite ist mindestens nur fuer
Angemeldete"); der Rueckfall ist jetzt "fuer niemanden", und das steht
da auch so.

Gruen: pruef-rechtetafel 19 (neu), pruef-rollen 287, pruef-sicht 84,
pruef-crew-adresse 129, pruef-modi-verborgen 80, pruef-haus-trennung 62.
Stempel 202609111617.

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 15:54:25 +02:00
DogFatherGitandClaude Opus 5 a04748b82f Excel-Dateien: keine Sackgasse mehr im Auswahlfenster
Filipe: "wenn ich auf screen1 druecke geht mein ordner auf aber meine
excel datei kann ich nicht auswaehlen wieso??"

Im Feld stand accept=".csv,text/csv,text/plain". Die .xlsx war damit
ausgegraut -- ohne ein Wort dazu. Eine Sackgasse ohne Wegweiser ist
schlimmer als eine Absage mit Begruendung: Man sucht den Fehler bei
sich.

WARUM SIE NICHT EINFACH GELESEN WIRD: Der Leser dahinter (csvZerlegen)
versteht Text -- Komma, Semikolon, Tabulator. Eine .xlsx ist in
Wahrheit ein ZIP-Archiv. Als Text gelesen ergibt sie Zeichensalat, und
der schlimmste Ausgang waere nicht "geht nicht", sondern eine Vorschau
mit Zahlen aus dem Dateikopf. Das Feld einfach zu oeffnen, ohne den
Fall zu behandeln, haette aus einer klaren Sperre einen unklaren
Fehlschlag gemacht.

Jetzt laesst sich jede Datei waehlen, und WAS sie ist, sagt der INHALT
-- die ersten Bytes, nicht die Endung. Eine umbenannte Datei ist keine
andere Datei. .xlsx beginnt mit "PK" (ZIP), die alte .xls mit dem
OLE-Kennzeichen D0 CF 11 E0.

Und dann steht da, was stattdessen zu tun ist, mit ZWEI Wegen:
  1. In Excel markieren, Strg+C, und den Knopf "Backstage-Tabelle
     einfuegen" nehmen -- der versteht TAB-getrennte Zeilen, also genau
     das, was beim Kopieren aus Excel in der Zwischenablage liegt. Das
     geht sofort und ohne Umspeichern.
  2. Oder in Excel als "CSV UTF-8" speichern.

Der erste Weg funktionierte schon vorher -- er stand nur nirgends.

Nebenbei: Eine leere Datei meldet jetzt "Die Datei ist leer" statt
durch die Vorschau zu laufen, und eine abgewiesene Datei bleibt nicht
im Feld stehen.

pruef-backstage-import 66 -> 72. Geprueft wird an einem echten
ZIP-Kopf, nicht an der Endung: Die Testdatei heisst .xlsx UND traegt
das Kennzeichen -- eine Pruefung ueber den Namen waere gruen, ohne die
Erkennung je zu beruehren. Mit Gegenprobe, dass eine echte CSV
denselben Weg weiterhin durchlaeuft; sonst hiesse das nur, dass gar
nichts mehr eingelesen wird.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 15:02:21 +02:00
DogFatherGitandClaude Opus 5 b34586be91 Die Agentur-Umstellung schreibt den Bauplan nicht mehr ab
Sie baute `eintraege` mit einer von Hand abgeschriebenen Spaltenliste
neu. 24 Spalten gingen hinein, 21 kamen heraus: einsatz, nur_leitung
und gesendet_am wurden vom Spalten-Nachtrag angelegt und unmittelbar
danach weggeworfen -- mit Inhalt, ohne Fehlermeldung, bei
unveraenderter Zeilenzahl.

DAS WAR DAS ZWEITE MAL. Am 07.09.2026 fehlten an derselben Stelle die
drei Event-Spalten; sie wurden nachgetragen, und daneben kam ein
Kommentar, der woertlich vor genau dieser Verlustart warnt. Seither
kamen drei neue Spalten dazu, und die Liste wurde still falsch. An
einer anderen Stelle im selben Modul steht sogar schon der Satz: "Eine
vierte Abschrift waere die vierte Gelegenheit dazu."

Jetzt uebernimmt checkListeErweitern -- dieselbe Funktion, die alle
spaeteren Bereiche umstellt. Sie holt den Bauplan aus sqlite_master
und die Spalten aus PRAGMA table_info: eine Liste, die nicht gepflegt
wird, kann nicht veralten. Sichern, Zeilen innerhalb der Transaktion
zaehlen, Indizes mitnehmen, Verweise pruefen -- alles, was der Block
auch tat. 90 Zeilen weniger.

NACHGEMESSEN, in dieser Reihenfolge:
- pruef-agentur: 31 Fehler + Absturz -> 62 Pruefungen, alle gruen.
- Die Umstellung meldet jetzt 24 Spalten statt 21.
- Der echte Fall ist durchgespielt: Auf einer Datenbank, die 'agentur'
  schon kennt, laeuft sie GAR NICHT mehr an. Neue Pruefung dazu, die
  die Sicherungsdateien zaehlt (genau eine, trotz mehrerer Neustarts)
  -- gemessen an der Spur, die ein Umbau hinterlaesst, nicht an der
  Absicht.
- Die Datenbank auf dem Server hat alle drei Spalten und kennt
  'agentur' bereits. Sie war nie in Gefahr; gefaehrlich war das
  Zurueckspielen einer Sicherung von vor dem 06.09.2026.

ZWEI ALTE PRUEFFEHLER LAGEN DAHINTER, beide bisher von einem Absturz
verdeckt:
- "der Wochenbericht kennt 6 Bereiche" -- eine feste Zahl, inzwischen
  sind es elf. Verglichen wird jetzt gegen die CHECK-Regel der
  Datenbank; damit stimmt sie auch beim zwoelften Bereich.
- Die Meldung wurde am Satzbau erkannt statt an der Aussage.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 14:43:14 +02:00
DogFatherGitandClaude Opus 5 c98aa06554 pruef-agentur kann jetzt sagen, woran sie scheitert
Sie meldete 31-mal "FEHL" und HTTP 503 -- und kein einziges Wort dazu,
warum. Die Serverausgabe hat sie immer schon mitgeschrieben, aber nur
gezeigt, wenn der Server gar nicht erst hochkam. Faellt er spaeter mit
einem Datenbankfehler um, war sie weg.

Dazu kam: Playwright wirft bei einem fehlenden Knopf eine Ausnahme, der
Prozess stirbt, und mit ihm die Zusammenfassung. Genau dann braucht man
sie am dringendsten. Deshalb haengt die Ausgabe jetzt auch an
uncaughtException und unhandledRejection.

Mit SERVERLOG=<datei> kommt das Protokoll vollstaendig heraus -- die
letzten 1800 Zeichen zeigen den Schaden, nicht immer seine Ursache.
Genau daran lag es hier: Der Verlust stand ganz oben, der Fehler ganz
unten.

WAS DAMIT IN EINEM LAUF SICHTBAR WURDE (Befund, noch nicht repariert):

  [workspace] Spalte 'einsatz' in eintraege ergaenzt.
  [workspace] Bereich 'agentur' freigeschaltet, 5 Eintraege
  [workspace] Bereich lesen: no such column: e.einsatz

Die Spalte wird angelegt und unmittelbar danach wieder verworfen. Die
einmalige 'agentur'-Umstellung baut `eintraege` mit einer FEST
EINGETRAGENEN Spaltenliste neu -- 24 Spalten gehen hinein, 21 kommen
heraus. Verloren gehen einsatz, nur_leitung und gesendet_am: die drei,
die nach dem 07.09.2026 dazukamen.

Der Kommentar an genau dieser Stelle warnt woertlich vor dieser
Verlustart -- damals fuer die drei Event-Spalten, die deshalb
nachgetragen wurden. Die Liste war am 07.09. richtig und ist seither
still falsch geworden. Dieselbe feste Zahl, dieselbe Falle, drittes
Mal.

DIE ECHTEN DATEN SIND NICHT BETROFFEN, nachgemessen statt vermutet: Die
Datenbank auf dem Server hat alle drei Spalten, und ihr CHECK kennt
'agentur' bereits -- die Umstellung laeuft dort nie wieder. Gefaehrlich
wird es erst beim Zurueckspielen einer Sicherung von vor dem
06.09.2026: Dann werden die drei Spalten angelegt und sofort samt
Inhalt weggeworfen, ohne Fehler, bei unveraenderter Zeilenzahl.

Die Reparatur waere, die Liste nicht zu schreiben, sondern aus
PRAGMA table_info abzuleiten -- so wie es checkListeErweitern fuer alle
spaeteren Bereiche schon macht. Das ist ein Eingriff in einen
Wanderungsweg auf echten Daten und wartet auf Filipes Wort.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 14:36:09 +02:00
DogFatherGitandClaude Opus 5 915a4ae07c Spicy Media sieht die Zahlen wieder -- und eine Creator-Liste enthaelt nur Creator
Zwei Dinge, das zweite habe ich nur gefunden, weil das erste eine
Pruefung rot gemacht hat.

1) DIE SPICY-SPERRE IST AUFGEHOBEN.
Filipe: "jetzt soll jede rolle diese kachel sehen. spicy, dogfather,
manager, scout und creator ... der manager scout dogfather oder spicy
koennen eintragen."

Kachel und Tuer hatte ich schon geoeffnet -- es reichte nicht. In
workspace-leistung.js sass eine dritte Schranke, die Spicy Media mit
404 abwies (Rest des Wunsches vom 07.09.). Folge: Die Seite lud, das
Auswahlfeld blieb leer, und es sah aus wie ein Fehler. Drei Schichten
mussten zustimmen, und die dritte stand woanders als die beiden
ersten.

Nebenwirkung, ausdruecklich: Damit stehen im Dashboard wieder
Diamanten, LIVE-Tage und Verweildauer je Creator-Karte. Das war der
zweite Teil der damaligen Entscheidung und faellt mit ihr weg.

Die Pruefung in pruef-spicy wurde nicht geloescht, sondern GEDREHT --
sie schlaegt jetzt an, wenn jemand die Sperre versehentlich wieder
einbaut.

2) EINE LISTE VON CREATOR-NUMMERN ENTHIELT KEINE CREATOR.
Beim Drehen fiel auf: Spicy Media bekam "Agentur, Filipe, Luna, Max,
NeuerCreator, NeuerManager" -- DogFather nur "Luna, NeuerCreator".

Ursache: `ohneVerborgene` schreibt ein `null` ("sieht alles") zu einer
echten Liste aus, sobald es etwas zu verbergen gibt -- zur Liste ALLER
Personen, weil sie nicht wissen kann, wovon "alles" gerade handelt.
Bei DogFather greift das nie (er verbirgt nichts vor sich selbst), bei
Spicy Media schon. Der Aufrufer baut daraus ein `IN (...)` OHNE
Rollenfilter, und damit wurden Manager und Scouts zu Creators.

Repariert an der Wurzel, nicht beim Aufrufer: Es gibt zehn Aufrufer,
und neun richtig plus einen vergessen sieht man nie. Der Name der
Funktion ist das Versprechen -- es wird jetzt dort eingeloest, wo der
Name steht.

AUFGEFALLEN IST ES, WEIL EINE PRUEFUNG DIE BEIDEN LISTEN VERGLICHEN
HAT, statt bei jeder einzeln "ist nicht leer" zu sagen. Genau dieser
Unterschied steht jetzt als eigene Aussage drin.

Gemessen: pruef-backstage-import 50 -> 63 (Manager und Spicy Media
kamen dazu, inklusive der Aussage, dass Spicy Media MEHR Creator sieht
als ein Manager), pruef-spicy 60 -> 62. Dazu gruen: betreuung,
manager-sicht, verborgen, haus-trennung, sicht, aufgabenbrett,
schulung, steckbrief, uebersicht, leistung, tiktok-datei,
fremde-sicht, personen-liste, creator-anlegen, ampel, tagesblick.

NICHT von mir: pruef-agentur meldet 31 Fehler (HTTP 503). Gegen den
Stand ohne meine Aenderungen nachgemessen -- dort dieselben 31. Ein
aelterer, eigener Befund, unangetastet.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 14:19:43 +02:00
DogFatherGitandClaude Opus 5 8d3a79ed2a Zahlen-Seite: wieder fuer alle fuenf Rollen
Filipe, mit der Kachel im Bild: "jetzt soll jede rolle diese kachel
sehen. spicy, dogfather, manager, scout und creator. aber die creator
kriegen dan quasi nur ihre daten zu sehen und der manager scout
dogfather oder spicy koennen eintragen."

Damit ist die Sperre vom 07.09.2026 aufgehoben. Geaendert sind genau
zwei Zeilen -- die Kachel in bereiche.js und die Tuer in workspace.js.
Ausdruecklich als Liste der fuenf Rollen, NICHT als `null`: `null`
hiesse auch jede Rolle, die es noch nicht gibt.

WER WAS DARF, musste ich nicht bauen -- es stand schon da und konnte
nur niemand benutzen: sichtbareCreatorIds() gibt einem Creator genau
seine eigene Nummer, darfEintragen() ist Leitung plus Scout. Das ist
exakt Filipes Satz, ohne eine einzige Aenderung am Server.

WAS DER UMBAU AUFGEDECKT HAT: "Aus Datei einlesen" hatte als einziger
Knopf NIE eine Rechteregel -- folgenlos, solange nur DogFather
hereinkam, ab heute haette ein Creator ihn gesehen und eine Absage
bekommen. Alle drei Eintrag-Knoepfe stehen jetzt in EINER Liste mit
ihrer Regel daneben, und der Knopf startet `hidden`, damit er nicht
kurz aufblitzt.

Gefunden hat das nicht das Nachdenken, sondern die Gegenprobe von
heute Mittag: Sie wurde rot, weil der Test-Scout auf der Startseite
landete -- waehrend ich nebenan eine Erklaerung "fuer Scouts und
Manager" schrieb fuer eine Seite, die beide gar nicht oeffnen konnten.

pruef-backstage-import: 36 -> 50 Pruefungen. Gemessen wird der
UNTERSCHIED zwischen den Rollen, nicht die Anwesenheit von irgendetwas:
jeder Knopf einzeln, bei Scout und Creator, dazu die Kachel auf der
Startseite und die Gegenprobe, dass die Zahlen des Creators trotzdem
dastehen. Sonst waere "der Creator sieht keinen Knopf" auch dann gruen,
wenn seine Seite leer bliebe.

Mit SCHIRM=1 legt die Pruefung zwei Bilder ab, eins je Rolle.

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

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

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

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

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

Der Kopierknopf meldet einen Fehlschlag, statt Erfolg vorzutaeuschen.

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 13:51:00 +02:00
DogFatherGitandClaude Opus 5 5487b94f73 Die fremde Sicht kam nur auf der halben Seite an
Gefunden beim Nachmessen von Filipes Meldung "die dogfather rolle sieht
die creator nicht mehr". Nichts war kaputt -- er war in einer fremden
Sicht. Dabei fiel aber etwas anderes auf:

DREI ENDPUNKTE LASEN `req.person`, WO IHRE NACHBARN `req.sicht ||
req.person` LESEN.

  /workspace/api/report/creator      (workspace-reports.js)
  /workspace/api/startcheck/creator  (workspace-startcheck.js)
  /workspace/api/uebersicht/creator  (workspace-aufgaben.js)

Folge: Die Zahlen einer Seite folgten der angesehenen Person, die
Creator-Auswahl daneben zeigte die EIGENEN. Zwei Antworten auf eine
Frage, und beide sahen fuer sich richtig aus. In reports.js stehen die
beiden Zeilen keine zwanzig auseinander.

Gemessen vorher/nachher in der Sicht von Miesmuschel:
  report/creator      6 Eintraege  ->  2 (Alle Creator + sie)
  startcheck/creator  5 Eintraege  ->  kein Umschalter, ihr eigener
  uebersicht/creator  alle         ->  nur sie

DER START-CHECK ZEIGT JETZT GAR KEINEN UMSCHALTER MEHR, und das ist
richtig: Bei `eigen: true` blendet die Seite ihn aus und zeigt den
Start-Check der angesehenen Person direkt -- genau das, was sie selbst
saehe. Mein erster Messwert las "0 Eintraege" und sah nach Fehler aus;
er hiess "kein Umschalter". Eine Zaehlung, die Verstecktes und Leeres
nicht unterscheidet, misst hier das Falsche.

WAS ABSICHTLICH NICHT MITGEAENDERT WURDE
/workspace/api/personen bleibt beim Angemeldeten. Diese Liste fuellt
die Auswahl "zu wem gehoert dieser Eintrag" -- also eine SCHREIB-
Auswahl. Die Regel steht seit dem 02.09. in workspace.js:

  "WER BIN ICH (fuer alles, was SCHREIBT) und WESSEN ARBEITSPLATZ SEHE
   ICH (fuer das, was gezeigt wird). Die beiden zu vermischen waere der
   sichere Weg dazu, dass irgendwann etwas unter fremdem Namen
   gespeichert wird."

Wuerde sie der Sicht folgen, koennte DogFather in einer fremden Sicht
nur noch Eintraege fuer diese eine Person anlegen -- ein stiller
Verlust von Handlungsfaehigkeit an einer Stelle, an der man ihn nicht
vermutet. Damit sind auch content.html und bereich.html zu Recht
unveraendert: Das sind Eingabeformulare, keine Ansichten.

NEUE PRUEFUNG (pruef-fremde-sicht, 12 Pruefungen)
Sie haelt beide Haelften der Regel fest -- Anzeigen folgt der Sicht,
Schreiben nicht -- und hat drei Gegenproben: dass dieselbe Abfrage mit
und ohne Sicht wirklich Verschiedenes liefert, dass eine Sicht auf
jemand anderen auch jemand anderen zeigt (sonst waere "Nova" nur
zufaellig der erste Eintrag), und dass eine erfundene Nummer keine
Sicht oeffnet. Drei Creator statt einem: Mit einem einzigen saehen
"alle" und "nur dieser" gleich aus.

Nebenbei geprueft: pruef-verwaltung-app, das im Sommer mit
MODULE_NOT_FOUND scheiterte, gibt es nicht mehr -- der Punkt ist
erledigt. Alle 132 Pruef- und Werkzeugdateien sind syntaktisch heil.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Gemessen: 13 Felder im Editor statt 5.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

=== WAS DIE RECHERCHE ERGEBEN HAT ===

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

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

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

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

=== WAS DARAUS GEBAUT WURDE ===

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

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

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

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

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

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

=== KEIN NEUER BAUKASTEN ===

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

=== WAS DIE PRUEFUNG GEFUNDEN HAT ===

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

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

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

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

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

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

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

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

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

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

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

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

=== 2. DIE LEISTE ===

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

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

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

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

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

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

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

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

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

=== WAS DIE PRUEFUNGEN GEZEIGT HABEN ===

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 00:30:18 +02:00
DogFatherGitandClaude Opus 5 da7ddf7b5e Alle Kategorien in der Personenliste -- und die rechte Hand liest mit
Filipe, mit Bildschirmfoto der Team-Seite: "ich muss alle kategorien da
sehen. und ich will dass die rechte hand auch alle sieht."

AUF DEM BILD STAND EIN EINZIGER ABSCHNITT: DogFather. VanVan war in
derselben Minute zur rechten Hand geworden (im Protokoll darunter zu
sehen: "#4 VanVan: admin -> hand") -- und damit aus der Liste
VERSCHWUNDEN.

Nicht aus der Antwort des Servers. Der schickte sie die ganze Zeit mit.
`assets/js/personen.js` gruppiert nach einer Liste mit fuenf Rollen, und
wer dort nicht steht, wurde nicht gezeichnet: kein Fehler, keine
Luecke, kein Hinweis. Dieselbe stille Lücke wie vorgestern in der
Personenauswahl des Chats, an einer anderen Stelle -- und dieselbe
Ursache: Die Namen der verborgenen Rollen duerfen in keiner
ausgelieferten Datei stehen, also kannte der Browser sie nicht.

DIE LOESUNG IST DIESELBE: Der Server schickt die Ueberschriften mit
(`zusatzrollen` -- es gab sie schon, sie waren bisher nur die Auswahl
beim Anlegen). Der Browser braucht dafuer keinen Rollennamen zu kennen,
er bekommt einen Text.

UND DARUNTER EIN AUFFANGBECKEN, das ist der eigentliche Fortschritt:
Kaeme morgen eine siebte Rolle und niemand daechte an diese Stelle,
stuenden ihre Leute trotzdem auf der Seite -- unter ihrem Rollennamen,
sichtbar, statt lautlos zu fehlen. Ein Abschnitt mit einer unschoenen
Ueberschrift ist tausendmal besser als ein Mensch, den es auf dem
Bildschirm nicht gibt.

DIE RECHTE HAND LIEST MIT -- LESEND. Das ist sein eigenes Wort
("sieht"): Codes, Sperren, Loeschen, Rollen vergeben und das Protokoll
bleiben bei DogFather. Die Ausnahme im Server ist Wort fuer Wort so
gebaut wie die, die Spicy Media schon hat: eine Methode, eine Adresse,
eine Rolle. Zwei Fassungen derselben Ausnahme waeren zwei Regeln, und
die zweite laesst irgendwann mehr durch als gedacht.

DREI SCHICHTEN MUSSTEN ZUSTIMMEN, und die dritte hatte ich uebersehen:
die Kachel, die Schnittstelle -- und die SEITE selbst. In der
Rollentabelle in workspace.js stand personen.html fuer spicy, admin und
manager; die rechte Hand flog von der Seite auf die Startseite zurueck,
obwohl Kachel und Daten schon stimmten.

Gefunden hat das nicht das Auge, sondern pruef-rollen. Sie geht jede
Kachel jeder Rolle ab und schaut nach, wo man landet: "Rechte Hand
Kachel personen.html LANDET AUF start.html". Das ist der Wert dieser
Pruefung -- der Fehler war unsichtbar, solange man nicht selbst als
rechte Hand auf die Kachel drueckt.

EINE ERWARTUNG HAT SICH GEDREHT, und das steht jetzt im Quelltext:
pruef-haus-trennung verlangte vor einer Stunde noch, dass die Kachel
bei ihr NICHT steht und die Seite sie abweist -- richtig, solange sie
die Seite nicht durfte. Die Pruefung ist dadurch nicht schwaecher
geworden: Sie verlangt weiterhin, dass Kachel und Zugang DASSELBE
sagen. Sie sagen jetzt beide ja statt beide nein.

DIE NEUE MESSUNG VERGLEICHT ZAHL GEGEN ZAHL: wie viele Menschen der
Server liefert, wie viele Zeilen auf dem Bildschirm stehen. Nicht
"steht VanVan da" -- das waere ein Name, den man beim naechsten Umbau
so lange anpasst, bis die Pruefung wieder passt. Eine Pruefung, die nur
die Antwort des Servers ansieht, waere hier uebrigens gruen gewesen.

Beim Schreiben dieser Messung ist sie zuerst viermal falsch
angeschlagen: Die Abschnitte stehen zugeklappt da, und zugeklappt sind
ihre Zeilen gar nicht im Dokument. Vier Fehler, die es nicht gab -- die
Pruefung klappt jetzt erst auf, dann liest sie.

pruef-personen-formular 27 -> 35 · pruef-haus-trennung 53 -> 61 ·
pruef-rollen 277 -> 278 · pruef-modi-verborgen 80 · pruef-start-ansicht
143 · pruef-css-klassen gruen · pruef-modi-wortleck 5.

ANMERKUNG ZUR TEAM-ADRESSE: Dort zeigt die Liste weiterhin nur Team
Dogi -- so, wie er es eine Stunde vorher verlangt hat ("bitte nur
basiert auf diese seite"). "Alle Kategorien" heisst also: alle des
Teams. Wenn er dort auch die Agentur sehen will, ist das eine Zeile,
aber es waere eine andere Entscheidung.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-11 00:11:36 +02:00
DogFatherGitandClaude Opus 5 670ce4a5c1 Personen & Zugaenge auf der Team-Seite -- und eine Rolle laesst sich endlich aendern
Filipe wollte VanVan die Rolle "Rechte Hand" geben. Auf die Frage nach
ihrem Code: "die kategorie personen & zugaenge fehlt also muss das
hinzugefuegt werden und bitte nur basiert auf diese seite."

BEIM NACHSEHEN KAMEN ZWEI DINGE HERAUS, und das zweite war das
eigentliche:

  Die Kachel fehlte, weil ich sie mit den Agenturkacheln entfernt hatte
  -- ausgerechnet die, mit der man jemandem eine Rolle gibt. Die
  Team-Adresse war damit eine Seite, auf der man das Team nicht
  verwalten kann.

  UND ES GAB DIE FUNKTION GAR NICHT. Im ganzen Server aendert keine
  einzige Stelle `personen.rolle`. Anlegen ja, sperren ja, loeschen ja
  -- aendern nirgends, seit dem ersten Tag. Wer jemandem eine andere
  Aufgabe geben wollte, musste ihn loeschen und neu anlegen, und daran
  haengen seine Aufgaben, seine Nachrichten, seine Eintraege, sein
  ganzer Verlauf. Kapitel 4 des Pflichtenhefts verlangt ausdruecklich
  das Gegenteil.

  (Nebenbefund aus derselben Messung, ihm gemeldet: Auf dem Server gibt
  es KEINE Rolle 'hand'. VanVan ist ein zweiter DogFather-Zugang. Die
  Rueckmeldungen mit "nur an DogFather" wuerde sie deshalb heute
  mitlesen -- die Regel fragt "ist das DogFather?", und ihre Rolle
  antwortet ja.)

DIE KACHEL traegt Namen, Zeichen und Farbton der Agenturseite. Es ist
dieselbe Seite mit demselben Zweck; ein zweiter Name dafuer waere ein
zweites Ding, das es nicht gibt.

SIE STEHT NUR DORT, WO SIE AUCH FUNKTIONIERT. Die Personenseite haengt
serverseitig an `nurAdmin`. In der Kachelliste der rechten Hand haette
sie auf eine 404 gefuehrt -- ein Knopf, der eine Absage bringt, ist
schlimmer als kein Knopf. Wenn sie das duerfen soll, ist das eine
eigene Entscheidung und gehoert an dieselbe Stelle wie nurAdmin.

"NUR BASIERT AUF DIESE SEITE" steht nicht in der Kachel, sondern im
Server: Auf crew. liefert die Liste nur Team Dogi, und angelegt werden
koennen nur Team-Rollen. Beides kommt aus Funktionen, die es schon gab
(hausBedingung, darfAnlegen) -- und `darfAnlegen` baut auch die Knoepfe
in der Oberflaeche, weshalb die anderen Rollen dort von selbst
verschwinden statt eine Absage zu bringen.

DER ROLLENWECHSEL HAT FUENF SICHERUNGEN, und jede hat ihren Grund:

  NUR DOGFATHER -- wer Rollen vergeben kann, kann sich selbst zum
  DogFather machen.

  NIE DIE EIGENE. Wer sich selbst herabstuft, sperrt sich aus; die
  Funktion zum Zurueckdrehen haengt an der Rolle, die er gerade
  abgegeben hat. Das ist keine Warnung wert, das ist eine Tuer, die
  zubleibt.

  NIE DEN LETZTEN AKTIVEN DOGFATHER. Gezaehlt werden die AKTIVEN: Ein
  gesperrter kann niemanden hereinlassen, ihn mitzuzaehlen waere eine
  Sicherung, die sich selbst beluegt.

  ALLE SITZUNGEN DIESER PERSON ENDEN. Eine Sitzung gehoert seit dem
  10.09.2026 zu einer ADRESSE, und welche das ist, entscheidet die
  Rolle. Wer eben noch DogFather war und jetzt rechte Hand ist, saesse
  sonst mit einer Sitzung da, die auf der Agenturadresse laeuft und
  dort nicht mehr hingehoert -- ein halb gueltiger Zustand, der erst
  beim naechsten Klick auffaellt.

  DER CODE BLEIBT. Er haengt am Menschen, nicht an der Rolle. Ihn
  mitzutauschen waere bequem und falsch: Dann muesste jede
  Rollenaenderung von einem Gespraech begleitet sein, und wer das
  vergisst, sperrt jemanden aus, ohne es zu merken.

Und es steht im Protokoll, mit beiden Rollen im Klartext.

DIE AUSWAHL IM BROWSER wird nicht noch einmal gebaut, sondern aus dem
Anlege-Formular gelesen. Dort stehen genau die Rollen, die der Server
dieser Person zugesteht -- einschliesslich derer, die in keiner
ausgelieferten Datei stehen duerfen und erst nachtraeglich dazukommen.
Eine zweite Liste waere die, in der eine Rolle fehlt oder eine zu viel
steht, und beides faellt erst auf, wenn jemand sie braucht.

EINE PRUEFUNG WAR WERTLOS UND IST ES NICHT MEHR: "ihre Sitzungen sind
beendet" lief gegen einen leeren Bestand -- ein gruener Haken ueber
einer Null. Jetzt meldet sich die Person vorher an, und die Zahl davor
muss groesser als null sein.

pruef-haus-trennung 32 -> 53 · pruef-rollen 277 · pruef-personen-formular
27 · pruef-css-klassen 30 · pruef-start-ansicht 143 ·
pruef-modi-verborgen 78 · pruef-modi-wortleck 5.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 23:47:13 +02:00
DogFatherGitandClaude Opus 5 9c99a5b9c3 Zwei Haeuser auf einer Datenbank -- die Team-Adresse zeigt nur das Team
Filipe, mit Bildschirmfoto der Zentrale: "die daten von dieser seite
sollen nichts mit den daten am hut haben von der workspace seite bitte,
die hier soll ihre eigene daten haben und komplett von der anderen
getrennt sein. dogfather soll die daten auch auf der anderen seite
sehen in der team dogi kategorie aber auch nur er und vanvan."

GETRENNT WIRD DER AUSSCHNITT, NICHT DER BESTAND. Eine zweite Datenbank
haette den zweiten Satz unmoeglich gemacht -- er will dieselben Daten
auf beiden Adressen sehen. Es bleibt also alles an einem Ort, und die
ADRESSE entscheidet, welcher Ausschnitt davon herauskommt.

ALLES HAENGT AN EINEM WERT: `person.haus`, gesetzt in sitzungLesen()
aus dem Hostnamen. Von dort reist er mit der Person durch jede
Sichtbarkeitsregel im Haus. Der Grund ist ein praktischer: Die Regeln
bekommen ueberall dieselbe Person gereicht -- sichtbar(person),
sichtbareCreatorIds(person), bereicheFuer(person). Ein zusaetzliches
Argument haette an ueber dreissig Aufrufstellen mitgeschleift werden
muessen, und die eine vergessene waere das Loch gewesen.

RECHTE AENDERT ES NICHT. Es entscheidet, WAS jemand sieht, nicht, was
er darf -- wie die Sicht eines anderen (sichtPerson) das auch nicht tut.

DER FILTER IST DER SPIEGEL EINES VORHANDENEN. Es gab schon
`ohneTeamDogi` ("alles ausser dem Team") fuer Spicy Media. Dazu kommt
jetzt `ohneAgentur` -- gleiche Bauweise, andere Rollenmenge, GEMEINSAME
Implementierung. In der steckt die NULL-Falle (`IS NULL OR NOT IN`,
denn `NULL NOT IN (...)` ist weder wahr noch falsch), und die sieht man
einer Abschrift nicht an.

WARUM NICHT "MINDESTENS EINE SPALTE ZEIGT AUF TEAM DOGI": Das waere die
naheliegende Formulierung und sie waere falsch. Eine Aufgabe, die
DogFather fuer einen Creator anlegt, haette ueber `erstellt_von` (er
gehoert zum Haus) trotzdem gepasst und stuende auf der Team-Seite.
Andersherum stimmt es: Sobald IRGENDEINE Spalte auf Creator, Scout,
Manager oder Spicy Media zeigt, gehoert die Zeile ins andere Haus.

VIER TUEREN, EINE FORM. Aufgaben, Bereiche, Dateien und der Kalender
haben je eine eigene sichtbar()-Funktion. Alle vier bekommen dieselbe
Bedingung an derselben Stelle, in derselben Schreibweise -- damit keine
davon anders aussieht als die anderen. Beim Kalender steht sie in
termineSichtbar() in workspace.js und nicht im Kalendermodul: Sonst
haetten Termine, Wiederholungen und der ICS-Abruf sie einzeln
gebraucht, und der ICS-Abruf ist der, den man vergisst -- er laeuft
ohne Bildschirm.

ZWEI ABFRAGEN GEHEN ABSICHTLICH NICHT DURCH DIE LISTENFUNKTIONEN, und
genau die standen im Bildschirmfoto: der Ring der Zentrale ("9 IM
TEAM", obwohl das Team drei Leute hat -- gezaehlt wurde das ganze Haus)
und die Hinweiszeile darunter ("Creator-Profile sind noch leer"). Im
Quelltext der Zentrale steht sogar ausdruecklich, dass sie die einzige
solche Stelle ist; gefunden habe ich sie trotzdem erst, weil ich der
Zahl im Bild nachgegangen bin. Beide bekommen die Bedingung jetzt aus
derselben Funktion (`hausBedingung`), nicht aus einer zweiten
Rollenliste.

Die Hinweis-Bedingung sitzt am BLOCK und nicht an den vier Abfragen
darin: Wer eine fuenfte hinzufuegt, bekommt sie dadurch mit, ohne daran
zu denken.

DIE KACHELN: Auf crew. liefert der Server dieselbe Liste wie der
rechten Hand -- nicht eine dritte. Fuenfundzwanzig Kacheln, von denen
zwei Drittel Creator und Agentur betreffen, waeren dort Fenster in ein
Haus, in dem er gerade nicht ist, und hinter jedem stuende seit heute
eine leere Liste. Auf workspace. bleibt alles, wie es war: Dort schickt
der Server weiterhin `bereiche: null` ("nimm die Liste aus der Datei").

JEDE MESSUNG STEHT ZWEIMAL DA. Die Trennung kann auf zwei Arten falsch
sein: Sie greift nicht (dann steht die Agentur weiter auf der
Team-Seite, und niemand merkt es, weil alles funktioniert), oder sie
greift zu weit (dann verschwindet auf der Agenturseite etwas -- der
gefaehrlichere Fall, denn eine zu kurze Liste sieht aus wie "nichts zu
tun"). Deshalb folgt auf jede Messung auf crew. dieselbe Messung auf
workspace., mit DERSELBEN Sitzung; der einzige Unterschied ist der
Host-Kopf. Dazu zwei Gegenproben zur Regel selbst: 127.0.0.1 bleibt
unberuehrt (sonst waeren alle Pruefungen im Haus stillschweigend blind
geworden), und eine erfundene Adresse oeffnet kein drittes Haus.

NEBENBEI ZWEI EIGENE FEHLER BEHOBEN: pruef-chat-kanaele und
pruef-rueckmeldung liefen auf Ports, die schon vergeben waren (4359
neben pruef-modi-verborgen, 4371 neben pruef-crew-adresse). Beide sind
umgezogen. Fuenf weitere Doppelungen zwischen fremden Pruefdateien
(4186, 4188, 4189, 4193, 4198) bleiben stehen und sind gemeldet -- an
Dateien zu greifen, an denen gerade eine zweite Sitzung arbeitet, waere
genau der Fehler, den diese Doppelungen ohnehin schon zeigen.

pruef-haus-trennung 32 (neu) · pruef-rollen 277 · pruef-modi-verborgen
78 · pruef-chat gruen · pruef-rueckmeldung 30 · pruef-modi-ideen 30 ·
pruef-crew-adresse 129 · pruef-start-ansicht gruen ·
pruef-zwischenspeicher 21 · pruef-modi-wortleck 5.

BERICHTIGUNG zum vorigen Commit: Dort steht "pruef-rueckmeldung 34".
Es sind 30. Ich hatte die Zeilen geschaetzt statt sie zu lesen.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ZWEI FEHLER, DIE ERST DER BILDSCHIRM ZEIGTE:

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 22:35:14 +02:00
DogFatherGitandClaude Opus 5 bcc1c70f4a Spicy Media legt Manager UND Scouts an -- eine Liste statt vier
Filipe, mit Bildschirmfoto der Zugaenge-Seite: "die spicy rolle soll
auch manager und scouts hinzufuegen koennen."

DER MANAGER-KNOPF FEHLTE NICHT AUS RECHTEGRUENDEN. Serverseitig war die
Tuer /workspace/api/manager-anlegen fuer Spicy Media die ganze Zeit
offen. Es gab nur nichts zum Draufdruecken -- wegen ZWEIER Listen in
derselben Funktion, drei Zeilen auseinander (personen.js):

  const darf = ... spicy ? ['manager', 'creator'] : ['creator'];
  ...
  if ((r.wert === 'admin' || r.wert === 'manager') && ich.rolle !== 'admin') continue;

Die erste erlaubt den Manager, die zweite nimmt ihn wieder weg. Uebrig
blieb ein einziger Knopf: Creator. Nichts war kaputt, nichts wurde rot,
es fehlte einfach -- die Sorte Fehler, die nur jemandem auffaellt, der
davorsitzt.

FUER SCOUTS GAB ES UEBERHAUPT KEINE TUER. Nur DogFather konnte welche
anlegen. Und die Wegwahl in der Oberflaeche war eine Kette mit
Auffangbecken (`rolle === 'manager' ? ... : creator-anlegen`): Ein Scout
waere im else gelandet, und creator-anlegen legt IMMER einen Creator an.
Der Knopf haette Erfolg gemeldet und das Falsche getan.

DIE ANTWORT STEHT JETZT AN EINER STELLE. `darfAnlegen` in workspace.js
sagt, wer wen anlegen darf. Daraus lesen:

  - die beiden Team-Tueren (Manager, Scout)
  - die allgemeine Verwaltungs-Tuer von DogFather
  - die Oberflaeche, ueber `darf_anlegen` in /workspace/api/ich

Die Oberflaeche hat damit gar keine eigene Liste mehr und kann deshalb
auch nicht mehr abweichen -- weder zu streng noch zu grosszuegig.

ZWEI TUEREN, NICHT EINE MIT EINEM ROLLENFELD. Der Absatz an der
Manager-Tuer raet davon ab, und der Rat gilt: Eine Tuer, die NICHTS
anderes kann, als eine bestimmte Rolle anzulegen, ist sicherer als eine,
die vorher nachfragt. `teamTuer(rolle)` baut beide aus demselben Text --
die Rolle wird beim Einhaengen festgelegt und kommt nie aus dem Aufruf.
Geprueft: ein mitgeschicktes "rolle: admin" bleibt wirkungslos.

GEPRUEFT (pruef-creator-anlegen, 33 -> 49 Pruefungen)
  - Spicy Media legt Manager an       -> 201, Rolle stimmt
  - Spicy Media legt Scout an         -> 201, Rolle stimmt
  - "rolle: admin" mitgeschickt       -> wirkungslos, es wird ein Scout
  - ein Manager durch die Scout-Tuer  -> 404
  - ein Scout durch die Scout-Tuer    -> 404
  - Personenliste lesen               -> 200 (die eine gewollte Ausnahme)
  - darueber anlegen                  -> 404, und es entsteht niemand
  - /api/ich nennt Spicy: manager, scout, creator -- und keinen DogFather
  - ein Manager bekommt genau eine Rolle genannt, ein Scout keine
  - die Knoepfe auf der Seite stimmen mit alldem ueberein
  - DogFather sieht unveraendert alle -- gemessen, nicht geglaubt

Der erste Anlauf der Pruefung behauptete, Spicy Media komme gar nicht an
/workspace/api/verwaltung. Falsch, und sie wurde zu Recht rot: nurAdmin
laesst genau einen Fall durch, das LESEN der Personenliste. Diese
Trennung ist jetzt festgenagelt.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 21:56:45 +02:00
DogFatherGitandClaude Opus 5 5f270c96c5 Beim Umbau einer Tabelle gehen ihre Indizes nicht mehr verloren
GEFUNDEN BEIM NACHDENKEN DARUEBER, WAS DIE NAECHSTE AUSLIEFERUNG AUF
DEM ECHTEN SERVER TUT -- nicht im Betrieb, nicht von einer Pruefung.

checkListeErweitern() baut eine Tabelle neu, wenn eine CHECK-Regel
erweitert werden muss: neue Tabelle, Daten hinueber, alte weg,
umbenennen. Sechs Aufrufe gehen durch diese Funktion. `DROP TABLE`
nimmt aber JEDEN Index der Tabelle mit, und der Bauplan aus
sqlite_master beschreibt nur die Tabelle -- die neue stand danach blank
da.

Gemerkt haette es niemand: Die Abfragen laufen weiter, sie lesen nur
die ganze Tabelle. Beim naechsten Neustart waere der Index wieder da
(er steht oben im Bauplan). "Bis zum naechsten Neustart falsch" ist
trotzdem kein Zustand, den man einbaut -- und bei einem EINDEUTIGEN
Index waere es keine Frage der Geschwindigkeit mehr, sondern der
Richtigkeit: Die Zusage "einen Kanal je Zustaendigkeit" haette bis zum
Neustart still ausgesetzt.

Beim Ausliefern der Kanaele wird `chat_raeume` genau so umgebaut. Der
Lauf sagt jetzt selbst, was er getan hat:

  'kanal' in chat_raeume.art freigeschaltet, 1 Zeilen, 7 Spalten,
  1 von 1 Indizes uebernommen, Verweise geprueft.

Und er meldet es als ACHTUNG, wenn nicht alle zurueckkommen.

DIE PRUEFUNG LAEUFT JETZT AUF EINER ALTEN DATENBANK. Bisher legte
pruef-chat-kanaele eine frische an -- dort steht 'kanal' schon im
Bauplan, die Umstellung tut nichts, und der gefaehrlichste Weg im Haus
blieb ungeprueft. Die Datenbank wird deshalb VOR dem Start in die alte
Form gebracht, mit Index und einer Zeile darin. Geprueft wird danach,
dass die Regel erweitert ist, die Spalte dazugekommen, die Zeile noch
da und der Index zurueck.

GEGENPROBE GEFAHREN: Wiederherstellung stillgelegt, Lauf wiederholt --
"FEHL der Index hat den Umbau ueberlebt (idx_chat_kanal_kategorie)".
Sie kann also auch nein sagen.

Der zweite, aeltere Umbauweg im selben Haus (die Artenumstellung fuer
'bigmatch') hat dieselbe Luecke. Er bleibt hier unangetastet: Das ist
eine dritte Abschrift derselben gefaehrlichen Prozedur, und sie ohne
eigene Pruefung anzufassen waere genau der Handgriff, der Daten
kostet. Notiert, nicht nebenbei erledigt.

pruef-chat-kanaele 73 -> 79 · pruef-spicy 60 · pruef-modi-ideen 30 ·
pruef-rollen 274.

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

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

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

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

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

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

DREI DINGE, DIE ERST DAS HINSEHEN GEZEIGT HAT:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 18:08:27 +02:00
DogFatherGitandClaude Opus 5 241b408edc Eigene Buehnen fuer die Modi-App -- und die Kopfleiste dazu
Filipe: "auch die hintergrund bilder vom crew espace sollen anderes
aussehen, der community angepasst wie die zugangscode seite die ist
mega."

UMFAERBEN HAETTE HIER NICHT GEREICHT. Bei der Zugangswand war Rot das
Problem; innen zeigen die neun Buehnen das SPICY-MEDIA-LOGO selbst, in
`halle` und `arena` vielfach nebeneinander. Ein blaues fremdes Logo
waere schlimmer gewesen als ein rotes.

Die Motive gibt es laengst -- auf der oeffentlichen Dogfather-Seite:
  studio/lounge  "Team Dogi -- Familie. Treue. Zusammenhalt."
  halle          TEAM DOGI mit den Menschen des Teams
  skyline/portal "Streamplan": Dogi und HasiDog auf der Buehne
  arena          "DogFathers Galerie": Filmrollen, ein Archiv
  garage         "Der Streamer": Filipe an seinem Platz

Fuer `garage` stand zuerst der Holo-Kontrollraum da -- grossartiges
Bild, aber darauf steht "WERDE MODI". Eine Einladung hinter dem
Aufgabenbrett von Leuten, die laengst dabei sind, liest sich falsch.
Ein Bild sagt etwas, auch wenn es nur Hintergrund ist.

DIE ABDUNKLUNG IST GERECHNET, NICHT GEWAEHLT
Mein erster fester Wert haette 18 von 27 Fassungen HELLER gemacht als
die, die sie ersetzen (114 gegen 67) -- ueber ihnen steht derselbe
kleine Text. Das Werkzeug misst jetzt jede Fassung gegen die bestehende
Buehne derselben Szene und senkt sie genau auf deren Wert.

Ueber eine KURVE statt eines schwarzen Schleiers: v' = 255*(v/255)^g
senkt die Lichter viel staerker als die Tiefen -- das Bild wird dunkler
und behaelt seine Zeichnung. Ein Schleier haette bei den hellsten
Motiven ueber 80 % gebraucht, und darunter liegt dann Nebel statt Bild
(derselbe Fehler wie beim Tresorbild).

Der erste Anlauf mit einer geschlossenen Formel war falsch: Die Kurve
wirkt auf jeden FARBKANAL, die Helligkeit ist eine gewichtete Summe der
drei, und L(v^g) ist nicht L(v)^g. Die Rechnung sagte 61,5 und heraus
kamen 67. Jetzt wird genaehert und nachgemessen, hoechstens sechsmal.

Beim Hochkant-Ausschnitt wird zusaetzlich das FENSTER GESUCHT: fuenf
Kandidaten, erst "dunkel genug", dann "am meisten Motiv". Die Mitte --
die das Haus sonst nimmt -- ist bei diesen Bildern das Hellste.

ZWEI FUNDE AUS DEM BILDSCHIRMFOTO, die nichts mit den Buehnen zu tun
hatten:

1. DIE KOPFLEISTE sagte "SPICY & DOGI · CREATOR WORKSPACE". Reitertitel,
   Begruessung und Symbol waren laengst richtig -- nur die Zeile, die
   man als Erstes ansieht, nicht. Der Grund: Auf Unterseiten traegt die
   Leiste einen Rueckweg-Verweis, auf der Startseite blossen Text; mein
   Code kannte nur die erste Bauform.

2. DAS CHILI-ZEICHEN kommt aus dem CSS als Bild, an drei Stellen
   (Kopfleiste, Siegel im Ring, die schwebenden Wasserzeichen). Auf
   crew. wird die Datei serverseitig durch den Husky ersetzt -- alle
   drei auf einmal, und ohne Flackern, weil schon der erste Abruf das
   richtige Bild bekommt.

GEMESSEN
pruef-crew-adresse  123 (statt 117): Fuer JEDE Buehne aus start.css --
                    die Namen werden dort GELESEN, nicht abgeschrieben --
                    gibt es auf crew. ein eigenes Motiv, auf workspace.
                    das alte, und die beiden sind nachweislich
                    verschiedene Dateien.
pruef-rollen        274   pruef-start-ansicht, pruef-zwischenspeicher 21
pruef-modi-wortleck   5 -- er hat wieder angeschlagen, zweimal auf
                    Kommentare, die ich selbst geschrieben hatte.

27 Fassungen, 3,5 MB (die bisherigen neun Szenen brauchen 7,1).

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

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

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

ZWEI ECHTE FEHLER, BEIDE VON DER NEUEN PRUEFUNG GEFUNDEN

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 16:27:44 +02:00
DogFatherGitandClaude Opus 5 cdddf32183 Husky bei DogFather und der Rechten Hand, Pfote bei den Modis
Filipe mit Bildschirmfoto: "bei rechte hand soll der husky sein und bei
modis soll die pfote sein."

DAS DREHT EINE FRUEHERE VORGABE UM, und der Grund gehoert in den Code:
Am 09.09. hiess es "das modi symbol soll das gleiche sein wie bei
dogfather" -- damals gab es dort zwei Rollen, und der Satz bedeutete
"die Modis gehoeren zu Dogi, nicht zur Agentur". Mit drei Rollen sagt
dieselbe Absicht etwas anderes: Der Husky steht bei den beiden, die den
Ueberblick haben, die Pfote bei denen, die taeglich unterwegs sind.
Zwei gleiche Zeichen und ein anderes lesen sich als Gruppe, nicht als
Reihe.

GEPRUEFT WIRD DIE ZUORDNUNG, NICHT DAS AUSSEHEN
An beiden Stellen -- Zugangswand und Rollenauswahl in der
Personenverwaltung -- wird gegen die DogFather-Karte verglichen, nicht
gegen "#r-husky": Waere dort morgen ein anderes Zeichen, muesste die
rechte Hand mitwandern. Gewollt ist "dasselbe wie er".

DAZU DIE GEGENPROBE, die vorher fehlte: Der Modi muss sich davon
UNTERSCHEIDEN. Ohne sie waere die Zeile darueber auch dann gruen, wenn
alle drei Karten dasselbe truegen -- und genau so sah es bis heute
Nachmittag aus.

Nebenbei hat der Wortleck-Test wieder angeschlagen: Meine eigene
Begruendung fuer die Pfote nannte zum Vergleich eine Rolle der anderen
Wand. In einer Datei, die auf crew. ausgeliefert wird, hat die nichts
verloren.

GEMESSEN
pruef-crew-adresse      117 (statt 115 -- die neue Zuordnungspruefung)
pruef-personen-formular  27   pruef-crew-wand-bild  45

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 16:03:04 +02:00
DogFatherGitandClaude Opus 5 d36f122926 Die alte Wand schweigt: ein Modi-Code zaehlt dort wie ein erfundener
Filipe: "auf der workspace seite fuer die agentur und so sollen die modis
von mir nicht mehr rein kommen." Das war seit dem Deploy schon so -- ein
Modi bekam dort keine Sitzung. Offen war nur, WIE die Wand reagiert:
Bis eben zeigte sie ihm den Weg zur neuen Adresse. Seine Entscheidung:
"gar nichts -- Code stimmt nicht."

WARUM DAS EIN ANDERER WEG IST UND NICHT NUR EINE ANDERE ANTWORT

Ein schlichtes `return 401` haette die richtige Meldung gezeigt und
trotzdem eine Spur hinterlassen: Der verborgene Zugang waere weiterhin
befragt worden -- ein Suchschluessel-Treffer und EIN scrypt-Durchlauf
statt der Kandidatenschleife der gewaehlten Kachel. Das ist messbar, und
Zeitunterschiede sind genau die Spur, die dieser Zugang vermeiden soll.

Deshalb wird stillerZugang() auf den drei alten Adressen ueberhaupt
nicht mehr aufgerufen. Der Code faellt danach durch den gewohnten Weg
wie jeder unbekannte: dieselbe Schleife, derselbe Eintrag in `versuche`,
dieselbe Antwort, dieselbe Dauer. Die alte Wand verhaelt sich exakt so
wie an dem Tag, bevor es diese Rollen gab.

GEPRUEFT WIRD DIE UNUNTERSCHEIDBARKEIT, NICHT DER STATUSCODE
Eine 401 waere leicht zu erfuellen und truege trotzdem eine Spur, wenn
Rumpf oder Koepfe anders aussaehen. Die Pruefung schickt deshalb einen
echten Modi-Code und einen frei erfundenen an dieselbe Wand und
vergleicht Zeichen fuer Zeichen:

  ok  workspace.: der Modi-Code wird abgewiesen wie ein erfundener (401)
  ok  workspace.: und die Antwort ist Zeichen fuer Zeichen dieselbe
  ok  workspace.: die neue Adresse wird nicht genannt

DER PREIS, und er gehoert genannt: Ein Modi mit der alten Verknuepfung
sammelt dort jetzt Fehlversuche wie jeder andere. Acht in zehn Minuten
sperren seine IP -- auch fuer die neue Adresse, denn die Sperre haengt
an der IP, nicht am Hostnamen.

GEMESSEN
pruef-crew-adresse    115 (statt 114 -- die neue Gegenprobe)
pruef-rollen          274   pruef-modi-verborgen  78

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