Commit Graph
2 Commits
Author SHA1 Message Date
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