Skip to content

📥 Inbox — Triage #4

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.

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. 222 remaining items

  16. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    💡 Découverte (CODE, #475, PR #480) — area:api : limiter le débit des 401 répétés d'un même jeton.

    Contexte : avant #480, un téléphone dont le compte venait d'être supprimé envoyait environ 8 GET /v1/me par seconde à l'API de staging (499 refus 401 par minute, constatés par Paul le 2026-10-15). En local, sur le code d'avant le correctif : 93 à 97 GET /v1/me en 401 en 8 s. #480 corrige le client, mais un ancien build resté installé (ou un autre client défaillant) peut toujours reproduire ce débit.

    Proposition, à ticketer à part : un plafond par jeton ou par uid, plus bas que RATE_LIMIT_MAX, sur les réponses 401 « Account deleted » et « Missing bearer token », avec un Retry-After. Rien n'est codé dans #480.

  17. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Découverte (CODE, #180, PR #482) — attribution des données d'Île-de-France Mobilités à afficher dans l'app : l'accès calculé vient du jeu « Gares et stations du réseau ferré d'Île-de-France (par ligne) » d'IDFM, sous Licence Ouverte v2.0 (Etalab) (pas ODbL). La licence demande de mentionner la paternité : la source et la date de dernière mise à jour (aujourd'hui 2025-12-10, portée par apps/api/src/transit/generated/stations.json). Proposition à trancher par DESIGN/Ilan : une ligne « Données : Île-de-France Mobilités, Licence Ouverte, mise à jour du 10 déc. 2025 » dans les mentions légales ou « À propos » (wiki Conditions-d-utilisation / Politique), éventuellement « Source : Île-de-France Mobilités » sous l'accès de E-05. À reporter aussi dans Architecture-Technique (données ouvertes, licences), qui ne cite pas encore cette source.

  18. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Découverte (CODE, #180, PR #482) — l'accès calculé n'atteint pas encore l'app : routes.computed.access est écrit ({ station, lines: [{ mode, line }], distance_m }), mais (1) la fiche RouteDetail.startAccess n'est servie que par les fixtures de l'app (startAccess: null), en attendant GET /v1/routes/:id ; son lines: string[] sans mode ne permet pas « Métro Abbesses, ligne 12 » de la maquette (D-052, mappings.access), et l'app affiche aujourd'hui « {{station}} ({{lines}}) » sans la distance « à 50 m du départ » ; (2) la réponse de l'éditeur (OwnRoute.computed, E-11 « Calculé pour vous ») ne porte pas l'accès. À ticketer : exposer l'accès avec son mode dans RouteDetail et RouteComputed, et l'afficher selon la maquette.

  19. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Découverte (CODE, #180, PR #482) — rafraîchissement des stations et recalcul hors éditeur : (1) les stations IDFM se rafraîchissent en relançant pnpm --filter @widoo/api transit:import puis en ouvrant une PR ; une action planifiée (trimestrielle, sur le modèle de sync-tokens.yml) qui ouvre cette PR serait une PR area:process à décider ; (2) seul l'enregistrement de l'éditeur (writeInPlace) et le seed écrivent computed.access : la validation d'une révision par la modération (PR #365) et le recalcul de nuit (Orchestration › Recalcul périodique) devront le recalculer avec accessColumnOf, y compris après un rafraîchissement des stations. (3) Le Modele-de-Donnees pourrait préciser la forme de computed.access (DESIGN).

  20. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Découverte (CODE, #189, PR #484) : copie livrée des textes légaux à tenir au niveau de l'API. L'app embarque les réponses de GET /v1/legal/:doc?locale=fr dans apps/mobile/src/legal/generated/*.json, pour un premier lancement hors connexion (E-19, D-063). Rien ne vérifie qu'elles suivent apps/api/src/legal/texts/ : un nouveau texte (nouvelle version) laisse l'ancienne copie dans les builds suivants tant que personne ne la régénère. Piste : une commande de l'API qui l'écrit, comme fixtures:route-sheets, et un test qui compare les versions. Même question pour les textes anglais quand ils existeront.

  21. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Découverte (CODE, #189, PR #484) : la sheet de connexion E-10 et la sheet « Mesure d'audience » ouvrent encore les textes légaux sur le site. D-063 les veut en écrans natifs, désormais disponibles (/settings/terms, /settings/privacy-policy) ; seuls les Réglages et la page Confidentialité y mènent dans #484. src/auth/links.ts (TERMS_URL, PRIVACY_URL) reste utilisé par E-10.

  22. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Découverte (CODE, #189, PR #484) : notifications du téléphone et permission Android. L'app ne déclare pas android.permission.POST_NOTIFICATIONS : sur Android 13 et plus, elle ne peut pas notifier, et Réglages › Notifications affiche toujours l'encart « coupées » avec des interrupteurs inactifs. La déclaration, la demande (premier « Programmer ») et la lecture de l'état sur iOS (getPermissionsAsync, D-061) relèvent de #44 : à y ajouter si ce n'est pas prévu, avec le remplacement de readPhoneNotifications (src/settings/phoneNotifications.ts).

  23. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Découverte (CODE, #189, PR #484) : assets et réglages qui manquent pour E-19 et E-20. (1) Logo Apple officiel et « G » de Google pour la carte de Réglages › Connexion (D-062, à reporter) : une icône key les remplace. (2) ios.appStoreUrl dans app.json dès que la fiche App Store existe : « Mettre à jour » ouvre une recherche « Widoo » d'ici là. (3) GET /config répond cache-control: max-age=300 : en recette, un abaissement de minVersion n'atteint une app déjà lancée qu'après ce délai côté client ; à garder en tête pour une version bloquante en urgence.

  24. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Constat (CODE, #189) : disque du Mac plein pendant la recette (100 %, Docker Desktop ne répondait plus, docker exec bloqué). L'agent a supprimé ses propres artefacts de build (DerivedData de son worktree, intermédiaires Gradle) : 5,9 Go libres ensuite. Trois autres dossiers ~/Library/Developer/Xcode/DerivedData/Widoo-* font environ 3,5 à 3,9 Go chacun ; leur nettoyage revient à Paul.

  25. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Tri MANAGER du 2026-10-15 (après-midi), découvertes de CODE pendant #180 (PR #482), #189 (PR #484) et #475 (PR #480). Tickets sans jalon (backlog), Epic posé dans le Project et dans la liste de l'epic.

    #180

    #189

    #475

    Non traités dans ce tri

  26. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Bilan de mi-journée, 2026-10-15

    Relevé MANAGER vers 13:45Z, d'après gh pr list --state merged --search "merged:2026-10-15", deploy-staging.yml et le Project « Widoo — MVP ».

    PR fusionnées aujourd'hui (8)

    PR Ticket Niveau
    #461 suppression des brouillons et privés, réinscription #128 3
    #473 profil public d'un créateur (API) #471 2
    #469 profil public de créateur (E-16) #65 1
    #478 clavier fermé avant le choix d'une anecdote #474 1
    #480 session d'un compte supprimé et boucle /me #475 2
    #481 vibration refusée sans moteur haptique #476 1
    #482 accès d'un parcours depuis les gares d'IDFM #180 2
    #484 pages des Réglages (E-19) et mise à jour (E-20) #189 2

    Déploiements staging verts sur chaque commit, dernier be0d461 (run 38738774809) ; /v1/health répond ok, base up.

    Terminés

    Recette de Paul sur le build preview 98b537be (Redmi Note 9, vers 13:40) et celle de ce matin sur 858b93ac : #387, #41, #198, #474, #475, #476, #65, #128 ; plus #471 (staging vérifié, profil public ouvert sur appareil). Aucun 401 sur staging en 10 minutes après la suppression d'un compte (480/min ce matin), aucun nouvel événement Sentry.

    Encore « À déployer », et pourquoi

    • #429 : le cache du tĂ©lĂ©phone n'a pas Ă©tĂ© inspectĂ© sur appareil.
    • #180 : rien n'indique que le seed de staging ait Ă©tĂ© rejouĂ©, donc aucun parcours n'a encore computed.access. Reste Ă  faire : infra/gcp/demo-seed.sh load (ou rĂ©enregistrer un parcours), puis vĂ©rifier en base.
    • #189 : E-20 attend le rĂ©glage app.versions en staging (#491).
    • Plus anciens, sans vĂ©rification consignĂ©e : #34, #37, #38, #126, #378, #385, #386, #392.

    Décisions d'Ilan toujours ouvertes

    #393 (contrat de la fiche, P0) · #383 · #413 · #414 · #417 et #460 · #418 · #433 · #434 · #435 · #436 · #438 · #446 · #447 · #450 (Brevo) · #457 · #464 · #466 (suppression livrée par #461, dont les trois choix de la PR) · D-088 (vélo, voiture, arrondi) · #470 · #472 · #477.
    Nouveaux : #485 (attribution IDFM) · #486 · #489 · #490 (questions fréquentes) · #492.
    Sortis depuis hier : #392 fermé ; #394 passé status:ready. #397 est bloqué par l'expéditeur Brevo (#467).

    Actions humaines restantes de Paul

    • ClĂ© Brevo brevo-api-key dans Secret Manager.
    • Nettoyage des dossiers ~/Library/Developer/Xcode/DerivedData/Widoo-* sur son Mac (environ 3,5 Ă  3,9 Go chacun ; 9 Go libres seulement).
    • RĂ©glage app.versions en staging et vĂ©rification de E-20 : #491.
    • Pour clore #180 : rejouer le seed de dĂ©mo en staging.
    • Pour clore #429 : inspection du cache sur appareil.
  27. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Découverte (CODE, #188, PR #494) : les rappels du premier « Programmer » (E-18) ne sont pas livrés par #188. La sheet « Recevoir un rappel ? », la demande d'autorisation des notifications et « Rappels désactivés » avec « Activer » dans Votre sortie (E-08) restent à faire. Sur iOS, demander l'autorisation exige un module natif (expo-notifications, nouvelle dépendance, droit aps-environment et nouveau build), qui est aussi celui de la réception des push de #44 ; sur Android 13+, il faut aussi déclarer POST_NOTIFICATIONS (découverte de #189). Tokens prêts : mappings.firstLaunch.reminderPermission et states.notificationsOff. #188 se fermera au merge de #494 sans cette partie : un ticket est à ouvrir, lié à #44.

  28. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Découverte (CODE, #188, PR #494) : états de E-18 non livrés, faute d'en-tête E-01 dans le code. L'accueil n'a pas de barre du haut (« Bonjour », bouton connexion, ligne « Paris 10e · République · 22 °C ») : (1) au premier lancement hors connexion, l'en-tête « Hors connexion » (wifi barré) et la carte en fond uni ; (2) position approximative : zone blue à 12 % bordée de blue 1,5 px à la place du point (le puck Mapbox ne la dessine pas ainsi), « Autour de Paris 10e » dans l'en-tête, lecteur d'écran « Votre position, approximative » ; (3) précision temporaire iOS demandée au lancement d'une sortie (E-07). Aussi : pendant la demande de position, l'accueil affiche un fond gris uni et non l'accueil en chargement de E-01 (squelettes). À ticketer avec l'en-tête de E-01 et E-07.

  29. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Constat (CODE, #188) : pas de recette possible sur ce Mac le 2026-10-15 vers 16 h. (1) Disque : 8 Go libres au départ ; un build iOS de dev complet (Pods + DerivedData) en consomme environ 7,5, le disque est tombé à 0,8 Go et l'agent a arrêté son build et supprimé ses propres artefacts (6 Go libres ensuite). Quatre dossiers ~/Library/Developer/Xcode/DerivedData/Widoo-* d'autres sessions font 3,5 à 3,9 Go chacun, plus ModuleCache.noindex (1,9 Go) : leur nettoyage revient à Paul. (2) Docker Desktop ne répond plus : le port 5432 accepte la connexion mais Postgres ne répond pas, docker ps reste bloqué ; l'agent a tenté quit app "Docker" puis open -a Docker, sans effet (les processus n'ont pas changé), puis s'est arrêté là. Un redémarrage de Docker Desktop revient à Paul.

  30. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    Tri MANAGER du 2026-10-15 (fin d'après-midi) : les découvertes restées non traitées au tri de 13:33Z, plus celles de #188 (PR #494).

    Recette de #474

    #471 (PR #473)

    #188 (PR #494)

    #199 (PR #493)

    Toujours en attente de DESIGN : Profil de Widoo sans identifiant.

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