Smart Fitness App: Client Architecture Spec
ArtefaktDieses Artefakt wird in Folge 3 „Give Your App a Brain“ und Folge 4 „The No-Code App Implementation Plan“ verwendet. Sie können diese Spezifikation als Referenz für Frontend-Ansichten, wiederverwendbare UI-Komponenten, die Verwaltung des Clientstatus und Testfälle in einfacher Sprache verwenden.
Melden Sie sich an, um auf dieses Artefakt zuzugreifen
Melden Sie sich mit Ihrem Google-Entwicklerprofil an, um das vollständige Artefakt aus der Build It!-Reihe anzusehen und zu kopieren.
Entwicklerprofil erforderlich
Sie sind nicht berechtigt, ein Entwicklerprofil zu erstellen. Bitten Sie Ihren Workspace-Administrator, diese Funktion zu aktivieren.
Entwicklerprofil erstellen
Erstellen Sie ein kostenloses Google-Entwicklerprofil, um alle Build It!-Prompts und ‑Artefakte freizuschalten.
Builder Central beitreten, um freizuschalten
Fordern Sie mit nur einem Klick Ihr kostenloses Builder-Mitglieder-Badge an, um alle Build It!-Prompts und ‑Artefakte freizuschalten.
Status: Bereit für die Planungssitzung (Entwurf mit dem Client Planning Companion)
Companion-Dokument: Spezifikation der Datenarchitektur
Architekturziel: Sauberer, wartbarer, modularer und testbarer Frontend-Neubau des Smart-Fitness-Prototyps von AI Studio.
0. Technischer Stack und Engineering-Standards
- Laufzeit-Framework: Next.js (App Router, React 19) + Offline-Asset-Caching für Progressive Web-Apps (PWA).
- Styling-Architektur: Tailwind CSS v4 + Tailwind-Varianten (für deterministisches Komponenten-Styling) + Lucide React (Symbole).
- Client State Division:
- Zustand (Local Session): Verwaltet den flüchtigen Zustand des Trainingsbereichs (
useActiveSessionStore), Stoppuhr-Timer, aktive Satzpuffer und vorberechnete Schrittfolgen. MitlocalStoragesynchronisiert, um die Displaysperre wiederherzustellen. - TanStack Query (Serverstatus): Verwaltet das Firestore-Dokument-Caching, die Hintergrund-Revalidierung und optimistische Updates für
weekly_plans,user_profiles,prsundworkout_logs.
- Zustand (Local Session): Verwaltet den flüchtigen Zustand des Trainingsbereichs (
- Diagrammvisualisierung: Recharts (mit benutzerdefinierten dunklen Gym-Modus-Tokens formatiert).
- Authentifizierung: Firebase Authentication mit Inhabertoken-Authentifizierungsheader, der an alle Serverendpunkte übergeben wird.
1. Frontend-Grundsätze und -Designprinzipien
- Ergonomie für das Fitnessstudio: Die Kopfhörer sind so konzipiert, dass sie sich auch während des Trainings mit verschwitzten Händen mit nur einer Hand bedienen lassen. Großzügige Berührungszielbereiche (mindestens 48 × 48 dp), kontrastreiche Lesbarkeit und minimale erforderliche Eingaben.
- Optimistische Benutzeroberfläche und Offline-Resilienz: Das Protokollieren von Sätzen, das Starten von Pausentimern und das Wechseln von Übungen müssen in der Benutzeroberfläche sofort (< 16 ms) reagieren. Die Hintergrundsynchronisierung übernimmt die Serverpersistenz für
POST /api/workouts/log, ohne den Nutzer zu blockieren. - Strikte Trennung der Zuständigkeiten: Dumb-/Präsentationskomponenten empfangen Daten und geben Ereignisse über Props aus. Smart-Container-Ansichten verwalten die Geschäftslogik, Zustandsspeicher und die API-Koordination.
- Staged Mutation UX: Vorschläge, die vom KI-Coach (
POST /api/coach/chat) generiert werden, werden als interaktive Vorschaukarten mit den expliziten Steuerelementen [Accept Plan] und [Modify] gerendert, bevor Änderungen am Anwendungsstatus vorgenommen werden. - Verhaltensgesteuerte Qualität: Jede Seite, jede Komponente und jede Interaktion wird mit Testfällen in natürlicher Sprache verknüpft, die das erwartete Verhalten eindeutig definieren.
2. App-Navigation und Ansichtshierarchie
| Route | Ansichtsname | Hauptzweck | Wichtige enthaltene Komponenten |
|---|---|---|---|
/ |
Root Redirect | Sofortige Weiterleitung zu /today. |
(Router-Weiterleitung) |
/today |
Vorschau auf das heutige Training | Standardansicht: Wird automatisch auf den aktuellen Wochentag eingestellt und zeigt eine Vorschau des heutigen Trainings an. | <BackButton />, <WorkoutHeader />, <CoachNoteCard />, <WorkoutExerciseSummary />, <WorkoutBlock />, <ExerciseCard />, <EmptyDayPlaceholder />, <ModifyWithCoachCard /> |
/workouts/:day |
Vorschau auf das tägliche Training | Zeigt eine Vorschau des Trainings für einen bestimmten Tag der Woche an (z.B. /workouts/monday, /workouts/thursday). |
<BackButton />, <WorkoutHeader />, <CoachNoteCard />, <WorkoutExerciseSummary />, <WorkoutBlock />, <ExerciseCard />, <EmptyDayPlaceholder />, <ModifyWithCoachCard /> |
/workout/active |
Tracker für aktive Sitzungen | Bildschirm für die Ausführung von Workouts mit hohem Einsatz (Sätze, Wiederholungen, Timer). Die untere Navigationsleiste bleibt sichtbar. | <ActiveSessionStickyHeader />, <ActiveExerciseCardHeader />, <CoachTipCard />, <CurrentSetTargetCard />, <SetNavigationRow />, <ExerciseSetsTable />, <ActiveRestTimerDock />, <SessionExerciseOverview />, <ActiveSessionControlsDock />, <SwapExerciseModal />, <FinishConfirmationModal /> |
/week |
Trainingsplan / Wochenansicht | Vollständige 7-Tage-Übersicht mit wöchentlichen Gesamtvolumen/-zeiten. | <WeekHeader />, <WeeklyStatsSummary />, <DayScheduleCardList />, <DayScheduleCard />, <ModifyWeekWithCoachCard /> |
/coach |
KI-Coach-Chat | Konversationelles Coaching mit kontextbezogenen Chips und gestaffelten Trainingsvorschlägen. | <CoachHeader />, <ChatMessageList />, <ChatBubble />, <StagedProposalCard />, <ContextualPromptsBar />, <ChatInputDock />, <ContextBanner />, <ChatInputBar />, <SpeechToTextButton /> |
/progress |
Fortschritt und Analysen | Frühere Trainingsprotokolle, persönliche Bestleistungen und Volumen-Diagramme. | <ProgressHeader />, <PRShowcaseBanner />, <VolumeProgressChartCard />, <AllTimeStatsGrid />, <WorkoutHistorySection />, <HistorySessionCard />, <EmptyHistoryPlaceholder /> |
/settings |
Nutzerprofil und Einstellungen | Geräteprofil, Benachrichtigungen und dreistufige Speicherverwaltung. | <SettingsHeader />, <UserProfileCard />, <EquipmentSelectorCard />, <EquipmentToggleChip />, <PreferencesGroup />, <MemoryTierViewerCard />, <MemoryItemCard />, <AccountActionsGroup /> |
/exercises/:exerciseId |
Details zur Übungsenzyklopädie | Anleitung für Übungen mit Deeplinks (z.B. /exercises/incline-db-bench-press) mit Video- und Formtipps. |
<BackButton />, <ExerciseVideoPlayer />, <TargetMusclesCard />, <HowToPerformCard />, <FormTipsCard /> |
3. Seiten- und Ansichtsspezifikationen
Ansicht: DailyWorkoutView (/today und /workouts/:day)
- Zweck: Zeigt das geplante Trainingsprogramm für einen bestimmten Tag an, einschließlich Trainingsschwerpunkt, Dauer, Zielverteilung der Muskelbelastung, Notizen des Coachs, Straight-Set-Blöcke und Superset-Blöcke. Wenn kein Training geplant ist, wird ein leerer Status angezeigt.
- Visuelle Anatomie:
- Oben:
<BackButton label="Back to Week" targetRoute="/week" />. - Header: Einzeiliger Titel (
"Today"oder Wochentag) mit bedingtem"✓ Completed"-Badge, Dauer-Pill ("⏱ 50 min") und Balken für die Intensität der Zielmuskeln in Prozent. - Coach-Hinweis: Karte mit kontextbezogenen Ratschlägen, Symbol und grünem Rand.
- Body: Scrollbare Liste mit Trainingsblöcken, die
<WorkoutExerciseSummary />verwenden (normale Sätze oder Supersätze mitborder-left: 3px solid #a3e635- und🔁 SUPERSET BLOCK-Badge). - Leerer Zustand:
<EmptyDayPlaceholder message="Nothing scheduled for this day" />. - Aktion in der Fußzeile:
<ModifyWithCoachCard />(leitet zu/coach?day=:dayweiter).
- Oben:
Ansicht: WeekScheduleView (/week)
- Zweck: Zeigt die vollständige Übersicht über den 7‑tägigen Trainingsplan an, einschließlich allgemeiner wöchentlicher Messwerte zu Volumen/Zeit, einer ausgewählten Liste aktiver Trainingstage (nicht geplante Tage/Ruhetage werden strikt herausgefiltert) und einer direkten Verknüpfung, um den Wochenplan mit dem KI-Coach zu überarbeiten.
- Visuelle Anatomie:
<WeekHeader />, dreispaltige<WeeklyStatsSummary />(Gesamtzeit, Gesamtvolumen, Häufigkeit), Liste der geplanten Tage mit<DayScheduleCard variant="normal" />(mit neongrünemTODAY-Badge am aktuellen Tag) und<ModifyWeekWithCoachCard />(leitet zu/coach?context=weekweiter).
Ansicht: CoachChatView (/coach)
- Zweck: Konversations-Coaching-Hub mit dem Gemini-Trainer-Agenten. Bietet motivierende und strategische Trainingstipps, unterstützt Sprache-zu-Text-Diktate und ermöglicht schrittweise Anpassungen des Trainings durch „Human in the Loop“ mit expliziten Steuerelementen für die Annahme.
- Visuelle Anatomie:
<CoachHeader />, scrollbare<ChatMessageList />(<ChatBubble />und<StagedProposalCard />), bedingte<ContextualPromptsBar />und angedockte<ChatInputDock />(<ContextBanner />mit[✕]zum Schließen +<ChatInputBar />+<SpeechToTextButton />).
Ansicht: ExerciseDetailView (/exercises/:exerciseId)
- Zweck: Deep-Link-fähiger Enzyklopädieeintrag mit einer automatisch wiederholten, stummgeschalteten Videodemonstration (
<ExerciseVideoPlayer />), Badges für primäre und sekundäre Zielmuskeln (<TargetMusclesCard />), einer geordneten Schritt-für-Schritt-Anleitung (<HowToPerformCard />) und Tipps zur Ausführung (<FormTipsCard />).
Ansicht: ActiveWorkoutView (/workout/active)
- Zweck: Bildschirm für die Ausführung von Workouts mit hoher Intensität und die Protokollierung von Sätzen. Verwaltet den Status der Stoppuhr für die Live-Sitzung, die aktuellen Ziele, die Eingaben für Wiederholungen/Gewicht, die sofortige Bestätigung per Häkchen (< 16 ms), den automatischen Wechsel von Supersets, den Countdown für den Ruhe-Timer mit haptischem/Audio-Feedback, den Wechsel von Übungen und die endgültige Speicherung in
POST /api/workouts/log. - Visuelle Anatomie:
<ActiveSessionStickyHeader />,<ActiveExerciseCardHeader />,<CoachTipCard />,<CurrentSetTargetCard />, schwebende<ActiveRestTimerDock />(+30s,Skip),<SetNavigationRow />,<ExerciseSetsTable />(+ Add Set),<SessionExerciseOverview />, angedockte<ActiveSessionControlsDock />([⇄ SWAP EXERCISE]+[▶ START WORKOUT]/[⏸ PAUSE]/[▶ RESUME]),<SwapExerciseModal />und<FinishConfirmationModal />.
Ansicht: ProgressView (/progress)
- Zweck: Verfolgt den sportlichen Fortschritt im Laufe der Zeit, feiert aktuelle persönliche Rekorde (
<PRShowcaseBanner />), visualisiert wöchentliche/monatliche Volumentrends mit interaktiven Recharts (<VolumeProgressChartCard />mit4W | 3M | 1Y-Umschaltern), zeigt<AllTimeStatsGrid />an und archiviert vergangene abgeschlossene Trainingseinheiten (<WorkoutHistorySection />/<HistorySessionCard />).
Ansicht: SettingsView (/settings)
- Zweck: Verwaltung von Athletenprofilinformationen (
<UserProfileCard />), Ausrüstungsinventar (<EquipmentSelectorCard />/<EquipmentToggleChip />), Trainingseinstellungen (<PreferencesGroup />fürLBS / KG, haptisches Feedback, Ton) und Bereitstellung einer transparenten Nutzerverwaltung und Löschung des dreistufigen Living Memory des KI-Trainers (<MemoryTierViewerCard />/<MemoryItemCard />).
4. Katalog und Schnittstellen für wiederverwendbare Komponenten
Wichtige TypeScript-Komponenten-Prop-Verträge in der Anwendung:
// src/components/workout/WorkoutExerciseSummary.tsx
interface WorkoutExerciseSummaryProps {
blocks: Array<{
label?: string;
category?: string;
exercises: Array<{
exercise_id: string; // Canonical slug (e.g. 'incline-db-bench-press')
name: string; // Denormalized display name (e.g. 'Incline DB Bench Press')
target_sets: number;
target_reps: string | number;
rest_seconds?: number;
}>;
}>;
activeExerciseId?: string;
onSelectExercise?: (exerciseId: string) => void;
}
// src/components/week/DayScheduleCard.tsx
interface DayScheduleCardProps {
dayName: string;
dayShort: string;
subtitleLabel?: string;
isToday?: boolean;
title: string;
focusBadge: string;
durationMin: number;
volumeLbs?: number;
targetMuscles: string[];
variant?: 'normal' | 'condensed';
onPress: (dayName: string) => void;
}
// src/components/coach/StagedProposalCard.tsx
interface StagedProposalCardProps {
proposalId: string;
type: 'UPDATE_DAY' | 'UPDATE_WEEK';
targetDay?: string;
summaryDiff: string;
proposalData: any;
isApplied?: boolean;
onAccept: (proposalId: string, data: any) => void;
onModify: (summaryDiff: string) => void;
}
// src/components/workout/CurrentSetTargetCard.tsx
interface CurrentSetTargetCardProps {
setNumber: number;
targetWeightLbs: number;
targetReps: number;
isCompleted: boolean;
onWeightChange: (weight: number) => void;
onRepsChange: (reps: number) => void;
onToggleComplete: () => void;
}5. Client State Management und Datenflussmatrix
5.1 Latenz- und Laderichtlinie: Die zweistufige Engine
- Optimistische Benutzeroberfläche für das Fitnessstudio (< 16 ms): Taktile Aktionen im Fitnessstudio – Sätze abhaken, Gewichte/Wiederholungen erhöhen, Tabs wechseln und Geräte umschalten – aktualisieren den lokalen Status und werden innerhalb von 16 Millisekunden neu gerendert. Nutzer werden beim Halten von Gewichten nie durch Ladeanzeigen blockiert.
- Explizite Lade-Spinner und -Anzeigen für asynchrone Vorgänge:
- KI-Coach-Unterhaltungen (
POST /api/coach/chat): Wenn du eine Chatnachricht sendest, wird im Chatstream sofort eine animierte KI-Coach-Denkblase angezeigt, bis Gemini eine Antwort oder einen Trainingsvorschlag zurückgibt. - Erster Kaltstart und Netzwerksynchronisierung: In Ansichtscontainern werden Skeleton Loader und kontrastreiche Ladeanzeigen angezeigt, während
weekly_plansoderhistorical_workoutsabgerufen werden. - Workout Submission (
[Finish]): Im Bestätigungsfenster für den Abschluss wird ein aktiver Ladekreis angezeigt, während die Nutzlast der Trainingseinheit in Cloud Firestore anPOST /api/workouts/logübergeben wird.
- KI-Coach-Unterhaltungen (
5.2 Client-Store-Architektur und Domain-Grenzen
| Geschäftsebene | Zustandsbereich und Schlüsseleigenschaften | Persistenz- und Cache-Richtlinie | Koordinierter Backend-Vertrag |
|---|---|---|---|
useActiveSessionStore (Zustand) |
sessionState (unstarted, running, paused), elapsedSeconds, currentStepIndex, steps: WorkoutStep[], loggedExercises. |
Wird jede Sekunde mit localStorage synchronisiert, um eine zuverlässige Wiederherstellung nach einer Sperrung oder Aktualisierung des Smartphones zu ermöglichen. |
Sendet die vollständige Nutzlast an POST /api/workouts/log. |
useWeeklyPlanQuery (TanStack Query) |
Aktueller 7-Tage-Plan, Tages-Workout-Objekte, Superset-Blöcke, Abschlussstatus (scheduled, completed). |
In TanStack Query (staleTime: 5 min) im Cache gespeichert; beim Start vorab abgerufen. |
Wird übernommen, wenn der Nutzer auf [Accept Plan] für Vorschläge von POST /api/coach/chat tippt. |
useCoachChatStore (Zustand + TanStack) |
Chronologische Nachrichtenblasen, activeContext, Prompt-Chips, isCoachTyping: boolean, gestaffelte Vorschläge. |
Synchronisiert mit dem wöchentlichen Firestore-Chat-Bucket über ein Echtzeitabo (onSnapshot). |
Leitet Abfragen an POST /api/coach/chat weiter. |
useProgressQuery (TanStack Query) |
Archiv mit Trainingsverlauf, PR-Rekordtafel (/users/{userId}/prs), Gesamtvolumen aller Zeiten, Zeitraumfilter (4W, 3M, 1Y). |
In TanStack Query (staleTime: 10 min) im Cache gespeichert. |
Wird sofort nach Abschluss einer Trainingseinheit aktualisiert. |
useUserProfileStore (TanStack Query) |
Ausrüstungsinventar, Einheiten (LBS/KG), Ton-/Haptik-Umschalter, 3-stufiges Gedächtnis (Grundbedürfnisse, physiologische Bedürfnisse, situative Bedürfnisse). |
Im Cache in TanStack Query mit bidirektionaler Synchronisierung mit Firestore user_profiles. |
Automatisch aktualisiert mit memory_mutations von POST /api/coach/chat. |
useExerciseLibraryQuery (TanStack Query) |
Statische Enzyklopädieeinträge, Video-URLs, primäre/sekundäre Muskeln, Schritte, Tipps zur Ausführung. | Aggressives Cache-First mit unendlicher TTL (staleTime: Infinity). |
Lesezugriff auf die unveränderliche Firestore-Sammlung exercises. |
5.3 Vorberechnetes Schrittdiagramm für aktive Sitzungen
export interface WorkoutStep {
stepIndex: number; // 1-based index (e.g. 1 to 13)
totalSteps: number; // Total sets in the session
blockIndex: number; // Index of block in day plan
blockType: 'straight' | 'superset';
exerciseId: string; // Canonical slug
exerciseName: string; // Display name
setNumber: number; // Set index for this exercise (1, 2, 3...)
targetWeightLbs: number; // Target weight in lbs
targetReps: string | number; // Target reps (e.g. "8-10")
restSecondsAfter: number; // Prescribed rest duration
isCompleted: boolean; // Completion checkmark status
actualWeightLbs?: number; // User entered weight
actualRepsCompleted?: number; // User entered reps
}5.4 End-to-End-Datenfluss und Mutationsmatrix
| Nutzer-Trigger | Ursprüngliche Ansicht | Client Store Mutated | UI-Latenz/Ladestatus | Backend-Koordination | Rollback/Fehlerbehandlung |
|---|---|---|---|---|---|
Tippe auf [✓] „Satz abschließen“. |
/workout/active |
useActiveSessionStore |
<16ms (optimistisch) |
Lokaler Sitzungspuffer aktualisiert; keine Netzwerkwartezeit. | Lokaler Speicherschreibvorgang mit zuverlässiger lokaler Persistenz. |
Tippe auf [Finish Workout]. |
/workout/active |
useActiveSessionStore, useWeeklyPlanStore, useProgressStore |
Auf der Schaltfläche wird während der Synchronisierung ein rotierendes Ladesymbol angezeigt. | Wird an POST /api/workouts/log gesendet. Markiert den Firestore-Tag als completed. |
Wenn Sie offline sind, wird die Nutzlast in den lokalen Synchronisierungspuffer gestellt und nach der Wiederherstellung der Verbindung noch einmal gesendet. |
Tippe auf [Accept Plan]. |
/coach |
useWeeklyPlanStore, useCoachChatStore |
Instant-UI-Stempel ("✓ Plan Applied") |
Überträgt proposal.data an Firestore weekly_plans. |
Wenn ein Netzwerkfehler auftritt, wird der Nutzer über eine Toast-Benachrichtigung informiert und die Schaltflächen bleiben aktiv, damit er es noch einmal versuchen kann. |
| Nachricht in Google Chat senden | /coach |
useCoachChatStore, useUserProfileStore |
Optimistisches Anhängen von Blasen + Coach Thinking Spinner | Ruft POST /api/coach/chat auf. Commits gaben memory_mutations zurück. |
Ersetzt den Ladekreis durch „Senden fehlgeschlagen. Zum Wiederholen tippen.“ angezeigt. |
| Chip für Ausrüstung ein-/ausschalten | /settings |
useUserProfileStore |
Sofortige Umschaltung (<16ms) |
Sendet Hintergrundschreibvorgang an Firestore user_profiles. |
Macht die Chipauswahl rückgängig und zeigt eine Toast-Fehlermeldung an, wenn der Schreibvorgang fehlschlägt. |
KI-Memory-Element „[🗑]“ löschen |
/settings |
useUserProfileStore |
Sofortiges Löschen (<16ms) |
Sendet die Löschmutation an Firestore user_profiles. |
Stellt ein gemerktes Element wieder her und benachrichtigt den Nutzer, wenn das Löschen fehlschlägt. |
6. End-to-End-User Journeys und Testmatrix in einfacher Sprache
- Suite 1: Anwendungsshell, Navigation und Routenverarbeitung (Tests 1.1–1.6: Weiterleitung beim Start im Stammverzeichnis, persistentes Dock, schnelle Rückkehr zur aktiven Sitzung, Fallback bei ungültigem Wochentag, Fallback bei unbekannter Route 404, Fallback bei ungültigem Deeplink für Training).
- Suite 2: Daily Workout View & Block Rendering (Tests 2.1–2.7: Dynamic day title resolution, specific day route & Button „Zurück“, single versus superset block treatment, empty day placeholder, completed workout stamp, pure navigation on center play button, modify with coach context attachment).
- Suite 3: Wochenplanansicht und Tagesplankarte (Tests 3.1–3.6: Darstellung der Wochenstatistiken, Filter nur für geplante Tage, visuelle Hervorhebung des heutigen Tages, Navigation auf der Tageskarte, Navigation zur Änderung der Woche, Darstellung der komprimierten Variante).
- Suite 4: Coach Chat und Staged Mutation (Tests 4.1–4.7: Rendern des Chatnachrichten-Streams, Anhängen und Schließen des Kontextbanners, Vorab-Ausfüllen von Prompt-Chips, Umschalten der Spracheingabe, Isolierung von Staged Mutation, Annahme und Commit von Vorschlägen, Vorschau und Commit von Vorschlägen für die wöchentliche Überarbeitung).
- Suite 5: Trainingsdetails und Enzyklopädie (Tests 5.1–5.5: Rendering von Trainingsdetails, automatische Wiedergabe in einer Schleife ohne Ton, Ein-/Aus-Button für Videopause, Tags für primäre und sekundäre Muskeln, Rückwärtsnavigation im Verlauf und Fallback).
- Suite 6: Aktiver Trainings-Tracker und Protokollierung (Tests 6.1–6.7: Nicht gestarteter Anfangszustand und manueller Start, Stoppuhr pausieren und fortsetzen, haptische Satzprotokollierung und Häkchen-Umschaltung, Superset-Schrittwechsel, Modal und Ersatz für Übungstausch, Bestätigung des Abschlusses und Serversynchronisierung, Wiederherstellung des Sitzungsstatus beim Neuladen).
- Suite 7: Fortschritt und Verlaufsanalysen (Tests 7.1–7.5: Rendern der Übersicht des Fortschritts-Dashboards, Anzeige des PR-Showcase-Banners, Umschalten des Zeitraums für Diagramme, leerer Verlauf, Tippen auf den Verlauf vergangener Trainingseinheiten).
- Suite 8: Nutzereinstellungen, Ausrüstung und KI-Memory (Tests 8.1–8.4: Rendern der Einstellungsansicht, Aktualisierung des Ausrüstungsschalters, Einheitenwechsel, Löschen von KI-Memory-Elementen).