Changelog
Changements notables sur Me&New. Format : Keep a Changelog.
Les onglets Spaces, Match et Profil renvoyaient « Session expirée » pour les utilisateurs dont le nom contenait un +. Cause racine : parse_qsl() décodait le + comme un espace, ce qui produisait un mismatch HMAC avec l'implémentation de référence Telegram. Remplacé par un parser manuel strict. On a aussi introduit des tokens de session pour que la Mini App ne renvoie plus l'initData brut à chaque requête.
Fixed
- Parser HMAC — remplacement de
parse_qsl() par un split manuel basé sur unquote() conforme à la spec Telegram. La vérif passe désormais pour tous les pseudos, y compris ceux avec un +.
- Logs de diagnostic — chaque 403 de
verify_init_data log un WARNING avec la raison précise (mismatch de hash avec les 8 premiers chars, auth_date expiré, mismatch user_id) au lieu d'échouer en silence.
Added
- Auth par token de session —
POST /rag/miniapp/auth échange l'initData brut contre un token de session de 6h stocké dans state_store. Tous les endpoints Mini App authentifiés acceptent soit le token, soit l'initData brut.
GET /rag/miniapp/ping — check d'auth léger au boot. Un 403 fait remonter un seul overlay d'erreur global plutôt que des messages « session expirée » par onglet.
Le bot avait 14 slash commands et zéro navigation in-chat. On a ajouté une barre du bas sticky à 3 boutons et remplacé la grille /help chargée par une palette de commandes contextuelle.
Added
- Reply keyboard persistant —
[🔥 Match] [📣 Post] [⚙️] épinglé au-dessus du champ de saisie pour tous les utilisateurs ayant terminé l'onboarding (is_persistent=True).
- Menu ⚙️ redessiné — header contextuel avec space actif, nombre de sessions en attente, et boutons inline par sections (Quick / Settings / More).
- Toggle de langue dans le menu — bascule FR↔EN sur place sans quitter le menu.
Changed
- Liste des slash commands réduite 14 → 6 — on garde
/start, /post, /profile, /sessions, /spaces, /help. Les commandes moins utilisées restent accessibles via le menu ⚙️.
Un post en français de Marie arrive maintenant en français dans le DM de chaque francophone et en anglais dans celui de chaque anglophone. Mis en cache : un appel LLM par langue cible, amorti sur tous les destinataires de la même langue.
Added
- Service de traduction — détection EN/FR heuristique (sans LLM, sans IO) + cache en base indexé sur
(sha256(text)[:32], target_lang). Le cache expire après 30 jours.
- Bouton 🔤 Voir l'original — ajouté à tous les DM de broadcast traduits. Un tap révèle le texte non traduit de l'expéditeur.
POST /rag/translate — endpoint réservé au bot, protégé par X-Bot-Secret.
Changed
- Le fan-out de broadcast appelle désormais la traduction par destinataire quand
recipient_lang ≠ sender_lang. Même logique appliquée aux annonces d'organizers.
Cinq fixes ciblés issus d'un audit hands-on du bot. L'onboarding conversationnel devient le défaut, la voix de /reset réécrite, fuite EN dans le flow d'annulation corrigée, onglet Rankings retiré.
Fixed
- Fuite EN dans le path d'annulation de
/reset — c'était hardcodé en anglais quelle que soit la langue de l'utilisateur. On résout maintenant la langue stockée et on utilise la bonne clé de copy.
- Copy de
/reset réécrit en voix SMS-native pour EN et FR.
- Le reset envoie maintenant un vrai DM de confirmation après le wipe de 30 s (les edits ne déclenchent pas de push notifs ; un nouveau message si).
Changed
- L'onboarding conversationnel Nova passe par défaut à
True. L'ancien formulaire 8 questions devient le fallback NOVA_CONVERSATIONAL_ONBOARDING=false.
- Les réponses de l'agent LangGraph incluent désormais une directive de langue pour que toutes les réponses arrivent dans la langue stockée de l'utilisateur.
Removed
- Onglet Rankings — les classements anonymisés « Builder #1 » ne délivrent aucun signal social. La Mini App fait maintenant 4 onglets : Profile · Sessions · Spaces · Match.
L'onglet Explore anonymisé est remplacé par un swipe deck façon Tinder. Les right-swipes mutuels créent automatiquement une proposition de meetup — les deux parties reçoivent le DM standard accept/decline via le pipeline de notifications existant.
Added
- Builder Match — swipe deck avec photo, prénom et un « currently building » sur une ligne. Geste de drag pointer-driven + boutons d'action au tap.
- Modal de match mutuel — overlay de célébration quand les deux utilisateurs se right-swipent.
- Cap quotidien — 10 swipes par utilisateur, reset à minuit UTC. Badge compteur dans le header.
- Scopé au space — affiche les membres actifs du space courant ; fallback sur le pool global découvrable.
- Anti-features : pas de vue « les gens qui t'ont liké », pas de super-likes, pas de paliers payants, pas de découverte cross-space en v1.
Cinq gros moves : voix directe du bot (plus de persona proxy), onboarding activation-first (poste avant d'avoir terminé), découverte de Spaces dans la Mini App, roulette de sérendipité hebdo, et le début du feature set actuel.
Added
- Navigateur de Spaces — parcours tous les spaces découvrables avec badges live/à venir/archivés, nombre de membres et join en un tap.
- Onboarding activation-first — le bot t'ouvre avec un vrai post du space et te demande d'écrire le tien. Ta première action part à ~15 builders avant la fin de l'onboarding.
- Roulette hebdo — dimanche 18h00 UTC, le poller pair chaque utilisateur actif de chaque space avec un peer aléatoire qu'il n'a pas encore rencontré. Dédup des paires sur 90 jours, bouton skip sur chaque pairing.
- Voix directe du bot — on a retiré le framing du persona intermédiaire « Nova ». Le bot parle directement et de façon concise.