Patch-Notes / v0.8.8

Patch-Notes v0.8.8

27.08.2026

Neu

  • Dein Platz + Dein DMG auf allen sechs Run-Boards (inkl. KW)
  • Highscore Letzte-10-Runs mit Spalten Dein Platz + Dein DMG (eingeloggt, board recent)
  • Show-Panel Mobile-Pendant (Gate-Run R1/R2, ui-527-Yield-Kette)
  • Tutorial-Sequenzen mobil verdrahtet (Loader unconditional + Scroll-Fixes)
  • Gate-Erklaerschritte Template/Rearm ab Run 2 statt Run 3
  • Privatraum-Zeilen ohne frei-Anzeige (X/CAP nur fuer oeffentliche Raeume)
  • Show-Panel Run-2-Content (Upgrades/Rang-Motivation, Fifty-Diktat)
  • Gate-Run Show-Panel (Geniess die Show) + Desktop-Bridge-Yield-Guard
  • Gast-Neuanlage resettet lokales Onboarding (ct_onboarding_v1)
  • Privater Raum fuer neue Spieler - Raum-Typ private (Owner-only-Sichtbarkeit inkl. WS-Gate, Schwelle 1, Matcher-/Featured-Ausschluss, Idle-Abbau) + 3-Run-Progress-Gate (users.private_room_gate_runs Migration 042 additiv ohne Backfill; Grandfathering zur Laufzeit: runsCompleted=0 UND hexa_grants vorhanden - jeder echte Run schreibt grants, Race fuer Runs 2/3 strukturell tot, Run-1-Restfenster dokumentiert selbstheilend da Gate vor jedem routeJoin frisch gelesen; Gast-Twitch-Merge via GREATEST) + routeJoin-Weiche server-seitig (4. Param, Bestandsaufrufer unveraendert); Premium-Solo-Struktur-Anker; Last-Kennzahl 100 Raeume ca. 4%/1.1% Tick-Budget; 38+neue Tests, Integration 29/29, 2 Bugs im Bau gefangen; PTR-Vermerk
  • NPC-Bot-Tower fuer den letzten Gate-Run im Privatraum - 2 (max 3) statische Uebungs-Tower via normaler Player-Factory (towerQueue-Push neben dem Owner, AllMode-Fallback, 0 Diff in player/awards/loop - kein Sonderpfad), zaehlen wie Mitspieler (maxTowerCount/Divisor/Ranking/Run-Ende; Rang-1-Reward real 20->40 Hexa, Review formelgeprueft), Persistenz-Guard filterBotAwardsForPersistence am einzigen processRunEnd-Ort (0 DB-Writes fuer bot-Logins, Praefix kollisionsfrei), Snapshot-Marker bot:true + Uebung-Pille beide Layouts, Glossar Uebungs-Tower; 23 Tests, Review 0/0/0; Endscreen-Viewer-Bestandsluecke (getPlayerState ohne room-Feld bei !running, srv-111-Aera) als Folge-Ticket-Fund dokumentiert; PTR-Vermerk
  • Mobile Yield-Kette hook>Bridge>CTA + Hexa-Bruecke fuer Mobile-Gaeste
  • Tutorial-Bloecke als Floating-Coachmarks + Tab-Gate-Fix
  • Panel-Feinschliff + Hexa-verdient-Moment fuer Gaeste
  • Tower-Tab-UX (Fifty Tutorial-Runde 3, letztes Ticket) - Fokus-Set speichert onclick (Debounce 500ms trailing im saveTemplate-Muster, Klick-Salve = 1 PUT, Set-leeren bricht laufenden Debounce clearTimeout-race-frei live 3x belegt, Fehler-Rollback auf saved+Toast, Speichern-Button + totes CSS raus, EINE Schreibstelle saveFocusSet, Viewer-Gate frozen-on-spawn unberuehrt, trailing Save ueberlebt PJAX via Node-Closure); Template-Legende in den Template-Block unter Schritt-hinzufuegen (Wortlaut gleich, unten raus); Pre-Lift-Skip-Jargon ersatzlos gestrichen; Zusatz-AK aus ui-517-Review: Mein Tip:/Mein 2. Tip: byte-exakt (Fiftys Diktat) + Pin nachgezogen; Review 0/1/0 (should: In-Flight-Race ohne Sequenz-Guard - matcht bestehendes Template-Muster, Generation-Counter-Fix-Richtung als followup); npm test 7363/0; HANDOFF: Tutorial-Runde-3-Eintrag (Privatraum-Eintrag rotiert); PTR-Nachhol-Vermerk
  • Tutorial-Info-Bloecke Tower-Tab#1/Achievement-Tab/Tower-Tab#2 (Fifty Tutorial-Runde 3, Wortlaute Fifty) - drei Inline-Bloecke im ui-488-Banner-Muster (immer server-gerendert, Sichtbarkeit client-seitig, obMarkSeen(step,false)-Seed OHNE mergeOnboarding, Allowlist +3 server-persistiert, dismissbar einmalig): #wth-intro ueber der Hexa-Basis mit CTA der den ECHTEN .dash-tab-PJAX-Link klickt (kein zweiter Nav-Mechanismus, Fallback Vollnav), #ath-intro mit dynamischen Champion-Werten (CHAMPION_ACHIEVEMENT_ID placement_first, tiers[0].drop_reward + HEXA_REWARD_PER_TIER -> live 1 Draw/25 Hexas, Cannon aus WEAPON_CATALOG, Tab-Label aus TAB_LABELS -> Tower), #wth-tips hinter Server-Gate championTier1Claimed (gleiche achievement_claims-Zeile/tier_index-1-Semantik wie der Claim-Pfad, mutationsgeprueft) mit Vorrang-Regel #1 vor #2; Live-Sequenz beidseitig komplett (CTA-PJAX auch im Setup-Popin, Claim-Round-Trip 1/25 == Blocktext, Dismiss-Persistenz, Bestands-User leer, Mobile 390 isoliertes Profil); 34 neue Tests, Review 0/1/0 (should: DL-3-Woertchen 'Mein' Tip gekuerzt - wandert als Zusatz-AK in ui-518), eigener CTA-Sync-Bug im Bau gefangen+gefixt; PTR-Nachhol-Vermerk
  • Wording-Migration Waffe->Tower player-facing (Fifty-Entscheide zu ui-520: Tab heisst Tower, Tower==Waffe als Typ-Konzept, Achievements Tower-spezifisch, Legal mit, TAB_LABELS-SSOT) - neue kanonische Quelle src/render/tab-labels.js (deps-frei, SSR via dash-nav + Client-ESM + window.CTUtil.tabLabel-Bridge fuer dash-onboarding als Nicht-ESM), alle Audit-Buckets A-H inkl. F admin.js + G styleguide.js (Spiegel-Pflicht) migriert, 51 Dateien: Views/Client/Glossar (4 Umzuege W->T mit vormals-Vermerken + 4 Verworfene-Begriffe)/Legal/Specs player-facing; Audit-Gap-Fund gefixt: web/achievements.json 9x Klassenbester lag ausserhalb aller vier Audit-Scopes (per DOM-Sweep gefunden); Rang-Header WAFFE->TOWER (44px-Slot live 45px scrollWidth, einzeilig); Naming: Waffen-Karte->Tower-Karte, Waffen-Punkt->Tower-Punkt; dev-facing byte-gleich (Routen/Keys/DB unangetastet, live 200er auf tab=weapon/focus-sets/equip); 15 Test-Suiten Wortlaut-Pins umgestellt (Review: alle 15 gelesen, keine Assertion geschwaecht) + neuer Sweep-Test; Review 0/0/0 (eigene TAB_LABELS-Mutationsprobe ueber SSR+Bridge, DOM-Sweep 0 Treffer auf 8+ Screens inkl. Changelog-Historie korrekt unangetastet); npm test 7320/0; FYI-followup dev-techtree-Editor; PTR-Nachhol-Vermerk (globaler Sichtbarkeits-Touch)
  • Gegner-Erstkontakt-Intros Schuetze/Tank/Boss (Fifty Tutorial-Runde 3) - einmalige account-weite Erklaerzeile beim allerersten Kontakt: Schuetze/Tank als .ei-explain an der bestehenden Intro-Karte, Boss als #bc-explain/#mb-explain an der Boss-Karte (kein Konkurrenz-Fenster), ui-482-persistiert (OB_STEP_ALLOWLIST +3 enemy_ranged/tank/boss, Flag erst bei tatsaechlicher Anzeige, bewusst NICHT in _obSkipAll - kontextuelle Mini-Info, begruendet), Ein-Fenster-Regel via _obAnyWindowVisible (offenes ob-Fenster gewinnt, Karte kommt beim naechsten Kontakt), Dasher/Blob explizit nicht (Negativ-Anker); Wortlaut-Verdikte: Panzer->Tank (Glossar-Kanon), Tank-Text auf defAbs/defPro-Ruestungs-Mechanik korrigiert (Schaden/Treffer statt Feuerrate, gegen applyDamage nachgerechnet, kein Widerspruch zu ui-517-Fruehgame-Tip), Boss-Bonus 1.5/0.5 aus CONFIG.HEXAS.BOSS_BONUS; src/enemy-intro.js nur additive Browser-only-Konstante+Renderzeile; 48 neue Tests, Review 0/1/0 (should: PTR-Methodik-Note Boss-Sichtmoment - Flag end-to-end belegt, visueller Moment lokal nicht einfangbar trotz 8 Reviewer-Laeufen, PTR-Spotcheck durch Fifty empfohlen; Zusatzbefund pre-existing doppelter bossCard.reset() beim Boot dokumentiert); Desktop+Mobile; Rebase: Viewer-Onboarding-Spec-Absatz 3-Wege-gemerged (ui-514-Deltas auf ui-515/516-Stand); PTR-Nachhol-Vermerk
  • Melde-dich-an-Hinweis umgezogen (Fifty Tutorial-Runde 3) - IST-Befund: 'Du hast Hexas generiert' und 'Melde dich an' waren DIESELBE Karte (Endscreen-Gast-CTA es-guest-cta mit Hexa-Note), der echte Konfliktgegner war der ob-hook der ueber dem Endscreen kleben blieb (live reproduziert); Umbau: neue persistente Gast-Karte guest-hint.js (Factory-Muster) im #panel-footer unter dem Sofort-spielen-Block, sichtbar in allen drei Panel-Modi inkl. Intro-Phase, Twitch+Passkey bleiben, Hexa-Zahl bleibt via hexa-ranking sichtbar (Trim review-verifiziert kein Substanzverlust), Desktop-Endscreen-CTA deaktiviert (isGuest:false), Mobile unangetastet (hook-Konflikt dort als followup); Review-Bounce gefixt: Passkey-Busy-/Erfolgs-State ueberlebte den 1Hz-Footer-Rebuild nicht (Klick-Zeit-Referenzen detachten) -> Closure-State-Machine idle/busy/done/error mit _paint() als einziger State->DOM-Schreibstelle (frischer querySelector, Repaint in _wire nach jedem Rebuild), Live-Beleg busy->resolve ueber 2 Rebuilds + Error-Persistenz + Doppel-Klick-Guard (Reviewer-eigene Proben); 23 Tests, Review + Re-Review 0/0 must (1 should: error-Pfad-Rebuild-Test fehlt, live belegt); Glossar + frontend.md/architektur.md integriert (Rebase: ui-516-Absatz additiv gemerged); PTR-Vermerk
  • Draw-Stapel Tiefen-Transparenz durch Abdunkeln ersetzt (Fifty PTR 2026-08-24: 'karten transparent ist komisch') - opacity fix 1 auf jeder Tiefenstufe, Staffelung via filter:brightness(0.82^depth) (live gegen 0.75 kalibriert: Icon der hintersten Karte bleibt erkennbar), draw-stack.js bleibt DOM-freie Layout-Rechnung (Feld opacity->brightness, Konstante+JSDoc nachgezogen), app.js applyDrawStackLayout wendet an, Transition um filter erweitert + :hover brightness(1)!important (gewinnt live-verifiziert gegen Inline-Style, Analogie zum alten Opacity-Hover), Scale 0.92/Versatz/Cap 5/z-Reihenfolge byte-gleich, prefers-reduced-motion unangetastet; Beleg-Tabelle opacity/filter je Tiefe Desktop 1920 + Mobile 390, vorher/nachher-Screenshots; Pins umgestellt + 2 Negativ-Anker (kein Alpha < 1 mehr), Review 0/0/0 (eigene Mutationsproben in app.js, Hover-Spezifitaet per CDP-Mausevent, Messwerte reproduziert); spec/frontend.md-Absatz aktualisiert; PTR-Nachhol-Vermerk
  • Pakt-Karten neu designt (Fifty: Cover = grosse Icon-Illustration, Details als Tooltip, Kurzzeile AN) - renderPactCardTile pactBody auf Cover (Icon-Aura 62/44px, Name 12.5px 2-zeilig, Akzent, Kurzzeile du-Wert+Penalty - traegt auch die Upgrade-Vorschau T+1), Detail-Tooltip ueber bestehende CTTip-Mechanik (Kopf mit Tier-Farb-Badge via --tc, Hexa-Bonus andere|du + Double-Dip-Satz, Penalty+Achse, Raum-Satz, Stapel-Hinweis nur bei k>=2), 'Details'-Trigger (tip-i tip-i--label in .tipwrap) einziger Oeffner, Karten-Klick bleibt Sockeln, CTTip-Matcher unangetastet; alte cs-pact-hdr/-blocks/-blk/-rsplit-Klassen restlos aus components.css + dashboard.css@600 entfernt; Live-Zusatzfund gefixt: Touch-Upgrade-Vorschau-Leiste verdeckte den Trigger (hover:none-Margin); Review-Bounce: CSS-Kommentar-Landmine .cs-bl-*/ am Zeilenende droppte live die .cs-bl-hdr-Mobile-Regel -> Ein-Zeichen-Fix mit CSSOM-Beleg vorher/nachher (Regel 0->1, gap normal->5px), Guard-Blindspot (css-comment-guard isLandmineShape: links klebt + Zeilenende) als meta-Kandidat in followups; 22 neue Tests + 4 nachgezogene, Review + Re-Review 0/0/0 (1920/2560/390 Touch-Tap, Tier-Badge im Portal, Mutationsproben); Spec karten-templates.md aktualisiert; HANDOFF: PTR-Feedback-Runde-2-Eintrag (Mobile-Join-Flow-Eintrag rotiert, Lehren in Tickets/followups); PTR-Nachhol-Vermerk
  • Privatraum-Rueckweg (Fifty-Entscheid Option A) - virtueller 'Dein Raum'-Eintrag als erste Zeile beider Raumlisten (Desktop .rs-seg--own, Mobile .mr-room--own), Sichtbarkeit datengetrieben ueber _ipTowerData.room.private (srv-158-Quelle, kein LS/ID-Pin, kein Server-Touch - Owner-WS-Join via ws-server Owner-Only-Gate IST-bestaetigt), Thin-Injection opts.getOwnRoom() in room-switcher.js analog getCurrentRoomId, zaehlt fuer das rooms>=2-Listen-Gate mit (sonst keine Liste bei nur stream), Sub-Text aus inQueue/inRun/room-Praesenz (room traegt kein phase/wave), Gate-Pille 'Run k/3' aus ui-500-Quelle, exklusive Aktiv-Markierung, Klick ueber dieselbe selectRoom-Delegation (ui-492-Defer + srv-158-Guard byte-gleich), Sig inkl. Own-Zustand; Live: Gate-User joint -> Eintrag+Liste, Wechsel Raum 1, Rueckweg ohne Teardown-Toast, Game-Over-Rueckweg mit vollem Endscreen (Fiftys Fall), Bestands-User kein Eintrag; 18 neue room-switcher-Tests (57/57), Review 0/0/0 (3 isolierte Profile, Teardown-Kante, ui-493-Zeile ohne Touch); Glossar/architektur.md/README nachgezogen; Follow-up: Composition-Filter-Testluecke (srv-158-Klasse); PTR-Nachhol-Vermerk
  • Setup-/Sockel-Texte bereinigt (Fifty PTR-Feedback 2026-08-22) - Gold-Zeile 'Template vorhanden: Fokus-Set danach nutzt jetzt dieses Set' komplett raus (templates.js-Block + build.css, ui-486-Pins zu Negativ-Ankern invertiert, Standalone-Block + DL-2-Hint byte-gleich); Pakt-Legende unter dem Karten-Grid raus (dashboard.js + card-gallery.js + CSS) und als zweite Zeile in das bestehende Pakt-Karten-Tooltip gezogen - 'Bonus gilt geteilt fuer alle im Run / Penalty trifft den ganzen RAUM' (Tisch war kein Glossar-Begriff; Portal kopiert innerHTML, Umbruch live bestaetigt; repo-weit 0 weitere player-facing Tisch-Treffer); Sockel-Panel-Sub ohne Design-Nachsatz ('Sockel kommen aus Sub-Monaten, Achievements und Hexa-Schwellen.'); 4 neue Render-Anker + 2 nachgezogene Pins, Mutationsproben; Review 0/0/0 (eigene Mutationsproben an anderen Stellen, Live-CDP Portal-Screenshot)
  • Fokus-Set als eigenstaendiges Per-Waffe-Datum - neue Tabelle viewer_focus_sets (Migration 043) mit einmaliger Lazy-Migration aus endmode_json (Row-Praesenz = entschieden, INSERT IGNORE race-frei), DL-6: genau EIN Editor - web-166-endStats-Editierbereich im Template-Editor komplett raus (Markup+Wiring+CSS), nur Read-only-Gold-Zeile bleibt; API-Feld savedFocusSet frozen-on-spawn (Praezedenz template/metaLevels - Live-Poll haette bei Waffenwechsel mitten im Run falsche Waffe gezeigt); Viewer-Gate auf gespeichertes Set, PUT /api/me/focus-sets/:weapon; Review 0/0/0 (Mutationsproben 3 Ebenen, eigenes CDP-Szenario c, 2 Doku-Drifts inline); Follow-ups: joinExistingRun Pre-Lift-Skip-Edge (pre-existing), api-templates endStats toter Code
  • Upgrade-Nudge 'Drei gleiche Karten' - Inline-Banner ueber dem Karten-Grid (ui-496-Lehre: kein Coachmark-Anker), Trigger tileIsUpgradeable + card_upgrade_hint server-persistiert im ui-482-Onboarding-System, drei Dismiss-Wege auf EIN Flag, CTA aktiviert ui-480-Upgradebare-Filter; Review-Bounce gefixt: syncUpgradeHintBanner-Seed via obMarkSeen(step,false) statt mergeOnboarding-Vollmerge (POST-Sturm fuer fremde Schritte bei jedem Sockel-Tab-Besuch, Trigger-Matrix-Test mit fetch-Spy pinnt 0 fremde POSTs); Re-Review 0/0/0; Follow-ups: Mobile-Sub-Default versteckt Banner (Design-Kandidat), Onboarding-Route White-Box-Luecke
  • Draw-Stapel statt Einzelkarte - aufeinanderfolgende Draws bleiben sichtbar (neueste vorn rechts, aeltere -42px versetzt mit scale .92^d/opacity .78^d, Cap 5 aelteste raus, fester 288x180-Slot ohne Layout-Spruenge), Reveal-Flip byte-unangetastet (Review gegen Basis-Stand verglichen), pure draw-stack.js (Praezedenz onboarding-position), reduced-motion CSS-only, Hover ohne Klick, fluechtig ohne Persistenz; 28 Tests, Live-Formeln exakt bestaetigt inkl. PJAX-Roundtrip, Review 0/0/1-nit; PTR-Vermerk
  • Gate-Faden-Momente mates + unlock - zwei neue ob-Schritte in der ui-482-State-Machine (GATE_STEPS/nextGateStep DOM-frei mit Pending-Parameter aus der Komposition, reload-feste Server-Zustands-Reads statt Transition-Tracker, OB_STEP_ALLOWLIST +2 server-persistiert - Neues-Geraet-Kante via mergeOnboarding geschlossen), mates beim Run-3-Start zentral ohne Element-Anker mit Bot-Zahl aus Snapshot (botsPresent = Roster-Praesenz, Bot-Tod-Kante strukturell tot), unlock nach Run-3-Ende auf stehendem srv-158-Endscreen mit rearm/tpl-Vorrang-Serialisierung; zwei echte Live-CDP-Funde im Bau gefixt (unlock-Deadlock durch nie-zeigbares Pending, hook+mates-Doppelfenster); Wortlaute DL-exakt, Bestand sieht nie etwas; 47+7 Tests, Review 0 must (18 Beleg-Screenshots), pairWouldShowNow-Helper als followup; HANDOFF Privatraum-Sprint-Eintrag; PTR-Vermerk
  • Gate-UX Raum-Tab im Privatmodus - Ein-Intent-CTA im Gate (gross7 strukturell raus via Options-Flag, Uebergangs-Rebuild genau 1x), Fortschritts-Subtext Dein Raum Run n von 3 ueber bestehende ctx-Mechanik, mr-hint-Gate-Zusatz, Kopf-Pille Dein Raum (fixt nebenbei Raum-null-Live-Bug seit srv-156, mode=run gescoped), Glossar-Eintrag; /api/me/tower additiv um privateGate-Felder erweitert (_withPrivateGateFields, alle Antwortformen, EINE indizierte Kombi-Query - Poll-Cache als followup); 23 Tests, Live-CDP 4 Szenarien x 2 Viewer inkl. reload-freiem Gate-durch-Uebergang, Review 0 must; PTR-Vermerk
  • Hexa-Basis-Grid zeigt immer genau die levelbaren Stats des Waffentyps - buildInvestGrid filtert via WEAPON_DISABLED_STATS (bestehende CONFIG-Quelle invertiert, Income-Ausschluss vorbestehend), disabled-Karten + nur-investierte-Toggle + State/CSS komplett raus, Legende dashboard.js gehoert zum Step-Editor-off-Fall und bleibt; Review handgerechnet alle 9 Waffentypen (cannon/minigun 12, sniper/laser/taser 10, rocket/swarm/mortar 11, shockwave 9), Invest-Roundtrip live, Styleguide-Demo-Drift inline gefixt; 6 Tests, Review 0/0/0; PTR-Check vermerkt
  • Viewer-Audio Default aus fuer Erstbesucher - deriveInitialMuted in audio-ui.js + hasNoStoredAudioPrefs in core/prefs.js (nicht-schreibend, LS-Bestand gewinnt in allen Kombinationen, Desktop+Mobile lesen nur audioMute.getState); OBS-Quelle bleibt laut via window.obsstudio-Injection (?obs existiert seit P7 nicht mehr - Praezedenz srv-054/077, Timing race-frei: UI-Init am window.load vs Injection bei Kontext-Erzeugung, Review-verifiziert inkl. addScriptToEvaluateOnNewDocument-Repro); 18 Tests, Review 0/0/0; Fifty prueft nach Prod-Deploy einmal OBS-Sound
  • NPX Phase 1 Viewer-Tutorial Roter Faden - Sequenz-State-Machine (hook -> c1-c3 -> Run-1-Ende bridge -> Run 2 manuell -> Run-2-Ende rearm -> tpl) ersetzt parallel aufpoppende Onboarding-Fenster, Desktop+Mobile (Mobile erstmals); Willkommen mit 3 Live-Miniatur-Zeilen aus echter Render-Pipeline (44px-Spalte, Buendigkeit 916.03/87px gemessen), K2/K3 mit echten ip-strow-Beispielen (CSS-Familie nach viewer-base.css, byte-identisch), Ein-Fenster-Invariante inkl. Bridge-Guard; Run-End-Zaehlung an EIGENE inRun-Transition gekoppelt (didOwnRunJustEnd am Poll, Review-Fund: fremde Spectate-Enden zaehlten mit), OB_STEP_ALLOWLIST +6 additiv, Legacy-LS-Fallback ohne Faden-Neustart; 47+10 Tests, 2 Live-Bugs im Bau gefunden+gefixt, Re-Review 0/0/0; PTR-Check vermerkt
  • Mobile-Join-Flow - Raum-Tab wird Aktions-Zentrale (Fifty-Entscheide F1/F2): Beitritts-Gruppe #mob-join (mr-jw + ipq-main) VOR der Raum-Liste, Landung nach erstem Poll kontextabhaengig (inRun -> Spielfeld, sonst auch queued/ausgeloggt -> Raum-Tab; pure decideMobileLanding mit Einmal-/User-Nav-Guard, ?room= orthogonal unberuehrt), Zuschau-Tap springt zum Spielfeld nur bei reason manual (Auto-Follow/Teardown nie), Join wartet im UI bis Platzierung (Auto-Follow/ui-492-Defer), ui-412-Feld-Mount bleibt; Desktop 0 Zeilen; 30+2 Tests, Live-CDP 6 Szenarien, Review 0/0/0; PTR-Check vermerkt
  • Endscreen bleibt bei Rearm stehen - Join platziert sofort (Server/Queue byte-identisch), Viewer deferred den Raumwechsel bis Endscreen-Timer 0 oder Zum-Run-Klick; gruenes rejoin-Banner (Dein Tower ist wieder dabei - Run laeuft in Raum N), Auto-Wechsel exakt bei Timer-Ende (Endscreen-Timer einzige Uhr, kein neues Intervall), Races idempotent (letzter Wechsel gewinnt, Klick vs Timer einfach); geteiltes DOM-freies Modul core/room-switch-defer.js fuer Desktop+Mobile (Praezedenz boot.js, Review-verifiziert legitim); global ohne Tutorial-Gate; 21 Tests, Live-CDP 8 Kombis 100/100, PTR-Check vermerkt
  • Neue Accounts starten mit 5 Draws (Twitch-Erstlogin + Gast, nicht rueckwirkend) - executeGrantDrawsTx reason=signup_draws idempotent via processed_redemptions-PK; Neu-Erkennung ueber deterministischen Pre-Existence-Check (SELECT FOR UPDATE in derselben TX, upsertTwitchLoginTx extrahiert) statt MariaDB-ambiger affectedRows-Heuristik (Review-Fund: No-op-Re-Login haette Bestandsaccounts +5 gegeben, Prod ist MariaDB 11.8.6); Gast-Pfad plain INSERT unveraendert, pending-Merge kein Doppel-Grant; 11 Stub- + 6 Real-DB-Tests, 4x-Parallel-Stress DB-korrekt; withTxRetry-Followup notiert
  • Karten-Inventar-Filter dritte Achse upgradebar - unabhaengiger Toggle im Disclosure (Single-Source tileIsUpgradeable via durchgereichtem canUpgrade, UND-Schnitt mit Nutzung x Effekt, dreifache Kreuz-Zaehler, dritter Kopf-Chip mit x, LS key+use+up abwaertskompatibel, Rebuild nach echtem Bulk-Upgrade verifiziert; 26+109 Tests, Kopf 52px mit drei Chips)

