Workers P2: Betriebsanleitung nach der Endprüfung (Merge statt Rebase, Ausfall-Probe, Testlauf mit Concurrency 2, Rücknahme ohne Merge-Commit, Handy-Entscheidung)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-18 05:51:34 +00:00
1 parent aceb558564
commit d732494eee
1 file changed
+13 -6
@@ -1518,10 +1518,17 @@ Alles unter `$WK`. **Neu:**
P2 braucht **keine** `.env`-, Compose- oder nginx-Änderung. Der Block `location /api/workers/` und der Container `webklar-workers` gehören zur Betriebsanleitung von P1; ohne sie zeigt die Seite „Der Hustler-Dienst ist noch nicht erreichbar“ (gewollt, kein Absturz). P2 braucht **keine** `.env`-, Compose- oder nginx-Änderung. Der Block `location /api/workers/` und der Container `webklar-workers` gehören zur Betriebsanleitung von P1; ohne sie zeigt die Seite „Der Hustler-Dienst ist noch nicht erreichbar“ (gewollt, kein Absturz).
1. **P1 prüfen (empfohlen vor P2):** `curl -s -o /dev/null -w '%{http_code}\n' https://ticket.webklar.com/api/workers/health` ⇒ `200`; `curl -s -o /dev/null -w '%{http_code}\n' https://ticket.webklar.com/api/workers/state` ⇒ `401` (ohne JWT). Anders ⇒ erst P1 in Betrieb nehmen; WOMS kann trotzdem schon live gehen. 1. **P1 prüfen (empfohlen vor P2):** `curl -s -o /dev/null -w '%{http_code}\n' https://ticket.webklar.com/api/workers/health` ⇒ `200`; `curl -s -o /dev/null -w '%{http_code}\n' https://ticket.webklar.com/api/workers/state` ⇒ `401` (ohne JWT). Anders ⇒ erst P1 in Betrieb nehmen; WOMS kann trotzdem schon live gehen.
2. **Stand merken:** `git -C /home/webklar/apps/ticket.webklar.com/dev-workers fetch origin && git -C /home/webklar/apps/ticket.webklar.com/dev-workers rev-parse origin/test` ⇒ SHA als `ALT` notieren (für das Zurücknehmen). Danach `git -C /home/webklar/apps/ticket.webklar.com/dev-workers merge-base --is-ancestor origin/test HEAD && echo OK`: Kommt kein `OK`, hat `test` inzwischen neue Commits; dann **nicht pushen und nie erzwingen**, sondern Claude bitten, `feature/workers` auf `origin/test` zu rebasen und Schritt 3 zu wiederholen. 2. **Stand merken:** `git -C /home/webklar/apps/ticket.webklar.com/dev-workers fetch origin && git -C /home/webklar/apps/ticket.webklar.com/dev-workers rev-parse origin/test` ⇒ SHA als `ALT` notieren (für das Zurücknehmen). Danach `git -C /home/webklar/apps/ticket.webklar.com/dev-workers merge-base --is-ancestor origin/test HEAD && echo OK`: Kommt kein `OK`, hat `test` inzwischen neue Commits; dann **nicht pushen und nie erzwingen** (kein `--force`), sondern Claude bitten, `origin/test` in `feature/workers` zusammenzuführen (`git fetch origin`, dann `git merge origin/test`; ein Rebase der 40 Commits ist nicht nötig und würde alle Commit-Nummern ändern) und danach Schritt 3 samt `vite build` zu wiederholen. **Stand der Endprüfung (2026-10-18): Es kommt kein `OK`.** `origin/test` steht auf `f9b0cbc` (Website-Statistik, 2026-10-17), der Branch ist 40 Commits davor und 1 dahinter, ein Push würde als Nicht-Fast-Forward abgelehnt und nichts ausliefern. `src/App.jsx` und `src/lib/navLinks.js` verschmelzen von selbst; es gibt genau einen Textkonflikt in `tests/unit/navLinks.test.mjs` (beide Seiten ändern dieselben `deepEqual`-Listen). Richtig ist die Reihenfolge `… 'customers', 'hustler', 'legal', 'statistik'` für Mitarbeiter und `… 'customers', 'hustler', 'finance', 'legal', 'statistik', 'serverpuls', 'admin'` für Admins. Eine Probezusammenführung in einer Kopie lief mit allen Tests grün und grünem Build (Stand 820ccd5: 993 Tests).
3. **Letzter Test:** `cd /home/webklar/apps/ticket.webklar.com/dev-workers && free -m && timeout 600 node --max-old-space-size=1024 --test tests/*.test.mjs tests/unit/*.test.mjs` ⇒ `# fail 0`. 3. **Letzter Test:** `cd /home/webklar/apps/ticket.webklar.com/dev-workers && free -m && timeout 900 node --max-old-space-size=1024 --test --test-concurrency=2 tests/*.test.mjs tests/unit/*.test.mjs` ⇒ `# fail 0` (Stand nach den Endprüfung-Korrekturen: 996 Tests, rund 31 s). `--test-concurrency=2` ist Pflicht: ohne den Schalter startet Node bis zu 7 Prüfprozesse mit je bis zu 1 GB Speicher, und auf diesem Server hat genau so ein Lauf am 2026-10-04 den Speicher erschöpft (OOM-Kill). Vorher mit `free -m` prüfen, dass mindestens 2 GB frei sind.
4. **Live schalten (Push):** `git -C /home/webklar/apps/ticket.webklar.com/dev-workers push origin feature/workers:test`. Der Deploy-Webhook baut in 1–3 Minuten. Prüfen: `curl -sI https://ticket.webklar.com/fonts/PixelifySans-Variable.woff2 | head -3` ⇒ `HTTP/… 200`; das Build-Log des Ticket-Build-Containers (Name mit `docker ps --format '{{.Names}}' | rg -i ticket` finden, Muster `webklar-ticket-build`; `docker logs --tail 40 <name>`) endet ohne Fehler. 4. **Live schalten (Push):** `git -C /home/webklar/apps/ticket.webklar.com/dev-workers push origin feature/workers:test`. Der Deploy-Webhook baut in 1–3 Minuten. Prüfen: `curl -sI https://ticket.webklar.com/fonts/PixelifySans-Variable.woff2 | grep -iE '^(HTTP|content-type)'` ⇒ `HTTP/… 200` **und** `content-type: font/woff2` (steht dort `text/html`, ist es nur die Startseite, die nginx bei fehlender Datei liefert, und die Schrift fehlt); das Build-Log des Ticket-Build-Containers (Name mit `docker ps --format '{{.Names}}' | rg -i ticket` finden, Muster `webklar-ticket-build`; `docker logs --tail 40 <name>`) endet ohne Fehler.
5. **Im Browser (als Mitarbeiter):** Menü zeigt „Hustler“ statt des grauen „Leads“; `https://ticket.webklar.com/leads` und `https://ticket.webklar.com/workers` springen auf `https://ticket.webklar.com/hustler` (eine angehängte Query wie `?tab=botleads` bleibt erhalten); Seitentitel (H1) und Browser-Tab zeigen „Hustler“; die Seite zeigt die sechs Kennzahlen, das Hochhaus mit 10 Etagen und 19 Figuren, ein Klick auf eine Figur öffnet rechts die Karte (Name, Modell, Zähler, Spur); es gibt vorerst nur den Bereich „Hochhaus“ ohne Reiterleiste (der Reiter „Freigabe“ kommt mit P3, dort P3-E11); auf dem Handy: Zoom-Knöpfe, kein seitliches Scrollen. Zu Beginn sind genau die acht Such-Räume grau mit „noch nicht angeschlossen“ (Netz-Radar, Kleinanzeigen, Portale, Foren & Fragen, Ärzte & Praxen, Handwerk, Selbstständige, Läden & Gastro); Brücke, Waage, Mail-Stube, Forum-Stube, Posteingang, Abschluss, die drei Werkstatt-Tische, Prüftisch und Archiv sind von Anfang an farbig (P1-E9). Das ist richtig: ein Such-Raum wird erst farbig, wenn der Dienst ihn als angeschlossen meldet (P3 für Netz-Radar, Kleinanzeigen, Portale, Foren; P6 für die Branchen-Räume). 5. **Im Browser (als Mitarbeiter):** Menü zeigt „Hustler“ statt des grauen „Leads“; `https://ticket.webklar.com/leads` und `https://ticket.webklar.com/workers` springen auf `https://ticket.webklar.com/hustler` (eine angehängte Query wie `?tab=botleads` bleibt erhalten); Seitentitel (H1) und Browser-Tab zeigen „Hustler“; die Seite zeigt die sechs Kennzahlen, das Hochhaus mit 10 Etagen und 19 Figuren, ein Klick auf eine Figur öffnet rechts die Karte (Name, Modell, Zähler, Spur); es gibt vorerst nur den Bereich „Hochhaus“ ohne Reiterleiste (der Reiter „Freigabe“ kommt mit P3, dort P3-E11); auf dem Handy: Zoom-Knöpfe, kein seitliches Scrollen; ein Tipp auf einen Namen in der Liste holt die Karte nach oben ins Bild (der Name in der Karte hat dann den Fokus), „ד schließt sie und setzt den Fokus zurück auf den Listeneintrag. **Ausfall-Probe (solange P1 noch nicht läuft, also ohne `/api/workers/`-Block oder ohne Container):** statt des Hochhauses steht „Der Hustler-Dienst ist noch nicht erreichbar“ mit einer Meldung und dem Knopf „Neu laden“; sobald P1 läuft, zeigt ein Klick auf „Neu laden“ das Hochhaus ohne Seite neu zu laden. Fällt der Dienst später aus, bleibt das Hochhaus stehen und eine Zeile „Verbindung gestört: … Es wird weiter versucht.“ erscheint; ein hängender Abruf wird nach 20 s abgebrochen, die Seite friert nicht ein. Meldet der Dienst dauerhaft „401“, erscheint „Anmeldung abgelaufen. Bitte neu anmelden.“, und es wird höchstens alle 2 Minuten ein neues Anmelde-Token (JWT) erzeugt (Appwrite begrenzt das je Nutzer). Dieselben Fälle prüft der Prüfstand (Szenario F in `scripts/workers-harness/shot.cjs`) im Browser. Zu Beginn sind genau die acht Such-Räume grau mit „noch nicht angeschlossen“ (Netz-Radar, Kleinanzeigen, Portale, Foren & Fragen, Ärzte & Praxen, Handwerk, Selbstständige, Läden & Gastro); Brücke, Waage, Mail-Stube, Forum-Stube, Posteingang, Abschluss, die drei Werkstatt-Tische, Prüftisch und Archiv sind von Anfang an farbig (P1-E9). Das ist richtig: ein Such-Raum wird erst farbig, wenn der Dienst ihn als angeschlossen meldet (P3 für Netz-Radar, Kleinanzeigen, Portale, Foren; P6 für die Branchen-Räume).
6. **Pausenschalter (nur wenn P1 läuft):** „Alles anhalten“ ⇒ Hinweis „Angehalten …“ und heller Schleier im Hochhaus; danach „Fortsetzen“ — den Dienst **nicht** angehalten lassen. Als Admin: „Einstellungen“ öffnen (Titel „Hustler-Einstellungen“; unter „Kosten“ stehen im Standard Tagesgrenze 6 und Monatsgrenze 150, jeweils USD, [Kenso, 17.10.: max. 150 € im Monat]; die harte Grenze ist das Ausgabenlimit des Console-Workspaces, 150 $/Monat, Betriebsanleitung P1), nichts ändern, „Abbrechen“; als Nicht-Admin fehlt der Knopf. **Versand-Notbremse (H4):** Hat der Dienst den Versand wegen Bounces gestoppt (P4), zeigt das Board für alle Mitarbeiter eine rote Zeile „Versand gestoppt: <Grund>. Ein Admin kann ihn in den Einstellungen freigeben.“ und der Einstellungs-Dialog (nur Admin) oben den Block „Versand gestoppt“ mit dem Knopf „Versand wieder freigeben“. Den Knopf erst drücken, wenn die Ursache geklärt ist (Bounce-Adressen im Postfach prüfen, Sperrliste); er schickt nur `sendingHalted:false`, der Dienst löscht den Grund. Ohne Stopp sind Zeile und Block nicht zu sehen; wer sie vor dem Livegang sehen will, öffnet den Prüfstand aus P2-T21 mit `?halted=1`. 6. **Pausenschalter (nur wenn P1 läuft):** „Alles anhalten“ ⇒ Hinweis „Angehalten …“ und heller Schleier im Hochhaus; danach „Fortsetzen“ — den Dienst **nicht** angehalten lassen. Als Admin: „Einstellungen“ öffnen (Titel „Hustler-Einstellungen“; unter „Kosten“ stehen im Standard Tagesgrenze 6 und Monatsgrenze 150, jeweils USD, [Kenso, 17.10.: max. 150 € im Monat]; die harte Grenze ist das Ausgabenlimit des Console-Workspaces, 150 $/Monat, Betriebsanleitung P1), nichts ändern, „Abbrechen“; als Nicht-Admin fehlt der Knopf. **Versand-Notbremse (H4):** Hat der Dienst den Versand wegen Bounces gestoppt (P4), zeigt das Board für alle Mitarbeiter eine rote Zeile „Versand gestoppt: <Grund>. Ein Admin kann ihn in den Einstellungen freigeben.“ und der Einstellungs-Dialog (nur Admin) oben den Block „Versand gestoppt“ mit dem Knopf „Versand wieder freigeben“. Den Knopf erst drücken, wenn die Ursache geklärt ist (Bounce-Adressen im Postfach prüfen, Sperrliste); er schickt nur `sendingHalted:false`, der Dienst löscht den Grund. Ohne Stopp sind Zeile und Block nicht zu sehen; wer sie vor dem Livegang sehen will, schaut sich das Bild `.superpowers/sdd/2026-10-17-workers-p2-hochhaus-woms/shots/desktop-gestoppt.png` an (Claude zeigt es auf Wunsch). Den Prüfstand mit `?halted=1` gibt es nur als automatisches Skript (`scripts/workers-harness/shot.cjs`, baut und beendet sich selbst); eine Seite zum Aufrufen im Browser gibt es nicht.
7. **Zurücknehmen, falls nötig:** `git -C /home/webklar/apps/ticket.webklar.com/dev-workers revert --no-edit ALT..HEAD` (ALT aus Schritt 2; macht auch die Dokumentations-Commits rückgängig, das schadet nicht), dann `git -C /home/webklar/apps/ticket.webklar.com/dev-workers push origin feature/workers:test`. Prüfen: `https://ticket.webklar.com/leads` zeigt wieder die Tickets (graues „Leads“ im Menü). 7. **Zurücknehmen, falls nötig:** `cd /home/webklar/apps/ticket.webklar.com/dev-workers && git revert --no-edit $(git rev-list --no-merges ALT..HEAD)` (ALT aus Schritt 2; nimmt alle eigenen Commits in der richtigen Reihenfolge zurück und lässt den Merge-Commit aus Schritt 2 stehen, denn `git revert` kann einen Merge-Commit nicht ohne `-m` zurücknehmen; die Konfliktlösung im Navigations-Test bleibt dann stehen, das betrifft nur den Test, nicht die Seite; macht auch die Dokumentations-Commits rückgängig, das schadet nicht), dann `git -C /home/webklar/apps/ticket.webklar.com/dev-workers push origin feature/workers:test`. Prüfen: `https://ticket.webklar.com/leads` zeigt wieder die Tickets (graues „Leads“ im Menü).
8. **Danach (Claude):** Memory-Eintrag zu WOMS-Workers aktualisieren (Stand live, Commit-SHA, Ergänzungen P2-E1 bis P2-E7 stehen in der Übersicht §11.1, die Notbremsen-Anzeige entspricht A21 und H4). 8. **Danach (Claude):** Memory-Eintrag zu WOMS-Workers aktualisieren (Stand live, Commit-SHA, Ergänzungen P2-E1 bis P2-E7 stehen in der Übersicht §11.1, die Notbremsen-Anzeige entspricht A21 und H4).
### Bekannte Einschränkung vor dem Livegang: Handy-Startansicht (Entscheidung für Kenso)
Auf dem Handy (390 px Breite) startet das Hochhaus vergrößert (Zoom 1,56, damit die Raumtitel lesbar sind). Folgen: Das Bild zeigt zuerst nur die oberen zwei Drittel (Prüfung, Pult, Tresor und Keller erreicht man durch Ziehen auf dem Bild oder mit „Ganz“), und ein Wischen, das auf dem Bild beginnt, verschiebt das Bild statt die Seite zu scrollen (die Seite lässt sich über Kennzahlen, Liste und Ränder scrollen; das Bild ist nur etwa 290 px hoch). Es gehen keine Daten und keine Funktion verloren, die Liste mit allen 19 Workern ist die Alternative. Das ist so im Plan beschlossen (Startzoom nach Breite, `touch-action: none` ab Zoom 1) und wird bewusst nicht ohne deine Entscheidung geändert. Zur Wahl:
1. So lassen (empfohlen für den Start): als bekannte Einschränkung hinnehmen.
2. Auf dem Handy mit dem ganzen Hochhaus starten (Zoom 1): Seite scrollt überall, aber die Raumtitel sind dann winzig (etwa 5 px).
3. Zoom 1,56 behalten, aber nur mit zwei Fingern oder nach „+“ verschieben, mit einem Finger scrollt die Seite (`touch-action: pan-y`): braucht eine kleine Änderung in `scene.js` plus Test.