Exigences non fonctionnelles — SIOP V2
Rôle de ce document (playbook) : les exigences fonctionnelles vivent dans la
user-story map et les issues ; ici on fige ce qui est transversal — qualité, sécurité,
conformité, exploitation — avec des critères mesurables (sinon invérifiables).
Qualité & design
| Exigence |
Critère mesurable |
| Fidélité au design |
Revue pixel par release : écrans conformes aux maquettes validées (../02-design/) |
| Réactivité |
Interfaces utilisables de 360 px (mobile) à 1920 px ; tables scrollables sans casser la page |
| Thème |
Clair et sombre, pilotés par les tokens ; aucun style codé en dur hors tokens |
| Accessibilité |
Navigation clavier sur les parcours critiques ; libellés/aria sur tous les contrôles ; contraste AA |
| Langue |
100 % français (produit), zéro franglais dans l'UI |
Performance
| Exigence |
Critère |
| Chargement des listes |
< 1 s pour 10 000 OT (pagination serveur, index SQL) |
| Tableau de bord |
< 2 s (agrégations SQL, jamais de calcul en mémoire sur tout l'historique) |
| Mobile offline |
Ouverture d'un OT déjà synchronisé : instantanée (< 200 ms, lecture locale) |
Sécurité
| Exigence |
Critère |
| API fermée par défaut |
Guard JWT global ; routes publiques explicitement @Public() ; test de couverture des routes |
| Permissions |
Matrice rôles × objets × droits en base (jamais dans le JWT), testée rôle par rôle |
| Démo-login |
POST /auth/demo-login inexistant (404) si DEMO_MODE n'est pas true ; jamais activé en production réelle ; test e2e dédié |
| Fichiers |
Accès aux objets MinIO uniquement par URL signée à durée courte ; clés opaques |
| Secrets |
Jamais en git ; .env.example exhaustifs ; secrets Dokploy |
Conformité (loi 09-08)
Consentement explicite pour toute géolocalisation ; géolocalisation limitée aux heures de
service ; purge des enregistrements audio après transcription (R5) ; droit d'accès/rectification
des données personnelles (procédure au runbook).
Fiabilité & exploitation
| Exigence |
Critère |
| Sauvegardes |
PostgreSQL + MinIO sauvegardés quotidiennement ; restauration testée 1×/release (runbook) |
| Migrations |
prisma migrate deploy rejouable ; seed idempotent (rejouer ne casse rien) |
| Offline mobile |
Aucune saisie terrain perdue : file locale + verrou optimiste + rejeu (testé) |
| Supervision |
Endpoint /health (base, Redis, MinIO) ; vérifié au déploiement |
Testabilité
Pyramide : unitaires (logique pure), intégration contre infra réelle (Docker), parcours
navigateur Playwright (1+ par release), mobile testé en Node (node:sqlite), contrat
OpenAPI bloquant en CI. Couverture API ≥ 70 % bloquante. Chaque bug corrigé = un test
qui l'aurait attrapé.