Test-Hook window.PULSE unverändert im Auslieferzustand enthalten #12

Open
opened 2026-08-29 01:41:12 +02:00 by G1LL1 · 3 comments
G1LL1 commented 2026-08-29 01:41:12 +02:00 (Migrated from gitlab.g1ll1.com)

Komponente: GAME
Betroffene Version: main @ 238ed66, index.html Zeilen 2965–2969

Beschreibung

Das abschließende IIFE exportiert einen globalen Hook mit direktem Zugriff auf den kompletten
Spielzustand und auf interne Funktionen:

/* Test-Hook für automatisierte Headless-Läufe (kein Einfluss im Spielbetrieb). */
window.PULSE = {
  S: S, CORE: CORE, startRun: startRun, setState: setState, pauseGame: pauseGame, resumeGame: resumeGame,
  gameOver: gameOver, tryFocus: tryFocus, update: update, render: render, resetWorld: resetWorld,
  press: INPUT.press, computeScore: computeScore, isTouch: isTouch
};

Der Kommentar behauptet „kein Einfluss im Spielbetrieb“ – für den Spielablauf stimmt das, aber
der Hook ist ein vollwertiger, schreibbarer Zugriff auf die gesamte Simulation.

Probleme

  1. Manipulierbarkeit / Score-Integrität. PULSE.S.stats.dodges = 1e6; PULSE.S.distance = 1e6
    gefolgt von einem normalen Tod schreibt einen beliebig hohen Rekord in
    localStorage("pulseSprintSaveV1"). Bei lokal gespeicherten Bestleistungen unkritisch, aber
    es schließt jede spätere Ranglisten-/Challenge-Logik aus.
  2. Globales Namensraum-Leck. AGENTS.md: „Vermeide unnötige globale Variablen“. Neben
    CORE, RENDER, AUDIO, STORE, INPUT (notwendige Modulreferenzen) ist PULSE ein
    reines Testartefakt.
  3. Umgeht die Zustandsmaschine. setState()/update()/render() von außen aufzurufen ist
    der kürzeste Weg in inkonsistente Zustände – ein Teil der in den Issues #2/#3 dokumentierten
    Messungen nutzt das. Für Nutzer:innen nicht vorgesehen, aber jederzeit möglich.
  4. Toter Code im ausgelieferten Spiel, da kein Testablauf im Browser ausgeliefert wird.

Lösungsvorschlag

Hook nur bei aktiviertem Testmodus anlegen und ihn aus der ausgelieferten Datei entfernen:

if (new URLSearchParams(location.search).get("test") === "1") {
  window.PULSE = { /* ... */ };
}

Die bestehenden Headless-Prüfungen (Playwright, CORE-Extraktion über __CORE_START__) können
denselben Schalter nutzen, damit sie wie bisher fahren.


Dokumentiert in gitlab-issues/12-testhook-window-pulse-im-produktionslauf.md (Commit 238ed66). Alle Befunde ausgeführt und gemessen; Repro-Schritte im Text.

**Komponente:** GAME **Betroffene Version:** `main` @ `238ed66`, `index.html` Zeilen 2965–2969 ## Beschreibung Das abschließende IIFE exportiert einen globalen Hook mit direktem Zugriff auf den kompletten Spielzustand und auf interne Funktionen: ```js /* Test-Hook für automatisierte Headless-Läufe (kein Einfluss im Spielbetrieb). */ window.PULSE = { S: S, CORE: CORE, startRun: startRun, setState: setState, pauseGame: pauseGame, resumeGame: resumeGame, gameOver: gameOver, tryFocus: tryFocus, update: update, render: render, resetWorld: resetWorld, press: INPUT.press, computeScore: computeScore, isTouch: isTouch }; ``` Der Kommentar behauptet „kein Einfluss im Spielbetrieb“ – für den Spielablauf stimmt das, aber der Hook ist ein vollwertiger, schreibbarer Zugriff auf die gesamte Simulation. ## Probleme 1. **Manipulierbarkeit / Score-Integrität.** `PULSE.S.stats.dodges = 1e6; PULSE.S.distance = 1e6` gefolgt von einem normalen Tod schreibt einen beliebig hohen Rekord in `localStorage("pulseSprintSaveV1")`. Bei lokal gespeicherten Bestleistungen unkritisch, aber es schließt jede spätere Ranglisten-/Challenge-Logik aus. 2. **Globales Namensraum-Leck.** AGENTS.md: „*Vermeide unnötige globale Variablen*“. Neben `CORE`, `RENDER`, `AUDIO`, `STORE`, `INPUT` (notwendige Modulreferenzen) ist `PULSE` ein reines Testartefakt. 3. **Umgeht die Zustandsmaschine.** `setState()`/`update()`/`render()` von außen aufzurufen ist der kürzeste Weg in inkonsistente Zustände – ein Teil der in den Issues #2/#3 dokumentierten Messungen nutzt das. Für Nutzer:innen nicht vorgesehen, aber jederzeit möglich. 4. **Toter Code im ausgelieferten Spiel**, da kein Testablauf im Browser ausgeliefert wird. ## Lösungsvorschlag Hook nur bei aktiviertem Testmodus anlegen und ihn aus der ausgelieferten Datei entfernen: ```js if (new URLSearchParams(location.search).get("test") === "1") { window.PULSE = { /* ... */ }; } ``` Die bestehenden Headless-Prüfungen (Playwright, CORE-Extraktion über `__CORE_START__`) können denselben Schalter nutzen, damit sie wie bisher fahren. --- *Dokumentiert in `gitlab-issues/12-testhook-window-pulse-im-produktionslauf.md` (Commit `238ed66`). Alle Befunde ausgeführt und gemessen; Repro-Schritte im Text.*
G1LL1 commented 2026-08-29 01:45:29 +02:00 (Migrated from gitlab.g1ll1.com)

changed the description

changed the description
G1LL1 commented 2026-08-29 01:48:13 +02:00 (Migrated from gitlab.g1ll1.com)

changed the description

changed the description
G1LL1 commented 2026-08-29 11:48:51 +02:00 (Migrated from gitlab.g1ll1.com)

mentioned in commit 98097885dc

mentioned in commit 98097885dcc7085fc491bb63d536d070e0e21bc7
Sign in to join this conversation.
No description provided.