ADR-0017 — Contrat démo web (fixtures du moteur réel hors Tauri)
ADR-0017 — Contrat démo web (fixtures du moteur réel hors Tauri)
- Statut : Accepted (2026-06-12) — implémenté en C37, documenté a posteriori (dette relevée au brief C37 §6.1)
- Décideurs : Thibault, Cowork
- Contexte : avant C37, le frontend appliquait un « contrat no-mock »
strict (CLAUDE.md §13 : pas de données factices) — hors contexte Tauri,
chaque page rejetait
tauri_unavailableet n’affichait RIEN.
Contexte et problème
Le CDC impose une démo web (plateforme 2ᵉ classe, bloquante v1.0) :
c’est ce que le jury data.gouv.fr et tout visiteur verront en premier.
Or le contrat no-mock produisait un site déployé fait de coquilles
vides avec des messages développeur (cargo run -p sobria-app). Deux
exigences légitimes se contredisaient : ne jamais montrer de données
inventées et montrer quelque chose.
Décision
Le contrat no-mock devient un contrat démo, aux règles suivantes :
- Les fixtures sortent du moteur réel. Aucune valeur n’est inventée
côté frontend :
tools/fixturegen/exécutesobria-estimator(seed 42, N = 10 000, horodatage figé) et sérialise les résultats complets (intervalles, bins, équivalents sourcés, hypothèses). Le catalogue (34 modèles), les méthodologies et les 28 datacenters sont les données embarquées réelles. Régénération documentée (briefs/chantiers/C37-mode-demo-web.md§2). - Jamais dans l’application de bureau. Activation uniquement quand
isTauriContext()est faux ; le module démo et ses fixtures sont chargés parimport()paresseux — le bundle Tauri ne les contient pas. - Transparence permanente. Bannière « Mode démo » sur toutes les
pages, suffixe
· DÉMOdans le rail, hypothèsemode_demoinjectée dans chaque résultat (l’utilisateur qui inspecte les hypothèses voit l’origine), requête écho = point de grille réellement calculé (on n’affiche jamais les tokens de l’utilisateur avec un résultat qui ne leur correspond pas). - Couverture partielle assumée. Les commandes non couvertes
rejettent
tauri_unavailableavec un message utilisateur final (« Application de bureau requise ») ; les actions desktop-only sont désactivées avec explication (C42). La démo n’imite jamais ce qu’elle ne sait pas faire (ledger, écritures disque, pairing). - La suite e2e teste CE contrat (
web/playwright.config.ts) : pages couvertes → contenu + bannière démo ; non couvertes → bandeau explicite sans jargon développeur.
Conséquences
- (+) La démo web montre le vrai comportement du produit (vrais intervalles, vraies distributions) sans serveur ni clé API.
- (+) CLAUDE.md §13 est respecté dans son intention : zéro donnée inventée, zéro mock silencieux — c’est un mode explicite, étiqueté, reproductible (seed).
- (−) Les fixtures doivent être régénérées quand le registry des modèles change (sinon dérive démo/produit) — coût accepté, commande unique.
- (−) ~500 Ko de JSON minifié chargés paresseusement par la démo web uniquement.
Options rejetées
- Coquille vide (statu quo) : site déployé sans fonctionnalité — inacceptable pour un livrable bloquant.
- Calcul client-side simplifié : aurait créé une méthodologie parallèle (interdite par CLAUDE.md §3) et des chiffres divergents.
- Backend de démo hébergé : contredit « pas de cloud Sobr.ia » (ADR-0013) et ajoute de l’infra pour un besoin statique.