Répare les user.householdId manquants quand le UID est toujours listé dans households.members.
🔨 Reconstruire memberDetails
Réécrit households.memberDetails à partir de members[] et des user docs frais. Fix les foyers qui apparaissent vides dans l'app alors que les UIDs sont listés.
🛡️ Recompute mirror memberAdBonusSlots (v618)
Recalcule households.memberAdBonusSlots = somme des slots membre des users du foyer. Migration one-shot pour réparer les désyncs antérieures aux fix v618 (leave/kick/refund qui ne décrémentaient pas le mirror).
💡 Clique sur une colonne pour trier (re-clique pour inverser).
Nom
Email
Foyer
XP
Niveau
Version
Premium
Inscrit le
Actions
-
Inscrits aujourd'hui
-
Inscrits cette semaine
-
Actifs cette semaine
-
Tâches complétées (semaine)
Inscription par méthode
Utilisateurs par pays
🏆 Top 10 XP
🏠 Plus gros foyers
📊 Répartition par niveau
📈 Foyers
⚠️ Utilisateurs sans foyer
🕐 Dernières inscriptions
📊 Données B2B — Insights vendables
-
Tâches moy. / utilisateur
-
XP moyen
-
Rétention (actifs/inscrits)
-
Taille moy. foyer
👥 Utilisateurs par tranche d'âge
🎯 Efficacité par tranche d'âge (XP moy.)
⚧ Répartition par sexe
⚡ Efficacité par sexe (XP moy. & tâches)
🏷️ Catégories de tâches les plus actives
📈 Engagement (tâches complétées moy.)
📅 Croissance utilisateurs (par semaine)
🌍 Répartition géographique
🕐 Heures les plus actives (inscriptions)
📋 Synthèse chiffrée
📱 Gestion des versions
Les utilisateurs avec une version inférieure à "Dernière version" verront un popup "Mise à jour disponible". Ceux en dessous de "Version minimum" verront "Mise à jour requise" (impossible de fermer). Les valeurs sont séparées par plateforme : Android est sur Play Store (quasi-instantané), iOS doit passer par Apple review (24–48h), donc ils peuvent être désynchronisés.
🤖 Android
🍎 iOS
📣 Annoncer une mise à jour
Crée une pop-up in-app pour prévenir les testeurs qu'une nouvelle version est dispo. Utile entre l'upload et la validation Apple/Google (les pop-ups version automatiques ne s'activent qu'après validation officielle). Tu peux éditer le contenu après création dans l'onglet 📣 Annonces.
🍎 iOS (TestFlight)
Crée une annonce qui invite à ouvrir TestFlight pour récupérer la dernière version.
🤖 Android (Play Store)
Crée une annonce qui invite à ouvrir le Play Store pour récupérer la dernière version (Closed Test ou Open Beta).
📣 Envoyer une notification ponctuelle
Si tu cibles "iOS uniquement", l'app Android filtrera la notification (ne s'affichera pas). Marche dès la v1.0.345+456+ (filter platforms côté Flutter).
HISTORIQUE DES NOTIFICATIONS
Titre
Message
Cible
Date
Type
Testeur
Message
Source
Date
Plateforme
Nom
Email
Langue
Statut
Mail envoyé
Inscrit le
Actions
📌 Source de vérité : le code. Cette page reflète l'état des fichiers
lib/config/game_config.dart, lib/config/premium_config.dart,
lib/providers/premium_providers.dart et lib/services/equity_service.dart.
Si une règle change dans le code, mettre à jour cette page à la main.
Synthèse de la session du 25 avril 2026 : audit collectif 25 agents (10 round 1 + 5 critiques + 10 panel client),
+ 100 personae fictifs votant l'offre tarifaire, + audit complet du leader Sweepy.
Chantier
AVANT
APRÈS v1.0.263
Carte « Charge mentale : pense vs fait »
Affichait 0 % pour TOUS les membres (formule comptait tasks.where(createdAt > weekStart) → 0 si tâches setup il y a longtemps)
Compte les complétions de la semaine indexées par task.createdBy. Camille passe de 0 % → 86 % Pense.
Card Eqwity dernière complétion
« Foyer · il y a 2j » (parité Lavande absente)
« Foyer · fait par Sophie · il y a 2j » — bilingue FR/EN, gère pending (⏳)
Calendrier historique par tâche
Aucune vue calendrier des complétions passées
Nouveau screen TaskHistoryCalendarScreen accessible depuis le dialog one-tap. 6 mois en arrière. Pastilles couleur par membre. Badge ×N pour multi-validations/jour. Bottom sheet détail au tap. Adaptatif Eqwity ↔ Lavande.
Légende membres calendrier
Uniquement en bas du calendrier (devait remonter pour la voir)
Pill compacte sous stats + intercalée entre chaque mois, avec counts par mois affiché (pas all-time).
Em-dashes "—" user-visible
14 occurrences dans home, équité, mode aveugle, sprint live, bilan
Tous remplacés par ., ,, · ou () (« ça fait IA » selon Charly).
Bouton qui force le save + marque sharedAt. Cloud Function onWeeklyReviewShare déployée → notif FCM aux autres membres.
Accès facile au bilan hebdo
Uniquement dimanche 20h auto-pop ou via Settings
Chip 📅 permanent dans header Eqwity (à côté du streak 🔥).
Sous-scores Pensée + Régularité (Stats)
N'existaient pas
2 mini-anneaux affichés en bêta sous le score d'équité. Theil + entropie Shannon. Voir docs/EQUITY_EXTENDED_v1.md.
Orthographe carte Charge mentale
« Qui pense aux tâches (les crée) vs qui les fait. quelqu'un d'autre pense les tâches »
« Qui pensent aux tâches (les créent) vs qui les font. quelqu'un d'autre pense aux tâches »
Dialog info équité (formule)
« calculé sur les XP gagnés cette semaine » (formule obsolète)
« Coefficient de Gini, pondéré par durée × difficulté » + 4 paliers (≥80 / 60-80 / 40-60 / <40)
Centralisation contexte session-persistante
Charly devait re-briefer Claude à chaque compaction de conversation
Nouveau CLAUDE.md à la racine du projet (lu auto à chaque session) + docs/BUSINESS.md (stratégie) + BACKLOG.md mis à jour.
🎯 Décision stratégique majeure (25/04/2026) : pivot vers modèle freemium massif + ads
au lieu d'un sub premium classique. Voir onglet 🎯 Stratégie & Marché.
🌱 Refonte UX anti-conflit couple — v1.0.253
Synthèse de 10 audits experts indépendants sur le risque que l'app alimente les conflits conjugaux (thérapeute couple Gottman, médiateur CNV, psy cognitif,
UX gamification, coach parental, anthropologue, philosophe Goodhart, sociologue genre, économiste comportementale, avocate famille).
Principe directeur conforme au slogan "rendre visible l'invisible" : on garde la visibilité (c'est le cœur de l'app)
mais on change la tonalité. Pas de podium inter-conjoints, pas d'accusation, reconnaissance de la charge cognitive.
Chantier
AVANT
APRÈS v1.0.253
Labels bonus/malus
"🦸 Sauvetage +50 %" — suppose que l'autre est en perdition
Logique de tri/filtre dupliquée dans 3 écrans — divergences silencieuses entre Eqwity et Lavande
4 nouveaux providers partagés (taskGrouping, taskFiltering, taskStats, uiState). Règle d'or : aucun .where() / .sort() sur tasks dans un widget.
🔜 À venir (v2) : rituel dimanche soir (bilan 5 min à 2), onboarding choix du modèle conjugal (symétrique / complémentaire / réseau élargi), baseline INSEE au setup, phrase socratique Goodhart, bouton repair après malus, gel probatoire export >90 jours post-départ.
6 changements issus de 4 audits croisés (économiste, sociologue, UX, ingénieur).
Toutes les règles sont documentées dans les sections ci-dessous.
Règle
AVANT (v1.0.250)
APRÈS (v1.0.251)
Formule XP (création custom)
2 formules parallèles : baseXp(difficulty) × categoryMult × durationMult à la création, XpCalculator.calculateXp(cooldown) à l'édition. L'XP pouvait changer au ré-enregistrement.
Unique XpCalculator.calculateXp(cooldown, duration, difficulty). Les 2 screens (V1 + Lavande) pointent vers la même source.
Équité
100 − (déviation_abs / effort × 50). Non Pigou-Dalton compliant. Exemple 80/20 : score ≈ 70/100 (faussement « OK »).
Dates comparées en DateTime.now() local. Un vol / changement de TZ faisait « sauter » ou reset le streak.
Dates normalisées en UTC avant comparaison. Streak stable peu importe le fuseau.
scheduledDays + late/overdue
Tâche « Sport lun/mer/ven » validée un mardi → calcul de retard sur l'heure du jour même → pénalité injuste (−50 %).
Si le jour de validation n'est pas dans scheduledDays, on skip la logique late/overdue (mult = 1.0).
Plafond XP / catégorie / jour
Aucun plafond. Fractionner une tâche en 3 sous-tâches permettait de tripler l'XP (exploit UX agent).
Si ≥ 150 XP déjà gagnés aujourd'hui dans la même catégorie, les complétions suivantes sont ×0.5.
CPE owner (Rodsky)
Aucune distinction entre un user qui « porte » une tâche de A à Z vs un exécutant ponctuel. Charge cognitive invisible non reconnue.
Champ isCpeOwner sur Task. Si créateur = doer et isCpeOwner=true → ×1.3 « 🧠 CPE +30 % ». Préparation vision v2 : anticipation XP au créateur.
🙏 Audits croisés : économiste (Gini/Atkinson), sociologue (Daminger/Rodsky/Walzer), UX product (anti-gaming), ingénieur (dette technique).
Convergence sur la formule opaque, divergence sur « simplifier » (UX) vs « enrichir cognitivement » (socio) → arbitrage au cas par cas.
📦 Tâches — paramètres de base
Cooldown par défaut
7 jours
Options cooldown
1 · 2 · 3 · 5 · 7 · 14 · 30 jours (récurrence max 365j via stepper)
09:00 (fuseau Paris CET/CEST dynamique via Cloud Function)
Rappel avant échéance
1h
Fenêtre de rappel après heure prévue
3h max (après, plus de notif)
Fréquence max par tâche
1 notif / 24h (anti-harcèlement)
🏆 Jalons achievements
Complétions
10 · 50 · 100 · 500 · 1000
XP total
500 · 1 000 · 2 000 · 5 000 · 10 000
Niveaux
5 · 10 · 25 · 50 · 100
✅ XP par niveau : 400 XP (unifié v1.0.249)
Source de vérité unique : XpConfig.xpPerLevel = 400 dans lib/config/game_config.dart.
Tous les calculs de niveau passent par XpConfig.calculateLevel(totalXp).
🎮 XP de base par tâche (3 facteurs combinés)
Le user ne peut PAS choisir l'XP d'une tâche — calculé automatiquement via
lib/config/premium_config.dart::XpCalculator.calculateXp(cooldown, duration).
Appliqué par participant au moment de la complétion via
tasks_notifier._computeAwardFor. Les multiplicateurs se cumulent sur xpBase.
Quand tu fais TA propre tâche
Situation
×
Label user
À l'heure
×1.0
—
Late (> durée après heure prévue)
×0.75
« Retard −25 % »
Overdue (> 3h après heure prévue)
×0.5
« Retard −50 % »
Quand tu fais la tâche d'un AUTRE
Situation
×
Label user
Tâche normale (pas en retard)
×1.2
« Entraide +20 % »
Tâche overdue du coéquipier
×1.5
« 🦸 Sauvetage +50 % »
Plafond XP / catégorie / jour (v1.0.251)
Si ≥ 150 XP gagnés aujourd'hui dans la même catégorie
×0.5
« Plafond catégorie −50 % »
Anti-fractionnement : bloque l'exploit « découper une tâche en 3 sous-tâches pour tripler l'XP ».
Bonus CPE owner — Rodsky Fair Play (v1.0.251)
Créateur valide sa propre tâche taggée isCpeOwner
×1.3
« 🧠 CPE +30 % »
Reconnaît la charge cognitive de celui qui « porte » le dossier de A à Z (anticipation, monitoring).
Heure prévue = task.scheduledTime de la journée courante.
Overdue = heure prévue + 3h dépassée.
scheduledDays : si le jour de validation n'est pas un jour planifié, on skip les pénalités late/overdue (v1.0.251, avant : pénalité injuste).
Les multiplicateurs sont cumulés par-participant (A assignee × late, B helper, etc.).
🧠 Charge mentale — qui PENSE vs qui FAIT
Widget lib/widgets/stats/household_tab.dart:846+. Deux barres par adulte actif :
Pense% (créations de tâche) vs Fait% (validations).
L'écart est la charge mentale portée.
Formule Pense%
Fenêtre hybride
40% semaine + 40% mois + 20% all-time
Prorata joinedAt
×(days/30), clamp [0, 1]. Nouveau membre moins pénalisé.
Dénominateur
Tâches créées par adultes actifs (exclusion vacationMode et enfants)
Formule Fait%
Dénominateur
Toutes les validations de la semaine (inclut enfants)
Exclusion
Phantom completions (bonus charge mentale) filtrées en amont
Source : Daminger 2019 (ASR) — The Cognitive Dimension of Household Labor.
La charge mentale se décompose en 4 phases (anticipation, identification, décision, monitoring).
Le proxy "créateur = pense" capture surtout identification + décision ; anticipation et monitoring restent invisibles.
⚖️ Équité du foyer (0–100)
Service lib/services/equity_service.dart. Score composite [0, 100].
Pondération effort par complétion = durée × difficulté, capée à 10 (v1.0.250)
Durée tâche
×
< 10 min
×1.0
10–30 min
×2.0
31–60 min
×3.0
> 60 min
×5.0
Difficulté
×
easy
×1.0
medium
×1.5
hard
×2.0
epic
×3.0
Cap à 10 (v1.0.250, inspiré Atkinson 1970/Gini) : sans cap, le produit max était 5 × 3 = 15,
une seule tâche "epic > 60 min" pouvait faire basculer l'équité d'un foyer avec 20 tâches normales.
Eurostat HETUS — standards européens des time-use surveys
🔜 Pistes académiques non implémentées (à évaluer)
Exposition effective
Diviser par active_days (jours où le user a eu ≥1 action) au lieu de jours calendaires depuis joinedAt. Corrige les absences (voyage, maladie). Source : INSEE 2010.
Gini complet
Remplacer la déviation à la moyenne par 100 × (1 − Gini(efforts)). Plus robuste. Chantier : 2-3h de refactor. Source : Atkinson 1970.
Cognitive tagging
Ajouter un champ cognitive_type (routine / planning / anticipation / monitoring) avec mult ×1.5 à ×2. Coût UX : users doivent cocher un tag en plus. Source : Daminger 2019.
🧪 Flags bêta (à désactiver avant release publique)
kBetaMode
true — tout le monde Premium gratuit
kForceFreeUids
Whitelist d'UIDs forcés en free malgré kBetaMode (pour tester les flows gratuits)
Pivot stratégique : freemium massif + monétisation pub, au lieu d'un sub premium classique.
Rationale : volume >> ARPU dans une app de couple (besoin de TOUS les membres pour mesurer la charge mentale).
Tier
Prix
Inclus
GRATUIT
0 €
TOUT débloqué + bannière + 1 interstitial/jour max + rewarded ads optionnelles
PREMIUM
1,99 €/mois · 9,99 €/an · 19,99 € lifetime
Tout pareil sans aucune publicité. Pas de gate de feature.
Projection 10 000 users : ~87 000 €/an (vs ~12 500 € en sub-only à 5 % conversion). Pari volume.
eCPM réalistes FR/EU : bannière 0,50-1,50 € · interstitial 5-15 € · rewarded 8-20 €.
ARPU pub estimé 11-18 €/an par user actif. CPI tolérable jusqu'à ~5 €.
🔬 Audit du leader Sweepy (avril 2026)
Métrique
Sweepy
Téléchargements cumulés
2,1 M (AppBrain)
Foyers actifs
> 1 M revendiqués
MRR
~40 000 $ confirmé Indie Hackers
ARR
~480 k$
Note App Store
4,7★ FR · 4,53★ Android
Cible primaire
Familles avec enfants 30-45 ans · 86 % utilisatrices femmes
Modèle
Free 1 user · Premium 2,99 €/mois ou 17,99 €/an (-50 %) · Trial 3-7j · Paywall 2e membre
Top 5 plaintes (à exploiter)
Pas de coche rétroactive — « L'app ne remarque plus si je rate un jour »
Reset minuit brutal — « Je voudrais choisir l'heure »
Système de points trop grossier (pelleter 1h = 3 pts, interrupteur = 1 pt)
Paywall famille = anti-couple — « Chaque membre doit créer un compte différent »
Sync Watch/iPad/iPhone cassée + bugs Apple ID
Failles exploitables par Eqwity
Manager problem (MIT) : Sweepy fait de la femme la PM qui délègue → vendre équité auto sans nag
Shame des barres rouges → notre anti-shame UX = différenciateur
Pseudonymisation des complétions / courses / tâches partagées
Suppression des récompenses, enfants virtuels, tokens FCM
Retrait du foyer + transfert d'ownership si nécessaire
Suppression du profil + compte Firebase Auth
Cible :
➕ Nouvelle inscription beta
Crée une inscription sans que la personne passe par le formulaire public. Idéal pour les demandes reçues en DM, par mail, ou lors d'un événement.
🪪 Customer 360
État complet du user d'après Firestore (lecture seule).
🎫 Nouveau ticket
Crée un ticket support pour ce user.
💬 Échanges & notes
-
Ouverts
-
En cours
-
Urgents
-
Total tickets
📭
Aucun ticket pour ce filtre.
Quand tu reçois un mail support, clique sur ➕ Nouveau ticket pour le tracker ici.
📊 Activité des foyers
Mesure basée sur les complétions réelles. Cliquer "Recharger" pour refresh (calcul lourd, lit toutes les complétions de tous les foyers).
-
Foyers actifs 24h
-
Foyers actifs 7j
-
Foyers actifs 30j
-
Complétions 24h
-
Complétions 7j
🏆 Top 20 foyers par activité 7j
🛡️ Journal d'audit admin
Toutes les actions sensibles des super-admins sont loguées dans admin_action_log/ par les Cloud Functions (togglePremium, purgeUser, ...). Lecture super-admin uniquement.