Repository navigation
Code-Health-Audit (2026-09-20): Farb-Token-Duplikation, toter AnimatedButton-Export, game.tsx State-Cluster #334
Description
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.tsxhartkodieren identische Hex-Werte, die inColors.tsbereits als benannte Tokens existieren.components/game/TimerArc.native.tsx:48undcomponents/game/TimerArc.web.tsx:22— beide Dateien enthalten wortgleichconst arcColor = timeRemaining <= 1 ? '#FF6B6B' : timeRemaining <= 3 ? '#FFD700' : '#FFFFFF';.#FF6B6Bist bereitsconstants/Colors.ts:20(gradients.warm[1]),#FFD700bereitsconstants/Colors.ts:86(stars.yellow) und:99(stars.filled) definiert. Zusätzlichapp/index.tsx:186,200,295(#F59E0B,#D97706,#FF6B35) — UI-Akzentfarben außerhalb des Zeichnungskontexts, ebenfalls nicht ausColors.tsreferenziert. Vorschlag:arcColor-Logik in einer gemeinsamen Stelle (z. B.Colors.ts-Export oder Shared-Hook, da.native.tsx/.web.tsxohnehin 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:136exportiertAnimatedButton, das einzige Vorkommen außerhalb der Definition ist ein Test-Mock incomponents/__tests__/GalleryScreen.test.tsx:43(mockt das Modul, ruft die Komponente aber nicht auf). Verifiziert perts-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 inAnimatedPrimitives.tsx(bereits 406 Zeilen). -
3. [Niedrig]
app/game.tsxsammelt UI-Overlay-State, der eigentlich zusammengehört.app/game.tsx:49-56: sieben eng verwandteuseState-Aufrufe für Modals/Toasts/Celebration (showSettings,showHintModal,hasUsedHint,showConfetti,celebrationEnabled,confettiIntensity,unlockedBadge) liegen direkt in der 545-Zeilen-Screen-Komponente, dazu 6useEffect-Blöcke, von denen 3 (app/game.tsx:123,154,185)eslint-disable-next-line react-hooks/exhaustive-depsbrauchen — bei insgesamt nur 8 solcher Suppressions im gesamten Projekt sitzen 3 allein hier (verifiziert per projektweitemgrep). Die Kern-Spielphasen sind bereits sauber inMemorizePhase/DrawPhase/ResultPhaseausgelagert — betroffen ist nur die verbleibende Overlay-/Feedback-Orchestrierung. Vorschlag: Diesen State-Cluster (Confetti + Badge-Toast + Hint-Modal) in einen dediziertenuseGameFeedback()-Hook auslagern, analog zum bestehenden MusteruseGamePhase/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|| truemehr beitsc --noEmit/Lint,test:cinutzt--coverageund dercoverageThresholdinjest.config.jsist 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 nachservices/storage/persistedJson.tszentralisiert (createPersistedJson-Helper);OnboardingManager.ts/AchievementManager.tsnutzen ihn, keine parallele Inline-Implementierung mehr gefunden. -
6. [Kein Befund] Dependency-Bloat —
npm audit --audit-level=highläuft sauber (0 high/critical, Stand nach fix: npm audit fix gegen High-Severity in js-yaml #333);react-native-svg-webbereits entfernt (chore: ungenutzte Dependency react-native-svg-web entfernen #321),npm lsbestätigt leer. -
7. [Kein Befund] Test-Integrität — keine stillen
testPathIgnorePatterns-Ausschlüsse, Coverage-Sammlung decktapp/,components/,services/,utils/vollständig ab. -
8. [Nicht messbar] Bundle-Größe — aktueller Web-Hauptbundle-Stand
entry-*.js≈ 2.83 MB (Standtesting, 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
S540d commentedon Sep 24, 2026
Umgesetzt in #343, gemergt nach
testing.Generated by Claude Code