11 KiB
Hustler-Pixelwelt in WOMS – Plan
Stand: 22.10.2026 · Status: Entwurf zur Freigabe durch Kenso · Spec: docs/superpowers/specs/2026-10-22-hustler-pixelwelt-design.md
Repo /home/webklar/apps/ticket.webklar.com/dev-hustler-pixel, Branch feature/hustler-pixel ab feature/workers c0163c3, node_modules als Verweis auf ../build/node_modules (kein npm install). Ausgangslage: 1154 Tests grün.
Ausführung: wie P1–P6 – ich steuere, Sonnet-Umsetzer je Aufgabe (Auftrag mit Sicherheitsblock), schlanke Prüfung je Aufgabe, am Ende eine Endprüfung. Jede Aufgabe endet mit grünen Tests und einem Commit (git add nur mit Namen, nie --force, nichts pushen). Node-Tests immer timeout … node --max-old-space-size=1024 --test --test-concurrency=2, vor schweren Läufen free -m (≥ 2500 MB frei). Prüfstand-Fotos laufen einzeln, nie parallel zu einer Testsuite.
Quelle der Vorlage: /root/reports/workers-2026-10-16/pixelwelt-v2/ (identisch mit der Zeichenfläche, Stand 22.10.). Arbeitskopien für geänderte Grafik: /root/reports/workers-2026-10-16/pixelwelt-woms/ (die Vorlage selbst wird nicht verändert).
Teil A – Grafik und Import
T1 Haus-Bild mit beweglichen grauen Räumen (Spec E4)
- Kopie von
haus/gen.pynachpixelwelt-woms/haus/; Zusatz: alle Räume hell (dim=False), neue helle Deko für Kleinanzeigen (Preisschild-Brett), Portale (Bildschirm mit Liste) und Foren (zwei Sprechblasen) im Stil der Nachbarräume, Raumlicht an. - Zusätzlich je Such-Raum (
netz, kleinanzeigen, portale, foren, aerzte, handwerk, selbst, laden) eine Ebeneraum-grau-<raum>.png(Ausschnitt des Raums, Dunkelfilter + Spinnweben wie bisher) mit Lage im Manifest. - Vorschau
vorschau-alle-hell.pngundvorschau-alle-grau.png(×2) – Kenso schaut drauf, bevor T5 sie einbaut. - Fertig: deterministisch (
timeout 300 python3 -I gen.py), alle übrigen Pixel vonhaus.pnggleich wie vorher (Prüfung per Bildvergleich außerhalb der drei Räume).
T2 Import-Skript und Schriften (Spec E2, E3)
scripts/hustler-import.mjs <pixelwelt-v2> <pixelwelt-woms>: Tabelle „Blob-Schlüssel → Quelldatei“ je Bildschirm (ausentwurf/bauen.py,keller/entwurf/bauen.py,pult/entwurf/bauen.py), Prüfung gegenhochgeladen.sha256bzw. Hash der Datei; kopiert nur benutzte PNGs nachsrc/assets/hustler/{haus,welt,figuren,ui,detail,keller,pult}/.- Zieht den
<style>-Block der drei Artboards heraus →src/styles/hustler/{hochhaus,keller,pult}.css:/_blob/…→ relativer Asset-Pfad, jede Klasse und jeder Keyframe-Name mithk-davor,body{…}→ Wurzelklasse des Bildschirms, Google-Fonts-Link entfällt. - Schreibt
src/lib/hustlerWelt.js(reine Daten): Weltgröße, Haus-Rechteck, Etagen (oben/unten), Räume, Anker der 19 Hustler, Briefkasten/Tresor/Keller-Schildpunkte, Aufzug-Halte, Sprite-Tabelle, Zeitachsen Arne/Boten/Tür/Briefkasten, Detail-Szenen-Anker. - Schriften:
public/fonts/PressStart2P-Regular.woff2+ OFL-Text (lokal vorhandene OFL-Kopie, Hash wird mit der Google-Fonts-Fassung verglichen),@font-faceinsrc/styles/hustler/schrift.css. - Test
tests/unit/hustlerAssets.test.mjs: jedeurl(...)in den drei CSS-Dateien zeigt auf eine vorhandene Datei, keine Datei insrc/assets/hustlerist unbenutzt, jede Klasse/Keyframe beginnt mithk-, kein/_blob/und keinfonts.googleapisübrig, Skript ist idempotent (zweiter Lauf ändert nichts).
Teil B – Gerüst und reine Logik
T3 Seite und Daten-Fluss (Spec E8)
WorkersPage.jsx: Seitenkopf und Reiterleiste raus;useWorkersFeedwandert aus dem Board auf die Seite (Zustand + Hustler-Tabelle überindexWorkers/reduceEvents, Ereignisse gehen zusätzlich an die Regie), damit Kopfzahlen, Arne und Boten auf allen drei Bildschirmen stimmen.?tab=undbot=wie bisher; Wechsel persetParams.- Vollhöhen-Layout:
.hk-seitefülltmain(Desktop100dvh, Handy100dvhminus Mobilleiste), kein Seiten-Scrollen. - Tests:
workersRouteangepasst (Route, Umleitungen, Lazy-Load bleiben), neuer Test: Tab-Auswahl, Feed einmal pro Seite, unbekannter Tab → Hochhaus.
T4 Reine Ableitungen src/lib/hustlerSicht.js (Spec E5–E7, E10)
figurZustand(workerId, eintrag, { paused })→ Sprite-Klasse, grau ja/nein, Extras (Bildschirm, Radar, Punkte, Zzz, Alarm, Raum grau),aria-label.anzeigeName(workerId)(„Overseer“ fürotto),modellName(model).hudWerte(kpis)(Münzen, fünf Icons, Strich bei fehlenden Werten, Budget-Warnstufe über die vorhandene 80-%-Regel).detailModell(workerId, eintrag, trace, now)(Felder der Detailansicht, Spur übertraceRows).- Kamera als reine Funktionen aus der Vorlage (
grenzen,passend,zoomAuf,etage, Mindestzoom „cover“). - Tests
tests/unit/hustlerSicht.test.mjs: alle fünf Status + Overseer + Pause, unbekannter Status, alle 19 Hustler bekommen ein Label; HUD mit vollen/leeren/kaputten Werten; Detail mit/ohne Trace; Kamera-Grenzen (nie Himmel über Rand, Zoom 5 max, Zoom um Mauspunkt hält den Punkt fest).
Teil C – Hochhaus
T5 Welt components/workers/hochhaus/HochhausWelt.jsx + useKamera.js (Spec E1, E4, E5, E8, E14)
- Ebenen wie Vorlage (Himmel, Funkeln, Mond, Welt + Lichter, Haus + Fenster + Schild + Neon, Antenne, Aufzug + Seil, Schnee), Raumschilder aus
ROOM_TITLES, Bildschirm/Radar nur beiarbeitet, graue Raum-Ebenen nachconnected, Briefkasten-Zähler, Tresor- und Keller-Schild aus den Kennzahlen. - Etagen als Knöpfe (zoomen) bzw. Links (Freigabe →
?tab=freigabe, Keller →?tab=botleads), Hustler als Knöpfe → Detailansicht. - Kamera: Mausrad, Ziehen, Pinch, Doppelklick/-tipp, Tasten +/−/0/Esc, Gleiten 0,55 s (aus bei „weniger Bewegung“), nach einem Zug kein versehentlicher Klick. Bei
pausedund bei verdecktem Tab stehen die CSS-Animationen (animation-play-state). - Tests (fakeReact): Figur-Klassen je Status, graue Räume, Etagen-Ziele, Zähler 0 → kein Badge, Labels; Kamera-Hook mit nachgestellten Zeigerereignissen.
T6 Kopfzeile, Meldungen, Pause, Einstellungen HochhausKopf.jsx (Spec E7)
- Panels mit Münzen und fünf Icons, Pause/Fortsetzen mit Pixel-Rückfrage (Logik 1:1 aus
WorkersBoard: Zielwert übergeben, Fokus zurück, Rückfrage verschwindet, wenn jemand anderes angehalten hat), Zahnrad nur für Admins → bestehenderWorkersSettingsDialog. - Banner: Notbremse (
haltReasonOfübernommen), Verbindung gestört, Umschalten fehlgeschlagen; Dienst nicht erreichbar → Pixel-Leerzustand mit „Neu laden“. - Tests: die fachlichen Zusicherungen aus
workersComponentszu Pause/Notbremse/Admin übernommen, plus HUD-Ausgabe.
T7 Detailansicht HustlerDialog.jsx (Spec E10)
- Szene + große Figur nach Status (Büro / Stecker / Brücke), Daten aus
detailModell,useWorkerTracewie bisher (15 s), Blättern in Roster-Reihenfolge, Esc/←/→, Fokusfalle, Fokus zurück zur Figur. - Tests: Felder, Laden/Fehler/leere Spur, unsichere Links bleiben Text, Blättern über das Ende, Fokus.
T8 Regie src/lib/hustlerRegie.js + RegieEbene.jsx (Spec E9)
- Rein:
eventToSteps→ Effekte mit Start/Dauer/Ort (Weltkoordinaten aushustlerWelt), höchstens 4 gleichzeitig, Rückstau über 12 verworfen,weniger Bewegung→ nur Blasen,flush()beim Zurückkehren in den Tab. - Ebene: Pixel-Sprechblase, Icon-Pop (vorhandene PNGs: Haken, Stopp, Umschlag, Akte, Münze, Alarm), fliegender Umschlag per CSS-Übergang, Hüpfer.
- Tests: Zuordnung je Schrittart, Höchstzahl, Rückstau, Zeitablauf mit eigener Uhr, unbekannte Hustler fallen weg.
Teil D – Pult
T9 Dein Pult components/workers/pult/ (Spec E11, Regeln Spec §2)
PultSzene.jsx(Raum, Lichter, Fenster-Schnee, Uhr, Lichterkette, Boten-Schleife nur wennpultOpen > 0),Klemmbrett.jsx(Reiter mit Zahl, Untertitel, Leerzustände, Umschläge, Meldung, „Pult zuklappen“),Brief.jsx(Dialog).PultList.jsxwird zum Klemmbrett; der heutigePultRowbleibt als Herz des Briefs erhalten (gleiche Zustände, Handler, Texte,rowModel-Schalter) und bekommt nur neues Markup (Stempel-Knöpfe). Entwürfe und Felder überleben weiter Filterwechsel und Neuladen.ProspectPanelöffnet aus dem Brief.- Tests:
workersPultUiund Panel-Teil vonworkersProspectumgestellt (Umschlag öffnen → Aktion), jede bisherige Zusicherung bleibt; neu: Umschlag-Inhalt je Art/Status, Brief schließt nach Abschluss und gibt Fokus an Meldung/Liste, Boten nur bei wartenden Einträgen.
Teil E – Keller
T10 Keller · Bot-Leads components/workers/keller/ (Spec E12)
KellerSzene.jsx(Arne-Schleife nur beiarbeitet, sonst döst er; Rohrpost, Schublade, Stempel synchron; Maus, Staub, Lampen-Flackern),RegisterBuch.jsx(Reiter, Suche, Einträge, Blättern),Akte.jsx(Dialog).src/lib/botleadGruende.js: Grund-Text → Icon + Erklärung für die 14 Gründe des Dienstes (inkl. „Punktzahl unter 55“ und „Lauf unterbrochen“), sonst allgemeiner Satz. Fixturetests/fixtures/botlead-gruende.json(Texte ausscoring/business.jsdes Dienstes, Stand d0d66f9).BotLeadList.jsxwird zum Register-Buch; Abruf-, Such-, Seiten- und Einzelansicht-Logik bleibt.- Tests:
botleadListundbotleadsViewumgestellt (alle Zusicherungen bleiben: Verzögerung, Fokus beim Blättern, „Erneut versuchen“, Einzelansicht, Telefonregel); neu: Grund-Tabelle deckt die Fixture, Akte zeigt Scout/Telefon/Quelle, Arne-Zustand.
Teil F – Aufräumen und Abnahme
T11 Alte Oberfläche entfernen
- Löschen:
components/workers/engine/*,WorkersStage,WorkersBoard,WorkerCard,WorkerList,WorkersKpisund die neun Engine-Tests (209 Tests: camera, director, fx, layout, lift, props, rooms, scene, sprites) samthelpers/engineVm.mjs, falls nichts anderes es braucht. workers.cssauf das Nötige (Einstellungen-Dialog, ProspectPanel) gekürzt;workersCss,workersComponents,workersFont,workersSmokeangepasst.- Fertig:
grepfindet keinen Verweis mehr auf die Engine; Suite grün;vite buildok.
T12 Prüfstand und Fotos
scripts/workers-harness/entry.jsxrendert die neue Seite mitscripted-api.js(alle Status, grau, fehler, Pause, Notbremse, Pult in allen Arten, 112 Bot-Leads).- Fotos 1280×720, 1920×1080, 390×844: Hochhaus ganz, Etage herangezoomt, Detail je Status, Pult mit Brief, Keller mit Akte. Seite an Seite mit der Zeichenfläche verglichen; Abweichungen werden behoben oder Kenso genannt.
T13 Endprüfung und Bericht
- Volle Suite,
vite build, Sonnet-Prüfer mit drei Blickwinkeln: (1) Pult-Regeln gleich wie vorher (Diff gegen alte Zusicherungen), (2) Fokus/Tastatur/Screenreader/„weniger Bewegung“, (3) Leistung (Anzahl animierter Elemente, kein Speicherleck beim Tab-Wechsel, Bildgröße) und CSS-Kollisionen. - Funde beheben, Bericht für Kenso (was geht, Fotos, was bewusst abweicht, Livegang-Hinweis: WOMS-Teil gehört zum Livegang „P3 (+P2 WOMS)“).
Reihenfolge
T1 → (Kenso schaut Haus-Vorschau) · T2 · T3 · T4 → T5 → T6 → T7 → T8 → T9 → T10 → T11 → T12 → T13.
T1 und T2 können parallel laufen; ab T3 nacheinander (gemeinsame Dateien: WorkersPage.jsx, CSS).
Risiken
- Bildgröße: ~1,3 MB PNG beim ersten Öffnen (danach im Cache). Gegenmaßnahme: lazy Seite, Keller/Pult-Bilder erst beim Öffnen des Reiters (eigene CSS-Chunks).
- Viele CSS-Animationen auf schwachen Rechnern: bei verdecktem Tab und Pause angehalten, „weniger Bewegung“ schaltet ab.
- Vorlage ändert sich (Kensos Hustler-Designs): Import-Skript neu laufen lassen, Tests zeigen fehlende Dateien/Klassen sofort.