8.5 KiB
8.5 KiB
JWE â Audit post-exĂ©cution (passe 2) â Rapport de vĂ©rification
Date : 2026-07-16 · Référentiel : prompts/JWE-prompt-verification-agents.md · Méthode : fetch réel, jamais recall. Corpus : 41 lieux.
Tableau des vérifications
| ID | Vérification | Méthode / Preuve | PASS/FAIL | Correctif appliqué |
|---|---|---|---|---|
| C1 | QID valides + sitelink frwiki | node app/scripts/validate-lieux.mjs : 32 QID vérifiés par wbgetentities batch, sitelink + label concordants |
PASS | â |
| C2 | Les « null » sont de vrais null | Recherche list=search frwiki par titre exact pour les 9 nulls. 1 FAIL initial : « Savane des Pétrifications » avait un article (casse « pétrifications » manquée au 1er contrÎle) |
FAIL â PASS | Savane â QID rĂ©el Q3474455 (coords P625 14.4011, â60.8576, photo CC BY-SA 4.0 re-vĂ©rifiĂ©e) ; nouvelle lacune Martinique : Anse Grosse Roche (absence frwiki prouvĂ©e sur 4 variantes de titre, photo CC BY-SA 4.0 HTTP 200) |
| C3 | CoordonnĂ©es < 500 m de la source | Comparaison P625 â JSON pour les 32 lieux Ă QID (haversine dans le validateur) : 32/32 < 500 m | PASS | Seed Fort DelgrĂšs dĂ©jĂ corrigĂ© en passe 1 (Q3077840, 15.9886, â61.7231) |
| C4a | Noms de fichiers photo opaques | Avant : URL Commons en clair dans /api/round (spoiler devtools). AprĂšs : photo.url = /api/photo/<uuid> â grep `FilePath |
.jpg` sur les rĂ©ponses = 0 | FAIL â PASS |
| C4b | EXIF strippés | sharp(buf).metadata() sur /api/photo/<id>?w=400 : exif: false, iptc: false, xmp: false |
PASS | Ré-encodage WebP systématique via le proxy |
| C4c | Licences vérifiables | content/credits.md : 41 photos, page Commons + auteur + licence (CC-BY-SA/BY/CC0/DP uniquement) |
PASS | â |
| C5 | Photos des lieux « null » | Les 9 nulls ont une photo Commons libre documentĂ©e (source + licence dans credits.md) â le cas « rare » du rĂ©fĂ©rentiel est couvert ; Ă terme prĂ©fĂ©rer photos OKI/Panoramax | PASS | Recommandation R4 pour les futurs lieux |
| A1 | Score juste en Guyane | Avant : radius fixe (FAIL). AprĂšs : radius_eff = max(radius, sqrt(aire_commune_km2/Ï)), aire_commune_km2 injectĂ© depuis geo.api.gouv.fr (41/41 lieux). Test rĂ©el : guess Ă 40 km d'un lieu de Saint-Laurent-du-Maroni â radiusEff 37,1 km, score 1699 (â2 sans le fix) |
FAIL â PASS | lieux.ts (rayonEffectifKm), rĂ©ponse /api/guess enrichie de radiusEffKm, affichage discret au rĂ©sultat. â ïž incident de revue : unitĂ©s ha/1000 corrigĂ©es en ha/100 avant commit |
| A2 | Pas de fuite de rĂ©gion | CamĂ©ra initiale globale (center [-58,0], zoom 3.6, GameMap.svelte) â aucun zoom rĂ©gion automatique ; devinette en deux temps : 4 boutons rĂ©gion (Ă©tape 1) â marqueur (Ă©tape 2) ; combinaison par la distance (mauvaise rĂ©gion â score â 0). DocumentĂ© dans docs/architecture.md §7 |
PASS | â |
| A3 | ChaĂźne Wikipedia exacte | wbgetentities(sitelinks) â REST summary ; cache mĂ©moire 24 h + Cache-Control: max-age=86400 (Ă©tait 3600) ; UA explicite ; fallback fr-only documentĂ©. Cas intermĂ©diaire tranchĂ© : 404 {"reason":"no-frwiki"} â variante Cas B « Pas encore d'article en français / Pa nyen an fransĂ© » + lien fiche Wikidata |
FAIL â PASS | wiki/[qid]/+server.ts, WikiFiche.svelte, clĂ©s lacuneFr.* FR+GCF ; bonus : redirections Wikidata rĂ©solues |
| A4 | Strapi vs SvelteKit | ADR §1 : SvelteKit seul + JSON versionné + script de validation au commit (app/scripts/validate-lieux.mjs, ajouté) |
PASS | Script de validation livré |
| A5 | Hors scope respectĂ© | Revue : pas de comptes, pas de leaderboard serveur, pas de multi ; scores cĂŽtĂ© client uniquement | PASS | â |
| B1 | Endpoint sans fuite | 15 tirages /api/round (passe 1) + re-test passe 2 : 0 occurrence coordonnees/commune/wikidata_id/FilePath |
PASS | â |
| B2 | Score cÎté serveur | Le client envoie {id, lat, lon, hintsUsed, timeMs?} ; le serveur calcule (formule A1) ; recalculs indépendants conformes (passe 1 et 2) |
PASS | â |
| B3 | Proxy Wikipedia | Cache 24 h + header 86400 (preuve curl %header{cache-control}) ; aucun texte stocké en base |
PASS | â |
| B4 | Zéro dépendance propriétaire | package.json : maplibre-gl + sharp (Apache-2.0, ajouté pour C4) ; aucune clé API ; pas de télémétrie |
PASS | â |
| F1 | Carte | Bounds + minZoom, aucune fuite région (A2), MapLibre lazy (chunk séparé, 0 occ. sur /), boutons zoom, clavier |
PASS | â |
| F2 | Cas A / Cas B distincts | Panneaux visuellement distincts, message lacune FR + crĂ©ole, CTA contribution prĂ©-rempli (passe 1, revĂ©rifiĂ© passe 2) | PASS | â |
| F3 | Cas intermĂ©diaire gĂ©rĂ© | 404 no-frwiki â variante Cas B dĂ©diĂ©e, pas d'Ă©cran vide ni d'erreur console (chemins compilĂ©s et testĂ©s) |
PASS | Voir A3 |
| F4 | Contour de commune | Non intĂ©grĂ© â optionnel (« si intĂ©grĂ© ») | N/A | Recommandation R3 |
| F5 | Doctrine OKI | Une action primaire, Valider zone pouce, timer calme, micro-interactions crĂ©oles, style non-Google | PASS | â |
| F6 | Perf 4G | Premier Ă©cran â 43 KB gz ; photos WebP via proxy + srcset + lazy ; poids round hors tiles : 1 JSON (~1 KB) + 1 WebP 400â1200 px |
PASS | â |
| Q1 | Bloquants rejoués | C1, C2, A1, A2, B1, B2, F2 : preuves ci-dessus, exécutées sur node build (prod) |
PASS | â |
| Q2 | Partie complÚte | Rounds API + résultats Cas A/Cas B/lieu guyanais testés ; rendu visuel non capturé (pas de navigateur headless dispo) | PASS (partiel) | Recommandation R5 |
| Q3 | Checklist OKI | Intégralement passée en passe 1 (docs/audit-oki.md), points inchangés |
PASS | â |
| Q4 | Scope creep | Rien de plus que le prompt v2 (+ champs audit : aire_commune_km2, radiusEffKm, proxy photo â correctifs, pas features) |
PASS | â |
| Q5 | CWV 4G | Mesures indirectes (poids bundles, SSR, lazy) : LCP estimé < 2 s ; pas de Lighthouse dispo | PASS (estimé) | Recommandation R5 |
Recommandations (hors scope audit â pas implĂ©mentĂ©es)
| # | Priorité | ProblÚme / opportunité | Solution proposée | Effort | Fichiers |
|---|---|---|---|---|---|
| R1 | important | ADR-001 v1 : le DĂ©fi est alĂ©atoire par joueur, impossible de jouer « les mĂȘmes 5 lieux » qu'un autre | Lien Ă seed /defi/<seed> (PRNG seedĂ© serveur, anti-fuite, partage par image) â v2 PlaySocketJS seulement si gate de traction |
M | routes/defi/[seed], server/lieux.ts |
| R2 | important | ADR-002 : MapLibre (~800 KB) absent de l'accueil, mais l'accueil n'a pas encore de carte du tout | Carte SVG statique des 4 régions (topojson geo.api.gouv.fr + mapshaper †150 KB gz, composant from scratch, sans JS) | M | lib/map/, +page.svelte |
| R3 | confort | Résultat : le joueur ne visualise pas les limites de la commune | Superposer le contour geo.api.gouv.fr (geometry=contour) sur la carte résultat |
S | GameMap, /api/guess (code INSEE Ă stocker) |
| R4 | confort | Les futurs lieux « null » dépendent de Commons (rare pour les lieux non documentés) | Prévoir photos OKI propres ou Panoramax dans le guide de contribution | S | docs/contribution.md |
| R5 | confort | Pas de tests automatisés ni de vraies mesures Lighthouse | Vitest sur le scoring + CI légÚre ; Lighthouse sur le VPS de prod | M | app/tests/ |
| R6 | confort | IcÎnes PWA SVG seulement ; contraste corail 3,7:1 | Générer PNG 192/512 à l'installation ; assombrir l'accent vers ℠4,5:1 | S | static/, oki.css |
Verdict passe 2 : CONFORME â 0 FAIL restant. 4 FAIL corrigĂ©s (C2, C4a, A1, A3), 1 script de validation pĂ©renne livrĂ©.
Addendum (2026-07-17) â R1 et R2 implĂ©mentĂ©es
- R1 (ADR-001 v1) : livrĂ©e. DĂ©terminisme prouvĂ© (mĂȘme seed â mĂȘmes 5 lieux, mĂȘme ordre, 2 processus), anti-fuite vĂ©rifiĂ©e (0 occurrence de champ sensible dans
/api/defi/<seed>), image de partage inchangée (score uniquement). Voirdocs/architecture.md§8. - R2 (ADR-002) : livrée.
regions-geo.json= 91,8 KB gz (budget 150 KB) ; SSR de/sans MapLibre ni JS requis (4 vrais<button>rĂ©gion bilingues) ; bilans dĂ©fi passĂ©s en SVG ; composant from scratch ; attribution prĂ©sente. V1âV5 PASS. - Les autres recommandations (R3âR6) restent ouvertes.