אפליקציית כושר חכמה: מפרט ארכיטקטורת לקוח
Artifactזהו פריט המידע שמשמש בפרק 3: Give Your App a Brain ובפרק 4: The No-Code App Implementation Plan. אתם יכולים להשתמש במפרט הזה כחומר עזר לתצוגות של ממשק המשתמש, לרכיבים של ממשק המשתמש שאפשר לעשות בהם שימוש חוזר, לניהול מצב הלקוח ולמקרי בדיקה בשפה פשוטה.
כדי לגשת לפריט המידע הזה, צריך להיכנס לחשבון
כדי לראות ולהעתיק את קובץ ה-artifact המלא שמשמש בסדרת הסרטונים Build It!, צריך להיכנס לפרופיל המפתח ב-Google.
נדרש פרופיל מפַתח
אין לך אפשרות ליצור פרופיל מפתח. כדי להפעיל את התכונה הזו, צריך לפנות לאדמין ב-Workspace.
יצירת פרופיל מפתח
כדי לקבל גישה לכל ההנחיות והתוצרים של Build It!, צריך ליצור פרופיל מפתח ב-Google בחינם.
מצטרפים ל-Builder Central ומקבלים גישה
בלחיצה אחת אתם יכולים לקבל את תג מועדון החברים בחינם ב-Builder, ולקבל גישה לכל ההנחיות ופריטי המידע של Build It!.
סטטוס: מוכן לפגישת תכנון (הכנת טיוטה עם Client Planning Companion)
מסמך נלווה: מפרט ארכיטקטורת נתונים
יעד הארכיטקטורה: בנייה מחדש של ממשק המשתמש של אב הטיפוס של הכושר החכם ב-AI Studio, כך שיהיה נקי, מודולרי, קל לתחזוקה וניתן לבדיקה.
0. מערך טכני בסיסי ותקני הנדסה
- מסגרת זמן ריצה: Next.js (נתב אפליקציות, React 19) + אחסון נכסים לא מקוונים במטמון של Progressive Web App (PWA).
- ארכיטקטורת עיצוב: Tailwind CSS v4 + Tailwind Variants (לעיצוב רכיבים דטרמיניסטי) + Lucide React (סמלים).
- Client State Division:
- Zustand (סשן מקומי): מנהל את המצב הדינמי של האימון (
useActiveSessionStore), טיימרים של שעון עצר, מאגרי נתונים זמניים של סטים פעילים ורצפי שלבים שחושבו מראש. סונכרן עםlocalStorageלשחזור נעילת הטלפון. - TanStack Query (מצב שרת): מנהל את השמירה במטמון של מסמכי Firestore, את האימות מחדש ברקע ואת העדכונים האופטימיים של
weekly_plans,user_profiles,prsו-workout_logs.
- Zustand (סשן מקומי): מנהל את המצב הדינמי של האימון (
- המחשה באמצעות תרשימים: Recharts (עם עיצוב מותאם אישית של אסימונים למצב כהה של חדר כושר).
- אימות: אימות ב-Firebase עם כותרת אימות של טוקן למוכ"ז שמועברת לכל נקודות הקצה של השרת.
1. עקרונות העיצוב והפיתוח של ממשק המשתמש
- ארגונומיה שמתאימה לאימונים: עיצוב שמאפשר תפעול באמצעות מגע ביד אחת, גם באמצע האימון כשהידיים מזיעות. מטרות נדיבות להקשה (מינימום 48x48dp), קריאות בניגודיות גבוהה ומינימום הקלדה נדרשת.
- ממשק משתמש אופטימי ועמידות במצב אופליין: רישום סטים, הפעלת טיימרים למנוחה והחלפת תרגילים חייבים להגיב באופן מיידי (פחות מ-16 אלפיות השנייה) בממשק המשתמש. סנכרון ברקע מטפל בנתונים שנשמרים בשרת ב-
POST /api/workouts/logבלי לחסום את המשתמש. - הפרדה קפדנית של תחומי האחריות: רכיבים טיפשים/רכיבי תצוגה מקבלים נתונים ופולטים אירועים באמצעות מאפיינים. תצוגות של קונטיינרים חכמים מנהלות את הלוגיקה העסקית, את מאגרי המצבים ואת התיאום של ה-API.
- ממשק משתמש לשינויים בשלבים: הצעות שנוצרות על ידי ה-AI Coach (
POST /api/coach/chat) מוצגות ככרטיסי תצוגה מקדימה אינטראקטיביים בשלבים, עם פקדים מפורשים של [אישור התוכנית] ו[שינוי], לפני שהשינויים נשמרים במצב האפליקציה. - איכות מבוססת-התנהגות: כל דף, רכיב ואינטראקציה משויכים למקרי בדיקה באנגלית פשוטה שמגדירים באופן חד-משמעי את ההתנהגות הצפויה.
2. ניווט באפליקציה והיררכיית תצוגות
| נתיב המסלול | שם התצוגה המפורטת | המטרה העיקרית | הרכיבים העיקריים שכלולים |
|---|---|---|---|
/ |
הפניה אוטומטית ברמת הבסיס | הפניה מיידית אל /today. |
(הפניה אוטומטית של הנתב) |
/today |
תצוגה מקדימה של האימון של היום | תצוגת ברירת המחדל. התצוגה המקדימה של האימון היומי מתעדכנת באופן אוטומטי בהתאם ליום הנוכחי בשבוע. | <BackButton />, <WorkoutHeader />, <CoachNoteCard />, <WorkoutExerciseSummary />, <WorkoutBlock />, <ExerciseCard />, <EmptyDayPlaceholder />, <ModifyWithCoachCard /> |
/workouts/:day |
תצוגה מקדימה של האימון היומי | הצגת תצוגה מקדימה של אימון ליום ספציפי בשבוע (למשל, /workouts/monday, /workouts/thursday). |
<BackButton />, <WorkoutHeader />, <CoachNoteCard />, <WorkoutExerciseSummary />, <WorkoutBlock />, <ExerciseCard />, <EmptyDayPlaceholder />, <ModifyWithCoachCard /> |
/workout/active |
מעקב אחרי סשנים פעילים | מסך ביצוע אימון עם הרבה נתונים (סטים, חזרות, טיימר). סרגל הניווט התחתון נשאר גלוי. | <ActiveSessionStickyHeader />, <ActiveExerciseCardHeader />, <CoachTipCard />, <CurrentSetTargetCard />, <SetNavigationRow />, <ExerciseSetsTable />, <ActiveRestTimerDock />, <SessionExerciseOverview />, <ActiveSessionControlsDock />, <SwapExerciseModal />, <FinishConfirmationModal /> |
/week |
לוח זמנים לאימונים / תצוגת שבוע | סקירה כללית של לוח הזמנים המלא ל-7 ימים עם סיכומים שבועיים של נפח/זמן. | <WeekHeader />, <WeeklyStatsSummary />, <DayScheduleCardList />, <DayScheduleCard />, <ModifyWeekWithCoachCard /> |
/coach |
צ'אט עם AI Coach | אימון באמצעות שיחה עם צ'יפים לפי הקשר והצעות לאימון בשלבים. | <CoachHeader />, <ChatMessageList />, <ChatBubble />, <StagedProposalCard />, <ContextualPromptsBar />, <ChatInputDock />, <ContextBanner />, <ChatInputBar />, <SpeechToTextButton /> |
/progress |
התקדמות וניתוח נתונים | יומני אימונים היסטוריים, הישגי שיא אישיים ותרשימי נפח. | <ProgressHeader />, <PRShowcaseBanner />, <VolumeProgressChartCard />, <AllTimeStatsGrid />, <WorkoutHistorySection />, <HistorySessionCard />, <EmptyHistoryPlaceholder /> |
/settings |
פרופיל המשתמש והעדפות | פרופיל ציוד, התראות וניהול זיכרון ב-3 רמות. | <SettingsHeader />, <UserProfileCard />, <EquipmentSelectorCard />, <EquipmentToggleChip />, <PreferencesGroup />, <MemoryTierViewerCard />, <MemoryItemCard />, <AccountActionsGroup /> |
/exercises/:exerciseId |
פרטים באנציקלופדיית התרגילים | מדריך תרגילים עם קישורי עומק (למשל /exercises/incline-db-bench-press) עם טיפים לסרטונים ולטפסים. |
<BackButton />, <ExerciseVideoPlayer />, <TargetMusclesCard />, <HowToPerformCard />, <FormTipsCard /> |
3. מפרטים של דפים ותצוגות
תצוגה: DailyWorkoutView (/today ו-/workouts/:day)
- מטרה: הצגת תוכנית האימונים המתוזמנת ליום ספציפי – כולל מטרת האימון, משך הזמן, חלוקת עומס השרירים הרצויה, הערות המאמן, בלוקים של אימוני סט רגיל ובלוקים של אימוני סופר-סט – עם חלופה נקייה של מצב ריק כשאין אימון מתוזמן.
- Visual Anatomy:
- למעלה:
<BackButton label="Back to Week" targetRoute="/week" />. - כותרת: כותרת בשורה אחת (
"Today"או יום בשבוע) עם תג"✓ Completed"מותנה, משך זמן ("⏱ 50 min") ופסים שמציינים את אחוז עצימות האימון של שריר היעד. - הערה למאמן: כרטיס עצה לפי הקשר עם סמל וגבול בגוון ירוק.
- גוף: רשימה נגללת של בלוקים של תרגילים באמצעות
<WorkoutExerciseSummary />(סטים רגילים או סופר-סטים עם תגborder-left: 3px solid #a3e635ו-🔁 SUPERSET BLOCK). - מצב ריק:
<EmptyDayPlaceholder message="Nothing scheduled for this day" />. - הפעולה בכותרת התחתונה:
<ModifyWithCoachCard />(מפנה אל/coach?day=:day).
- למעלה:
תצוגה: WeekScheduleView (/week)
- המטרה: הצגת סקירה כללית של לוח הזמנים המלא של האימונים ל-7 ימים, כולל מדדים ברמה גבוהה של נפח/זמן שבועי, רשימה של ימי אימון פעילים (סינון קפדני של ימים לא מתוזמנים/ימי מנוחה) וקיצור דרך ישיר לשינוי התוכנית השבועית באמצעות AI Coach.
- מבנה ויזואלי:
<WeekHeader />,<WeeklyStatsSummary />עם 3 עמודות (זמן כולל, נפח כולל, תדירות), רשימה של ימים מתוזמנים באמצעות<DayScheduleCard variant="normal" />(עם תגTODAYבצבע ירוק ניאון ביום הנוכחי) ו-<ModifyWeekWithCoachCard />(מפנה אל/coach?context=week).
תצוגה: CoachChatView (/coach)
- המטרה: מרכז הדרכה בממשק שיחה עם סוכן ההדרכה של Gemini. נותן עצות אסטרטגיות ומעודדות לאימון, תומך בהכתבה באמצעות המרת דיבור לטקסט (STT) ומבצע התאמות לאימון בשלבים עם האדם שבתהליך, באמצעות אמצעי בקרה מפורשים לאישור.
- מבנה חזותי:
<CoachHeader />,<ChatMessageList />שניתן לגלול (<ChatBubble />ו-<StagedProposalCard />),<ContextualPromptsBar />מותנה ו-<ChatInputDock />מעוגן (<ContextBanner />עם[✕]סגירה +<ChatInputBar />+<SpeechToTextButton />).
תצוגה: ExerciseDetailView (/exercises/:exerciseId)
- המטרה: ערך אנציקלופדי עם קישורי עומק שמציג סרטון הדגמה מושתק בלופ אוטומטי (
<ExerciseVideoPlayer />), תגים של שרירי המטרה הראשיים לעומת המשניים (<TargetMusclesCard />), הוראות ביצוע מסודרות שלב אחר שלב (<HowToPerformCard />) וטיפים לגבי צורת הביצוע (<FormTipsCard />).
תצוגה: ActiveWorkoutView (/workout/active)
- מטרה: מסך לביצוע אימון ולתיעוד סטים. מנהל את מצב שעון העצר של הסשן הפעיל, את יעדי הסט הנוכחיים, את קלט החזרות/המשקל, את סימן ה-וי המיידי (<16ms), את החלפת אימון הסופר-סט האוטומטית, את הספירה לאחור של טיימר המנוחה עם משוב פיזי/אודיו, את החלפת התרגילים ואת השמירה הסופית ב-
POST /api/workouts/log. - מבנה חזותי:
<ActiveSessionStickyHeader />,<ActiveExerciseCardHeader />,<CoachTipCard />,<CurrentSetTargetCard />,<ActiveRestTimerDock />צף (+30s,Skip),<SetNavigationRow />,<ExerciseSetsTable />(+ Add Set),<SessionExerciseOverview />,<ActiveSessionControlsDock />מעוגן ([⇄ SWAP EXERCISE]+[▶ START WORKOUT]/[⏸ PAUSE]/[▶ RESUME]),<SwapExerciseModal />ו-<FinishConfirmationModal />.
תצוגה: ProgressView (/progress)
- מטרה: מעקב אחר ההתקדמות בספורט לאורך זמן, ציון שיאים אישיים (
<PRShowcaseBanner />), הצגת מגמות של נפח שבועי/חודשי באמצעות Recharts אינטראקטיביים (<VolumeProgressChartCard />עם מתגי4W | 3M | 1Y), הצגת<AllTimeStatsGrid />וארכוב של אימונים קודמים שהושלמו (<WorkoutHistorySection />/<HistorySessionCard />).
תצוגה: SettingsView (/settings)
- מטרה: ניהול פרטי הפרופיל של הספורטאי (
<UserProfileCard />), מלאי הציוד (<EquipmentSelectorCard />/<EquipmentToggleChip />), העדפות האימון (<PreferencesGroup />עבורLBS / KG, משוב פיזי, צליל), וניהול שקוף של המשתמשים ומחיקת הזיכרון הדינמי ב-3 רמות של מאמן ה-AI (<MemoryTierViewerCard />/<MemoryItemCard />).
4. קטלוג וממשקים של רכיבים לשימוש חוזר
החוזים העיקריים של מאפייני רכיבי TypeScript באפליקציה:
// 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. מטריצה של ניהול מצב הלקוח וזרימת הנתונים
5.1 מדיניות בנושא זמן אחזור וטעינה: מנוע בשתי מהירויות
- ממשק משתמש אופטימי לאימון בחדר כושר (פחות מ-16 אלפיות השנייה): פעולות שקשורות לאימון בחדר כושר – סימון סטים, הוספת משקולות או חזרות, מעבר בין כרטיסיות והחלפת ציוד – מעדכנות את המצב המקומי ומוצגות מחדש תוך 16 אלפיות השנייה. המשתמשים אף פעם לא נחסמים על ידי אינדיקטורים של טעינה בזמן שהם מחזיקים משקולות.
- סמלי טעינה ואינדיקטורים ברורים לפעולות אסינכרוניות:
- שיחות עם AI Coach (
POST /api/coach/chat): כששולחים הודעת צ'אט, מיד מופיעה בועת חשיבה מונפשת של המאמן בשיחה עד ש-Gemini מחזיר תשובה או הצעה לאימון. - הפעלה קרה ראשונית וסנכרון רשת: במכלי התצוגה מופיעים סמלי טעינה של שלד וסמלי טעינה מסתובבים בניגודיות גבוהה בזמן אחזור של
weekly_plansאוhistorical_workouts. - Workout Submission (
[Finish]): המודל של אישור הסיום מציג ספינר טעינה פעיל בזמן שהמטען הייעודי (payload) של הסשן נשלח אלPOST /api/workouts/logב-Cloud Firestore.
- שיחות עם AI Coach (
5.2 ארכיטקטורת החנות של הלקוח וגבולות הדומיין
| שכבת החנות | דומיין המדינה ומאפייני מפתח | מדיניות שמירה במטמון ונתונים קבועים | חוזה מתואם בקצה העורפי |
|---|---|---|---|
useActiveSessionStore (Zustand) |
sessionState (unstarted, running, paused), elapsedSeconds, currentStepIndex, steps: WorkoutStep[], loggedExercises. |
הנתונים מסונכרנים עם localStorage בכל שנייה, כדי שתוכלו לשחזר אותם בקלות אם הטלפון ננעל או אם אתם מרעננים את הדף. |
שליחת המטען הייעודי (payload) שהושלם אל POST /api/workouts/log. |
useWeeklyPlanQuery (TanStack Query) |
לוח הזמנים הנוכחי ל-7 ימים, אובייקטים של אימונים יומיים, בלוקים של אימוני סופר-סט, סטטוסים של השלמה (scheduled, completed). |
נשמר במטמון ב-TanStack Query (staleTime: 5 min); נשלף מראש בהפעלה. |
ההתחייבות מתבצעת כשהמשתמש לוחץ על [Accept Plan] כדי לקבל הצעות מ-POST /api/coach/chat. |
useCoachChatStore (Zustand + TanStack) |
בועות של הודעות בסדר כרונולוגי, activeContext, הצעות לפרומפט, isCoachTyping: boolean, הצעות בשלבים. |
מסונכרן עם קטגוריית הצ'אט השבועית של Firestore באמצעות מינוי בזמן אמת (onSnapshot). |
שולח שאילתות אל POST /api/coach/chat. |
useProgressQuery (TanStack Query) |
ארכיון אימונים קודמים, לוח שיאים אישיים (/users/{userId}/prs), סיכום נפח האימונים לאורך זמן, מסנן מסגרת זמן (4W, 3M, 1Y). |
נשמר במטמון ב-TanStack Query (staleTime: 10 min). |
הנתונים מתעדכנים מיד בסיום האימון. |
useUserProfileStore (TanStack Query) |
מלאי ציוד, יחידות (LBS/KG), מתגי צליל/מגע, זיכרון חי בשלוש רמות (מצרכים בסיסיים, פיזיולוגי, מצבי). |
נשמר במטמון ב-TanStack Query עם סנכרון דו-כיווני ל-Firestore user_profiles. |
העדכון בוצע באופן אוטונומי באמצעות memory_mutations מ-POST /api/coach/chat. |
useExerciseLibraryQuery (TanStack Query) |
ערכים סטטיים באנציקלופדיה, כתובות URL של סרטונים, שרירים ראשיים/משניים, שלבים, טיפים לגבי טכניקה. | Aggressive cache-first with infinite TTL (staleTime: Infinity). |
קריאה בלבד מאוסף exercises ב-Firestore שלא ניתן לשינוי. |
5.3 תרשים שלבים של סשן פעיל שחושב מראש
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 מטריצת מוטציות וזרימת נתונים מקצה לקצה
| טריגר של משתמש | התצוגה המקורית | מאגר הלקוחות השתנה | זמן אחזור של ממשק המשתמש / מצב טעינה | תיאום בק-אנד | חזרה למצב קודם / טיפול בשגיאות |
|---|---|---|---|---|---|
לוחצים על [✓] "השלמת הסט". |
/workout/active |
useActiveSessionStore |
<16ms (אופטימי) |
מאגר הנתונים הזמני של הסשן המקומי עודכן, אין המתנה לרשת. | כתיבה בזיכרון המקומי עם שמירה מקומית אמינה. |
לוחצים על [Finish Workout]. |
/workout/active |
useActiveSessionStore, useWeeklyPlanStore, useProgressStore |
בזמן הסנכרון, מוצג בכפתור סמל של טעינה | שליחה אל POST /api/workouts/log. היום של Firestore מסומן בתור completed. |
אם אין חיבור לאינטרנט, המערכת מוסיפה את המטען הייעודי (payload) לתור במאגר נתונים זמני (buffer) מקומי לסנכרון, ומנסה שוב כשהחיבור מתחדש. |
לוחצים על [Accept Plan]. |
/coach |
useWeeklyPlanStore, useCoachChatStore |
חותמת ממשק משתמש מיידית ("✓ Plan Applied") |
שומר את proposal.data ב-Firestore weekly_plans. |
אם החיבור לרשת נכשל, המשתמש מקבל התראה קצרה והלחצנים נשארים פעילים כדי לנסות שוב. |
| שליחת הודעה ב-Chat | /coach |
useCoachChatStore, useUserProfileStore |
הוספת בועה אופטימית + ספינר חשיבה של המאמן | מתקשרים אל POST /api/coach/chat. השמירות החזירו את הערך memory_mutations. |
הספינר מוחלף בטקסט "השליחה נכשלה. יש ללחוץ כדי לנסות שוב." |
| החלפת המצב של צ'יפ הציוד | /settings |
useUserProfileStore |
מתג מיידי (<16ms) |
שליחת כתיבה ברקע אל Firestore user_profiles. |
אם הכתיבה נכשלת, המערכת מבטלת את בחירת הצ'יפ ומציגה הודעה קצרה על השגיאה. |
מחיקת פריט מהזיכרון של ה-AI [🗑] |
/settings |
useUserProfileStore |
מחיקה מיידית (<16ms) |
שליחת מוטציית מחיקה אל Firestore user_profiles. |
משחזר פריט בזיכרון ומתריע למשתמש אם המחיקה נכשלת. |
6. התהליכים שעוברים המשתמשים מקצה לקצה ומטריצת בדיקה בשפה פשוטה
- חבילה 1: מעטפת האפליקציה, ניווט וטיפול בנתיבים (בדיקות 1.1 עד 1.6: הפניה אוטומטית בהפעלה מהשורש, עגינה קבועה, חזרה מהירה לסשן פעיל, חזרה למצב קודם במקרה של יום לא חוקי בשבוע, חזרה למצב קודם במקרה של נתיב 404 לא ידוע, חזרה למצב קודם במקרה של קישור עומק לא חוקי לתרגיל).
- חבילה 2: תצוגת אימון יומי ועיבוד בלוקים (בדיקות 2.1-2.7: רזולוציה דינמית של כותרת היום, מסלול יום ספציפי וכפתור "הקודם ", טיפול בבלוקים של אימון יחיד לעומת אימון סופר-סט, פלייסהולדר ליום ריק, חותמת אימון שהושלם, ניווט טהור בכפתור ההפעלה המרכזי, שינוי עם צירוף הקשר של מאמן).
- חבילה 3: תצוגת לוח זמנים שבועי וכרטיס לוח זמנים יומי (בדיקות 3.1-3.6: עיבוד נתונים סטטיסטיים שבועיים, סינון ימים מתוזמנים בלבד, הסבר חזותי להיום, ניווט בכרטיס יומי, שינוי ניווט שבועי, עיבוד גרסה דחוסה).
- חבילה 4: צ'אט עם מאמן ושינוי בשלבים (בדיקות 4.1 עד 4.7: עיבוד של סטרימינג של הודעות צ'אט, צירוף וסגירה של באנר הקשר, אכלוס שדות מראש של הצעה לפרומפט, החלפת מצב של הכתבה קולית, בידוד של שינוי בשלבים, קבלה ושמירה של הצעה, תצוגה מקדימה ושמירה של הצעה לשינוי שבועי).
- חבילה 5: פרטי תרגילים ואנציקלופדיה (בדיקות 5.1 עד 5.5: עיבוד פרטי תרגילים, הפעלה אוטומטית בלופ במצב מושתק, החלפת מצב השהיית סרטון, תגי שרירים ראשיים לעומת משניים, ניווט לאחור בהיסטוריה וחלופה).
- חבילה 6: מעקב פעיל אחר אימונים ורישום ביומן (בדיקות 6.1-6.7: מצב ראשוני שלא הופעל והפעלה ידנית, השהיה והמשך של שעון העצר, רישום ביומן של סטים באמצעות מגע והחלפת מצב של סימן וי, החלפת שלבים באימון סופר-סט, מודל החלפת תרגילים והחלפה, אישור סיום וסנכרון עם השרת, שחזור מצב הסשן בטעינה מחדש).
- חבילה 7: ניתוח היסטורי והתקדמות (בדיקות 7.1-7.5: רינדור סקירה כללית של לוח הבקרה של ההתקדמות, הצגת באנר של שיא אישי, החלפת מסגרת הזמן של התרשים, מצב היסטוריה ריקה, לחיצה על היסטוריית אימונים קודמים).
- חבילה 8: הגדרות משתמש, ציוד וזיכרון AI (בדיקות 8.1-8.4: עיבוד תצוגת הגדרות, עדכון החלפת ציוד, החלפת יחידות, מחיקת פריט זיכרון AI).