Files
tickte-system/docs/superpowers/specs/2026-10-22-hustler-pixelwelt-design.md
T

73 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Hustler-Pixelwelt in WOMS – Spec
Stand: 22.10.2026 · Status: **Entwurf zur Freigabe durch Kenso** · Branch `feature/hustler-pixel` (ab `feature/workers` c0163c3)
## 1. Ziel
Die in der Claude-Design-Zeichenfläche „Hustler – Oberflächen“ abgenommene Pixel-Nachtwelt ersetzt die bisherige helle Oberfläche des Hustler-Reiters (P2–P6). Drei Bildschirme:
| Bildschirm | Vorlage (Zeichenfläche) | ersetzt heute |
|---|---|---|
| **Hochhaus** – 16:9-Spielwelt mit Zoom/Ziehen, klickbare Etagen und Hustler, Detailansicht, Kopfzeile mit Münzen und Icons | `Main.dc.html` | `WorkersBoard` (Kanvas-Engine, Kennzahlen, Karte, Liste) |
| **Keller · Bot-Leads** – Archiv-Szene mit Arne, Liste als Register-Buch, Akte | `BotLeads.dc.html` | `BotLeadList` (Tabelle) |
| **Dein Pult · Freigabe** – Büro-Szene mit Aufzug und Briefkasten, Umschläge auf dem Klemmbrett, Brief | `Freigabe.dc.html` | `PultList` (Zeilenliste) |
Alles hängt an den echten Daten: `workersApi`, `useWorkersFeed`/Ereignisstrom, `usePultFeed`, `api.botleads`, `api.trace`. Keine Beispieldaten im Code (nur im Prüfstand und in Tests).
Nicht Teil davon: Freigabe-Handy, Kaufseite (Portal), Dienst-Code, neue Funktionen der Hustler.
## 2. Unveränderte Regeln (Vertrag)
- **Pult-Aktionen exakt wie heute:** Sichtbarkeit und Sperren kommen aus `rowModel` in `src/lib/workersPult.js`; Ablauf, Texte und Rückfragen aus dem heutigen `PultRow` (Rückfrage 4 s bei Verwerfen/Freigeben/Bauen, `BUILD_HINT`, „Kopieren & öffnen“ über `copyAndOpen`, Antworten/Einfügen mit 8000-Zeichen-Grenze, `UNCERTAIN_TEXT`, Übernehmen, Fokus-Rückgabe). `workersPult.js` wird nicht geändert.
- **Bot-Leads:** Telefonregel (`phoneLabel`, Heilberufe nie), sichere Links (`safeHref`), Raumfilter, Suche mit Verzögerung, Seiten vom Dienst (50 je Seite), Einzelansicht über `?tab=botleads&bot=<id>`.
- **Hochhaus:** Pause mit Rückfrage (nur Anhalten fragt), Einstellungen nur für Admins, Notbremse-Hinweis (`sendingHalted`), Verbindungsfehler-Hinweis, Spur nur mit sicheren Links (`safeLink`).
- `src/lib/*` (Events, Feed, View, Pult, Roster, Api, Prospect, Focus) bleibt fachlich gleich; neue reine Funktionen kommen in neue Dateien.
## 3. Entscheidungen (meine Vorschläge, Kenso gibt frei)
**E1 Technik: DOM + CSS statt Kanvas.** Die Welt ist wie in der Vorlage ein 2400 × 1200 großes Element mit PNG-Ebenen, per `transform` verschoben und gezoomt; Figuren, Etagen und Effekte sind HTML-Elemente, Animationen reine CSS-Sprite-Animationen (`steps()`). Die Kanvas-Engine (`components/workers/engine/*`) samt `WorkersStage`, `WorkerCard`, `WorkerList`, `WorkersKpis`, `WorkersBoard` entfällt.
**E2 Bilder:** Die PNGs aus `pixelwelt-v2` kommen nach `src/assets/hustler/<gruppe>/` und werden aus dem CSS referenziert (Vite hängt einen Hash an, kein Cache-Ärger nach Updates). Nur benutzte Dateien, ca. 1,3 MB, Seite lädt weiter lazy. Ein Import-Skript (`scripts/hustler-import.mjs`) kopiert die Bilder, übernimmt das CSS der drei Artboards (Blob-Adressen → Asset-Pfade, alle Klassen und Keyframes mit `hk-` vorangestellt, damit nichts mit dem WOMS-CSS kollidiert) und schreibt die Geometrie (Welt, Haus, Etagen, Anker, Aufzug-Halte, Zeitachsen) nach `src/lib/hustlerWelt.js`. So lässt sich jede spätere Änderung an der Zeichenfläche (z. B. Kensos Hustler-Designs einzeln) neu einspielen.
**E3 Schriften:** Pixelify Sans (liegt schon da) und Press Start 2P (SIL OFL, für Zahlen und Überschriften) selbst gehostet unter `public/fonts/`, kein Google-Fonts-Abruf.
**E4 Graue Räume dynamisch:** Im Entwurfsbild sind die Räume von Kim, Pia und Finn fest abgedunkelt. Echt ist „nicht angeschlossen“ ein Zustand, der sich ändert (alle acht Such-Räume können grau sein, `SEARCH_ROOMS`). Darum wird `haus.png` mit allen Räumen hell neu erzeugt (kleine neue Raum-Deko für Kleinanzeigen, Portale, Foren im Stil der übrigen Räume) und für jeden der acht Such-Räume eine abgedunkelte Raum-Ebene (gleicher Generator, Dunkelfilter + Spinnweben) erzeugt, die nur bei `connected: false` erscheint. Vorschau bekommt Kenso vor dem Einbau.
**E5 Status → Figur** (Haus und Detailansicht):
| Dienst-Status | Figur | Zusatz |
|---|---|---|
| `arbeitet` | farbig, tippt | Bildschirm leuchtet; Rita: Radar läuft |
| `wartet` | grau, Kaffeetasse | „…“-Punkte |
| `leerlauf` | grau, schläft | „Zzz“ |
| `grau` (nicht angeschlossen) | grau, steht | Raum abgedunkelt (E4); Detail: Szene mit Stecker |
| `fehler` | grau, steht | roter „!“-Marker über dem Kopf, Statustext rot |
Overseer (`otto`): Kristall immer sichtbar; nur bei `arbeitet` volles Leuchten, sonst gedimmt. Bei `state.paused` stehen alle Animationen still und die Kopfzeile zeigt „Angehalten“.
**E6 Name:** `otto` heißt in der Oberfläche „Overseer“ (Anzeige-Name, wie in der Zeichenfläche). Roster, Fixture und Dienst bleiben bei `otto`/„Otto“. Texte, die der Dienst schreibt (Spur, Ereignisse), können noch „Otto“ sagen – das wäre eine eigene Dienst-Änderung.
**E7 Kopfzeile (HUD):** grüne Münze = `kpis.mrrNewEur` („+60 €/M“), rote Münze = `kpis.apiTodayUsd` („−5,10 $“, Hinweis-Text „von 6,00 $“ im Titel, ab 80 % blinkt sie). Icons mit Zahl: Stern Abos (`newAbosMonth`), Pokal Deals (`dealsMonth`), Blase Gespräche (`openThreads`), Glocke Wartet auf dich (`pultOpen`), Roboter Bot-Leads (`botLeads`). Fehlende Werte zeigen „–“. Rechts: Pause/Fortsetzen (mit Pixel-Rückfrage wie heute) und Zahnrad (nur Admin, öffnet den bestehenden Einstellungen-Dialog unverändert). Meldungen (Notbremse, Verbindung gestört, Umschalten fehlgeschlagen) als Pixel-Banner unter der Kopfzeile.
**E8 Navigation:** `?tab=hochhaus|freigabe|botleads` bleibt (Links aus dem Ereignisstrom und `/leads`/`/workers`-Umleitungen funktionieren weiter). Etage „Freigabe“ → Pult, Etage „Keller“ → Bot-Leads, alle anderen Etagen zoomen heran. Pult und Keller haben oben links „◂ Hochhaus“. Im Haus: Briefkasten-Zähler = `pultOpen` (bei 0 weg), Tresor-Schild „N Deals“, Keller-Schild „N Bot-Leads“. Die Seitenüberschrift „Hustler“ und die Reiterleiste entfallen (Tab-Titel bleibt „Hustler“). Die Welt füllt den Inhaltsbereich neben der WOMS-Seitenleiste in voller Höhe.
**E9 Ereignisse sichtbar machen (leicht):** Status und „Gerade“-Text folgen live dem Ereignisstrom (`reduceEvents`, wie heute). Zusätzlich übersetzt eine neue kleine Regie (`src/lib/hustlerRegie.js`, rein, testbar) die vorhandenen Schritte aus `eventToSteps` in kurze Effekte: Sprechblase (2,5 s), Stempel/Umschlag/Akte/Alarm-Symbol über der Figur, Umschlag fliegt von Figur zu Figur (`give`), kleiner Hüpfer (`cheer`), Münzen in den Tresor (`deal`). Höchstens 4 gleichzeitig, Rückstau wird verworfen, „weniger Bewegung“ zeigt nur Blasen, verdeckter Tab sammelt nichts an. Symbole kommen aus den vorhandenen Icon-PNGs, keine neue Grafik.
**E10 Detailansicht:** wie Zeichenfläche (Büro-, Stecker- oder Brücken-Szene mit großer Figur nach E5, daneben Name, Status, Modell, Etage · Raum, Aufgabe, Gerade, Heute, Kosten · Tokens, Spur, ◂ n / 19 ▸). Daten: Modell aus `MODEL_IDS` als „Claude Opus 5.5“ usw., Aufgabe = `trace.worker.role` sonst Roster-Rolle, Gerade = `worker.task`, Heute = `counterLines`, Kosten/Tokens aus `trace.today`, Spur = `traceRows` (neueste zuerst, nur sichere Links). Tastatur: ←/→ blättern, Esc schließt, Fokus bleibt im Dialog und geht danach zur Figur zurück.
**E11 Pult:** Szene wie Zeichenfläche; die Boten-Schleife (Clara, Nora, Aufzug, Fähnchen) läuft nur, solange etwas wartet, sonst ruht der Raum. Klemmbrett mit Reitern Wartet / Veraltet / Erledigt (`PULT_FILTERS`, `usePultFeed` unverändert). Zahl am Reiter: „Wartet“ aus `kpis.pultOpen`, am aktiven Reiter die Länge der Liste; für die anderen beiden gibt es keine Zahl (sonst drei Abrufe alle 30 s). Ein Umschlag zeigt Art-Icon, Titel, Alter, ggf. Frist/übernommen/veraltet/Ergebnis-Stempel und „von <Hustler>“. Klick öffnet den **Brief**: Original, Entwurf (bearbeitbar bei sendbaren Arten), Stempel-Knöpfe = die heutigen Aktionen nach `rowModel`, Antworten-/Einfügen-Feld, „Interessent“ öffnet das bestehende `ProspectPanel`. „Pult zuklappen“ zeigt die Szene ganz.
**E12 Keller:** Szene wie Zeichenfläche; Arne läuft seine Ablage-Schleife nur bei `arbeitet`, sonst döst er am Pult (Haus-Figur, schläft), Rohrpost nur bei `arbeitet`. Register-Buch: Raum-Reiter (`ROOM_FILTERS`, Zahl nur am aktiven Reiter = `total`), Suche, Einträge der Dienst-Seite (50) im Buch scrollbar, Blättern ◂ ▸ mit „Seite x von y“. Zeile: Raum-Icon, Name, Ort, Grund-Icon + Grund. **Akte** (Dialog): Grund mit Erklärung (Tabelle für die 14 Gründe aus `scoring/business.js` des Dienstes, unbekannt → allgemeiner Satz), Scout aus dem Roster, Punkte, Telefon nach `phoneLabel`, Quelle (`safeHref`), gefunden am, „gekürzt“. „Register zuklappen“ zeigt die Szene ganz.
**E13 Handy (unter 720 px):** Haus mit Wischen/Pinch wie am Desktop, Kopfzeile bricht um. Pult und Keller: Klemmbrett/Buch in voller Breite über der abgedunkelten Szene; Brief, Akte und Detailansicht als Vollbild. Keine eigenen Handy-Entwürfe – schlicht und benutzbar.
**E14 Barrierefreiheit:** Etagen und Figuren sind echte Knöpfe mit deutschem `aria-label` („Lea, Haiku, arbeitet“), Bilder `aria-hidden`, Dialoge `role="dialog"` mit Fokusfalle, Tastenkürzel im Haus (+/−/0/Esc), „weniger Bewegung“ schaltet Schnee, Flackern und Gleiten ab.
## 4. Tests
- Alle Tests der reinen Logik (`workersEvents`, `workersFeed`, `workersView`, `workersPult`, `botleadsView`, `workersRoster`, `workersApi`, `workersSettingsForm`, `workersFocus`, `workersProspect` (Logik), `copyableCredential`, `navLinks`, `routeErrorBoundary`) bleiben **unverändert grün**.
- UI-Tests, die die alte Oberfläche abbilden (`workersPultUi`, `botleadList`, `botleadsView` (Teil Komponente), `workersComponents`, `workersCss`, `workersRoute`, `workersFont`, `workersProspect` (Teil Panel), `workersHarness`, `workersSmoke`), werden auf die neue Struktur umgestellt; **jede fachliche Zusicherung bleibt** (gleiche Aktionen, Texte, Sperren, Rückfragen), nur Klassen/Wege ändern sich (z. B. erst Umschlag öffnen, dann Knopf drücken).
- Die Tests der Kanvas-Engine (`workersCamera`, `workersDirector`, `workersFx`, `workersLayout`, `workersLift`, `workersProps`, `workersRooms`, `workersScene`, `workersSprites`) gehen mit der Engine.
- Neu: Geometrie (jeder der 19 Hustler hat einen Anker in seinem Raum, Etagen lückenlos), Status→Figur-Tabelle inkl. `fehler`/`grau`/Overseer/Pause, HUD-Werte und Striche, Kamera-Mathematik (Grenzen, Zoom um Punkt, Etage heranzoomen), Regie (Blasen, Höchstzahl, Rückstau, weniger Bewegung), Detailansicht (Daten, Blättern, Fokus), Pult (Umschlag → Brief → jede Aktion wie bisher), Keller (Buch, Akte, Grund-Tabelle deckt alle Dienst-Gründe), Assets (jede im CSS genannte Datei existiert, keine Datei ungenutzt, keine fremde Klasse ohne `hk-`).
- Prüfstand (`scripts/workers-harness`) zeigt die neue Seite mit dem Skript-Dienst; Bildschirmfotos 1280×720, 1920×1080 und 390×844 für Kenso.