Skip to content

📥 Inbox — Triage #4

Open
Open

Description

@IlanAMG

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.

Pinned by PaulThiberville

Activity

  1. pinned this issue on Sep 21, 2026
  2. PaulThiberville commented on Sep 23, 2026

    @PaulThiberville
    Collaborator

    Découvertes en mode CODE pendant #16 (PR #86), hors périmètre du ticket :

    1. 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 ».
    2. 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.
  3. PaulThiberville commented on Sep 23, 2026

    @PaulThiberville
    Collaborator

    Découvertes de #17 (PR #87 et #88), pour l'alignement du wiki :

    1. 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.
    2. Page API, codes d'erreur : internal_error ajouté 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.
    3. 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.
    4. 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.
    5. 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.
    6. 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 ?
  4. PaulThiberville commented on Sep 23, 2026

    @PaulThiberville
    Collaborator

    Découvertes de #18 (PR #89, #90, #91), hors périmètre du ticket :

    1. 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.
    2. 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.
    3. 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.
    4. 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.
  5. PaulThiberville commented on Sep 23, 2026

    @PaulThiberville
    Collaborator

    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).
  6. PaulThiberville commented on Sep 23, 2026

    @PaulThiberville
    Collaborator

    📥 Découvertes de #20 (PR #95, #96, #97), hors périmètre :

    1. 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é.
    2. 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 ».

    3. mode de DELETE /me (page wiki API : anonymiser ou supprimer ses parcours publiés) : non implémenté. À ticketer avec la création de parcours.

    4. 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.

    5. 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.

    6. Préférences de notification (DESIGN, E-09) : clés proposées plannedRouteReminders, creatorPush et creatorEmail, vraies par défaut. À valider avec la maquette.

    7. 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.

    8. GET /me : les compteurs du mois et les limites (page wiki API) seront à ajouter avec les tickets des favoris et de la programmation.

    9. 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.

  7. PaulThiberville commented on Sep 23, 2026

    @PaulThiberville
    Collaborator

    📥 Découvertes de #21 (PR #98, #99, #100, #101), hors périmètre :

    Pour DESIGN

    1. 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.
    2. 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).
    3. 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 :

    • eas init dans apps/mobile (écrit le projectId) ;
    • variables EXPO_PUBLIC_API_URL des environnements EAS preview (API staging, Déployer l'API en staging sur GCP : Cloud SQL, Cloud Run, Secret Manager #24) et production, en https:// sinon l'app refuse de démarrer ;
    • identifiant app.widoo à valider avant la première publication. Une variante app.widoo.preview permettrait d'installer recette et production côte à côte.
    1. 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.
    2. 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.
    3. 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.
    4. Icône et écran de démarrage : ceux d'Expo par défaut, jusqu'à Préparer les fiches stores, l'icône, la landing page et la liste d'attente #61.
  8. PaulThiberville commented on Sep 23, 2026

    @PaulThiberville
    Collaborator

    📥 Découvertes de #23 (PR #105), hors périmètre :

    Pour Ilan

    1. 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.
    2. Les réglages du ruleset main qui 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 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.

  9. PaulThiberville commented on Sep 23, 2026

    @PaulThiberville
    Collaborator

    Découvertes de CODE pendant #22 (PostHog et Sentry avec consentement) :

    1. 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.

    2. 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.

    3. DESIGN — Analytics en retard sur E-01 (D-004).

      • 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.
    4. 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.
    5. 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.

  10. PaulThiberville commented on Sep 23, 2026

    @PaulThiberville
    Collaborator

    📥 Découvertes de CODE pendant #24 (PR #110, #111, #112), hors périmètre :

    Pour Ilan (décisions et réglages)

    1. É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.
    2. 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.
    3. 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).

  11. PaulThiberville commented on Sep 23, 2026

    @PaulThiberville
    Collaborator

    → #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.

  12. PaulThiberville commented on Sep 23, 2026

    @PaulThiberville
    Collaborator

    📥 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 ».

  13. PaulThiberville commented on Sep 23, 2026

    @PaulThiberville
    Collaborator

    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.

  14. PaulThiberville commented on Sep 24, 2026

    @PaulThiberville
    Collaborator

    🧭 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)
    C18.2 : sonde de démarrage sonde TCP dans 3-run.sh (#111)
    C18.3 : image épinglée épinglée par digest (#110) ; Dependabot docker reste à faire (ci-dessous)
    C19 : utilisateur cloudsqlsuperuser pour les extensions fait (#111), migration passée en staging
    C20.9 : FIREBASE_PROJECT_ID au déploiement posé par 3-run.sh (widoo-staging)
    C22.4 : réglages Sentry faits et consignés (wiki Securite-et-RGPD, D-019, D-020)
    C22.5 : API restée lancée sans suite
    C24.1, C24.2, C24.3 : VPC direct, utilisateur unique, TLS 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.6 : expo-updates pour l'OTA
    • feat(mobile): rapports de plantage Sentry sans donnée utilisateur #108 : envoi des source maps à Sentry (SENTRY_AUTH_TOKEN en secret EAS)
    • C113 : gh project item-list ne renvoie pas les items récents ; chercher l'item par issue.projectItems en GraphQL dans les scripts
    • C19, C21.8 : alertes de dépendance moyennes (esbuild via drizzle-kit, decode-uri-component et uuid via Expo), en dette suivie

    3. Epics existants

    Epic Découvertes
    #8 Carte et découverte 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
    #10 Filtres, recherche et recommandation 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)
    #9 Fiche parcours et orchestration C19 : emprise nulle d'un parcours à une étape ; C24.5 : secret Mapbox serveur avec Directions et Geocoding
    #6 Compte et profil 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)
    #7 Création de parcours C20.3 : mode de DELETE /me pour les parcours publiés
    #12 Lancement Paris 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

    Mise en garde pour la prochaine session

    • sync-project.sh ne fait plus reculer un ticket parti en développement (Préserver les statuts avancés dans sync-project.sh #113) ; il peut être lancé.
    • 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.
  15. 293 remaining items

  16. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    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) ?

  17. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    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.

  18. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    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é.

  19. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    📋 Suite du tri Dependabot, MANAGER, 2026-10-20 (sur déclaration de Paul et constat sur le dépôt) :

  20. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    → #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à.

  21. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    → #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.

  22. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    → #574 (découverte du 20/10, 07:39, « Répondre » du support) : ticket créé, type:feature prio:P2 area:api area: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é.

  23. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    → #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.

  24. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    → #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.

  25. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    → #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.

  26. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    📌 É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).

    Ticket PR Fusion
    #43 — Mes parcours : À venir, Favoris, Passés, Créés (E-08) #514 2026-10-16
    #508 — « À ne pas manquer » et photos d'étape créditées (API) #525 2026-10-16
    #36 — GET /routes/:id et /timeline, computed stocké #536 2026-10-19
    #515 — « Votre sortie » : changer la date, annuler, rétablir (E-08) #526 2026-10-19
    #520 — réponse plus fraîche d'une même recherche #541 2026-10-19
    #519 — mini-lecteur : étapes passées, Go fermé ailleurs (E-07) #542 2026-10-19
    #539 — « Accessible à toute heure » dans la timeline programmée #543 2026-10-19
    #510 — « Itinéraire » dans le mode du trajet #544 2026-10-19
    #503 — routes « J'y suis » et « Passer cette étape » (API) #553 2026-10-20
    #537 — fiche parcours de l'app branchée sur l'API (E-05) #554 2026-10-20
    #538 — computed recalculé par le moteur (éditeur et seed) #564 2026-10-20
    #504 — passer une étape, retard recalculé, « J'y suis » à l'API (E-07) #565 2026-10-20
    #560 — cache turbo invalidé quand un paquet interne change #567 2026-10-20
    #555 — PR Dependabot fusionnables (SDK Expo exclu, politique de PR) #568 2026-10-20
    #415 — create_limit retiré du catalogue analytics #569 2026-10-20

    b. Staging

    c. Build preview Android

    d. PR ouvertes

    À nous

    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)

    e. En attente d'Ilan

    Les 5 questions du message du 2026-10-20 :

    1. Texte de l'alerte « fermée à l'arrivée » écrit par la PR feat(mobile): passer une étape, recalculer le retard, J'y suis à l'API #565 (« Café Lomi sera fermé à votre arrivée » / « Vous arriverez vers 16:10. ») : à valider ou réécrire (Inbox).
    2. occurredAt : corps de arrived et skip (heure réelle de l'action hors connexion), Écrire dans API le corps vide et le 422 de arrived et skip #562 (Inbox).
    3. « Passer » hors alerte : où le visiteur passe-t-il une étape de lui-même (reason: user) ? (Inbox).
    4. Icônes D-100 : clock-countdown aussi 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 garde warning sur ce cas sans confirmation.
    5. Domaine widooapp.com : achat, Acheter les domaines widooapp.com et widooapp.fr (tâche d'Ilan) #366 (bloque Liens universels iOS et App Links Android sur le domaine du site #241, liens universels).

    Tickets needs-design ouverts (leur liste complète ci-dessous).

    Tickets needs-design ouverts au 2026-10-20

    f. Actions humaines de Paul restantes

    g. Par où reprendre

    File status:ready hors human, par priorité :

    1. P0, v0.5 : Rechercher et créer un lieu avec géocodage et détection de doublons (E-13) #46 (lieu : recherche, géocodage, doublons, E-13), Uploader et redimensionner les photos via URL signées #47 (photos par URL signées), Enregistrer confirmations et signalements de lieux avec pondération et statuts #49 (confirmations et signalements de lieux), Afficher et saisir la vérification des lieux dans la fiche et le parcours en cours #50 (vérification des lieux dans la fiche et le Go).
    2. v0.4, epic Programmer, partir et noter : Ajouter la carte du parcours et l'en-tête compact au parcours en cours (E-07) #506 (carte et en-tête compact du Go, P2), Terminer et arrêter la sortie hors connexion, remonter l'accueil au-dessus du mini-lecteur #507 (fin et arrêt hors connexion, P3), puis les deux tickets de D-100 : Tenir le toast « Étape passée » 6 s avec Annuler, comme la règle des toasts (D-051) #580 (toast « Passer » 6 s, P2) et 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 (icônes step-late et step-skipped, P3, après la fusion de chore(tokens): synchroniser tokens.json v38 depuis le wiki #577).
    3. Puis Servir les photos stockées par chemin du bucket sous une URL lisible #530 (photos du bucket servies par URL lisible, P1), Exposer POST /routes/:id/reports pour signaler un parcours #437 (POST /routes/:id/reports, P1), Réviser l'exception d'audit node-forge et braces (échéance 2026-11-05) #280 (exception d'audit node-forge et braces : échéance 2026-11-05 : à prendre en premier si la reprise approche cette date).

    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).

  27. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    → #586 (alerte d'étape au-delà de 150 % de texte, découverte : needs-design, question plafond à 1,3 ou défilement, Cadrage)

  28. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    → #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é

  29. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    Collaborator

    → #588 (champ Préparation de scripts/sync-project.sh : un ticket status:blocked déjà « À review » compté bloqué, vu sur l'epic #235)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    inboxIssue de triage épinglée

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions