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,45 @@
|
||||
# 1.2 — Service de verrouillage (domaine + use cases)
|
||||
|
||||
## Objectif
|
||||
Encapsuler l'épinglage derrière une interface de domaine propre et des use cases
|
||||
testables, indépendants de l'implémentation (plugin ou natif).
|
||||
|
||||
## Périmètre & hors-périmètre
|
||||
- Inclus : interface `LockingRepository`, use cases, impl. data branchée sur le résultat de 1.1, providers Riverpod.
|
||||
- Exclus : UI enfant (jalon 4) ; c'est elle qui appellera ces use cases.
|
||||
|
||||
## Dépendances
|
||||
1.1 (faisabilité prouvée).
|
||||
|
||||
## Conception
|
||||
- **Domain** (`features/locking/domain/`) :
|
||||
- `LockState` (value object / enum) : `unlocked`, `locked`, `unsupported`.
|
||||
- `LockingRepository` (interface) :
|
||||
- `Future<Result<Unit>> startLock()`
|
||||
- `Future<Result<Unit>> stopLock()`
|
||||
- `Stream<LockState> watchState()`
|
||||
- `Future<LockState> currentState()`
|
||||
- `LockingFailure` (sous-type de `Failure`) : `LockUnsupportedFailure`, `LockDeniedFailure`.
|
||||
- **Application** (`features/locking/application/`) :
|
||||
- `StartLockUseCase`, `StopLockUseCase`, `WatchLockStateUseCase`.
|
||||
- `StopLockUseCase` **n'autorise pas** la sortie système ; il ne fait que demander l'arrêt de l'épinglage (la confirmation reste au système). À documenter.
|
||||
- **Data** (`features/locking/data/`) :
|
||||
- `KioskModeLockingRepository` (impl. via plugin) **ou** `NativeChannelLockingRepository` (impl. 1.3), selon décision de 1.1.
|
||||
- **DI** : provider `lockingRepositoryProvider` (override en test).
|
||||
|
||||
## Plan TDD
|
||||
1. **Red** : `start_lock_use_case_test.dart` — avec un `LockingRepository` mocké renvoyant `Ok`, le use case renvoie `Ok` ; en `Err(LockDenied)`, propage l'échec. Échoue (types absents).
|
||||
2. **Green** : créer interface + use case.
|
||||
3. **Red** : `watch_lock_state_use_case_test.dart` — le stream relaie les états émis par le repo mocké.
|
||||
4. **Green** : implémenter.
|
||||
5. **Red** : `kiosk_mode_locking_repository_test.dart` — avec un wrapper mockable autour du plugin, `startLock` mappe succès→`Ok` et exception→`LockingFailure`.
|
||||
6. **Green** : implémenter l'impl. data avec mapping d'erreurs.
|
||||
7. **Refactor**.
|
||||
|
||||
## Definition of Done
|
||||
- Tous les tests ci-dessus verts ; aucune dépendance au plugin dans `domain/`/`application/`.
|
||||
- `tool/check.sh` passe.
|
||||
- Étape 1.2 cochée dans `ROADMAP.md`.
|
||||
|
||||
## Risques / notes
|
||||
- Garder l'API du repository minimale : start/stop/observe. Pas de fioritures.
|
||||
Reference in New Issue
Block a user