# סיכום סשן — 0037
תאריך: 2026-06-02 11:36
אפליקציה: VitVital
נושא: 7 releases (v34→v40) — Trainer + Dashboard + AI

## מה נבנה/הושלם

### v34 — Per-exercise history chart
- `lib/screens/workouts/exercise_history_sheet.dart` חדש
- DraggableScrollableSheet עם 1RM line chart + volume line chart (fl_chart)
- "היום" ghost dot מקווקו על שני הגרפים
- Per-session detail list מתחת לגרפים
- Delta chip ▲/▼ ירוק/אדום ליד הערך האחרון
- Tappable מ-`_LastSessionBadge` בכרטיס תרגיל
- Empty state: "זה האימון הראשון שלך כאן"

### v35 — BIA sticky + delete weight
- `_latestBia` נפרד מ-`_latest` (חיפוש 60 יום אחורה אחר entry עם bodyFatPct)
- כש-`_latest != _latestBia` → באנר אמבר "מדדים ממדידה קודמת"
- Trash icon + long-press על `_WeightRow` → confirm dialog → Firestore delete
- אייקון 🔬 ליד שקילות עם BIA (לזיהוי "שקילות כבדות")
- HC entries מוסטים ל-SnackBar "מנוהל ב-Health Connect"

### v36 — Dedup + HC delete + delta chip
- בעיית הכפילויות: כל שמירה מ-Mi Home Share מבצעת `_hc.writeWeight()` → HC mirror באותה דקה. תוקן ב-`_loadData()` עם filter לפי minute-key + weight ±0.2kg, חלון ±1 דקה
- `HealthConnectService.deleteWeightAt(measuredAt)` חדש — `Health().delete(type: WEIGHT, startTime, endTime)` עם חלון ±2s
- מחיקת mihome_/manual_ קוראת גם ל-HC delete (מונע resurrection)
- `_DeltaChip` ▲ אדום (עליה) / ▼ ירוק (ירידה) / "±0" אפור (<50g)

### v37 — Machine # + carry-over notes + tempo timer + AI image fix + routine labels
- **Machine #:** `RoutineExercise.machineNumber` + `WorkoutExercise.machineNumber` חדשים. שדה ב-routine editor ליד "שריר". Chip זהוב "#41" בכרטיס תרגיל חי. נמשך מהאימון האחרון על אותו תרגיל אם לא הוגדר ב-routine
- **Carry-over notes:** `WorkoutExercise.carryForwardNote: bool`. `_lookupExerciseStats` מחזיר עכשיו `carryNote` + `carryNoteDate` + `lastMachineNumber`. `_CarryNoteBadge` כחול: "📝 מהאימון ב-DD/MM: …". checkbox "המשך הערה זו לאימון הבא" בכרטיס
- **Tempo timer 45s:** ב-AppBar ⏲ → big circular countdown (1/3 מסך). SystemSound.alert + HapticFeedback.heavyImpact בכל אפס. אמבר ב-5 שניות אחרונות
- **AI image fix:** `gemini-2.5-flash-image-preview` עבר ל-GA `gemini-2.5-flash-image`. הוספתי `_imageModelCandidates` list עם 2 שמות (GA → preview fallback). שגיאות "unknown" מציגות עכשיו את ה-`e.toString()` האמיתי במקום fallback string
- **Routine labels:** באנר כחול "זו תוכנית — אלה ברירות מחדל. באימון תוכל לשנות לכל סט". Labels: "סטים (התחלה)", "חזרות (טווח)", "משקל התחלה"

### v38 — Aerobic exercise
- "+ אירובי" כפתור זהוב חדש מתחת ל-"+ מכשיר" ו-"+ ידני"
- Dialog עם ChoiceChips: ריצה / הליכה / אופניים / אליפטי / חתירה / מדרגות + שם חופשי + machine #
- `_ExerciseDraft.aerobic()` factory עם distance/speed/duration controllers
- `_AerobicInputs` widget נפרד עם **autocompute** של השדה השלישי (distance=speed×time/60)
- Aerobic cards: no rest timer / no sets table / no PR detection / "פעם שעברה" formatter ייעודי
- `WorkoutExercise.isAerobic + distanceKm + avgSpeedKmh + durationMin` חדשים. fromSaved משחזר נכון

### v39 — Workout edit + reorder/insert
- `lib/screens/workouts/workout_edit_screen.dart` חדש — `_ExerciseDraftLite` (פחות שדות), PopScope עם dirty check, מחיקת תרגיל בודד או של האימון כולו. נגיש מ-`workout_detail_screen` דרך IconButton(edit). מוסתר ל-HC entries
- `Workout.copyWithExercises(newExercises)` helper בwool_model
- **Reorder/insert בסשן חי:** popup menu ⋮ בכל כרטיס → "הוסף תרגיל מעל/מתחת" (פותח bottom sheet עם 3 add types) / "↑ הזז למעלה" / "↓ הזז למטה" / "הסר תרגיל"
- `_pendingInsertAt int?` + `_insertExercise(at: idx)` משותפים בין 3 ה-add methods

### v40 — Dashboard wired + Insights AI fix
- **Dashboard:** 3 StreamSubscriptions חדשים — `body_composition` (latest weight), `meals` (today), `workouts` (Firestore-side). `_WeightTile` + `_NutritionTile` + `_MacroChip`. הוחלף `floorsClimbed` (תמיד null) ב-`basalCalories` (קיים ב-HC)
- **Insights AI fix:** הבאג הקריטי — `runJsonForSummary` עבר דרך `_meal` model שיש לו `responseSchema: _mealSchema`. Gemini החזיר `{kcal, proteinG,…}` במקום `{whatWorked,…}` → fields ריקים → 3 fallback strings סטטיים. תיקון: `_textJson` model חדש (text+JSON, ללא schema); flag `useMealSchema` ב-`_runJson` — true רק ב-parseMealText. `WeeklySummaryService` עכשיו זורק שגיאה אמיתית אם 3 השדות ריקים

