Files
JWE/prompts/JWE-ADR-mode-defi-et-carte-legere.md
T

8.1 KiB
Raw Blame History

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 :

  1. Traction mesurĂ©e : ≄ 30 parties/semaine pendant 4 semaines consĂ©cutives (mesure locale anonymisĂ©e, pas d'analytics tiers).
  2. Demande explicite : ≄ 5 retours d'utilisateurs ou partenaires (OKI, AKILPA, enseignants) demandant le dĂ©fi en direct.
  3. 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_id dĂ©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 -9 consignĂ©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.