Files
JWE/docs/audit-passe2.md
T

8.5 KiB
Raw Permalink Blame History

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). Voir docs/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.