## החלטות שהתקבלו
- **גישת bottom-sheet במקום drag-to-reorder:** popup menu ⋮ פשוט יותר מנגיש drag handles ב-ReorderableListView. עובד טוב על 1-15 תרגילים. שמרתי scope.
- **`_textJson` model נפרד במקום override של `_meal`:** כל schema-less prompt עובר דרכו. בעתיד אם נרצה schema גנרי לתשובות אחרות — פותח אותו ל-flag נוסף
- **Autocompute אירובי dist/speed/time:** מצב נורמלי במאזניים — לא נכבה את ה-controller שעורכים אליו (תיעוד ב-`_editing` field, מונע overwrite mid-keystroke)
- **Aerobic ב-live session בלבד:** לא ב-routine builder. סקופ. routines נשארות strength-only
- **AI image dual model candidates:** GA קודם, preview fallback. אם אף אחד לא עובד — מציג את הexception האמיתי במקום הודעה גנרית

## בעיות שנפתרו
1. **BIA נעלם** (display bug, לא איבוד data) — `_latest` היה weight-only entry, BIA grid תלוי בbodyFatPct. תיקון: `_latestBia` נפרד עם fallback 60 ימים
2. **כפילויות בהיסטוריית שקילה** — HC mirror לא הוסר אחרי שמירה מ-Mi Home. תיקון: dedup + sync delete
3. **AI image generation falilng silently** — model name change ל-GA, ושגיאה גנרית הסתירה את הסיבה. תיקון: dual candidates + surface real e.toString
4. **Tempo timer requirement** — המשתמש ביקש 45 שניות רץ ברציפות, גודל 1/3 מסך, ביפ ורטט בכל אפס. ביצענו ב-Stack של Scaffold body
5. **Insights AI מחזיר 3 fallback strings סטטיים בכל פעם** — `_meal` model schema הכריח meal-shape output. תיקון: `_textJson` model נפרד + `useMealSchema` flag
6. **דשבורד מנותק מ-60% מהדאטה** — חסרו body composition, meals, real-time Firestore sync. תיקון: 3 StreamSubscriptions + 2 widgets חדשים

## מה לא עבד / צריך להיזהר
- **Windows file lock ב-mergeReleaseNativeLibs:** קרה כל build. השיגרה (Get-Process java → Stop-Process → cmd /c rd /s /q build\app) עבדה כל פעם. לתעד למשתמשים אחרים.
- **`HC FLOORS_CLIMBED` לא קיים ב-VitVital:** הוסר מ-`kAllReadTypes`. השאר את ה-UI כ-`basalCalories` במקום
- **AI Coach chat — לא התחלנו:** המשתמש העלה את החזון, סיכמתי architectural sketch (summary context + Gemini single-turn). דחוי
- **Wear OS companion — סיכון:** Strong/Hevy לא הצליחו עם sensor-based rep counting. ספייק POC נחוץ לפני מחויבות

## קבצים שנוצרו/שונו

### חדשים
- `lib/screens/workouts/exercise_history_sheet.dart` (v34)
- `lib/screens/workouts/workout_edit_screen.dart` (v39)
- `_release_notes_v34.txt` ... `_release_notes_v40.txt` (7 קבצים)

### ששונו
- `lib/screens/body/body_screen.dart` (v35 + v36 — _latestBia, _BiaGrid header, delete UI, dedup, delta chip)
- `lib/services/health_connect_service.dart` (v36 — `deleteWeightAt`)
- `lib/models/workout.dart` (v37 + v38 — machineNumber, isAerobic, distance/speed/duration, carryForwardNote, copyWithExercises)
- `lib/models/workout_routine.dart` (v37 — machineNumber)
- `lib/screens/workouts/routine_edit_screen.dart` (v37 — machine field, banner, labels, error fix)
- `lib/screens/workouts/gym_session_screen.dart` (v37-v39 — machine chip, _CarryNoteBadge, _TempoTimer, _AerobicInputs, popup menu, _addAerobic, _pickAddAt, _insertExercise)
- `lib/screens/workouts/routines_screen.dart` (v37 — machine # in chips)
- `lib/screens/workouts/workout_detail_screen.dart` (v39 — edit button + StatefulWidget)
- `lib/screens/dashboard/dashboard_screen.dart` (v40 — 3 streams + 2 tiles + basalCalories swap)
- `lib/services/gemini_service.dart` (v37 + v40 — `_imageModelCandidates`, `_textJson` model, `useMealSchema` flag)
- `lib/services/weekly_summary_service.dart` (v40 — surface error if fields empty)

## הצעד הבא
**טריאז׳ראשון:** המשתמש בודק v40 על הטלפון. אם כל הפיצ׳רים עובדים → שני מסלולים פתוחים:

1. **AI Coach chat (חזון המשתמש)** — צ׳אט שיושב על כל ה-data. תוכנית מסוכמת:
   - Data summary builder (lib/services/coach_context_builder.dart)
   - Gemini single-turn coach service (lib/services/coach_chat_service.dart)
   - Chat UI (lib/screens/coach/coach_chat_screen.dart) — drawer entry, chips של שאלות מוכנות
   - BYO key first, Firebase fallback
   - מטמון summary ל-60 דק׳
   - ~יום עבודה

2. **Wear OS companion** — ספייק קטן קודם (אקסלרומטר → ספירת תנודות), אחר כך accept/reject. 3-5 ימים אם ממשיכים

הראשון יותר user-facing ובסקופ קטן יותר. ההמלצה: AI Coach. אבל החלטה למשתמש.