Fix

  • Intro-Coachmark Position/Overflow + CTA ohne Tab-Wechsel + Post-Claim-Draws-Hinweis (ui-535, Regression aus ui-516+ui-523-Kombination)
  • Upgrade-Toasts nennen Anzeige-Namen statt interner Waffen-Keys (Sweep (a)=0)
  • Fokus-Set wirkt auch ohne Template (Spawn-Wiring-Fix + resolveFocusSet)
  • Hexa-Budget-Balken Familien-Look (Border + Cyan-Marker, 0%-Sichtbarkeit-Root-Cause behoben, kein fehlendes CSS)
  • Setup-Coachmarks tab-bewusster Vorrang + Obsoleszenz-Skip + Scroll-Anker
  • Desktop-Panel patcht statt 1Hz-Voll-Rebuild (Fiftys Scroll-Sprung-Fix)
  • Hexa-Bruecke Hydrations-Guard (kein 0-Verbrennen, Retry naechster Tick)
  • Frisch gezogene Karten sofort sockelbar (Closure-Resync im Draw-Pfad, Bug seit web-161/Juni)
  • Run-End-Fehlerpfad ehrlich (ok/Log) + withTxRetry an 4 Stellen (schliesst stille Hexa-Verlust-Klasse)
  • Popin-Font-Kontext auf 15px normalisiert (13px-Blindspot geschlossen)
  • Attribut-Kachel-Ueberschriften unter 11px gefixt (Fifty Tutorial-Runde 3) - Root Cause: DRITTER Font-Kontext, den die ui-489-M-Serie nicht kannte: Desktop erreicht /dashboard nie standalone (web-086-Redirect auf /viewer.html?setup=1), im Setup-Popin gewinnt desktop.css body{font:13px} als letzte Kaskade (html bleibt 15px, base.css) -> em-Ketten rechnen ab 13px, 0.74em faellt von 11.1 auf 9.62px; Fix: 22 build.css-Selektoren auf rem-basierte Tokens var(--fs-caption)/var(--fs-micro) (brechen die em-Kette, zielen auf html 15px - live 11.5005px im Popin, Mobile 11.02px), 4 K2-/Dead-Code-Faelle begruendet belassen; spec/frontend.md um den dritten Kontext ergaenzt; 31 Anker-Tests + ui-505-c6-Korrektur, Mutationsprobe 23/31 rot gegen Basis; Review 0/0/0 (eigener Ancestor-Trace, Clamp-Mathe, K2-Verdikte, 22er-Zaehlung nachgerechnet); Follow-ups: Popin-13px-Kontext betrifft auch collection/techtree (+4 Kandidaten) - Struktur-Fix-Vorschlag Container-Normalisierung; Onboarding-Fetch-Race-Nebenfund; PTR-Vermerk
  • Tutorial-Navigation gefixt (Fifty Tutorial-Runde 3) - IST-Befund: der Sockel-Force sass NICHT im Roten Faden (onboarding-flow.js strukturell tab-frei, 0 Treffer) sondern im separaten ui-148-Setup-Walkthrough web/public/dash-onboarding.js, dessen start() bedingungslos auf cards navigierte und den ui-485-weapon-Default ueberschrieb (vorbestehender Test ui-474c demonstrierte den Bug unfreiwillig); Fix: start() navigiert nicht mehr, neues syncVisibility() + stepTabMatches() datengetrieben aus STEPS[i].tab + active-Flag - Hexa-Klick oeffnet wieder den Waffe-Tab wie ohne Tutorial, kontextfremde Walkthrough-Schritte (Ziehe deine erste Karte) blenden beim Tab-Wechsel aus und kehren beim Rueckwechsel wieder (pending bleibt, Flag-Invariante: Ausblenden setzt NIE seen); desktop/mobile/main.js + onboarding-flow.js unangetastet; 3 stale ui-474-Tests ersetzt + 7 neue, 4 Dev- + 2 Reviewer-Mutationsproben; Review 0/1/0 (should: ui-516i-Testbehauptung unter aktueller STEPS-Datenlage strukturell nicht diskriminant - im Review-Block dokumentiert); spec/architektur.md-Absatz; Live Desktop+Mobile beidseitig unabhaengig reproduziert; PTR-Vermerk
  • Rang-Teilnehmer-Tabelle @1920x1080 gefixt (Fifty PTR: User zu breit + Scrollbar, ui-490 Ziel verfehlt) - Root Cause belegt, DREI additive Bugs die nur im Viewer-Popin auftreten: (1) desktop.css unscoped table/th/td-Regeln der #stats-Command-Referenz leakten white-space:nowrap in jedes Companion-Popin-Fragment (seit ui-402 selbes Dokument, 100px Overflow) -> auf #stats gescoped; (2) ui-495-Regeln .hs-table th:nth-last-child(n) als bare Nachfahren-Selektoren trafen die GESCHACHTELTE .hs-participant-table (User = nth-child(4) UND nth-last-child(4):not(.num) -> 34% statt 12%, Spezifitaet gewann) -> alle 13 Regeln auf Kind-Kombinatoren .hs-table > thead > tr > th / > tbody > tr > td (alle 4 .hs-table-Instanzen haben explizites thead/tbody, verifiziert); (3) overflow-wrap:anywhere-Vererbung in die innere Tabelle (RANK/SLOT brachen) -> :not(.hs-details-cell); Messung Rang-/Profil-Popin 1920/2560/1280: Overflow 100px->0, User 27.9%->12.0%, DMG/Credits/Hexas exakt 30/28/30 (#popin capt 1180px), Standalone + Mobile-390 unveraendert; ui-495-Pins auf Kind-Kombinatoren + 3 Anker, neuer ui-510-Scope-Test (10), should-fix-Nachzug: (b13)-Regex um first-child (mutationsbewiesen), Fallen-Register README + frontend.md-Sektion Tabellen-Selektoren + highscore-dps-Satz; Review 0/0/0 + Re-Review 0/0/0 (thead/tbody-Vollstaendigkeit, Guide/Glossar/Patch-Notes ohne Kollateral, #stats byte-identisch, eigene Messwerte); followups: Desktop-Messmatrix 1920x1080 + Viewer-Flaechen-Kontext Pflicht
  • Viewer-VFX-Stau bei offener Flaeche gefixt (Fifty-Report: Shockwave-Ring-Stapel + Lag-Spike nach Hexa-Panel oeffnen/warten/schliessen) - Root Cause: srv-090/ui-407-Flaechen-Drossel skippt jeden Cosmetics-Tick (core/loop.js), handleEventsBatch gated aber nur auf viewerHidden -> vfx/popups/beams/dyingEnemies liefen bis Cap 200 voll, age eingefroren, beim Schliessen alterten alle parallel ab; Fix spiegelt das viewerHidden-Muster auf die Flaeche, Desktop+Mobile symmetrisch: Event-Gate (viewerHidden || _spOpen bzw. _ipSurfaceOpen) in den 4 Cap-Cases + _clearCosmeticsArrays-Flush beim echten Oeffnen (false->true, openSurfacePopin/ipGoToTab - einziger Choke-Point je Plattform, deckt alle 6 Flaechen), Drossel + Cap 200 + core/loop.js-Verhalten unangetastet (ui-428-Lock, nur Kommentare); Vorher/Nachher live: 44 gestaute VFX nach 32s offen -> 0 durchgehend, kein Synchron-Ring-Stapel; 25 strukturelle Anker-Tests, Review 0/0/0 (eigene Mutationsproben Mobile-Gate/Desktop-Flush, unabhaengige Live-Repro); PTR-Nachhol-Vermerk (Viewer-Touch)
  • M3 Schriftgroessen - Companion-Rest + 0.72em-Treppe + fs-caption-Floor (ui-489-Konzept K3): tokens.css --fs-micro 10px NEU (K2-only, fix) + --fs-caption-Floor 10->11 (clamp 11.0-11.5px, reine Parallelverschiebung mit byte-identischer vw-Steigung, gegen Nachbar-Tokens gegengerechnet); 38 Fundstellen - 28 K1 auf var(--fs-caption) (17er-0.72em-Treppe kontextgeprueft, 1 abweichender Ancestor .cl-cat korrekt als Orphan behandelt), 2 K2-Bumps 9->10 via var(--fs-micro) (dg-boss-lbl/dg-endlbl redundant zur Legende), 5 K2 konform belassen, 3 ausser Scope belegt (admin.css=M4, em-allmode-badge seit ui-486 weg, detail-label admin-scoped); catalog-tag@360px-Sonderfall live geheilt (10.9999px); em-Regel-Doku in web/client/README.md + spec/frontend.md; 54 Anker-Tests + legitimer Cross-Ticket-Pin-Update in ui-503-Test (Selektoren in M1-Notes explizit als M3-Scope earmarked); Review 0/0/0 (Token-Mathe exakt, eigene Mutationsprobe, Live-CDP 360/1440px)
  • M2 Schriftgroessen - Viewer Sub-11px auf 11px-Boden/10px-Whitelist (ui-489-Konzept, K4 gestrichen - kein OBS-Sonderfall): 20 Audit-Fundstellen in desktop.css/mobile.css/viewer-base.css - 15x K1 auf 11px (inkl. 3 live promotete Ticket-K2-Kandidaten tb-num/hud-k-Landscape/mob-fs-hud-k, 40px-Grid-Track haelt), 5x begruendete K2 (mb-num/mr-here/tb-du/rc-expand/mob-fs-exp - Redundanz je gegen echten Code verifiziert), 1x obsolet (rc-allmode-indicator tote CSS seit ui-193, Regressionstest statt Deko-Fix); Zeilendrift-Nachzuegler u-tpl-mode-m-sub + mob-fs-card-exp; Messungen 2560x1440/1280x800/390x844/844x390-Landscape, modehint-Ellipsis faengt 1280er-Overflow; 24 Anker-Tests + Sweep-Test mit Mutationsproben, Review 0/0/0 (K2-Verdikte code-verifiziert, Injektions-Markup gegen echte Renderer abgeglichen); PTR-Handy-Check durch Fifty steht aus
  • M1 Schriftgroessen - Companion-Karten-Kacheln 6.5-9.75px auf den 11px-Lese-Boden (ui-489-Konzept K1): 24 CSS-Regeln in components.css/dashboard.css@600/collection.css/card-gallery.js, dashboard.css ueber bestehende lokale ui-343-Tokens (--card-min-fs/--card-name-fs, tokens.css unangetastet - M3-Abgrenzung), 1 begruendete K2-Ausnahme .cs-sub-info 10px (aria-hidden-Deko neben vollstaendigem Linktext); 0 Wortlaut-Kuerzungen noetig, Overflow-Verdachte als Messartefakte widerlegt (tip-i-Hit-Target, stash-Pixelvergleich); 30 Anker-Tests mit Mutationsprobe, Review 0/0/0 (eigener Gegen-Sweep, Token-Konsumenten-Klassifikation, Live-CDP Desktop+iPhone-UA); Follow-ups: Touch-Preview-Leiste ueberlappt Sublabel, Koeder-Effekttext dupliziert -Boss (beide vorbestehend)
  • Privatraum-Endscreen/-Viewer reisst weg (P1) - ZWEI Mechanismen gefixt: getPlayerState liefert room-Feld bei !running fuer den Privatraum-Owner (privat-only; srv-111-Bestandsluecke: ui-219 baute room 2026-06-27 nur in 3 von 4 Pfade, nie ein Entscheid) + Client-Teardown-Fallback _rsOnRooms/_ipOnRooms exemptiert den EIGENEN Privatraum von der /api/rooms-Sichtbarkeitspruefung (isOwnPrivateRoom, kein Raum-Pin; live belegt: Client fiel sonst schon WAEHREND des Runs auf stream zurueck); Kanten a-d Review-bestaetigt (Poll synchron, Idle-Abbau nur bei 0 Clients, Zuschau-Tap divergiert sauber), oeffentliche Raeume byte-identisch gepinnt; 7 Tests, natuerliches Run-Ende 189s WS-Kontinuitaet; Client-Guard-Testpin als followup; PTR-Vermerk
  • Logout im Viewer erreichbar - Button am Ende von profileBody() (EINE Render-Quelle: Desktop-Profil-Popin + Mobile-Profil-Screen + volle Companion-Seite via embed-Fragment), Form-POST byte-identisch zu layout.js an POST /auth/logout; Gate isOwn+viewerHasTwitchLink (Gaeste ausgenommen: Logout wuerde Gast-Account ohne Passkey irreversibel verwaisen - Gast+Passkey-Differenzierung als followup); 5 Tests, Live-CDP Desktop/Mobile/Gast, Review approved mit Loader-Hook-Mutationsprobe + inline Doku-Fix (Regression: Logout war seit der Viewer-First-Welle unerreichbar)
  • PTR-Feedback ui-482 - K1-K3-Coachmark hing oben links statt am Panel: Root Cause id=ip-head/ip-stbl existierten seit ui-146 NIE im echten Markup (nur im Design-Prototyp, getElementById immer null, Karte blieb an CSS-Default-Position) - IDs in _buildDesktop wiederhergestellt + Anker-Tests (Re-Review-Bounce: Regression war 2 Monate testblind), Positions-Formel als DOM-freies core/onboarding-position.js mit definiertem Fallback (zentriert, Pfeil aus) statt stummem Oben-links; Weiter-Button nowrap + ob-nav flex-wrap (Ganzelement-Umbruch, kein Glyph-Split, 390-2560px verifiziert); 25 Tests, Live-Messwerte 2560x1440+1280x800, Re-Review approved; PTR-Check vermerkt
  • aeussere Run-Listen-Tabelle .hs-table lief bei ~700px horizontal ueber (table-layout auto, dritter Auftritt nach ui-481/490) - table-layout fixed + Spaltenbreiten ueber robuste Anker (first-child/nth-last-child + Klassen-Splits, Cascade-Order fuer Pos., von Review Zelle fuer Zelle ueber alle 3 Renderer 9/9/10 Spalten verifiziert), Top-Tower-Name ellipsiert mit title (topTowerTitleAttr), Kind-Element-Fund behoben (Version-Pille/Detail-Button rissen in Nachbarspalten ohne Container-Overflow); 0 Overflow in 6 Szenarien, 390px-Kartenmodus unberuehrt; 24+4 Tests; td-Reihenfolge-Testluecke als followup
  • Mobile-Endscreen-Dock zeigt Queue-Status statt totem Sofort-spielen-Button - dritter Dock-Modus queued (Gate td.inQueue statt intent: deckt findQueueMembership kind=tower-Randfall, Review bis game-room.js-Quelle verifiziert), mesQueuedBlockHtml mit srv-154-Wording aus dem Runde-Tab (sofort/gross7 inkl. live tickendem Countdown ueber bestehenden Poll, kein neues Intervall), reiner Status ohne Wiring; Zusammenspiel mit ui-492-Banner konfliktfrei belegt; 34 Tests, Live-CDP a-d; PTR-Check vermerkt
  • Tablet-Login-Landung auf den Viewer statt /dashboard (Fifty-Entscheid hebt ui-308-Tablet-Ausnahme auf) - oauthLandingPath liefert fuer alle UAs withAutojoinCarry /viewer.html, Carry-Verlust fuer Tablets behoben, Desktop-Komposition auf 768x1024+1024x768 verifiziert bedienbar, ct_tablet_choice_v1 kollisionsfrei (gespeicherte Mobile-Wahl greift nach Landung); Passkey-/resolve-Weichen bleiben separat -> web-249; ui-493-IST-Absatz nachgezogen; Tablet-Tests + Carry-Mutationsprobe
  • Run-Detail-Ranking (Profil+Rang) Slot/Waffe massiv zu breit, Tabelle lief horizontal ueber - table-layout fixed auf .hs-participant-table, th-Breiten 36/38/44px + Prozent, gemeinsamer thead-Helfer participantTableHeadHtml, es-total/es-breakdown ohne nowrap, gescoptes overflow-wrap nur th:nth-child(n+4) (Header-Labels einzeilig, Baseline-Overlap -2.3..-9px -> alle Gaps positiv 6.4..210px, 0 Overflow in 6 Szenarien, ui-396-Mobile-Karten unberuehrt); 25 Tests; .hs-table-Overflow pre-existing -> ui-495
  • Laser-Beam bei low damage unsichtbar - Opacity-Floor 0.45 am Ramp-Start (LASER_BEAM_OPACITY_FLOOR, Math.max auf 0.30+norm*0.70; No-op ab norm>=0.2143 und bei Voll-Ramp): kein Regressions-Commit, 0.30-Tiefpunkt seit game-071, game-144/150 strukturell unbeteiligt (kein sustained-Zweig in fireWeapon); Ink-Scan +34-45% Dev / +40.6% Review am Ramp-Start, Voll-Ramp byte-identisch; 5 Tests; PTR-Check durch Fifty vermerkt
  • Hexa oeffnet immer Waffe-Tab - Server-Default /dashboard cards->weapon, alle 4 Call-Sites explizit (Desktop-Cluster, ?setup=1, Mobile-Nav, Endscreen-CTA), Deeplinks mit Tab-Ziel bleiben; Nebenfund-Fix surface-host Doppel-Nav gated auf .dash-tabs (Review-verifiziert legitim); 14 Tests, Live-CDP 21 Checks; Review-should-fixes in followups (Mobile-Login-Landung Draw-Button = Fifty-Gegencheck)
  • Onboarding-Tour-CTA (Weiter/Fertig) on hover unsichtbar - globaler button:hover-Reset in base.css:105 faerbte Text cyan auf cyaner Pille; Fix .ob-cta:hover:not(:disabled) color #04222b (bestehender Hex, Spezifitaet 0,3,0), Kontrast 10,5:1 in allen 4 Zustaenden, 7 Anker-Tests
  • Feuer-Akkumulator (game-144/146-Mechanik) fuer alle getakteten Waffen - EIN Helper drainFireAccumulator + bankFireAccumulator (Minigun Freeze, generisch geklemmt auf 1 Intervall: erster Schuss sofort, kein Burst), Ueberhang tragen statt Reset (Treppe 12/15/19 -> 10/s behoben), Mehrfachschuss pro Tick mit Cap, Sub-Tick-Spawn Cannon inkl. Specials-Faecher + Mortar, Sniper/Taser/Rocket/Swarm Raten-Korrektur, timeSinceLastShot entfernt; keine CONFIG-Aenderung, Vorher/Nachher-Tabelle + Zielwechsel-Szenario (Sniper 43->45, Mortar 43->45, Cannon 272->408) in Notes; 26 Tests
  • Desktop-Panel - keine horizontale Scrollbar mehr bei langen Stat-Zeilen (Auto-Layout-Tabelle .ip-stbl wuchs ueber 252px, Prod-Fund McEs_): table-layout fixed + td overflow hidden, Label ellipsiert zuerst mit title (Werte/Level nie), #panel-scroll overflow-x hidden; beide Render-Pfade (upgrades.js + tower-detail.js), Langwert-Fixture-Tests, Live-CDP 2 Zooms x 2 Panels, Normalfall-Geometrie 0 Diff

