docs: rapport d'audit passe 2 (0 FAIL restant), architecture mise a jour, prompts de mission
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user