4.6 KiB
4.6 KiB
Build Execution Ledger
Active Target
- Current Milestone: Phase 4: Recipe Web Scraper Engine & Meal Planning Calendar
- Status: Phase 3 Complete
Phase Checklist
- Phase 1: Foundation & Identity (Passwordless SSO & Encrypted Drift DB)
- Phase 2: Medication Domain, Injection Rotation, Serum Modeling
- Phase 3: Nutrition, Protein Target Tracking, HealthGateway Sync
- Phase 4: Recipe Web Scraper Engine & Meal Planning Calendar
- Phase 5: Pantry Delta Engine & Auto-Shopping Generator
- Phase 6: Hardening, Native Desktop/Web Polish, CI/CD
Phase 2 Deliverables (2026-10-16)
- Domain:
DoseEntryentity, 12-quadrantInjectionSiterotation model,Glp1Compoundvalue object (Sema 168h / Tirze 120h / Lira 13h),IMedicationRepositorycontract. - Domain:
CalculateSerumLeveluse case implementingC(t) = Σ D_i · 0.5^((t − t_i)/t_half). - Data: injection-history CRUD on
AppDatabase+ drift-backedMedicationRepository(record ↔ entity mapping). - Presentation:
MedicationController(Riverpod StateNotifier) with serum estimation, least-recently-used site rotation, and reminder scheduling; refactoredMedicationScreen(serum card, rotation suggestion, interactive log dialog, history with delete). - Platform:
INotificationService/PlatformNotificationService(flutter_local_notifications 17.x; Android/iOS/macOS scheduled reminders, graceful no-op on Web/Windows/Linux); Android boot-receiver manifest entries;timezonedependency added. - Regression fix:
SupabaseAuthServicenow resolves its client lazily (baseline widget test no longer throws when Supabase is uninitialized). - Tests: 33 new unit/widget-fake tests (PK calculator, rotation policy, repository w/ in-memory drift, controller); baseline smoke test green.
Post-Phase-2 Additions
- Development auth bypass (2026-10-16): debug-only "Continue Without Signing In" button on the login screen (
kDebugMode-gated, in-memorydevAuthBypassProvider) lets reviewers enter the app without a Supabase session; the router guard honors the flag and the shell shows an orange "Development mode - not signed in" banner while active. Covered bytest/features/auth/dev_auth_bypass_test.dart(3 tests).
Phase 3 Deliverables (2026-10-16)
- Domain:
FoodLogEntry(+MealTypeenum),HydrationLogEntry,BiometricEntry(+BiometricSourceenum),INutritionRepository,IHealthSyncRepository— all pure Dart. - Data:
AppDatabaseschema v2 (+ migration for v1 installs) withFoodLogsTable,HydrationLogsTable,BiometricLogsTable, range-filtered watch/get/CRUD helpers,clearSyncedRangefor idempotent re-syncs; drift-backedNutritionRepositoryandHealthSyncRepository(record ↔ entity mapping). - Platform:
HealthGatewayrewrite —IHealthGateway+ conditional-import factory; mobile impl (health_gateway_mobile.dart) wrapspackage:healthforWEIGHT(kg→lb normalization) andACTIVE_ENERGY_BURNED(joule→kcal) with double-guarded try/catch; fallback impl (health_gateway_fallback.dart) for Web/Windows/macOS never touches platform channels (reads served from the drift cache, writes via manual entry). - Presentation:
NutritionController(RiverpodAsyncNotifier; today's logs, 100 g protein / 96 oz water targets, meal grouping, quick-add water) andBiometricController(weight history, 7/30-day deltas, manual entry, native sync with per-day active-energy aggregation);LogFoodDialogandLogWeightDialog. - Presentation:
NutritionScreenupgraded — interactive protein/hydration progress meters, +8/+16/+24 oz quick-add buttons, meal-grouped food diary with delete, weight tracker card (latest weight, 7/30-day trend chips, latest active burn) whose "Log Weight / Sync" button runsHealthGatewaysync on Android/iOS and opens the manual dialog on Windows/Web; status snackbars viaref.listen. - Tests: 23 new tests — nutrition repository (in-memory drift: CRUD, day-range filter, watch,
MealTyperound-trip), nutrition controller (targets, grouping, validation, quick-add, delete, failure retention), biometric controller (manual entry, deltas, fallback short-circuit, permission denial, weight+energy sync idempotency). - Regression fix: none required — existing 37 tests untouched and green.
Active Verification Gates
flutter pub run build_runner build --delete-conflicting-outputsflutter analyze(Zero issues —No issues found!)flutter test(60/60 passing)flutter build web --no-tree-shake-icons(conditional import keepspackage:health/dart:ioout of the web bundle)