Skip to content

Code-Health-Audit (2026-09-20): Farb-Token-Duplikation, toter AnimatedButton-Export, game.tsx State-Cluster #334

Closed

Description

@S540d

Zweiter Durchlauf des wiederkehrenden Code-Health-Audit-Standards (siehe project-templates#136 / dev-standards/code-health-audit.md). Basis: testing-Branch, Commit c226efb (2026-09-16). Reine Bestandsaufnahme, keine Codeänderungen.

Vorheriges Audit: #318 (geschlossen, beide Befunde umgesetzt in #319/#320).

Priorisierte Befunde

  • 1. [Mittel] Farb-Duplikation statt zentraler Tokens: TimerArc.native.tsx/TimerArc.web.tsx hartkodieren identische Hex-Werte, die in Colors.ts bereits als benannte Tokens existieren. components/game/TimerArc.native.tsx:48 und components/game/TimerArc.web.tsx:22 — beide Dateien enthalten wortgleich const arcColor = timeRemaining <= 1 ? '#FF6B6B' : timeRemaining <= 3 ? '#FFD700' : '#FFFFFF';. #FF6B6B ist bereits constants/Colors.ts:20 (gradients.warm[1]), #FFD700 bereits constants/Colors.ts:86 (stars.yellow) und :99 (stars.filled) definiert. Zusätzlich app/index.tsx:186,200,295 (#F59E0B, #D97706, #FF6B35) — UI-Akzentfarben außerhalb des Zeichnungskontexts, ebenfalls nicht aus Colors.ts referenziert. Vorschlag: arcColor-Logik in einer gemeinsamen Stelle (z. B. Colors.ts-Export oder Shared-Hook, da .native.tsx/.web.tsx ohnehin dieselbe Logik duplizieren) zusammenfassen und existierende Tokens referenzieren statt Hex-Literale. Risiko: gering funktional, aber bei künftiger Farbpalettenänderung (z. B. Rebranding, Issue App-weite Markenfarbe vereinheitlichen: Blau (app.json) vs. Violett (Colors.primary) #306 "Markenfarbe vereinheitlichen") müssten mehrere Stellen synchron angepasst werden — leicht zu übersehen.

  • 2. [Niedrig] Toter Code: AnimatedButton-Export wird nirgends in der App verwendet. components/AnimatedPrimitives.tsx:136 exportiert AnimatedButton, das einzige Vorkommen außerhalb der Definition ist ein Test-Mock in components/__tests__/GalleryScreen.test.tsx:43 (mockt das Modul, ruft die Komponente aber nicht auf). Verifiziert per ts-prune + grep. Vorschlag: Entweder entfernen (falls wirklich ungenutzt) oder — falls für einen anstehenden Screen vorgesehen — mit Kommentar kennzeichnen, warum sie im Baum bleibt. Risiko: minimal, reine Aufräumarbeit, aber jede ungenutzte Primitive erschwert die Orientierung in AnimatedPrimitives.tsx (bereits 406 Zeilen).

  • 3. [Niedrig] app/game.tsx sammelt UI-Overlay-State, der eigentlich zusammengehört. app/game.tsx:49-56: sieben eng verwandte useState-Aufrufe für Modals/Toasts/Celebration (showSettings, showHintModal, hasUsedHint, showConfetti, celebrationEnabled, confettiIntensity, unlockedBadge) liegen direkt in der 545-Zeilen-Screen-Komponente, dazu 6 useEffect-Blöcke, von denen 3 (app/game.tsx:123,154,185) eslint-disable-next-line react-hooks/exhaustive-deps brauchen — bei insgesamt nur 8 solcher Suppressions im gesamten Projekt sitzen 3 allein hier (verifiziert per projektweitem grep). Die Kern-Spielphasen sind bereits sauber in MemorizePhase/DrawPhase/ResultPhase ausgelagert — betroffen ist nur die verbleibende Overlay-/Feedback-Orchestrierung. Vorschlag: Diesen State-Cluster (Confetti + Badge-Toast + Hint-Modal) in einen dedizierten useGameFeedback()-Hook auslagern, analog zum bestehenden Muster useGamePhase/useTimer. Risiko: gering akut, aber wächst mit jedem neuen Feedback-Feature (z. B. weitere Celebration-Varianten) weiter in dieselbe Datei.

  • 4. [Kein Befund] CI-Gate-Integrität — pull_request-Trigger deckt jetzt korrekt [main, testing] ab (.github/workflows/ci-cd.yml:6-7), kein || true mehr bei tsc --noEmit/Lint, test:ci nutzt --coverage und der coverageThreshold in jest.config.js ist auf den tatsächlichen Ist-Stand kalibriert. Beide Befunde aus Code-Health-Audit (2026-09-06): PRs gegen testing durchlaufen keine CI, tsc-Fehler maskiert #318 vollständig umgesetzt (fix: CI für PRs gegen testing aktivieren, tsc-Fehler nicht mehr maskieren #319, refactor: DailyChallengeManager/OnboardingManager auf StorageManager umstellen #320).

  • 5. [Kein Befund] Boilerplate-Duplikation Storage-Layer — AsyncStorage-Direktzugriffe sind nach services/storage/persistedJson.ts zentralisiert (createPersistedJson-Helper); OnboardingManager.ts/AchievementManager.ts nutzen ihn, keine parallele Inline-Implementierung mehr gefunden.

  • 6. [Kein Befund] Dependency-Bloat — npm audit --audit-level=high läuft sauber (0 high/critical, Stand nach fix: npm audit fix gegen High-Severity in js-yaml #333); react-native-svg-web bereits entfernt (chore: ungenutzte Dependency react-native-svg-web entfernen #321), npm ls bestätigt leer.

  • 7. [Kein Befund] Test-Integrität — keine stillen testPathIgnorePatterns-Ausschlüsse, Coverage-Sammlung deckt app/, components/, services/, utils/ vollständig ab.

  • 8. [Nicht messbar] Bundle-Größe — aktueller Web-Hauptbundle-Stand entry-*.js ≈ 2.83 MB (Stand testing, lokaler Export). Kein dokumentierter Vergleichswert aus Code-Health-Audit (2026-09-06): PRs gegen testing durchlaufen keine CI, tsc-Fehler maskiert #318 vorhanden, daher kein Trend feststellbar — für das nächste Audit als Baseline vermerkt.

Priorität

Nichts davon ist release-blockierend. Befund 1 (Farb-Duplikation) am ehesten vor der nächsten größeren Theming-/Rebranding-Arbeit (Issue #306) angehen, da sich der Aufwand sonst multipliziert. Befunde 2 und 3 sind unabhängig und können einzeln als kleine Tickets abgearbeitet werden, wenn Kapazität da ist.

Activity

  1. S540d commented on Sep 24, 2026

    @S540d
    OwnerAuthor

    Umgesetzt in #343, gemergt nach testing.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions