8.1 KiB
JWE â ADR-001 & ADR-002 (format audit OKI)
Deux décisions d'architecture rédigées selon le format du prompt d'audit post-exécution : critÚres bloquants, preuves exigées, rapport tabulaire, interdits. Elles ne modifient pas le build v1 en cours ; elles cadrent la phase 2 et une optimisation perf.
ADR-001 â Mode DĂ©fi : seed-link en v1, PlaySocketJS en phase 2 conditionnĂ©e
- Statut : Accepté (v1) / à étudier (v2, gate explicite)
- Date : 2026-07-17
- Décideurs : Architecte OKI
- Références : PlaySocketJS (MIT, rooms, CRDT, server-authoritative, battle-tested >1,3 M duels sur 1 instance Node) ; Geoguess/Geoguess (modÚle de room sans compte, max 5 joueurs) ; prompt v2 §A5 (pas de comptes, pas de leaderboard serveur).
Contexte
Le prompt v2 interdit comptes et leaderboard serveur. L'usage rĂ©el visĂ© (OKI, AKILPA, salles de classe, Ă©vĂ©nements) crĂ©e pourtant un besoin : jouer les mĂȘmes 5 lieux que d'autres et comparer les scores. Deux horizons : maintenant (zĂ©ro serveur) et plus tard (temps rĂ©el, si le projet prouve sa traction).
Décision
v1 â DĂ©fi asynchrone par lien Ă seed partagĂ©e.
- L'URL de défi contient une seed opaque (ex.
/defi/<seed>) ; le serveur (ou la fonction SvelteKit) dĂ©rive de la seed les mĂȘmes 5 lieux pour tous les joueurs (PRNG seedĂ© cĂŽtĂ© serveur, jamais cĂŽtĂ© client). - Aucune coordonnĂ©e dans l'URL ni dans le payload initial (anti-triche §6 du prompt v2 maintenu).
- Fin de partie : l'image de partage canvas (déjà prévue prompt v2 §4.4) affiche le score ; la comparaison se fait humainement (screenshot dans le groupe WhatsApp/Signal). Zéro serveur d'état, zéro compte, cohérent doctrine.
v2 â Duel temps rĂ©el via PlaySocketJS, UNIQUEMENT si le gate §"Conditions" est franchi.
- ModĂšle : rooms sans compte Ă la Geoguess (nom de room partagĂ©, 2â5 joueurs), Ă©tat synchronisĂ© par PlaySocketJS en mode server-authoritative (le serveur valide les guesses et calcule les scores â jamais le client).
- HĂ©bergement : 1 instance Node sur le VPS OKI existant, dans l'enveloppe 40â50 âŹ/mois. Aucune dĂ©pendance Google/Firebase (contraire Ă Geoguess â voir annexe).
Options considérées
| Option | Souveraineté | Coût serveur | Effort | Anti-triche | Verdict |
|---|---|---|---|---|---|
| Seed-link asynchrone (v1) | Totale | Nul | S | Serveur dérive les lieux, scores non comparés en ligne | Retenu v1 |
| PlaySocketJS rooms (v2) | Bonne (MIT, self-host) | 1 instance Node | M | Server-authoritative natif | Retenu v2 si gate |
| Socket.io maison | Bonne | 1 instance Node | MâL | Ă rĂ©implĂ©menter | RejetĂ© (rĂ©invention) |
| Supabase/Firebase Realtime | Mauvaise (cloud propriétaire) | Abonnement | M | Faible cÎté client | Rejeté (doctrine) |
Conditions de dĂ©clenchement de la v2 (gate â bloquant)
La v2 n'est étudiée que si TOUTES les conditions suivantes sont remplies et documentées dans le rapport de gate :
- Traction mesurée : ℠30 parties/semaine pendant 4 semaines consécutives (mesure locale anonymisée, pas d'analytics tiers).
- Demande explicite : ℠5 retours d'utilisateurs ou partenaires (OKI, AKILPA, enseignants) demandant le défi en direct.
- CapacitĂ© d'hĂ©bergement confirmĂ©e sur le VPS OKI sans dĂ©passer l'enveloppe 40â50 âŹ/mois.
Vérifications (obligatoires, preuves à l'appui)
- V1 (bloquant, v1) â DĂ©terminisme : la mĂȘme URL de dĂ©fi produit les mĂȘmes 5 lieux, dans le mĂȘme ordre, sur deux machines diffĂ©rentes. Preuve : double exĂ©cution filmĂ©e ou logs serveur.
- V2 (bloquant, v1) â Anti-fuite : l'URL et les payloads initiaux ne contiennent ni coordonnĂ©es, ni commune, ni
wikidata_iddĂ©codable. Preuve : inspection rĂ©seau + revue de l'URL. - V3 (bloquant, v1) â L'image de partage n'affiche que score/pseudo libre, jamais les rĂ©ponses des autres joueurs.
- V4 (bloquant, v2) â POC PlaySocketJS : room Ă 3 clients, dĂ©connexion/reconnexion d'un joueur sans perte d'Ă©tat (CRDT), score validĂ© cĂŽtĂ© serveur (tentative de triche client rejetĂ©e â preuve par requĂȘte forgĂ©e).
- V5 (v2) â Licence :
npm view playsocketjs license= MIT, consignĂ© dans le rapport. - V6 (v2) â Charge : 10 rooms simultanĂ©es Ă 5 joueurs sur le VPS sans saturation (preuve : log ressources).
Rapport (format obligatoire)
| ID | Vérification | Méthode / Preuve | PASS/FAIL | Correctif appliqué |
Interdits
- Aucun compte utilisateur, aucun leaderboard global, aucun stockage de pseudos au-delĂ de la room.
- Aucune dépendance Google/Firebase/Supabase pour le temps réel.
- Aucune copie de code Geoguess/Geoguess (Vue.js) : référence de design uniquement.
- La v2 ne doit pas régresser le hors-scope du prompt v2 pour le solo.
ADR-002 â Carte SVG/topojson lĂ©gĂšre pour les Ă©crans hors-jeu (perf 4G)
- Statut : Accepté
- Date : 2026-07-17
- RĂ©fĂ©rences : composant carte SVG/topojson d'OpenGuessr Education (inspiration uniquement â licence MIT + Commons Clause = non-commercial, aucune copie de code) ; geo.api.gouv.fr (contours de communes GeoJSON, gratuit, sans clĂ© â testĂ© OK) ; prompt v2 §4.1 (lazy-load MapLibre) et §4.5 (perf).
Contexte
MapLibre GL JS pÚse ~800 kB de JS avant la premiÚre tile. L'accueil, le récapitulatif final et les fiches « Aprann » n'ont pas besoin d'une carte interactive complÚte. Sur 4G caribéen, charger MapLibre sur ces écrans détruit le budget < 3 s du prompt v2.
Décision
- Les écrans hors-jeu (accueil 4 régions, mini-carte du récapitulatif, vignette de fiche lieu) utilisent une carte SVG statique générée au build depuis un topojson des communes des 4 régions, projection précalculée, aucune tile, aucun JS carte.
- MapLibre reste réservé aux écrans de jeu (devinette, résultat, explorer interactif) et reste lazy-loadé.
- Pipeline données : contours communes via
geo.api.gouv.fr/communes?codeRegion=01|02|03|04&fields=nom,code,contour&format=json&geometry=contourâ simplification (mapshaper, seuil Ă calibrer) â topojson versionnĂ© dans le repo â composant Svelte SVG from scratch (MIT).
Vérifications
- V1 (bloquant) â Budget poids : topojson simplifiĂ© des 4 rĂ©gions †150 kB gzippĂ© ; preuve : taille du fichier +
gzip -9consignĂ©s. Si dĂ©passement : simplifier davantage ou dĂ©couper par rĂ©gion avec import dynamique. - V2 (bloquant) â LCP accueil < 2,5 s en throttling 4G (Lighthouse mobile, 3 runs, mĂ©diane consignĂ©e).
- V3 â Rendu sans JS : la carte SVG s'affiche en SSG avec JS dĂ©sactivĂ© ; chaque rĂ©gion est un
<a>ou<button>rĂ©el (accessibilitĂ© clavier, lecteur d'Ă©cran : nom de rĂ©gion en FR + crĂ©ole). - V4 â Attribution donnĂ©es : © contributeurs OpenStreetMap / rĂ©utilisation donnĂ©es publiques mentionnĂ©e dans le footer (licence ODbL pour les contours dĂ©rivĂ©s OSM le cas Ă©chĂ©ant).
- V5 â ZĂ©ro code copiĂ© d'OpenGuessr Education : revue de provenance, le composant est Ă©crit from scratch (licence MIT du projet).
Rapport (format obligatoire)
| ID | Vérification | Méthode / Preuve | PASS/FAIL | Correctif appliqué |
Interdits
- Ne pas charger MapLibre (ni son CSS) sur l'accueil ou le récapitulatif.
- Ne pas embarquer de tuiles raster de substitution (le SVG est vectoriel pur).
- Ne pas copier le code d'OpenGuessr Education (Commons Clause).
Annexe â Ătude Geoguess/Geoguess (rĂ©fĂ©rence, 2026-07-17)
- Projet : clone GeoGuessr open source, solo + multijoueur par rooms (nom de room partagé, †5 joueurs), PWA, cartes custom GeoJSON, licence MIT.
- Stack : Vue.js + Google Maps StreetView + Firebase â non rĂ©utilisable (doctrine zĂ©ro Google ; Vue â Svelte).
- Signal fort : leur README admet que la dĂ©mo publique est limitĂ©e par le prix de l'API Google et renvoie vers l'auto-dĂ©ploiement avec clĂ© personnelle â justification directe du zĂ©ro propriĂ©taire OKI, Ă citer dans l'ADR d'architecture initial.
- Ă retenir : (1) le modĂšle de room sans compte (base UX de l'ADR-001 v2) ; (2) le repo GeoGuess-Maps, liste de cartes communautaires â modĂšle pour les futurs map-packs JWE contribuĂ©s par la communautĂ© OKI/AKILPA via PR, sans CMS.