Files
Vincent Bourdon 16fd4c8c36 docs: cadrage initial Storytime (specs par jalon, roadmap, CLAUDE.md)
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>
2026-06-19 17:03:33 +02:00

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 » quand storiesPlayed == 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 (renvoie LimitStatus).
  • Data : PrefsLimitsRepository via shared_preferences (réglages + compteurs + date du jour). Reset : si la date stockée ≠ aujourd'hui, compteurs remis à zéro à la lecture.

Plan TDD

  1. Red : limit_evaluator_test.dart — table de cas : minuterie désactivée → toujours ok jusqu'au compteur d'histoires ; T-5 min → warnTimeSoon ; temps atteint → reached ; storiesPlayed == max-1warnLastStory ; == maxreached. Les deux limites combinées : la plus restrictive gagne.
  2. Green : implémenter LimitEvaluator (logique pure).
  3. Red : register_story_started_use_case_test.dart — incrémente ; si nouveau jour, repart de 0.
  4. Green : implémenter.
  5. Red : prefs_limits_repository_test.dart — sauvegarde/relecture des réglages et compteurs ; reset au changement de date (date injectée, pas DateTime.now() direct → horloge injectable).
  6. Green : implémenter le repo + horloge injectable.
  7. Refactor.

Definition of Done

  • Tests évaluateur (table de cas) + use cases + repo verts.
  • Logique de décision sans dépendance Flutter.
  • tool/check.sh passe ; étape 6.1 cochée dans ROADMAP.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.