- flutter create --platforms=android --org biz.siteop
- arborescence lib/core/{error,theme,router,di} et lib/features/{locking,playback,podcasts,parental,limits}/{domain,application,data,presentation}
- pubspec.yaml : flutter_riverpod ^2.6.1 (YAGNI — autres paquets aux jalons suivants)
- lib/main.dart : ProviderScope + StorytimeApp (MaterialApp + écran placeholder)
- test/app_boots_test.dart : TDD Red→Green vérifié (flutter test vert, flutter analyze 0 issue)
- README.md : prérequis Flutter 3.41.6 / Dart 3.11.4
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.6 KiB
Storytime — Roadmap
Vue d'ensemble de l'avancement. À tenir à jour à la fin de chaque étape (cocher la case + dater au format AAAA-MM-JJ). Source de vérité du « où on en est ».
Légende :
[ ]à faire ·[~]en cours ·[x]terminé (date)
Spec détaillée : docs/specs/ — un dossier par jalon, étapes en sous-fichiers.
État global
| Jalon | Titre | Statut | Bloquant |
|---|---|---|---|
| 0 | Fondations | [~] en cours |
— |
| 1 | Verrouillage / épinglage | [ ] à faire |
⚠️ bloquant projet |
| 2 | Lecture audio | [ ] à faire |
— |
| 3 | Découverte & gestion des podcasts | [ ] à faire |
— |
| 4 | Espace enfant | [ ] à faire |
— |
| 5 | Code parental & espace parent | [ ] à faire |
— |
| 6 | Limites, avertissements & fin de session | [ ] à faire |
— |
⚠️ Le jalon 1 valide la faisabilité de l'exigence n°1 (interdire la sortie). Si l'épinglage ne tient pas (plugin + fallback natif), on reconsidère la stratégie matérielle (tablette dédiée) avant d'investir dans le reste.
Jalon 0 — Fondations
Spec : docs/specs/jalon-0-fondations/
- 0.1 — Structure du projet Flutter & arborescence clean archi (2026-06-19)
- 0.2 — Outillage qualité (lint strict, format, CI locale)
- 0.3 — Socle transverse (
Result, erreurs, thème, router, DI Riverpod)
Jalon 1 — Verrouillage / épinglage ⚠️
Spec : docs/specs/jalon-1-verrouillage/
- 1.1 — Spike
kiosk_modesur appareil réel (épingler/désépingler) — bloquant - 1.2 — Service de verrouillage (interface domaine + impl. + use cases)
- 1.3 — Fallback natif Kotlin via platform channel (si 1.1 insuffisant)
Jalon 2 — Lecture audio
Spec : docs/specs/jalon-2-lecture-audio/
- 2.1 — Domaine de lecture (entités épisode/histoire, état de lecture)
- 2.2 — Service audio (
just_audio+audio_service) derrière interface - 2.3 — UI lecteur (boutons, progression) + contrôleur Riverpod
Jalon 3 — Découverte & gestion des podcasts
Spec : docs/specs/jalon-3-podcasts/
- 3.1 — Recherche annuaire (API iTunes Search)
- 3.2 — Ajout par URL RSS (parsing + aperçu)
- 3.3 — Persistance des abonnements (SQLite) + use cases CRUD
Jalon 4 — Espace enfant
Spec : docs/specs/jalon-4-espace-enfant/
- 4.1 — Liste des histoires (titres cliquables, vignettes)
- 4.2 — Navigation verrouillée (épinglage auto au démarrage, pas d'échappatoire UI)
Jalon 5 — Code parental & espace parent
Spec : docs/specs/jalon-5-code-parental/
- 5.1 — Création du code au premier lancement (4 chiffres, double saisie)
- 5.2 — Stockage sécurisé (haché) + vérification du code
- 5.3 — Accès à l'espace parent (icône discrète → saisie code) + abritage de la gestion podcasts
Jalon 6 — Limites, avertissements & fin de session
Spec : docs/specs/jalon-6-limites/
- 6.1 — Domaine des limites (minuterie + compteur d'histoires, reset quotidien)
- 6.2 — Avertissements doux en amont (« encore 5 min », « dernière histoire »)
- 6.3 — Écran de fin « C'est fini pour ce soir 🌙 » + reprise parent uniquement
Journal des décisions / écarts
Noter ici toute décision prise en cours de route ou tout écart avec la spec.
- (vide pour l'instant)