Lecteur de documentation

BADGE CATALOG

Fichier source: gamification/BADGE_CATALOG.md

Markdown rendu Markdown

Catalogue des badges - système de gamification CleanMyMap

Documentation complète des familles de badges et des systèmes de progression utilisés dans CleanMyMap.

Référence canonique à lire en premier:

Vue d ensemble

Le système de gamification comprend 4 familles de badges exposées par l API, 2 systèmes infinis affichés dans la zone profil, 2 badges one-shot d'entrée, ainsi que 5 badges hérités basés sur des points. Chaque famille récompense un comportement différent :

Matrice des échelles

FamilleÉchelleRemarque
ExplorerÉchelle d exploration dédiéePas de vocabulaire gemme
ParticipantÉchelle cartographique dédiéeBase Observateur, paliers propres à la participation
FormsÉchelle végétale dédiéeGraine → Forêt primaire
Clean ZonesÉchelle atmosphérique dédiéeBrise → Eden
Actions crééesÉchelle gemmeObservateur → Pilier
Équilibre des contextesÉchelle gemmeObservateur → Pilier
Régularité mensuelleÉchelle gemmeObservateur → Pilier
Zone sensible apaiséeÉchelle gemmeObservateur → Pilier
MohsÉchelle minérale héritéeTalc → Diamant, distincte de la gemme

Règle produit:


1. Badge Explorer - Échelle d exploration dédiée

Objectif : récompenser l exploration géographique et la révélation de nouvelles zones sur la carte.

Échelle d exploration : dédiée / cartographique - 13 paliers

PalierNomIcôneSeuilProgressionDéclenchement
1Observateur👀01 zone0+ zone
2Promeneur Local👣12 zones1-2 zones
3Arpenteur🥉32 zones3-4 zones
4Éclaireur🔦53 zones5-7 zones
5Patrouilleur🚶83 zones8-10 zones
6Repéreur📍114 zones11-14 zones
7Cartographe🗺️155 zones15-19 zones
8Coordinateur🧭205 zones20-24 zones
9Sentinelle🛡️255 zones25-29 zones
10Régulateur⚖️305 zones30-34 zones
11Conservateur🌳3510 zones35-44 zones
12Gardien🦺455 zones45-49 zones
13Maître des Cartes🔭5050+ zones

Récompense XP : +1 XP par palier débloqué, sans bonus

Source de données : table user_visited_places - comptage des enregistrements uniques par utilisateur

Direction visuelle :

Composants :

État d implémentation : ✅ complet avec tests


2. Badge Participant - Actions de nettoyage

Objectif : récompenser la participation aux actions communautaires de dépollution.

Échelle : exploration / cartographie - base zéro + 8 paliers

PalierNomIcôneSeuilEmojiInfo-bulle
0Observateurmarker0👀Point de départ de la participation
1Promeneur Localfootprints1👣Première participation utile
2Éclaireurcompass3🔦Participation assidue
3Patrouilleurboots5🚶Participation récurrente
4Cartographemap10🗺️Contribue à la couverture
5Coordinateurcompass-rose15🧭Rôle central
6Sentinelleshield20🛡️Pérennité garantie
7Conservateurtree25🌳Impact notable
8Gardienguardian30🦺Ambassadeur de terrain

Seuils : 0 → 1 → 3 → 5 → 10 → 15 → 20 → 25 → 30 participations

Récompense XP : +1 XP par palier débloqué, sans bonus

Source de données : table action_participants - comptage des enregistrements où user_id = userId

Direction visuelle :

Composants :

État d implémentation : ✅ complet


3. Badge Forms - Formulaires soumis

Objectif : récompenser la création de formulaires d action éligibles.

Échelle : croissance végétale - 8 paliers (Graine → Forêt primaire)

PalierNomIcôneSeuilEmojiVisuel
1Graineplant-seed1🌱Vert léger de semence
2Pousseplant-sprout3🌿Vert de pousse
3Jeune planteplant-seedling5🌱Vert de plantule
4Arbusteplant-sapling8🎋Vert de jeune arbre
5Jeune arbreplant-young-tree10🌳Vert d arbre jeune
6Arbre matureplant-mature-tree15🌲Vert d arbre mature
7Bosquetplant-grove20🌴Vert de bosquet
8Forêt primaireplant-primary-forest25🌳🌳Vert de forêt primaire

Seuils : 1 → 3 → 5 → 8 → 10 → 15 → 20 → 25 formulaires

Récompense XP :

Règles d éligibilité :

Source de données : table action_responses (approche indicative) - filtrée et dédupliquée par action + groupe

Logique de calcul :

          
text
eligible_forms = count distinct des paires (action_id, group_id) où status='validated' AND validated_by_admin=true ET action.status='approved' ET action.type != 'zone_propre' bonus_xp = floor(eligible_forms / 10) * 2 // un bonus par décennie

Direction visuelle :

Composants :

Tests :

État d implémentation : ✅ complet avec tests


4. Badge Clean Zones - Lieux propres validés

Objectif : récompenser la déclaration et la validation des lieux propres et des sites de pollution.

Échelle : atmosphérique / écologique - 10 paliers (Brise → Eden)

PalierNomIcôneSeuilEmojiDescription
1Brisebreeze1🌬️Brise légère, vent doux
2Horizonhorizon3🌅Là où le ciel rencontre la terre
3Azurazure5🔵Ciel bleu profond
4Auroredawn8🌄Aube rose-orange
5Zénithzenith10☀️Zénith lumineux
6Stratosphèrestratosphere15☁️Haute altitude, bleus froids
7Étherether20Atmosphère légère et éthérée
8Hélioshelios25🌟Référence solaire, teinte dorée
9Harmonieharmony30🦋Équilibre bleu-vert
10Edeneden40🌿Paradis végétal, vert profond

Seuils : 1 → 3 → 5 → 8 → 10 → 15 → 20 → 25 → 30 → 40 zones

Récompense XP :

Critères d éligibilité :

Déduplication : fusionner les résultats des deux sources en s appuyant sur une clé canonique de lieu afin d éviter tout double comptage

Garde-fou de cooldown :

Logique de calcul :

          
text
normalized_candidates = union all des lignes de trash_spotter_spots et de spots, après projection vers : canonical_place_key, source_table, source_id, status, latitude, longitude, notes, validated_at_or_cleaned_at eligible_candidates = lignes où status IN ('validated', 'cleaned') ET latitude IS NOT NULL ET longitude IS NOT NULL ET notes IS NOT NULL ET validated_at_or_cleaned_at <= now - interval '24 hours' deduped_candidates = première ligne par canonical_place_key, ordonnée d abord par validated_at_or_cleaned_at ASC, puis par priorité de source si nécessaire pour départager les égalités clean_zones_count = count(distinct canonical_place_key) per_task_xp = 1 par zone éligible (via insertion dans progression_events) bonus_xp = floor(clean_zones_count / 10) * 2 // un bonus par décennie

Direction visuelle :

Composants :

Tests :

État d implémentation : ✅ complet avec tests et cooldown


5. Infinite Badges - Progression personnelle continue

Objectif : récompenser l accumulation continue des compteurs d impact affichés dans la zone profil.

Familles :

Échelle : progression ouverte avec changement de titre, de rang, d icône et de style visuel lorsque le total augmente.

Garde-fou métier :

Source de données : table user_badge_totals - waste_kg, butts, places_count pour les trois premières familles, et calcul dérivé depuis les actions + formulaires validés pour Actions créées; pour Équilibre des contextes, la progression est reconstruite chronologiquement avec remise à zéro de chaque cycle

Direction visuelle :

Composants :

État d implémentation : ✅ complet


6. Mohs Badge - Échelle de grades pour déchets et mégots

Objectif : récompenser une accumulation longue avec une échelle minérale à 10 grades affichée dans la zone de progression personnelle.

