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>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
# 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-1` → `warnLastStory` ; `== max` → `reached`. 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.
|
||||
Reference in New Issue
Block a user