16fd4c8c36
Lecteur d'histoires cadenassé pour le coucher (Android/Flutter). - CLAUDE.md : principes craftsmanship/TDD/clean code/clean archi + decisions techniques - ROADMAP.md : suivi haut niveau des 7 jalons, a tenir a jour par etape - docs/specs/ : specs completes decoupees par jalon, etapes en sous-fichiers - .gitignore Flutter (pubspec.lock versionne, projet applicatif) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2.8 KiB
2.8 KiB
6.1 — Domaine des limites
Objectif
Modéliser les limites de coucher (minuterie + nombre d'histoires) et la logique qui décide quand avertir et quand arrêter, indépendamment de l'UI.
Périmètre & hors-périmètre
- Inclus : configuration des limites, compteurs, calcul des seuils d'avertissement et d'arrêt, reset quotidien, persistance des réglages + compteurs.
- Exclus : affichage des avertissements (6.2), écran de fin (6.3).
Dépendances
2.x (événements de lecture : histoire démarrée, position/temps), Jalon 0.
Conception
- Domain (
features/limits/domain/) :LimitSettings(value object) :timerEnabled,timerDuration?,storyCountEnabled,maxStories?.SessionCounters:elapsed(Duration),storiesPlayed(int),day(date du compteur, pour le reset).LimitStatus(résultat de décision) :ok,warnTimeSoon,warnLastStory,reached.LimitEvaluator(service de domaine pur) :LimitStatus evaluate(LimitSettings, SessionCounters)— applique les seuils (ex. avertissement minuterie à T-5 min ; « dernière histoire » quandstoriesPlayed == maxStories - 1).LimitsRepository(interface) :get/saveSettings,get/saveCounters, reset si le jour a changé.
- Application :
GetLimitSettingsUseCase,SaveLimitSettingsUseCase.RegisterStoryStartedUseCase(incrémente le compteur + reset si nouveau jour).TickElapsedUseCase/EvaluateLimitsUseCase(renvoieLimitStatus).
- Data :
PrefsLimitsRepositoryviashared_preferences(réglages + compteurs + date du jour). Reset : si la date stockée ≠ aujourd'hui, compteurs remis à zéro à la lecture.
Plan TDD
- Red :
limit_evaluator_test.dart— table de cas : minuterie désactivée → toujoursokjusqu'au compteur d'histoires ; T-5 min →warnTimeSoon; temps atteint →reached;storiesPlayed == max-1→warnLastStory;== max→reached. Les deux limites combinées : la plus restrictive gagne. - Green : implémenter
LimitEvaluator(logique pure). - Red :
register_story_started_use_case_test.dart— incrémente ; si nouveau jour, repart de 0. - Green : implémenter.
- Red :
prefs_limits_repository_test.dart— sauvegarde/relecture des réglages et compteurs ; reset au changement de date (date injectée, pasDateTime.now()direct → horloge injectable). - Green : implémenter le repo + horloge injectable.
- Refactor.
Definition of Done
- Tests évaluateur (table de cas) + use cases + repo verts.
- Logique de décision sans dépendance Flutter.
tool/check.shpasse ; étape 6.1 cochée dansROADMAP.md.
Risques / notes
- Injecter une
Clock(interface) pour tester le reset quotidien sans dépendre de l'heure réelle. - Le seuil d'avertissement minuterie (5 min) est une constante nommée, ajustable.