Familles :

Échelle : progression Mohs - 10 grades de Talc à Diamant

Règle de séparation :

Sources de données :

Direction visuelle :

Composants :

État d implémentation : ✅ complet


7. Badges one-shot - Premiers jalons d'entrée

Badges uniques débloqués une seule fois, sans répétition, pour marquer les premiers seuils de contribution.

BadgeNomDéclencheurXPIcône
first_trace_utilePremière trace utilePremière action validée avec données complètes+1 XPbadge-check
trace_fondatriceTrace fondatriceMême premier jalon, version mémorielle / vitrine0 XPsparkles

Règles :

Source de données : table actions + forms validés + progression_events pour l'unicité d'attribution

État d implémentation : ✅ complet


8. Badges hérités basés sur les points

Badges de jalons simples basés sur les points cumulés dans user_points.total_points :

BadgeNomSeuilIcône
first_stepPremier pas10 points👣
contributorContributeur100 points🌱
activeActif500 points🔥
championChampion1000 points
legendLégende5000 points👑

Récompense XP : intégrée au système de points (points ≈ XP)

État d implémentation : ✅ complet


9. Règle de bonus par décennie

S applique aux badges utilisant la progression [1, 3, 5, 8, 10, 15, 20, ...] :

Quand le nombre d éléments éligibles d un utilisateur franchit un multiple de 10 (10, 20, 30...), il reçoit :

Implémentation :

          
typescript
const bonusCount = Math.floor(eligibleCount / 10); for (let i = 1; i <= bonusCount; i++) { const bonusKey = `<badge>:bonus:${i*10}`; // Vérifier si le bonus a déjà été attribué (l unicité empêche les doublons) // Si non, insérer un progression_event avec xp_base=2, xp_awarded=2 }

Appliqué à :

10. Correction historique des actions

Quand la règle Actions créées a été corrigée pour n accorder de XP qu après un formulaire validé, un backfill dédié a été prévu pour remettre l historique au bon niveau.

Ce que fait le backfill :

Commande associée :

Sécurité :


Flux de données

Table des événements de progression des badges

Toutes les attributions de XP sont enregistrées dans progression_events :

          
sql
CREATE TABLE progression_events ( id UUID PRIMARY KEY, user_id UUID NOT NULL, event_type TEXT NOT NULL, -- 'tier_unlock', 'tier_bonus', 'clean_zone_task', etc. source_table TEXT NOT NULL, -- 'action_responses', 'trash_spotter_spots', 'spots', etc. source_id TEXT NOT NULL, -- 'forms:forms-seed', 'clean-zone:clean-zones-breeze', etc. status_phase TEXT NOT NULL DEFAULT 'pending', weight INT DEFAULT 1, xp_base INT NOT NULL, xp_awarded INT NOT NULL, occurred_on DATE NOT NULL, metadata JSONB, created_at TIMESTAMP DEFAULT now(), UNIQUE(user_id, source_table, source_id) -- Empêche les doublons d XP );

L unicité empêche :

Journal d audit

Toutes les attributions de XP sont enregistrées dans xp_audit avec :

Accessible via :


Notifications en temps réel

Lorsqu un palier de badge est débloqué ou qu un bonus est attribué :

  1. Événement NOTIFY : la RPC Supabase émet notify_gamification
  2. Diffusion WebSocket : le relais diffuse l événement aux clients connectés
  3. Toast UI : le client affiche une notification de célébration avec le nom du palier et le montant XP

Structure du payload :

          
json
{ "type": "tier_unlocked" | "tier_bonus" | "clean_zone_task_awarded", "userId": "...", "tierId": "forms-seed", "threshold": 1, "xp": 1 }

Checklist d implémentation pour un nouveau badge

Pour ajouter une nouvelle famille de badges, suivre cette checklist :


Références


Dernière mise à jour : 2026-06-01 État : 4 familles de badges implémentées, 5 badges hérités basés sur les points actifs