Ứng dụng theo dõi thể chất thông minh: Thông số kỹ thuật về cấu trúc ứng dụng
Tạo tácĐây là cấu phần phần mềm được dùng trong Tập 3: Thêm trí tuệ cho ứng dụng và Tập 4: Kế hoạch triển khai ứng dụng không cần mã. Bạn có thể sử dụng thông số kỹ thuật này làm tài liệu tham khảo cho các thành phần hiển thị giao diện người dùng, thành phần giao diện người dùng có thể sử dụng lại, quản lý trạng thái ứng dụng và các trường hợp kiểm thử bằng tiếng Anh đơn giản.
Đăng nhập để truy cập vào dữ liệu này
Đăng nhập bằng Hồ sơ nhà phát triển của Google để xem và sao chép toàn bộ cấu phần phần mềm được dùng trong loạt bài Build It! (Xây dựng).
Bắt buộc phải có Hồ sơ nhà phát triển
Bạn không đủ điều kiện để tạo hồ sơ nhà phát triển. Hãy thông báo cho quản trị viên Workspace của bạn để bật tính năng này.
Tạo hồ sơ nhà phát triển
Tạo Hồ sơ nhà phát triển của Google miễn phí để sử dụng tất cả câu lệnh và cấu phần phần mềm của Build It!
Tham gia Builder Central để mở khoá
Chỉ cần một cú nhấp chuột là bạn có thể nhận huy hiệu hội viên Builder miễn phí để mở khoá tất cả câu lệnh và dữ liệu của Build It!
Trạng thái: Sẵn sàng cho phiên lập kế hoạch (Đang soạn thảo với Trợ lý lập kế hoạch cho khách hàng)
Tài liệu đi kèm: Thông số kỹ thuật về cấu trúc dữ liệu
Mục tiêu về cấu trúc: Xây dựng lại giao diện người dùng sạch sẽ, dễ bảo trì, theo mô-đun và có thể kiểm thử cho nguyên mẫu thể dục thông minh của AI Studio.
0. Ngăn xếp kỹ thuật cốt lõi và tiêu chuẩn kỹ thuật
- Khung thời gian chạy: Next.js (Bộ định tuyến ứng dụng, React 19) + Lưu tài sản ngoại tuyến vào bộ nhớ đệm của Ứng dụng web tiến bộ (PWA).
- Kiến trúc tạo kiểu: Tailwind CSS phiên bản 4 + Biến thể Tailwind (để tạo kiểu thành phần tất định) + Lucide React (biểu tượng).
- Client State Division:
- Zustand (Phiên cục bộ): Quản lý trạng thái không ổn định của phòng tập (
useActiveSessionStore), đồng hồ bấm giờ, vùng đệm của hiệp tập đang hoạt động và trình tự bước được tính toán trước. Đã đồng bộ hoá vớilocalStorageđể khôi phục khi điện thoại bị khoá. - TanStack Query (Trạng thái máy chủ): Quản lý việc lưu tài liệu Firestore vào bộ nhớ đệm, xác thực lại trong nền và cập nhật lạc quan cho
weekly_plans,user_profiles,prsvàworkout_logs.
- Zustand (Phiên cục bộ): Quản lý trạng thái không ổn định của phòng tập (
- Trực quan hoá biểu đồ: Recharts (được tạo kiểu bằng mã thông báo chế độ tối tuỳ chỉnh cho phòng tập).
- Xác thực: Xác thực Firebase bằng tiêu đề xác thực mã thông báo truy cập được chuyển đến tất cả các điểm cuối của máy chủ.
1. Nguyên tắc thiết kế và nguyên lý giao diện người dùng
- Thiết kế công thái học ưu tiên cho việc tập luyện: Thiết kế xúc giác, dễ dàng thao tác bằng một tay ngay cả khi tay ra mồ hôi trong lúc tập luyện. Đích chạm lớn (tối thiểu 48x48dp), độ tương phản cao dễ đọc và yêu cầu nhập liệu tối thiểu.
- Giao diện người dùng lạc quan và khả năng thích ứng khi không có mạng: Giao diện người dùng phải phản hồi ngay lập tức (<16 mili giây) khi ghi nhật ký các hiệp, bắt đầu đồng hồ hẹn giờ nghỉ và đổi bài tập. Tính năng đồng bộ hoá trong nền xử lý việc lưu trữ dữ liệu trên máy chủ cho
POST /api/workouts/logmà không chặn người dùng. - Tách biệt nghiêm ngặt các mối quan ngại: Các thành phần trình bày/thụ động nhận dữ liệu và phát ra sự kiện bằng cách sử dụng thuộc tính; các thành phần hiển thị vùng chứa thông minh quản lý logic kinh doanh, kho lưu trữ trạng thái và điều phối API.
- Trải nghiệm người dùng về thay đổi theo giai đoạn: Các đề xuất do Huấn luyện viên AI (
POST /api/coach/chat) tạo sẽ hiển thị dưới dạng thẻ xem trước theo giai đoạn có tính tương tác, kèm theo các nút điều khiển rõ ràng là [Chấp nhận kế hoạch] và [Sửa đổi] trước khi áp dụng các thay đổi cho trạng thái ứng dụng. - Chất lượng dựa trên hành vi: Mỗi trang, thành phần và hoạt động tương tác đều được ghép nối với các trường hợp kiểm thử bằng tiếng Anh đơn giản, xác định rõ ràng hành vi dự kiến.
2. Điều hướng trong ứng dụng và hệ phân cấp view
| Đường dẫn tuyến đường | Tên chế độ xem | Mục đích chính | Các thành phần chính có trong sản phẩm |
|---|---|---|---|
/ |
Chuyển hướng gốc | Chuyển hướng tức thì đến /today. |
(Chuyển hướng bộ định tuyến) |
/today |
Xem trước bài tập hôm nay | Chế độ xem mặc định. Tự động phân giải thành ngày hiện tại trong tuần và hiển thị bản xem trước bài tập của ngày hôm nay. | <BackButton />, <WorkoutHeader />, <CoachNoteCard />, <WorkoutExerciseSummary />, <WorkoutBlock />, <ExerciseCard />, <EmptyDayPlaceholder />, <ModifyWithCoachCard /> |
/workouts/:day |
Bản xem trước bài tập hằng ngày | Hiển thị bản xem trước bài tập thể dục cho một ngày cụ thể trong tuần (ví dụ: /workouts/monday, /workouts/thursday). |
<BackButton />, <WorkoutHeader />, <CoachNoteCard />, <WorkoutExerciseSummary />, <WorkoutBlock />, <ExerciseCard />, <EmptyDayPlaceholder />, <ModifyWithCoachCard /> |
/workout/active |
Trình theo dõi phiên hoạt động | Màn hình thực hiện bài tập có mức độ rủi ro cao (hiệp, số lần lặp lại, đồng hồ hẹn giờ). Thanh điều hướng dưới cùng vẫn hiển thị. | <ActiveSessionStickyHeader />, <ActiveExerciseCardHeader />, <CoachTipCard />, <CurrentSetTargetCard />, <SetNavigationRow />, <ExerciseSetsTable />, <ActiveRestTimerDock />, <SessionExerciseOverview />, <ActiveSessionControlsDock />, <SwapExerciseModal />, <FinishConfirmationModal /> |
/week |
Lịch đào tạo/Chế độ xem theo tuần | Tổng quan về lịch biểu đầy đủ trong 7 ngày với tổng số lượng/thời gian hằng tuần. | <WeekHeader />, <WeeklyStatsSummary />, <DayScheduleCardList />, <DayScheduleCard />, <ModifyWeekWithCoachCard /> |
/coach |
Trò chuyện với huấn luyện viên AI | Hướng dẫn trò chuyện bằng các khối bối cảnh và đề xuất bài tập theo giai đoạn. | <CoachHeader />, <ChatMessageList />, <ChatBubble />, <StagedProposalCard />, <ContextualPromptsBar />, <ChatInputDock />, <ContextBanner />, <ChatInputBar />, <SpeechToTextButton /> |
/progress |
Tiến trình và số liệu phân tích | Nhật ký tập luyện trước đây, thành tích cá nhân và biểu đồ khối lượng tập luyện. | <ProgressHeader />, <PRShowcaseBanner />, <VolumeProgressChartCard />, <AllTimeStatsGrid />, <WorkoutHistorySection />, <HistorySessionCard />, <EmptyHistoryPlaceholder /> |
/settings |
Hồ sơ người dùng và lựa chọn ưu tiên | Hồ sơ thiết bị, thông báo và quản lý bộ nhớ 3 tầng. | <SettingsHeader />, <UserProfileCard />, <EquipmentSelectorCard />, <EquipmentToggleChip />, <PreferencesGroup />, <MemoryTierViewerCard />, <MemoryItemCard />, <AccountActionsGroup /> |
/exercises/:exerciseId |
Chi tiết về bách khoa toàn thư về bài tập thể dục | Hướng dẫn tập thể dục có thể liên kết sâu (ví dụ: /exercises/incline-db-bench-press) kèm theo video và mẹo về tư thế. |
<BackButton />, <ExerciseVideoPlayer />, <TargetMusclesCard />, <HowToPerformCard />, <FormTipsCard /> |
3. Thông số kỹ thuật của trang và chế độ xem
Xem: DailyWorkoutView (/today và /workouts/:day)
- Mục đích: Hiển thị chế độ tập luyện theo lịch cho một ngày cụ thể (bao gồm trọng tâm bài tập, thời lượng, mức phân bổ tải cơ mục tiêu, ghi chú của huấn luyện viên, các khối hiệp thẳng và các khối superset) với trạng thái dự phòng trống khi không có lịch tập luyện.
- Giải phẫu trực quan:
- Trên cùng:
<BackButton label="Back to Week" targetRoute="/week" />. - Tiêu đề: Tiêu đề một dòng (
"Today"hoặc ngày trong tuần) có huy hiệu"✓ Completed"có điều kiện, thanh thời lượng ("⏱ 50 min") và thanh tỷ lệ phần trăm cường độ cơ mục tiêu. - Ghi chú của huấn luyện viên: Thẻ lời khuyên theo bối cảnh có biểu tượng và đường viền màu xanh lục.
- Nội dung: Danh sách có thể cuộn gồm các khối bài tập sử dụng
<WorkoutExerciseSummary />(bài tập thẳng hoặc superset có huy hiệuborder-left: 3px solid #a3e635và🔁 SUPERSET BLOCK). - Trạng thái trống:
<EmptyDayPlaceholder message="Nothing scheduled for this day" />. - Thao tác ở chân trang dưới cùng:
<ModifyWithCoachCard />(chuyển đến/coach?day=:day).
- Trên cùng:
Xem: WeekScheduleView (/week)
- Mục đích: Hiển thị thông tin tổng quan về lịch tập luyện đầy đủ trong 7 ngày, bao gồm các chỉ số cấp cao về khối lượng/thời gian hằng tuần, danh sách chọn lọc các ngày tập luyện tích cực (lọc nghiêm ngặt các ngày không theo lịch/ngày nghỉ) và lối tắt trực tiếp để điều chỉnh kế hoạch hằng tuần bằng Huấn luyện viên AI.
- Cấu trúc trực quan:
<WeekHeader />,<WeeklyStatsSummary />3 cột (Tổng thời gian, Tổng khối lượng, Tần suất), danh sách các ngày đã lên lịch bằng<DayScheduleCard variant="normal" />(có huy hiệuTODAYmàu xanh lục neon vào ngày hiện tại) và<ModifyWeekWithCoachCard />(định tuyến đến/coach?context=week).
Xem: CoachChatView (/coach)
- Mục đích: Trung tâm huấn luyện đàm thoại với tác nhân huấn luyện viên Gemini. Đưa ra lời khuyên về việc tập luyện mang tính chiến lược và tạo động lực, hỗ trợ tính năng đọc chính tả chuyển lời nói thành văn bản và điều chỉnh bài tập theo giai đoạn có sự tham gia của con người bằng các chế độ kiểm soát chấp nhận rõ ràng.
- Cấu trúc trực quan:
<CoachHeader />,<ChatMessageList />có thể cuộn (<ChatBubble />và<StagedProposalCard />),<ContextualPromptsBar />có điều kiện và<ChatInputDock />được neo (<ContextBanner />có nút đóng[✕]+<ChatInputBar />+<SpeechToTextButton />).
Xem: ExerciseDetailView (/exercises/:exerciseId)
- Mục đích: Mục bách khoa toàn thư có thể liên kết sâu, cung cấp video minh hoạ tự động lặp lại và tắt tiếng (
<ExerciseVideoPlayer />), huy hiệu cơ mục tiêu chính và phụ (<TargetMusclesCard />), hướng dẫn thực hiện từng bước theo thứ tự (<HowToPerformCard />) và mẹo về tư thế (<FormTipsCard />).
Xem: ActiveWorkoutView (/workout/active)
- Mục đích: Màn hình ghi nhật ký và thực hiện bài tập có mức độ rủi ro cao. Quản lý trạng thái đồng hồ bấm giờ của phiên tập trực tiếp, mục tiêu hiện tại của hiệp tập, dữ liệu đầu vào về số lần lặp lại/trọng lượng, hoàn thành dấu kiểm tức thì (<16 mili giây), tự động thay thế superset, đếm ngược đồng hồ hẹn giờ nghỉ bằng phản hồi xúc giác/âm thanh, hoán đổi bài tập và lưu trữ dữ liệu cuối cùng vào
POST /api/workouts/log. - Cấu trúc hình ảnh:
<ActiveSessionStickyHeader />,<ActiveExerciseCardHeader />,<CoachTipCard />,<CurrentSetTargetCard />,<ActiveRestTimerDock />nổi (+30s,Skip),<SetNavigationRow />,<ExerciseSetsTable />(+ Add Set),<SessionExerciseOverview />,<ActiveSessionControlsDock />được neo ([⇄ SWAP EXERCISE]+[▶ START WORKOUT]/[⏸ PAUSE]/[▶ RESUME]),<SwapExerciseModal />và<FinishConfirmationModal />.
Xem: ProgressView (/progress)
- Mục đích: Theo dõi tiến trình tập luyện thể thao theo thời gian, tôn vinh Kỷ lục cá nhân (
<PRShowcaseBanner />) gần đây, trực quan hoá xu hướng khối lượng hằng tuần/hằng tháng bằng Recharts tương tác (<VolumeProgressChartCard />có nút bật/tắt4W | 3M | 1Y), hiển thị<AllTimeStatsGrid />và lưu trữ các buổi tập đã hoàn thành trước đây (<WorkoutHistorySection />/<HistorySessionCard />).
Xem: SettingsView (/settings)
- Mục đích: Quản lý thông tin hồ sơ của vận động viên (
<UserProfileCard />), kho thiết bị (<EquipmentSelectorCard />/<EquipmentToggleChip />), lựa chọn ưu tiên về bài tập thể dục (<PreferencesGroup />choLBS / KG, phản hồi xúc giác, âm thanh) và cung cấp tính năng quản lý người dùng minh bạch cũng như xoá Bộ nhớ động 3 cấp của huấn luyện viên AI (<MemoryTierViewerCard />/<MemoryItemCard />).
4. Danh mục và giao diện thành phần có thể tái sử dụng
Các hợp đồng thuộc tính thành phần TypeScript chính trong ứng dụng:
// 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. Quản lý trạng thái ứng dụng và ma trận luồng dữ liệu
5.1 Chính sách về độ trễ và tốc độ tải: Công cụ hai tốc độ
- Giao diện người dùng lạc quan cho phòng tập (<16 mili giây): Các thao tác chạm trong phòng tập (đánh dấu hoàn thành hiệp tập, tăng trọng lượng/số lần lặp lại, chuyển đổi thẻ và bật/tắt thiết bị) sẽ cập nhật trạng thái cục bộ và kết xuất lại trong vòng 16 mili giây. Người dùng không bao giờ bị chỉ báo tải chặn khi đang giữ trọng số.
- Chỉ báo và vòng quay tải rõ ràng cho các thao tác không đồng bộ:
- Cuộc trò chuyện với huấn luyện viên AI (
POST /api/coach/chat): Khi bạn gửi tin nhắn trò chuyện, một bong bóng hình tròn xoay động cho biết huấn luyện viên đang suy nghĩ sẽ xuất hiện ngay lập tức trong luồng trò chuyện cho đến khi Gemini đưa ra câu trả lời hoặc đề xuất bài tập. - Khởi động nguội ban đầu và đồng bộ hoá mạng: Vùng chứa khung hiển thị cho thấy trình tải khung và vòng quay tải có độ tương phản cao trong khi tìm nạp
weekly_planshoặchistorical_workouts. - Gửi thông tin về buổi tập (
[Finish]): Phương thức xác nhận hoàn tất sẽ hiển thị một vòng quay tải đang hoạt động trong khi tải trọng của phiên được cam kết vớiPOST /api/workouts/logtrong Cloud Firestore.
- Cuộc trò chuyện với huấn luyện viên AI (
5.2 Kiến trúc kho lưu trữ của ứng dụng và ranh giới miền
| Lớp cửa hàng | Miền trạng thái và thuộc tính chính | Chính sách về bộ nhớ đệm và tính bền vững | Hợp đồng phụ trợ phối hợp |
|---|---|---|---|
useActiveSessionStore (Zustand) |
sessionState (unstarted, running, paused), elapsedSeconds, currentStepIndex, steps: WorkoutStep[], loggedExercises. |
Đồng bộ hoá với localStorage mỗi giây để khôi phục trạng thái khoá/làm mới điện thoại một cách an toàn. |
Gửi tải trọng đã hoàn tất đến POST /api/workouts/log. |
useWeeklyPlanQuery (TanStack Query) |
Lịch tập 7 ngày hiện tại, đối tượng bài tập trong ngày, khối superset, trạng thái hoàn thành (scheduled, completed). |
Được lưu vào bộ nhớ đệm trong TanStack Query (staleTime: 5 min); được tìm nạp trước khi khởi chạy. |
Đã cam kết khi người dùng nhấn vào [Accept Plan] cho các đề xuất từ POST /api/coach/chat. |
useCoachChatStore (Zustand + TanStack) |
Bong bóng tin nhắn theo trình tự thời gian, activeContext, khối câu lệnh, isCoachTyping: boolean, đề xuất theo giai đoạn. |
Đã đồng bộ hoá với bộ chứa cuộc trò chuyện hằng tuần của Firestore bằng gói thuê bao theo thời gian thực (onSnapshot). |
Gửi truy vấn đến POST /api/coach/chat. |
useProgressQuery (TanStack Query) |
Lưu trữ nhật ký tập luyện, bảng kỷ lục cá nhân (/users/{userId}/prs), tổng hợp khối lượng tập luyện từ trước đến nay, bộ lọc khung thời gian (4W, 3M, 1Y). |
Đã lưu vào bộ nhớ đệm trong TanStack Query (staleTime: 10 min). |
Cập nhật ngay sau khi hoàn tất một buổi tập thể dục. |
useUserProfileStore (TanStack Query) |
Kho trang bị, đơn vị (LBS/KG), nút bật/tắt âm thanh/phản hồi xúc giác, bộ nhớ sống 3 tầng (Nhu yếu phẩm, Sinh lý, Tình huống). |
Được lưu vào bộ nhớ đệm trong TanStack Query với tính năng đồng bộ hoá hai chiều với Firestore user_profiles. |
Tự động cập nhật bằng memory_mutations từ POST /api/coach/chat. |
useExerciseLibraryQuery (TanStack Query) |
Mục bách khoa toàn thư tĩnh, URL video, cơ chính/cơ phụ, các bước, mẹo về tư thế. | Ưu tiên bộ nhớ đệm ở mức cao với TTL vô hạn (staleTime: Infinity). |
Chỉ đọc từ tập hợp exercises không thể thay đổi của Firestore. |
5.3 Biểu đồ bước phiên hoạt động được tính toán trước
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 Luồng dữ liệu toàn diện và ma trận đột biến
| Điều kiện kích hoạt người dùng | Chế độ xem gốc | Client Store Mutated | Độ trễ giao diện người dùng/Trạng thái tải | Điều phối phần phụ trợ | Khôi phục/Xử lý lỗi |
|---|---|---|---|---|---|
Nhấn vào [✓] Hoàn tất bộ |
/workout/active |
useActiveSessionStore |
<16ms (Lạc quan) |
Bộ đệm phiên cục bộ đã được cập nhật; không cần chờ mạng. | Ghi vào bộ nhớ cục bộ bằng tính năng lưu trữ cục bộ đáng tin cậy. |
Nhấn vào biểu tượng [Finish Workout] |
/workout/active |
useActiveSessionStore, useWeeklyPlanStore, useProgressStore |
Nút hiển thị vòng quay cho biết đang tải trong khi đồng bộ hoá | Gửi đến POST /api/workouts/log. Đánh dấu ngày Firestore là completed. |
Nếu không có mạng, hãy đưa tải trọng vào hàng đợi trong vùng đệm đồng bộ hoá cục bộ và thử lại khi kết nối lại. |
Nhấn vào biểu tượng [Accept Plan] |
/coach |
useWeeklyPlanStore, useCoachChatStore |
Dấu giao diện người dùng tức thì ("✓ Plan Applied") |
Cam kết proposal.data với Firestore weekly_plans. |
Nếu mạng không hoạt động, thông báo ngắn sẽ cảnh báo người dùng và các nút vẫn hoạt động để thử lại. |
| Gửi tin nhắn trong Chat | /coach |
useCoachChatStore, useUserProfileStore |
Thêm bong bóng lạc quan + Biểu tượng vòng quay cho biết huấn luyện viên đang suy nghĩ | Cuộc gọi POST /api/coach/chat. Số lượng thay đổi được trả về: memory_mutations. |
Thay thế biểu tượng vòng quay bằng thông báo "Không gửi được. Nhấn để thử lại". |
| Khối bật/tắt thiết bị | /settings |
useUserProfileStore |
Nút bật/tắt tức thì (<16ms) |
Gửi lệnh ghi trong nền đến Firestore user_profiles. |
Huỷ bỏ lựa chọn khối và hiển thị thông báo ngắn về lỗi nếu không ghi được. |
Xoá mục trong bộ nhớ AI [🗑] |
/settings |
useUserProfileStore |
Xoá ngay lập tức (<16ms) |
Gửi đột biến xoá đến Firestore user_profiles. |
Khôi phục mục trong bộ nhớ và thông báo cho người dùng nếu không xoá được. |
6. Hành trình của người dùng toàn diện và ma trận thử nghiệm bằng tiếng Anh đơn giản
- Bộ 1: Giao diện ứng dụng, điều hướng và xử lý tuyến đường (Kiểm thử 1.1–1.6: Chuyển hướng khởi chạy gốc, thanh công cụ cố định, quay lại nhanh phiên hoạt động, dự phòng ngày trong tuần không hợp lệ, dự phòng tuyến đường 404 không xác định, dự phòng đường liên kết sâu bài tập không hợp lệ).
- Bộ 2: Chế độ xem bài tập hằng ngày và kết xuất khối (Bài kiểm tra 2.1 – 2.7: Độ phân giải tiêu đề ngày động, tuyến đường và nút quay lại cho ngày cụ thể, xử lý khối đơn so với khối superset, phần giữ chỗ cho ngày trống, dấu bài tập đã hoàn thành, thao tác điều hướng thuần tuý trên nút phát ở giữa, sửa đổi bằng tệp đính kèm bối cảnh huấn luyện viên).
- Bộ 3: Chế độ xem lịch biểu theo tuần và Thẻ lịch biểu theo ngày (Thử nghiệm 3.1 – 3.6: Hiển thị số liệu thống kê hằng tuần, bộ lọc chỉ hiển thị ngày đã lên lịch, chú thích trực quan về ngày hôm nay, thao tác điều hướng thẻ ngày, sửa đổi thao tác điều hướng theo tuần, hiển thị biến thể thu gọn).
- Bộ kiểm thử 4: Trò chuyện với huấn luyện viên và thay đổi theo giai đoạn (Kiểm thử 4.1 – 4.7: Hiển thị luồng tin nhắn trò chuyện, đính kèm và đóng biểu ngữ bối cảnh, điền sẵn khối câu lệnh, bật/tắt tính năng đọc chính tả, tách biệt thay đổi theo giai đoạn, chấp nhận và cam kết đề xuất, xem trước và cam kết đề xuất cải tổ hằng tuần).
- Bộ 5: Chi tiết bài tập và Bách khoa toàn thư (Bài kiểm tra 5.1 – 5.5: Hiển thị chi tiết bài tập, tự động lặp lại khi phát ở chế độ tắt tiếng, bật/tắt tạm dừng video, thẻ cơ chính và cơ phụ, điều hướng quay lại nhật ký và dự phòng).
- Bộ kiểm thử 6: Trình theo dõi và ghi nhật ký tập luyện đang hoạt động (Kiểm thử 6.1 – 6.7: Trạng thái ban đầu chưa bắt đầu và bắt đầu thủ công, tạm dừng và tiếp tục đồng hồ bấm giờ, ghi nhật ký hiệp tập bằng xúc giác và bật/tắt dấu kiểm, thay đổi bước superset, phương thức và thay thế bài tập, xác nhận hoàn tất và đồng bộ hoá máy chủ, khôi phục trạng thái phiên khi tải lại).
- Bộ 7: Tiến trình và số liệu phân tích trước đây (Bài kiểm tra 7.1 – 7.5: Hiển thị thông tin tổng quan về trang tổng quan tiến trình, hiển thị biểu ngữ giới thiệu PR, bật/tắt khung thời gian biểu đồ, trạng thái nhật ký trống, nhấn vào nhật ký phiên trước đây).
- Bộ 8: Chế độ cài đặt của người dùng, thiết bị và bộ nhớ AI (Thử nghiệm 8.1 – 8.4: Hiển thị chế độ xem cài đặt, cập nhật nút bật/tắt thiết bị, chuyển đổi đơn vị, xoá mục bộ nhớ AI).