You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Issue épinglée de triage. Le mode CODE y dépose en commentaire ce qu'il découvre hors du périmètre de son ticket : bugs, dette, idées, questions de design. Le mode MANAGER en fait des tickets et répond → #N sous chaque commentaire traité.
Ilan y dépose aussi ses retours de recette, un par commentaire : l'écran (E-xx), ce qui ne va pas, ce qu'il attend, une capture si possible. MANAGER les traite comme les autres ; en mode ITERATION, un retour simple peut être corrigé directement.
Format d'un commentaire : contexte (ticket ou PR d'origine), constat, proposition éventuelle.
Écrit par MANAGER le 2026-10-20 vers 18 h, pour une reprise à froid après plusieurs semaines. Tout ce qui suit est vérifiable sur le dépôt ; l'avancement fait foi dans le Project « Widoo — MVP » (vues Board, Roadmap, Backlog).
a. Livré et fusionné depuis le 2026-10-16
Toutes ces PR sont fusionnées en rebase and merge ; leurs 15 tickets sont fermés et en À déployer dans le Project (aucun encore en Terminés : le staging est déployé mais pas vérifié écran par écran).
Ticket
PR
Fusion
#43 — Mes parcours : À venir, Favoris, Passés, Créés (E-08)
Découvertes en mode CODE pendant #16 (PR #86), hors périmètre du ticket :
scripts/sync-project.sh remet en « Prêts » les tickets en cours. La règle « issue ouverte + status:ready → Prêts » ne regarde que le label, que CODE ne retire pas. Un ticket passé « En cours » ou « À review » par CODE revient donc à « Prêts » au prochain lancement du script en début de session MANAGER. Piste : ne poser « Prêts » que si le statut courant est vide, « Cadrage » ou « Prêts ».
pnpm/action-setup@v4 dans .github/workflows/ci.yml bloque le passage à pnpm 11. L'action ne gère pnpm 11 qu'à partir de sa v6. Le socle est donc fixé en pnpm 10.34 (avec minimumReleaseAge: 1440). Monter l'action en v6 (PR area:process, ou Dependabot github-actions) permettra de passer à pnpm 11.
Découvertes de #17 (PR #87 et #88), pour l'alignement du wiki :
Page API, card de recherche : « author … ou « Widoo » pour un parcours officiel ». Le schéma RouteCard envoie author: null avec isOfficial: true, parce qu'un libellé affiché ne doit pas transiter comme donnée. À refléter dans la page.
Libellés absents du tableau Taxonomie (Filtres-et-Recherche) : catégories de lieu, statuts de parcours et de vérification, motifs de signalement, rôles, fournisseurs de réservation. Ils sont proposés dans packages/shared/src/labels/fr.ts (feat(shared): taxonomies, libellés français et seuils des buckets #87), en partie rédigés par l'agent. Ilan doit les valider, puis la page doit les lister.
Contradiction sur conditions : Filtres-et-Recherche indique OU dans le groupe Conditions, alors que Modele-de-Donnees (requête centrale) utilise @>, soit toutes les conditions demandées. Il faut trancher avant le ticket de recherche.
reason de la card (« À 600 m », « Très bien noté ») : il faut des codes et leurs libellés, pas une phrase envoyée par l'API. Non défini dans le wiki, donc laissé hors de RouteCard. De même pour effort (easy, moderate, intense) et les libellés du tri.
Arrondissement et quartier sur la card (E-01) : la source des données n'est pas précisée dans Modele-de-Donnees. Adresse de la première étape ?
Découvertes de #18 (PR #89, #90, #91), hors périmètre du ticket :
Déploiement Cloud Run : renseigner TRUST_PROXY (ticket de déploiement staging). La limitation de débit compte par IP cliente ; derrière le front-end Google, X-Forwarded-For n'est lu que si le pair direct figure dans TRUST_PROXY (IP, CIDR ou linklocal…). Fastify 5.12 a supprimé la confiance par nombre de sauts, usurpable. Sans cette variable, tous les clients partagent la même clé et la limite de 1 000/min devient globale. Proposition : constater l'adresse du pair au premier déploiement staging, puis fixer la variable dans la configuration Cloud Run. Autre point : le compteur est en mémoire, donc par instance.
Sonde de démarrage Cloud Run : GET /v1/health répond 503 quand la base est injoignable (utile au monitoring). Si on en fait la sonde de démarrage ou de vivacité, une panne de base fait redémarrer les instances en boucle. Proposition : garder la sonde TCP par défaut, ou demander une route de vivacité sans base dans le ticket de déploiement.
Image de base Docker épinglée par tag (node:22-bookworm-slim, infra/api.Dockerfile). Proposition : épinglage par digest et Dependabot docker (et github-actions, voir le point 2 du commentaire de Initialiser le monorepo pnpm + Turborepo avec lint, types et tests #16) dans une PR area:process.
Alignement du wiki, page API (DESIGN) :
format de details d'un validation_error : details.issues[] = { location: body|querystring|params|headers, path: "steps.0.placeId", code, message } (ValidationIssue dans @widoo/shared) ;
message des erreurs en anglais, message technique : l'app affiche un libellé français choisi d'après code ;
GET /health (200 ok/up, 503 degraded/down) absente de la page ;
forme de GET /config : { minAppVersion, taxonomies, labels: { fr }, thresholds } (schéma AppConfig de shared), minAppVersion pris dans la variable MIN_APP_VERSION tant que la table settings n'est pas lue.
Découvertes de CODE pendant #19 (modèle de données, PR #92, #93, #94) :
Pour DESIGN — aligner Modele-de-Donnees sur le schéma livré (apps/api/src/db/schema.ts, #93) :
places.price_range (free, low, medium, high) n'avait pas de taxonomie dans shared : ajoutée (priceRanges), libellés rédigés par CODE, à valider par Ilan : « Gratuit », « Bon marché », « Prix moyen », « Haut de gamme ». Le tableau Taxonomie de Filtres-et-Recherche ne la mentionne pas.
place_hours a une colonne id (plusieurs créneaux par jour, pas de clé naturelle) ; settings a updated_at.
Valeurs par défaut choisies, absentes du wiki : routes.status = draft, access = free, transport = walk, cities.is_active = false, users.is_public = true, trust_score = 1 ; places.verification_status sans défaut (qui crée un lieu dit s'il est vérifié).
routes.author_id, places.created_by, media.uploaded_by passent à null à la purge d'un compte : que devient un parcours publié dont l'auteur est purgé (reste publié sans auteur, dépublié) ? Règle à écrire dans Securite-et-RGPD ou Creation-et-Moderation.
UUID v7 générés par l'API, pas par Postgres 16 (pas de uuidv7() avant Postgres 18).
Pour MANAGER :
Paris en production : db:seed est refusé avec NODE_ENV=production (il insère des lieux et un parcours fictifs). La ville elle-même devra être créée en production autrement (migration de données ou admin) avant le lancement : pas de ticket aujourd'hui.
Cloud SQL (Déployer l'API en staging sur GCP : Cloud SQL, Cloud Run, Secret Manager #24) : la migration 0000_extensions fait CREATE EXTENSION IF NOT EXISTS postgis et pg_trgm ; l'utilisateur qui lance node dist/migrate.js doit avoir le rôle cloudsqlsuperuser (ou les extensions créées au provisionnement).
Emprise d'un parcours à une seule étape : routes.bounds devient un polygone de surface nulle, que PostGIS stocke et que ST_Intersects trouve, mais qu'il déclare invalide. À traiter par le calcul d'emprise de l'orchestration (petite marge autour des étapes).
Alerte de dépendance modérée : drizzle-kit (dev) → @esbuild-kit/esm-loader → esbuild 0.18.20, GHSA-67mh-4wv8-2f99 (serveur de développement d'esbuild). Sans impact : ce serveur n'est jamais lancé et le paquet n'est pas dans l'image. Non bloquant selon SECURITY.md ; à suivre en dette si souhaité (disparaît avec drizzle-kit 1.0).
Purge des comptes supprimés (MANAGER, ticket à créer) : DELETE /v1/me fait un soft delete avec anonymisation. Il manque la tâche planifiée (Cloud Scheduler → endpoint interne protégé par un jeton de service) qui supprimera :
les lignes users dont deleted_at date de plus de 30 jours (routes.author_id, places.created_by et media.uploaded_by passent alors à null) ;
leurs favoris, programmations et signaux, quand ces tables existeront ;
l'avatar stocké.
Suppression du compte Firebase (décision d'Ilan). Deux options :
l'app, avec user.delete() après une ré-authentification récente, plus la révocation Sign in with Apple exigée par Apple ;
l'API, avec deleteUser de firebase-admin, ce qui demande le rôle IAM « Firebase Authentication Admin » pour le compte de service Cloud Run.
Tant qu'aucun des deux ne le fait, un utilisateur qui se reconnecte avec le même compte Firebase avant la purge reçoit 401 « Account deleted ».
mode de DELETE /me (page wiki API : anonymiser ou supprimer ses parcours publiés) : non implémenté. À ticketer avec la création de parcours.
Avatar (DESIGN puis MANAGER) : PATCH /me n'accepte que le retrait (null). Poser un avatar suppose le pipeline d'upload (URL signée, réencodage) ; aujourd'hui, media.owner_type n'a pas de valeur user. Par ailleurs, @google-cloud/storage est exclu par ignoredOptionalDependencies (pnpm-workspace.yaml) : il faudra le déclarer explicitement dans apps/api avec le ticket d'upload.
Hiérarchie des rôles (DESIGN, wiki Compte-et-Monetisation) : implémentée avec admin qui détient tous les rôles, et editor et moderator distincts, aucun n'impliquant l'autre. À confirmer et à écrire dans le wiki.
Préférences de notification (DESIGN, E-09) : clés proposées plannedRouteReminders, creatorPush et creatorEmail, vraies par défaut. À valider avec la maquette.
Wiki Securite-et-RGPD (DESIGN) : le tableau des durées indique « vie du compte + 30 jours » pour l'e-mail, le prénom et l'avatar. L'implémentation les efface dès la suppression et ne garde que l'uid Firebase jusqu'à la purge. Aligner le tableau.
GET /me : les compteurs du mois et les limites (page wiki API) seront à ajouter avec les tickets des favoris et de la programmation.
Déploiement (Ilan ou Paul) : FIREBASE_PROJECT_ID est désormais obligatoire pour démarrer l'API ; staging et production ont chacun le leur. FIREBASE_AUTH_EMULATOR_HOST ne doit jamais être défini hors local : il est refusé en production.
Hauteur de ligne et texte à 150 % sur Android (Direction-Artistique › Accessibilité) : Android 14 agrandit les grands textes de façon non linéaire. Un lineHeight fixé dans le thème grandit moins vite que la taille de police : le jambage du « g » de « Configuration » était rogné à 150 %. Le thème de l'app n'impose donc plus de hauteur de ligne (feat(mobile): thème de l'app et barre d'onglets E-01 #100). Règle à ajouter aux « règles pour le code » : pas de lineHeight fixe sur un texte qui suit la taille système.
Icônes de la barre d'onglets sur Android : la maquette E-01 montre des icônes pleines. L'app utilise les SF Symbols pleins sur iOS, mais les Material Symbols d'Android (expo-symbols) n'existent qu'en contour. À valider, ou prévoir des icônes maison dans le design system (Mettre à jour Direction-Artistique et le design system Widoo selon D-003 #81).
Accent chaud et fond : l'app suit D-003, donc fond blanc pur et accent corail #F2592A (favori, Gastronomie), utilisé seulement pour des icônes et des composants (3,4:1 sur blanc, jamais du texte). Direction-Artistique indique encore « Fond #FAF9F6 » et « accent à définir » : déjà couvert par Mettre à jour Direction-Artistique et le design system Widoo selon D-003 #81, à confirmer à cette occasion.
Pour MANAGER
4. La barre d'onglets est dans le flux, sous l'écran : il faudra la faire flotter au-dessus de la carte et de la sheet, comme sur la maquette E-01. À prévoir dans #26 ou #28, avec une marge basse pour le contenu.
5. EAS, pour Ilan ou Paul :
identifiant app.widoo à valider avant la première publication. Une variante app.widoo.preview permettrait d'installer recette et production côte à côte.
Mises à jour OTA : eas.json déclare les canaux staging et production (Architecture-Technique), mais expo-updates n'est pas installé et demande le projectId. Ticket à créer.
Détection du compte supprimé : le client (feat(shared): client API typé dans packages/api-client #98) reconnaît le 401 « Account deleted » à son message. Un code d'erreur distinct, ou une constante partagée dans shared utilisée par l'API et le client, serait plus robuste. Petite PR API + shared.
Alertes de dépendance moyennes apportées par Expo, non bloquantes selon SECURITY.md :
decode-uri-component ≤ 0.4.2, via expo-router > query-string : déni de service sur une URL malformée ; un lien profond piégé pourrait figer l'app, sans accès ni donnée ;
uuid < 11.1.1, via @expo/config-plugins > xcode : outil de build seulement.
À suivre en dette si souhaité ; à revérifier avec le SDK 58.
Le dépôt est public (gh repo view : visibility: PUBLIC), alors que CLAUDE.md le décrit comme « Dépôt privé ». À confirmer. S'il reste public, vérifier dans Settings › Actions, que je ne peux pas lire (403) : « Workflow permissions » en lecture seule, et approbation des workflows lancés par des contributeurs externes.
Pour MANAGER
3. Build EAS preview sur main : la page wiki Architecture-Technique › Qualité l'annonce (« build EAS preview sur main »), mais il n'est pas dans ci.yml ni dans #23. Il dépend de eas init et des variables EAS (voir les découvertes de #21, point 5). Ticket à créer.
4. Une PR qui modifie .github/workflows/ci.yml ne lance pas son propre job Lint, types, tests. L'étape Detect code to verify classe tout .github/ en process et répond vert sans rien lancer : une erreur dans une étape pnpm de ci.yml ne se verrait qu'à la PR de code suivante. Piste : compter .github/workflows/ comme du code dans ce filtre. Petite PR area:process.
Découvertes de CODE pendant #22 (PostHog et Sentry avec consentement) :
DESIGN — aucune maquette de bannière de consentement.Ecrans n'a pas d'écran pour le consentement. #107 livre une bannière sobre avec les composants existants :
titre « Mesure d'audience », texte d'information, « Refuser » et « Accepter » au même poids ;
posée au-dessus de la barre d'onglets, texte défilant au-delà de 60 % de l'écran.
À maquetter et à identifier (nouvel écran ou état de E-01), textes compris.
DESIGN / RGPD — aucun endroit pour changer d'avis. E-09 (Profil et réglages) ne prévoit pas d'entrée « Mesure d'audience » ou « Confidentialité ». Le retrait du consentement doit être aussi simple que son recueil. Le code sait déjà le faire (consent.set('denied') : arrêt de PostHog et effacement de son identifiant) ; il manque l'écran. À prévoir avant la soumission aux stores.
La page garde view_switched (bascule carte / liste, retirée), weather_banner_shown / weather_banner_tapped et filters_applied.source = weather (chip météo retirée).
Plusieurs valeurs ne sont pas énumérées : sheet_level (les trois crans de E-04), creator_profile_opened.source, place_confirmed / place_reported.context, weather_banner_*.condition.
Le catalogue typé de packages/shared/src/analytics.ts (#106) suit la page telle quelle ; les valeurs non énumérées y sont des string.
Sentry — reste à régler hors code (comptes interdits à CODE), détaillé dans #108 et #109 :
créer les projets dans la région UE, conservation 90 jours ;
activer « Prevent storing of IP addresses » et le Data Scrubber côté serveur. Les plantages natifs ne passent pas par le beforeSend JavaScript : ils portent l'identifiant d'installation aléatoire du SDK, sans e-mail ni jeton, mais le filtrage serveur est la seule barrière pour eux.
Process — un pnpm --filter api dev tournait déjà depuis 13:01, lancé par une session précédente et resté ouvert (port 8080). Je l'ai utilisé puis arrêté en fin de session.
📥 Découvertes de CODE pendant #24 (PR #110, #111, #112), hors périmètre :
Pour Ilan (décisions et réglages)
Écart au ticket : sortie VPC directe au lieu du connecteur VPC. Même accès privé à Cloud SQL, sans les deux VM minimum du connecteur (10 € par mois environ). À valider ; sinon, retour au connecteur dans infra/gcp/3-run.sh.
Un seul utilisateur de base (widoo, cloudsqlsuperuser) pour la migration et le service : le runtime a les droits DDL. Acceptable en staging (données fictives). Avant la production, créer un rôle d'exécution limité aux lectures et écritures (SQL, pas gcloud), avec ALTER DEFAULT PRIVILEGES, et un secret distinct pour le job. Ticket à prévoir avec la production.
TLS vers Cloud SQL sans vérification du certificat (sslmode=require, trafic interne au VPC). verify-full demanderait d'embarquer l'autorité de Cloud SQL dans l'image : à trancher pour la production.
Pour MANAGER
4. TRUST_PROXY=linklocal est une hypothèse (adresse du frontal Cloud Run), à confirmer au premier déploiement selon infra/README.md › « Vérifier les critères de #24 ». Le compteur de débit reste par instance (point 1 du commentaire de #18).
5. Secret Mapbox serveur non créé : l'API ne lit aucune clé Mapbox. Il faudra l'ajouter avec le ticket Directions et Geocoding côté API (2-database.sh pour le secret, 3-run.sh pour le monter).
6. Dependabot docker et github-actions : l'image de base est maintenant épinglée par digest et les actions de deploy-staging.yml par SHA. Sans Dependabot, rien ne signale leurs mises à jour de sécurité. Petite PR area:process (voir aussi le point 3 du commentaire de #18).
7. shellcheck et actionlint hors CI. Les scripts infra/gcp/*.sh et les workflows ne sont vérifiés qu'en local. shellcheck est déjà présent sur les runners Ubuntu. Étape de CI à ajouter, dans la même PR area:process que le point 4 du commentaire de #23.
8. Déploiement sans nouvelle CI sur main : le commit fusionné part en staging sur la foi des checks de sa PR. Si c'est jugé insuffisant, faire dépendre deploy-staging.yml de ci.yml (workflow_run, à cadrer : ce déclencheur a ses propres pièges).
→ #113 pour le point 1 du commentaire du 2026-09-23 (découvertes de #16) : sync-project.sh ne fera plus reculer un ticket « En cours » ou au-delà. En attendant la fusion, ne lancer ni scripts/sync-project.sh ni scripts/validate-design.sh.
Seul le point 1 est traité ici. Le point 2 (pnpm/action-setup en v6 pour passer à pnpm 11) reste à trier.
📥 Découverte de CODE pendant #113 (PR #114) : gh project item-list ne renvoie pas un item récent.
Constat : #113, créé à 13:38 UTC, est bien dans le Project « Widoo — MVP » (lu par GraphQL : item PVTI_lADOBx-85s4BkNm_zg8VnZo, non archivé, Status posé à la main). Pourtant, plus de 12 minutes après, gh project item-list 1 --owner Inprogress-Agency ne le renvoie pas et items.totalCount reste à 76. scripts/sync-project.sh affiche donc à tort « #113 : absent du Project (le workflow Auto-add l'ajoutera) » et ne le traite pas. Même effet dans project_status de scripts/validate-design.sh (« item introuvable »). Aucune écriture fautive : l'item est ignoré, pas modifié.
Proposition : vérifier si le décalage se résorbe (délai d'indexation GitHub). S'il dure, chercher l'item par l'issue (issue.projectItems en GraphQL) quand la liste ne le contient pas, et reformuler le message « absent du Project ».
Découverte (mode CODE, pendant la reprise de #105 pour #23) : l'étape « Detect code to verify » de .github/workflows/ci.yml liste les fichiers modifiés par un diff à deux points (git diff --name-only "$BASE" "$HEAD", clone de profondeur 1). C'est le défaut que #105 corrige dans Diff size : quand la base d'une PR empilée a avancé, la liste compte aussi les fichiers changés sur la base depuis la création de la branche.
Effet : sans risque pour la sécurité, car la liste est un sur-ensemble et le job ne saute jamais une vérification due. En revanche, une PR de documentation ou de process empilée sur une base qui a bougé lance le lint, les types et les tests complets pour rien. Correctif possible : mesurer depuis le point de divergence (BASE...HEAD), ce qui demande plus d'historique que --depth=1. Non traité dans #105, qui ne touche pas à ci.yml.
🧭 Passation pour MANAGER — fin de l'epic Socle technique (2026-09-24)
L'epic #13 est fermé. Voici le tri proposé de toutes les découvertes encore ouvertes de cette Inbox, préparé en session LIBRE. Seul le point 1 du commentaire de #16 est déjà traité (→ #113). Référence des commentaires : C16 = découvertes de #16, C17 = #17, C18 = #18, C19 = #19, C20 = #20, C21 = #21, C23 = #23, C22 = #22, C24 = #24, C113 = #113, C105 = #105.
1. Déjà réglé pendant la session (répondre « réglé » sans ticket)
Découverte
Réglé par
C18.1 et C24.4 : TRUST_PROXY
confirmé en staging le 2026-09-24 (#24) ; reste à mettre à jour infra/README.md (ticket d'outillage ci-dessous)
acceptés pour le staging (Risques acceptés, D-021) ; à reprendre avec la production
2. Nouvel epic « Exploitation et outillage » (v0.2, D-022) — à créer, puis ses tickets
C16.2 : pnpm/action-setup v6 et passage à pnpm 11
C18.3 et C24.6 : Dependabot docker et github-actions
C24.7, C23.4 et C105 : shellcheck et actionlint en CI ; « Detect code to verify » (une PR qui modifie ci.yml ne se vérifie pas, diff à deux points)
C24.8 et #24 : déploiement de staging non déclenché au push de a26ce89 ; décider s'il doit attendre la CI de main ; mettre à jour TRUST_PROXY dans infra/README.md
C21.5 et C23.3 : eas init (Paul ou Ilan), variables EAS par environnement (EXPO_PUBLIC_API_URL en https, EXPO_PUBLIC_POSTHOG_KEY, EXPO_PUBLIC_SENTRY_DSN), build preview sur main
C21.4 : barre d'onglets flottante (#26 ou #28) ; amender #32 : les données de démonstration doivent aussi se charger en staging, où db:seed est refusé (NODE_ENV=production) — la base de staging est vide aujourd'hui
C17.4 : trancher OU ou ET sur conditions avant le ticket de recherche ; C17.5 : codes de reason, effort et libellés du tri ; C17.6 : source de l'arrondissement et du quartier ; jetons mood-* du thème (D-016)
C20.1 : purge des comptes à 30 jours ; C20.2 : suppression du compte Firebase (décision d'Ilan) ; C20.4 : avatar (pipeline d'upload) ; C21.7 : code d'erreur account_deleted partagé ; C22.2 et D-018 : retrait du consentement dans E-09 ; C20.8 : compteurs de GET /me (avec favoris et programmation)
D-018 : politique de confidentialité et lien depuis la bannière ; C19 : création de Paris en production (hors seed) ; C21.5 : valider l'identifiant app.widoo avant la première publication ; C21.9 : icône et démarrage (#61)
4. Pour DESIGN (tickets needs-design)
Page API : C17.1 (author: null + isOfficial), C17.2 (internal_error), C18.4 (format de validation_error, /health, forme de /config)
Libellés à valider par Ilan : C17.3 (catégories de lieu, statuts, motifs, rôles, fournisseurs), C19 (priceRanges)
Modele-de-Donnees : C19 (colonnes et valeurs par défaut livrées ; sort d'un parcours publié dont l'auteur est purgé)
Compte-et-Monetisation : C20.5 (hiérarchie des rôles), C20.6 (clés des préférences de notification, E-09)
Securite-et-RGPD : C20.7 (tableau des durées : e-mail et prénom effacés dès la suppression)
Direction-Artistique : C21.1 (pas de lineHeight fixe), C21.2 (icônes Android en contour), C21.3 (fond blanc et accent corail)
Écrans : C22.1 (maquette de la bannière de consentement)
Analytics : C22.3 (view_switched, événements météo, valeurs non énumérées)
5. Pour Ilan
C23.1 : le dépôt est public ; vérifier Settings › Actions › Workflow permissions en lecture seule
La fusion reste manuelle : le contrôle de permissions de Claude Code refuse aux agents de fusionner. Les PR empilées se rejouent avec git rebase --onto origin/main <ancienne pointe> puis push --force-with-lease par Paul ; script réutilisable dans ~/widoo-merge-stack.sh sur le poste de Paul.
Découverte CODE (#504, #565) — durée du toast « Café Lomi passé » : c'est un toast d'information (4 s, mappings.toast), avec « Annuler ». En recette, 4 s pour lire puis viser « Annuler » est court. Question DESIGN : durée plus longue pour un toast qui porte une action d'annulation (6 s comme une attention, ou jusqu'au geste) ?
Découverte CODE (#504, #565) — fuseau des heures du Go : GoSheet, goText et GoSections appellent localTime sans le fuseau du parcours (planned.route.timezone), donc en Europe/Paris par défaut, alors que la fiche les lit dans le fuseau de sa ville depuis a746df4. Sans effet tant que tous les parcours sont à Paris ; petit ticket mobile à prévoir.
Découverte (CODE, #509) — opacité du texte du crédit photo écrite en dur. apps/mobile/src/ui/PhotoCredit.tsx écrit DISCREET_INK = 0.72 en dur : mappings.photoCredit.ink (rgba(255, 255, 255, 0.72)) est dans packages/tokens/generated/tokens.json, mais le thème généré (theme.ts, preset Tailwind) ne publie pas mappings.photoCredit. Le fond de la pastille passe bien par un jeton (scrim, même valeur que photoCredit.bg). Même chose pour SCROLL_DARKEN = 0.65 dans GoPage.tsx (mappings.immersive.scrollDarken est écrit en toutes lettres dans tokens.json). Le critère « couleurs et opacités lues dans les tokens » de #509 n'est donc tenu qu'en partie pour le crédit. À corriger côté pipeline des tokens (générer photoCredit.ink et immersive.scrollDarken en valeurs numériques), puis faire lire ces valeurs aux deux composants. Hors du périmètre de #509 : je n'y ai pas touché.
→ #575 (découverte du 19/10, 13:34, alerte « Annuler la sortie ? » d'E-08 sur Android) : la spec n'y répond pas (elle demande à la fois une alerte système et des boutons empilés). Ticket needs-design pour Ilan : rendu natif d'Android accepté, ou alerte dessinée par l'app sur les deux plateformes. Rien à changer dans le code d'ici là.
→ #576 (question du 20/10, 05:53, chiffres PostHog de la fiche partenaire, #346) : ticket needs-design dans l'epic #5 (événements « clic » et « installation », émetteur, clé de lecture, projet PostHog lu par l'admin) ; rattachement commenté sur #346, dont le critère ne change pas.
→ #574 (découverte du 20/10, 07:39, « Répondre » du support) : ticket créé, type:featureprio:P2area:apiarea:admin, v0.6, epic #5, bloqué par #397 (dépendance blocked_by, status:blocked). Le critère de réponse par e-mail de #349 y est déplacé.
→ #579 (découverte du 20/10, 11:59, icônes de l'alerte d'étape absentes des tokens) : corrigé en tokens v38 par D-100, remplacement de clock et play ticketé, après la PR de synchronisation #577.
→ #580 (découverte du 20/10, 11:59, durée du toast « Café Lomi passé ») : la règle existe déjà, mappings.toast.undo (6 s, tenu sous le focus du lecteur d'écran, D-051) ; ticket type:bug, pas de question DESIGN.
Écrit par MANAGER le 2026-10-20 vers 18 h, pour une reprise à froid après plusieurs semaines. Tout ce qui suit est vérifiable sur le dépôt ; l'avancement fait foi dans le Project « Widoo — MVP » (vues Board, Roadmap, Backlog).
a. Livré et fusionné depuis le 2026-10-16
Toutes ces PR sont fusionnées en rebase and merge ; leurs 15 tickets sont fermés et en À déployer dans le Project (aucun encore en Terminés : le staging est déployé mais pas vérifié écran par écran).
Ticket
PR
Fusion
#43 — Mes parcours : À venir, Favoris, Passés, Créés (E-08)
En local : la base de développement, les worktrees et les branches de travail ont été nettoyés. Reprendre par git pull, pnpm install, docker compose up -d, pnpm --filter api db:migrate && pnpm --filter api db:seed, puis les contrôles MANAGER (scripts/check-design-links.sh, scripts/sync-project.sh).
→ #587 (photoCredit publié dans le thème généré, découverte) ; la partie immersive.scrollDarken, encore écrite en phrase dans tokens.json, est couverte par #511 (needs-design), commenté
Activity
PaulThiberville commentedon Sep 23, 2026
Découvertes en mode CODE pendant #16 (PR #86), hors périmètre du ticket :
scripts/sync-project.shremet en « Prêts » les tickets en cours. La règle « issue ouverte +status:ready→ Prêts » ne regarde que le label, que CODE ne retire pas. Un ticket passé « En cours » ou « À review » par CODE revient donc à « Prêts » au prochain lancement du script en début de session MANAGER. Piste : ne poser « Prêts » que si le statut courant est vide, « Cadrage » ou « Prêts ».pnpm/action-setup@v4dans.github/workflows/ci.ymlbloque le passage à pnpm 11. L'action ne gère pnpm 11 qu'à partir de sa v6. Le socle est donc fixé en pnpm 10.34 (avecminimumReleaseAge: 1440). Monter l'action en v6 (PRarea:process, ou Dependabotgithub-actions) permettra de passer à pnpm 11.PaulThiberville commentedon Sep 23, 2026
Découvertes de #17 (PR #87 et #88), pour l'alignement du wiki :
author… ou « Widoo » pour un parcours officiel ». Le schémaRouteCardenvoieauthor: nullavecisOfficial: true, parce qu'un libellé affiché ne doit pas transiter comme donnée. À refléter dans la page.internal_errorajouté pour le 500 normalisé que demande Mettre en place l'API Fastify : health, config, erreurs, logs, OpenAPI #18 ; il n'est pas dans la liste des codes stables.packages/shared/src/labels/fr.ts(feat(shared): taxonomies, libellés français et seuils des buckets #87), en partie rédigés par l'agent. Ilan doit les valider, puis la page doit les lister.conditions: Filtres-et-Recherche indique OU dans le groupe Conditions, alors que Modele-de-Donnees (requête centrale) utilise@>, soit toutes les conditions demandées. Il faut trancher avant le ticket de recherche.reasonde la card (« À 600 m », « Très bien noté ») : il faut des codes et leurs libellés, pas une phrase envoyée par l'API. Non défini dans le wiki, donc laissé hors deRouteCard. De même poureffort(easy,moderate,intense) et les libellés du tri.PaulThiberville commentedon Sep 23, 2026
Découvertes de #18 (PR #89, #90, #91), hors périmètre du ticket :
TRUST_PROXY(ticket de déploiement staging). La limitation de débit compte par IP cliente ; derrière le front-end Google,X-Forwarded-Forn'est lu que si le pair direct figure dansTRUST_PROXY(IP, CIDR oulinklocal…). Fastify 5.12 a supprimé la confiance par nombre de sauts, usurpable. Sans cette variable, tous les clients partagent la même clé et la limite de 1 000/min devient globale. Proposition : constater l'adresse du pair au premier déploiement staging, puis fixer la variable dans la configuration Cloud Run. Autre point : le compteur est en mémoire, donc par instance.GET /v1/healthrépond 503 quand la base est injoignable (utile au monitoring). Si on en fait la sonde de démarrage ou de vivacité, une panne de base fait redémarrer les instances en boucle. Proposition : garder la sonde TCP par défaut, ou demander une route de vivacité sans base dans le ticket de déploiement.node:22-bookworm-slim,infra/api.Dockerfile). Proposition : épinglage par digest et Dependabotdocker(etgithub-actions, voir le point 2 du commentaire de Initialiser le monorepo pnpm + Turborepo avec lint, types et tests #16) dans une PRarea:process.detailsd'unvalidation_error:details.issues[]={ location: body|querystring|params|headers, path: "steps.0.placeId", code, message }(ValidationIssuedans@widoo/shared) ;messagedes erreurs en anglais, message technique : l'app affiche un libellé français choisi d'aprèscode;GET /health(200ok/up, 503degraded/down) absente de la page ;GET /config:{ minAppVersion, taxonomies, labels: { fr }, thresholds }(schémaAppConfigdeshared),minAppVersionpris dans la variableMIN_APP_VERSIONtant que la tablesettingsn'est pas lue.PaulThiberville commentedon Sep 23, 2026
Découvertes de CODE pendant #19 (modèle de données, PR #92, #93, #94) :
Pour DESIGN — aligner Modele-de-Donnees sur le schéma livré (
apps/api/src/db/schema.ts, #93) :places.price_range(free, low, medium, high) n'avait pas de taxonomie dansshared: ajoutée (priceRanges), libellés rédigés par CODE, à valider par Ilan : « Gratuit », « Bon marché », « Prix moyen », « Haut de gamme ». Le tableau Taxonomie de Filtres-et-Recherche ne la mentionne pas.place_hoursa une colonneid(plusieurs créneaux par jour, pas de clé naturelle) ;settingsaupdated_at.routes.status = draft,access = free,transport = walk,cities.is_active = false,users.is_public = true,trust_score = 1;places.verification_statussans défaut (qui crée un lieu dit s'il est vérifié).routes.author_id,places.created_by,media.uploaded_bypassent ànullà la purge d'un compte : que devient un parcours publié dont l'auteur est purgé (reste publié sans auteur, dépublié) ? Règle à écrire dans Securite-et-RGPD ou Creation-et-Moderation.uuidv7()avant Postgres 18).Pour MANAGER :
db:seedest refusé avecNODE_ENV=production(il insère des lieux et un parcours fictifs). La ville elle-même devra être créée en production autrement (migration de données ou admin) avant le lancement : pas de ticket aujourd'hui.0000_extensionsfaitCREATE EXTENSION IF NOT EXISTS postgisetpg_trgm; l'utilisateur qui lancenode dist/migrate.jsdoit avoir le rôlecloudsqlsuperuser(ou les extensions créées au provisionnement).routes.boundsdevient un polygone de surface nulle, que PostGIS stocke et queST_Intersectstrouve, mais qu'il déclare invalide. À traiter par le calcul d'emprise de l'orchestration (petite marge autour des étapes).drizzle-kit(dev) →@esbuild-kit/esm-loader→esbuild0.18.20, GHSA-67mh-4wv8-2f99 (serveur de développement d'esbuild). Sans impact : ce serveur n'est jamais lancé et le paquet n'est pas dans l'image. Non bloquant selon SECURITY.md ; à suivre en dette si souhaité (disparaît avec drizzle-kit 1.0).PaulThiberville commentedon Sep 23, 2026
📥 Découvertes de #20 (PR #95, #96, #97), hors périmètre :
Purge des comptes supprimés (MANAGER, ticket à créer) :
DELETE /v1/mefait un soft delete avec anonymisation. Il manque la tâche planifiée (Cloud Scheduler → endpoint interne protégé par un jeton de service) qui supprimera :usersdontdeleted_atdate de plus de 30 jours (routes.author_id,places.created_byetmedia.uploaded_bypassent alors à null) ;Suppression du compte Firebase (décision d'Ilan). Deux options :
user.delete()après une ré-authentification récente, plus la révocation Sign in with Apple exigée par Apple ;deleteUserde firebase-admin, ce qui demande le rôle IAM « Firebase Authentication Admin » pour le compte de service Cloud Run.Tant qu'aucun des deux ne le fait, un utilisateur qui se reconnecte avec le même compte Firebase avant la purge reçoit 401 « Account deleted ».
modedeDELETE /me(page wiki API : anonymiser ou supprimer ses parcours publiés) : non implémenté. À ticketer avec la création de parcours.Avatar (DESIGN puis MANAGER) :
PATCH /men'accepte que le retrait (null). Poser un avatar suppose le pipeline d'upload (URL signée, réencodage) ; aujourd'hui,media.owner_typen'a pas de valeuruser. Par ailleurs,@google-cloud/storageest exclu parignoredOptionalDependencies(pnpm-workspace.yaml) : il faudra le déclarer explicitement dansapps/apiavec le ticket d'upload.Hiérarchie des rôles (DESIGN, wiki Compte-et-Monetisation) : implémentée avec
adminqui détient tous les rôles, eteditoretmoderatordistincts, aucun n'impliquant l'autre. À confirmer et à écrire dans le wiki.Préférences de notification (DESIGN, E-09) : clés proposées
plannedRouteReminders,creatorPushetcreatorEmail, vraies par défaut. À valider avec la maquette.Wiki Securite-et-RGPD (DESIGN) : le tableau des durées indique « vie du compte + 30 jours » pour l'e-mail, le prénom et l'avatar. L'implémentation les efface dès la suppression et ne garde que l'uid Firebase jusqu'à la purge. Aligner le tableau.
GET /me: les compteurs du mois et les limites (page wiki API) seront à ajouter avec les tickets des favoris et de la programmation.Déploiement (Ilan ou Paul) :
FIREBASE_PROJECT_IDest désormais obligatoire pour démarrer l'API ; staging et production ont chacun le leur.FIREBASE_AUTH_EMULATOR_HOSTne doit jamais être défini hors local : il est refusé en production.PaulThiberville commentedon Sep 23, 2026
📥 Découvertes de #21 (PR #98, #99, #100, #101), hors périmètre :
Pour DESIGN
lineHeightfixé dans le thème grandit moins vite que la taille de police : le jambage du « g » de « Configuration » était rogné à 150 %. Le thème de l'app n'impose donc plus de hauteur de ligne (feat(mobile): thème de l'app et barre d'onglets E-01 #100). Règle à ajouter aux « règles pour le code » : pas delineHeightfixe sur un texte qui suit la taille système.expo-symbols) n'existent qu'en contour. À valider, ou prévoir des icônes maison dans le design system (Mettre à jour Direction-Artistique et le design system Widoo selon D-003 #81).#F2592A(favori, Gastronomie), utilisé seulement pour des icônes et des composants (3,4:1 sur blanc, jamais du texte). Direction-Artistique indique encore « Fond#FAF9F6» et « accent à définir » : déjà couvert par Mettre à jour Direction-Artistique et le design system Widoo selon D-003 #81, à confirmer à cette occasion.Pour MANAGER
4. La barre d'onglets est dans le flux, sous l'écran : il faudra la faire flotter au-dessus de la carte et de la sheet, comme sur la maquette E-01. À prévoir dans #26 ou #28, avec une marge basse pour le contenu.
5. EAS, pour Ilan ou Paul :
eas initdansapps/mobile(écrit leprojectId) ;EXPO_PUBLIC_API_URLdes environnements EASpreview(API staging, Déployer l'API en staging sur GCP : Cloud SQL, Cloud Run, Secret Manager #24) etproduction, enhttps://sinon l'app refuse de démarrer ;app.widooà valider avant la première publication. Une varianteapp.widoo.previewpermettrait d'installer recette et production côte à côte.eas.jsondéclare les canauxstagingetproduction(Architecture-Technique), maisexpo-updatesn'est pas installé et demande leprojectId. Ticket à créer.sharedutilisée par l'API et le client, serait plus robuste. Petite PR API + shared.decode-uri-component≤ 0.4.2, viaexpo-router > query-string: déni de service sur une URL malformée ; un lien profond piégé pourrait figer l'app, sans accès ni donnée ;uuid< 11.1.1, via@expo/config-plugins > xcode: outil de build seulement.À suivre en dette si souhaité ; à revérifier avec le SDK 58.
PaulThiberville commentedon Sep 23, 2026
📥 Découvertes de #23 (PR #105), hors périmètre :
Pour Ilan
gh repo view:visibility: PUBLIC), alors queCLAUDE.mdle décrit comme « Dépôt privé ». À confirmer. S'il reste public, vérifier dans Settings › Actions, que je ne peux pas lire (403) : « Workflow permissions » en lecture seule, et approbation des workflows lancés par des contributeurs externes.mainqui restent manuels sont listés dans la PR chore(process): fiabiliser Diff size et pr-policy, documenter la CI #105, section Risque.Pour MANAGER
3. Build EAS preview sur
main: la page wiki Architecture-Technique › Qualité l'annonce (« build EAS preview surmain»), mais il n'est pas dansci.ymlni dans #23. Il dépend deeas initet des variables EAS (voir les découvertes de #21, point 5). Ticket à créer.4. Une PR qui modifie
.github/workflows/ci.ymlne lance pas son propre jobLint, types, tests. L'étapeDetect code to verifyclasse tout.github/en process et répond vert sans rien lancer : une erreur dans une étape pnpm deci.ymlne se verrait qu'à la PR de code suivante. Piste : compter.github/workflows/comme du code dans ce filtre. Petite PRarea:process.PaulThiberville commentedon Sep 23, 2026
Découvertes de CODE pendant #22 (PostHog et Sentry avec consentement) :
DESIGN — aucune maquette de bannière de consentement. Ecrans n'a pas d'écran pour le consentement. #107 livre une bannière sobre avec les composants existants :
À maquetter et à identifier (nouvel écran ou état de E-01), textes compris.
DESIGN / RGPD — aucun endroit pour changer d'avis. E-09 (Profil et réglages) ne prévoit pas d'entrée « Mesure d'audience » ou « Confidentialité ». Le retrait du consentement doit être aussi simple que son recueil. Le code sait déjà le faire (
consent.set('denied'): arrêt de PostHog et effacement de son identifiant) ; il manque l'écran. À prévoir avant la soumission aux stores.DESIGN — Analytics en retard sur E-01 (D-004).
view_switched(bascule carte / liste, retirée),weather_banner_shown/weather_banner_tappedetfilters_applied.source = weather(chip météo retirée).sheet_level(les trois crans de E-04),creator_profile_opened.source,place_confirmed/place_reported.context,weather_banner_*.condition.packages/shared/src/analytics.ts(#106) suit la page telle quelle ; les valeurs non énumérées y sont desstring.Sentry — reste à régler hors code (comptes interdits à CODE), détaillé dans #108 et #109 :
beforeSendJavaScript : ils portent l'identifiant d'installation aléatoire du SDK, sans e-mail ni jeton, mais le filtrage serveur est la seule barrière pour eux.Process — un
pnpm --filter api devtournait déjà depuis 13:01, lancé par une session précédente et resté ouvert (port 8080). Je l'ai utilisé puis arrêté en fin de session.PaulThiberville commentedon Sep 23, 2026
📥 Découvertes de CODE pendant #24 (PR #110, #111, #112), hors périmètre :
Pour Ilan (décisions et réglages)
infra/gcp/3-run.sh.widoo,cloudsqlsuperuser) pour la migration et le service : le runtime a les droits DDL. Acceptable en staging (données fictives). Avant la production, créer un rôle d'exécution limité aux lectures et écritures (SQL, pasgcloud), avecALTER DEFAULT PRIVILEGES, et un secret distinct pour le job. Ticket à prévoir avec la production.sslmode=require, trafic interne au VPC).verify-fulldemanderait d'embarquer l'autorité de Cloud SQL dans l'image : à trancher pour la production.Pour MANAGER
4.
TRUST_PROXY=linklocalest une hypothèse (adresse du frontal Cloud Run), à confirmer au premier déploiement seloninfra/README.md› « Vérifier les critères de #24 ». Le compteur de débit reste par instance (point 1 du commentaire de #18).5. Secret Mapbox serveur non créé : l'API ne lit aucune clé Mapbox. Il faudra l'ajouter avec le ticket Directions et Geocoding côté API (
2-database.shpour le secret,3-run.shpour le monter).6. Dependabot
dockeretgithub-actions: l'image de base est maintenant épinglée par digest et les actions dedeploy-staging.ymlpar SHA. Sans Dependabot, rien ne signale leurs mises à jour de sécurité. Petite PRarea:process(voir aussi le point 3 du commentaire de #18).7.
shellchecketactionlinthors CI. Les scriptsinfra/gcp/*.shet les workflows ne sont vérifiés qu'en local.shellcheckest déjà présent sur les runners Ubuntu. Étape de CI à ajouter, dans la même PRarea:processque le point 4 du commentaire de #23.8. Déploiement sans nouvelle CI sur
main: le commit fusionné part en staging sur la foi des checks de sa PR. Si c'est jugé insuffisant, faire dépendredeploy-staging.ymldeci.yml(workflow_run, à cadrer : ce déclencheur a ses propres pièges).PaulThiberville commentedon Sep 23, 2026
→ #113 pour le point 1 du commentaire du 2026-09-23 (découvertes de #16) :
sync-project.shne fera plus reculer un ticket « En cours » ou au-delà. En attendant la fusion, ne lancer niscripts/sync-project.shniscripts/validate-design.sh.Seul le point 1 est traité ici. Le point 2 (
pnpm/action-setupen v6 pour passer à pnpm 11) reste à trier.PaulThiberville commentedon Sep 23, 2026
📥 Découverte de CODE pendant #113 (PR #114) :
gh project item-listne renvoie pas un item récent.Constat : #113, créé à 13:38 UTC, est bien dans le Project « Widoo — MVP » (lu par GraphQL : item
PVTI_lADOBx-85s4BkNm_zg8VnZo, non archivé, Status posé à la main). Pourtant, plus de 12 minutes après,gh project item-list 1 --owner Inprogress-Agencyne le renvoie pas etitems.totalCountreste à 76.scripts/sync-project.shaffiche donc à tort « #113 : absent du Project (le workflow Auto-add l'ajoutera) » et ne le traite pas. Même effet dansproject_statusdescripts/validate-design.sh(« item introuvable »). Aucune écriture fautive : l'item est ignoré, pas modifié.Proposition : vérifier si le décalage se résorbe (délai d'indexation GitHub). S'il dure, chercher l'item par l'issue (
issue.projectItemsen GraphQL) quand la liste ne le contient pas, et reformuler le message « absent du Project ».PaulThiberville commentedon Sep 23, 2026
Découverte (mode CODE, pendant la reprise de #105 pour #23) : l'étape « Detect code to verify » de
.github/workflows/ci.ymlliste les fichiers modifiés par un diff à deux points (git diff --name-only "$BASE" "$HEAD", clone de profondeur 1). C'est le défaut que #105 corrige dansDiff size: quand la base d'une PR empilée a avancé, la liste compte aussi les fichiers changés sur la base depuis la création de la branche.Effet : sans risque pour la sécurité, car la liste est un sur-ensemble et le job ne saute jamais une vérification due. En revanche, une PR de documentation ou de process empilée sur une base qui a bougé lance le lint, les types et les tests complets pour rien. Correctif possible : mesurer depuis le point de divergence (
BASE...HEAD), ce qui demande plus d'historique que--depth=1. Non traité dans #105, qui ne touche pas àci.yml.PaulThiberville commentedon Sep 24, 2026
🧭 Passation pour MANAGER — fin de l'epic Socle technique (2026-09-24)
L'epic #13 est fermé. Voici le tri proposé de toutes les découvertes encore ouvertes de cette Inbox, préparé en session LIBRE. Seul le point 1 du commentaire de #16 est déjà traité (→ #113). Référence des commentaires : C16 = découvertes de #16, C17 = #17, C18 = #18, C19 = #19, C20 = #20, C21 = #21, C23 = #23, C22 = #22, C24 = #24, C113 = #113, C105 = #105.
1. Déjà réglé pendant la session (répondre « réglé » sans ticket)
TRUST_PROXYinfra/README.md(ticket d'outillage ci-dessous)3-run.sh(#111)dockerreste à faire (ci-dessous)cloudsqlsuperuserpour les extensionsFIREBASE_PROJECT_IDau déploiement3-run.sh(widoo-staging)2. Nouvel epic « Exploitation et outillage » (v0.2, D-022) — à créer, puis ses tickets
pnpm/action-setupv6 et passage à pnpm 11dockeretgithub-actionsshellchecketactionlinten CI ; « Detect code to verify » (une PR qui modifieci.ymlne se vérifie pas, diff à deux points)a26ce89; décider s'il doit attendre la CI demain; mettre à jourTRUST_PROXYdansinfra/README.mdeas init(Paul ou Ilan), variables EAS par environnement (EXPO_PUBLIC_API_URLen https,EXPO_PUBLIC_POSTHOG_KEY,EXPO_PUBLIC_SENTRY_DSN), buildpreviewsurmainexpo-updatespour l'OTASENTRY_AUTH_TOKENen secret EAS)gh project item-listne renvoie pas les items récents ; chercher l'item parissue.projectItemsen GraphQL dans les scriptsdecode-uri-componentetuuidvia Expo), en dette suivie3. Epics existants
db:seedest refusé (NODE_ENV=production) — la base de staging est vide aujourd'huiconditionsavant le ticket de recherche ; C17.5 : codes dereason,effortet libellés du tri ; C17.6 : source de l'arrondissement et du quartier ; jetonsmood-*du thème (D-016)account_deletedpartagé ; C22.2 et D-018 : retrait du consentement dans E-09 ; C20.8 : compteurs deGET /me(avec favoris et programmation)modedeDELETE /mepour les parcours publiésapp.widooavant la première publication ; C21.9 : icône et démarrage (#61)4. Pour DESIGN (tickets
needs-design)author: null+isOfficial), C17.2 (internal_error), C18.4 (format devalidation_error,/health, forme de/config)priceRanges)lineHeightfixe), C21.2 (icônes Android en contour), C21.3 (fond blanc et accent corail)view_switched, événements météo, valeurs non énumérées)5. Pour Ilan
main(rebase and merge seulement, approbation, code owners)Mise en garde pour la prochaine session
sync-project.shne fait plus reculer un ticket parti en développement (Préserver les statuts avancés dans sync-project.sh #113) ; il peut être lancé.git rebase --onto origin/main <ancienne pointe>puispush --force-with-leasepar Paul ; script réutilisable dans~/widoo-merge-stack.shsur le poste de Paul.293 remaining items
PaulThiberville commentedon Oct 20, 2026
Découverte CODE (#504, #565) — durée du toast « Café Lomi passé » : c'est un toast d'information (4 s,
mappings.toast), avec « Annuler ». En recette, 4 s pour lire puis viser « Annuler » est court. Question DESIGN : durée plus longue pour un toast qui porte une action d'annulation (6 s comme une attention, ou jusqu'au geste) ?PaulThiberville commentedon Oct 20, 2026
Découverte CODE (#504, #565) — fuseau des heures du Go :
GoSheet,goTextetGoSectionsappellentlocalTimesans le fuseau du parcours (planned.route.timezone), donc en Europe/Paris par défaut, alors que la fiche les lit dans le fuseau de sa ville depuis a746df4. Sans effet tant que tous les parcours sont à Paris ; petit ticket mobile à prévoir.PaulThiberville commentedon Oct 20, 2026
Découverte (CODE, #509) — opacité du texte du crédit photo écrite en dur.
apps/mobile/src/ui/PhotoCredit.tsxécritDISCREET_INK = 0.72en dur :mappings.photoCredit.ink(rgba(255, 255, 255, 0.72)) est danspackages/tokens/generated/tokens.json, mais le thème généré (theme.ts, preset Tailwind) ne publie pasmappings.photoCredit. Le fond de la pastille passe bien par un jeton (scrim, même valeur quephotoCredit.bg). Même chose pourSCROLL_DARKEN = 0.65dansGoPage.tsx(mappings.immersive.scrollDarkenest écrit en toutes lettres dans tokens.json). Le critère « couleurs et opacités lues dans les tokens » de #509 n'est donc tenu qu'en partie pour le crédit. À corriger côté pipeline des tokens (générerphotoCredit.inketimmersive.scrollDarkenen valeurs numériques), puis faire lire ces valeurs aux deux composants. Hors du périmètre de #509 : je n'y ai pas touché.PaulThiberville commentedon Oct 20, 2026
📋 Suite du tri Dependabot, MANAGER, 2026-10-20 (sur déclaration de Paul et constat sur le dépôt) :
@dependabot recreatesur chore(infra): Bump @sentry/node from 10.75.2 to 11.8.0 #549 (12:56 UTC). Recréée : nouveau commit7ff1336aà 12:59 UTC, titrechore(infra): Bump @sentry/node from 10.75.2 to 11.8.0. « Title, body, issue link » passe désormais ; « Lint, types, tests » reste rouge, comme attendu (sendDefaultPiiretiré en v11) : toujours à ne pas fusionner, la montée passe par Migrer @sentry/node 10 vers 11 dans l'API sans renvoyer de donnée personnelle #559.minor-and-patch, 26 paquets ; CI en cours), chore(infra): Bump tailwindcss from 3.4.19 to 4.3.3 #571 (tailwindcss3 → 4, majeure ; CI rouge), chore(infra): Bump @jest/globals from 29.7.0 to 30.5.2 #572 (@jest/globals29 → 30 ; CI en cours), chore(infra): Bump jest from 29.7.0 to 30.5.2 #573 (jest29 → 30 ; CI en cours). Le contrôle de titre et de corps passe sur les quatre. À trier dans une prochaine session MANAGER.PaulThiberville commentedon Oct 20, 2026
→ #575 (découverte du 19/10, 13:34, alerte « Annuler la sortie ? » d'E-08 sur Android) : la spec n'y répond pas (elle demande à la fois une alerte système et des boutons empilés). Ticket
needs-designpour Ilan : rendu natif d'Android accepté, ou alerte dessinée par l'app sur les deux plateformes. Rien à changer dans le code d'ici là.PaulThiberville commentedon Oct 20, 2026
→ #576 (question du 20/10, 05:53, chiffres PostHog de la fiche partenaire, #346) : ticket
needs-designdans l'epic #5 (événements « clic » et « installation », émetteur, clé de lecture, projet PostHog lu par l'admin) ; rattachement commenté sur #346, dont le critère ne change pas.PaulThiberville commentedon Oct 20, 2026
→ #574 (découverte du 20/10, 07:39, « Répondre » du support) : ticket créé,
type:featureprio:P2area:apiarea:admin, v0.6, epic #5, bloqué par #397 (dépendanceblocked_by,status:blocked). Le critère de réponse par e-mail de #349 y est déplacé.PaulThiberville commentedon Oct 20, 2026
→ #579 (découverte du 20/10, 11:59, icônes de l'alerte d'étape absentes des tokens) : corrigé en tokens v38 par D-100, remplacement de
clocketplayticketé, après la PR de synchronisation #577.PaulThiberville commentedon Oct 20, 2026
→ #580 (découverte du 20/10, 11:59, durée du toast « Café Lomi passé ») : la règle existe déjà,
mappings.toast.undo(6 s, tenu sous le focus du lecteur d'écran, D-051) ; tickettype:bug, pas de question DESIGN.PaulThiberville commentedon Oct 20, 2026
→ #563 (découverte du 20/10, 11:59, fuseau des heures du Go) : déjà couvert par ce ticket, ouvert sur la découverte de #554.
PaulThiberville commentedon Oct 20, 2026
📌 État du projet au 2026-10-20 (pause)
Écrit par MANAGER le 2026-10-20 vers 18 h, pour une reprise à froid après plusieurs semaines. Tout ce qui suit est vérifiable sur le dépôt ; l'avancement fait foi dans le Project « Widoo — MVP » (vues Board, Roadmap, Backlog).
a. Livré et fusionné depuis le 2026-10-16
Toutes ces PR sont fusionnées en rebase and merge ; leurs 15 tickets sont fermés et en À déployer dans le Project (aucun encore en Terminés : le staging est déployé mais pas vérifié écran par écran).
b. Staging
mainàbcdc8801(dernier commit de code ;mainporte depuis un commit de doc,c67094f0, CLAUDE.md › champ Sprint).computedcalculé par le moteur (Recalculer et stocker computed par le moteur dans l'éditeur, et recalculer le seed #538).app.versions(recommendedVersion 0.2.0) encore présente, posée pour Poser le réglage app.versions en staging pour vérifier E-20 (tâche de Paul) #491 : à retirer après la recette d'E-20.c. Build preview Android
7a89052flancé depuisbcdc8801: https://expo.dev/accounts/inprogress-agency-team/projects/widoo/builds/7a89052f-aa9e-4c7d-aa76-63406d080972cff79f3a; le commentaire du 2026-10-20 sur le ticket fait le lien).d. PR ouvertes
À nous
sync-tokens.yml) : CI verte, fusionnable par Paul ; elle débloque Utiliser step-late et step-skipped dans l'alerte d'étape et la timeline du Go, heure de fermeture dans « fermé à l'arrivée » (E-07) #579.De Marco (aucune fusionnée ; tickets en « À review »)
Dependabot (tri complet dans le tableau du 2026-10-20 ; alertes de sécurité ouvertes : zéro)
tailwindcss4 (CI rouge) → Monter tailwindcss 3 vers 4 avec la version de NativeWind qui le prend en charge #581 ; chore(infra): Bump @jest/globals from 29.7.0 to 30.5.2 #572@jest/globals30 (CI rouge) et chore(infra): Bump jest from 29.7.0 to 30.5.2 #573jest30 (CI verte, seule) → Monter Jest 29 vers 30 avec jest-expo (jest et @jest/globals ensemble) #582, bloqué par Monter l'app au SDK Expo 58 (React Native 0.88, React 19.3) #556 ; chore(infra): Bump @sentry/node from 10.75.2 to 11.8.0 #549@sentry/node11 (CI rouge) → Migrer @sentry/node 10 vers 11 dans l'API sans renvoyer de donnée personnelle #559. Aucune des quatre à fusionner.e. En attente d'Ilan
Les 5 questions du message du 2026-10-20 :
occurredAt: corps dearrivedetskip(heure réelle de l'action hors connexion), Écrire dans API le corps vide et le 422 de arrived et skip #562 (Inbox).reason: user) ? (Inbox).clock-countdownaussi pour l'étape fermée à l'arrivée (choix de DESIGN, à confirmer) ; Utiliser step-late et step-skipped dans l'alerte d'étape et la timeline du Go, heure de fermeture dans « fermé à l'arrivée » (E-07) #579 gardewarningsur ce cas sans confirmation.Tickets
needs-designouverts (leur liste complète ci-dessous).Tickets needs-design ouverts au 2026-10-20
f. Actions humaines de Paul restantes
7a89052f(section c).app.versions.g. Par où reprendre
File
status:readyhorshuman, par priorité :En local : la base de développement, les worktrees et les branches de travail ont été nettoyés. Reprendre par
git pull,pnpm install,docker compose up -d,pnpm --filter api db:migrate && pnpm --filter api db:seed, puis les contrôles MANAGER (scripts/check-design-links.sh,scripts/sync-project.sh).PaulThiberville commentedon Oct 20, 2026
→ #586 (alerte d'étape au-delà de 150 % de texte, découverte :
needs-design, question plafond à 1,3 ou défilement, Cadrage)PaulThiberville commentedon Oct 20, 2026
→ #587 (
photoCreditpublié dans le thème généré, découverte) ; la partieimmersive.scrollDarken, encore écrite en phrase danstokens.json, est couverte par #511 (needs-design), commentéPaulThiberville commentedon Oct 20, 2026
→ #588 (champ Préparation de
scripts/sync-project.sh: un ticketstatus:blockeddéjà « À review » compté bloqué, vu sur l'epic #235)