docs: rapport d'audit passe 2 (0 FAIL restant), architecture mise a jour, prompts de mission

This commit is contained in:
sucupira
2026-07-16 21:58:32 -04:00
parent 0b01013411
commit 8178e87f87
4 changed files with 260 additions and 10 deletions
@@ -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.