Unter der Haube

  • CDP-Profiling-Harness perf-matrix (focused/unfocused/hidden, Running-Check)
  • Hintergrund-Perf-Telemetrie (WS-Timing fg/bg, Long Tasks, Hardware-Kontext)
  • Achievement-Auswertung gebatcht (257 auf 5 Queries pro Spieler-Run-Ende)
  • Server-Poll-Kosten gesenkt (Session-Cache, Gate-Memo, /api/rooms-ETag)
  • Client-Polls bei verstecktem Tab stoppen + Aufhol-Fetch bei Rueckkehr
  • Perf-Sink gehaertet (Rate-Limit, Payload-Cap, 30-Tage-Retention)
  • isOwnPrivateRoom/_ipOwnRoom nach core/own-room.js extrahiert + Test-Pins
  • fnBody-Test-Helfer konsolidiert (10 Kopien -> 1, Klammer-Balancing)
  • Wording-Audit Waffe vs Tower (Fifty Tutorial-Runde 3) - Audit-Dokument ui-520-audit.md ueber 4 Scope-Areas (web/client, web/src/views, src inkl. Chat, web/public) + Glossar: Kern-Ergebnis Kategorie (a)=0 (Code nutzt Waffe diszipliniert fuer den Waffentyp), (b)=46 fachlich korrekt + ~15 Glossar, (c)=32 Struktur-Faelle (Tab-Name, pro-Waffe-Systeme, Achievement-Kategorie, Waffe-Tab-Strings inkl. dash-onboarding H1), Bucket F admin.js (9) + G styleguide.js (19, Spiegel-Pflicht ui-521) + H web/public (2, player-facing im Haupttotal), dev-facing-Inventar mit Nicht-Umbenennen-Empfehlung; 3 Review-Runden (R1: viewer-shell+admin.js-Luecken + Legal-Swap, R2: Bucket G inline + web/public-Gap, R3 0/0/0 mit nachgerechneten Summen und CTUtil-Bridge-Verifikation); ui-521-Migrations-Hinweise: TAB_LABELS erreicht dash-onboarding.js nur via window.CTUtil-Bridge, Zeilenstand-Vorbehalt nach ui-516; die 5 Fifty-Fragen sind beantwortet (2026-08-24) und in ui-521 verankert (reines Audit-Dokument, keine Code-Aenderung)
  • M4 Schriftgroessen - Admin + Styleguide-Spiegel (Abschluss ui-489-Serie, admin-/dev-only): admin.css 4 Audit-Faelle + 2 selbst gefundene Blindflecken (sw-matrix em-Nesting nur im JS-Laufzeit-DOM sichtbar) auf var(--fs-caption)/var(--fs-micro K2), admin.js 3 attr-em K3-Hygiene, highscore.css .detail-label (von M3 explizit deferred); Styleguide-Spiegel: 19 css- + 30 js-Inline-Faelle auf die geshippten M1-M3-Endwerte gesynct (Kartenbonus 11->16px war echter Sync-Fehler), Per-Tier-Demo-Kollision 104->136px gefixt (Range-Messung); Review-Bounce gefixt: 3 Rim-Card-Demo-Werte spiegelten falsch 10px (real laengst 11px, vor der Serie compliant - Fehlschluss M2-hat-nichts-angefasst), 2 legitime Illustrativ-Faelle mit korrektem Grund (img-Icon/tote CSS) re-dokumentiert; 56 Anker-Tests, Review+Re-Review 0/0/0; HANDOFF: Schriftgroessen-Serie-Eintrag, v0.8.7-Eintrag rotiert (fiftysbike-Backup-Merkposten nach followups.md)
  • OBS-Support komplett entfernt (Fifty: OBS ist Geschichte) - isObsContext/customWindow aus audio-ui.js raus, deriveInitialMuted defaultet ausnahmslos stumm (ui-497-Audio-Ausnahme obsolet), srv-054/077-obsSource-Events-Block aus desktop/main.js raus (viewerHidden rein ueber Page Visibility, symmetrisch zu mobile), repo-weiter Sweep kategorisiert (7 Doku-Stellen umgeschrieben, Featured-Raum-Framing ohne OBS-Anspruch, ~40 Historie-Kommentare bewusst belassen); Regressions-Guard mit 3 Ankern (Export-Check + Quelltext-Scans desktop/main.js UND audio-ui.js - Bounce-Fix: Ursprungs-File war blinde Stelle, Mutationsprobe rot/gruen belegt); Featured-Lock byte-identisch, --mute-audio-Workflow-Regel bleibt; Review + Re-Review 0/0/0 (4 Mutationsproben inkl. Bracket-Notation-Grenze precedent-konsistent); HANDOFF-OBS-Gegenprobe-Vermerk obsolet gestrichen
  • Solo-Oekonomie vermessen (reines Mess-Ticket, 0 Sim-/CONFIG-Zeilen) - Befund: funktioniert ehrlich, kein Tuning noetig. Champion solo korrekt (placement=1 auch beim einzigen Solo-End-Pfad Tower-Tod, kein Rang-Gate in evalContribution; 3-Teilnehmer-Vorgriff: nur Rang 1 bekommt Champions), Skalierung count x maxTowerCount (HP ohne Tower-Term), Run-1-Budget von 2 Champion-Claims dominiert (fix 50,0 Hex Display = 10-25x der Run-Wirtschaft, exakt 10 damage-Level Kaufkraft, Review handnachgerechnet), Run-2-Median Welle 5->7; Bimodalitaet frueh~5/tief~20 als FYI; 8 deterministische Tests ~1,5s (keine funktionale Aenderung geshippt)
  • Login-Landungs-Logik konsolidiert (Fifty: Logik nicht 3x im Code) - EINE Funktion loginLandingPath(c,ua,{carry}) fuer OAuth-Callback (carry:true, byte-gleich, ui-308-Tests 0 Zeilen Diff), /passkey/login/verify (alle UAs -> /viewer.html, carry:false mit dokumentiertem ui-274-Contract-Grund) und /twitch/resolve (UA-vereinheitlicht, carry:false konservativ - Carry-Through waere neue Produktentscheidung, followup); isMobileUserAgent-Landungs-Weichen aus auth.js komplett raus; 16 Tests + Call-Site-Pin-Followup notiert
  • Snapshot-/Endscreen-Bau nur bei Abnehmern (Broadcast-Gate + Awards-Memo)
  • Tick-Dauer-Telemetrie + Privatraum-Deckel (Default 25)
  • Bash-Backslash-Pfad-Defekt strukturell adressiert (2x belegt: ui-491-Review Repo-Strand, ui-495-Dev Haupt-Checkout-Strand mit ship-Sync-Block) - Forward-Slash-Regel + git-status-Nachcheck in dev.md/reviewer.md/CLAUDE.md, followups-Werkzeug-Eintrag; review:skip (reine Workflow-Doku, Wortlaut im Ticket)
  • Review-Cleanup Batch - ship.ps1/new-ticket.ps1 committen via -F Temp-Datei (Praxis-Beweis: diese Message enthaelt "doppelte Anfuehrungszeichen"), ui-326-IDOR-Scan nullt ui-419-Felder, ptr-auto-bump meldet Force-Override, css-guard url()-Warnung + Grenz-Landminen + 2 Tests, srv-140-Flake nicht reproduziert (5 Laeufe), mark-deployed ueberspringt Skelette