SPB Git

spb/lou-ka

Public

Lou·Ka — tous les logements à louer du Québec, un seul endroit.

History of frontend Clear filter
page 1
  1. Tue, Aug 25, 2026 3

    1. Nav v2 correctif : le ✕ de fermeture vit DANS le panneau (fixe, toujours visible)
      …
      Le ✕ était le burger du header ; si le header n'est pas épinglé (bas de page),
      il défilait hors écran alors que le panneau fixed restait affiché — impossible
      de fermer sans Escape. Ajout d'un .mm-close position:fixed en haut à droite du
      panneau et burger masqué à l'ouverture (une seule commande de fermeture).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 2 files +13 −2
    2. Nav mobile v2 : le dropdown 480px devient un panneau plein écran fixed
      …
      Standard KA 2026-08-25 : .mobile-menu passe de position:absolute top:100%
      (max-height 480px) à position:fixed inset:0 — menu visible peu importe la
      position de scroll. Rang du header (marque + burger→✕) maintenu au-dessus du
      panneau, verrou de scroll CSS pur via html:has(.mobile-menu.open).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +13 −10
  2. Mon, Aug 24, 2026 9

    1. Simon-Pierre Boucher · 1 file +10
    2. Annuaire des déménageurs du Québec : page /demenageurs (565 entreprises, 17 régions)
      …
      - data/demenageurs.json : dataset canonique (balayage Google Places via Serper,
        188 villes, dédoublonnage CID/téléphone) — partagé avec Immo-Ka
      - louka/demenageurs.py : API /api/demenageurs (filtres région + texte)
      - frontend : page Demenageurs.tsx (recherche, filtre par région, tel:/site web),
        liens nav + menu mobile + prefooter
      - seo.py : SSR /demenageurs (liste complète par région, JSON-LD MovingCompany
        ItemList) + entrée sitemap-pages
      - scripts/build_demenageurs.py : régénération du dataset
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 2 files +240
    3. feat(fiche): dossier d'intelligence locative — passe sharp desktop/mobile + PDF complet
      …
      CSS : pastilles de statut affûtées, score hiver et note Google en tuiles
      à ombre dure, timeline encre, media queries 640px (tableau coût réel,
      dates empilées, barres d'avis compactes). PDF fiche : cinq nouvelles
      sections fidèles au web — coût réel ligne par ligne (statuts étiquetés),
      historique Lou-Ka + vies antérieures, passeport de l'immeuble (tuiles
      KPI, rotation, pression), gestionnaire (note Google, distribution des
      avis, plaintes, confiance d'association), score hiver.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +38 −7
    4. feat(fiche): styles du dossier d'intelligence locative — coût réel, historique, immeuble, gestionnaire, hiver
      …
      Complète les snapshots ka2 (backend 8efd8cb + composants 0ee1a2d) : pastilles
      de statut de donnée (observé/estimé/inconnu), tableau du coût réel, timeline
      Lou-Ka, distribution des avis Google, score hiver.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +166
    5. Simon-Pierre Boucher · 7 files +670
    6. feat(design): passe « éditorial sharp » sur la fiche — cartes, KPI, tableaux, pastilles
      …
      Blocs de la fiche transformés en cartes encre (bordure 1,5 px + ombre décalée
      douce), titres de section à marqueur accent + filet, tuiles KPI blanches à
      ombre dure, tableaux zébrés avec survol accent, barres de proximité/crime/air
      en dégradé, pastilles d'état unifiées (mono, point, liseré), décisions TAL en
      mini-cartes. Vérifié Playwright desktop 1440 + mobile 390 (overflow 0,
      check-order OK).
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +111
    7. feat(tal): historique du Tribunal administratif du logement par adresse
      …
      Décisions publiques du TAL (diffusées par SOQUIJ) croisées avec l'adresse
      de chaque annonce : recherche « no civique + rue » via Scrapfly (le site
      exige rendu JS + IP résidentielle ; pas de phrases entre guillemets),
      puis vérification de l'adresse exacte dans le texte intégral et
      classification (non-paiement, résiliation, expulsion, reprise/éviction,
      insalubrité…, demande du locateur vs du locataire, verdict). Cache par
      adresse dans data/tal.db, backfill borné dans la boucle watch + file
      prioritaire alimentée par les fiches consultées (/api/tal), bloc
      « Historique au TAL » sur la fiche (aucun nom de partie affiché —
      référence neutre + lien SOQUIJ).
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher · 4 files +148
    8. feat(doc): page documentation /doc (guide + captures) + lien footer + PDF téléchargeable
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 7 files +160
    9. Stats : panneaux territoire (registre des loyers, population, essence)
      …
      - louka/statsextra.py : 3 panneaux calculés sur nos jeux ouverts (cache 30 min)
        · Registre des loyers : 57 k loyers déclarés — KPI, médiane par nb chambres,
          histogramme, top 15 villes
        · Population & territoire : recensement des aires de diffusion couvertes
          (population, revenu médian, % locataires, âge, défavorisation) via
          listings.dauid
        · Prix de l essence : ~2450 stations gazquebec.ca — médianes régulier/super/
          diesel, barres et tableau par région
      - dashboard : clé panels ; Stats.tsx : rendu groupé et titré réutilisant le kit
        (KpiCard/Donut/BarChart/Histogram/DataTable)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +38
  3. Sun, Aug 23, 2026 13

    1. hydro : cache par uid + dérivation du code postal via lat/lng (Mapbox)
      …
      - cache indexé aussi par uid (clé stable annonce) : affichage cache-only sur
        la fiche sans code postal ni appel Mapbox
      - code postal dérivé du lat/lng par géocodage inverse Mapbox quand l adresse
        n en porte pas (cas Immo-Ka) — au moment du calcul seulement
      - estimate(uid, lat, lng) ; endpoint et fiche passent uid+lat+lng ;
        cache-only renvoie en_attente (bouton) si un calcul est faisable
      - precompute sélectionne lat/lng/uid, saute ce qui est déjà en cache par uid
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +19 −8
    2. hydro : pré-calcul des 100 annonces récentes + auto pour les nouvelles
      …
      - hydro.precompute(limit, budget) : calcule l estimation des annonces les plus
        récentes non encore en cache, plafond de résolutions captcha par appel
        (coût borné) ; run.py hydro-precompute [N] [budget]
      - watch : precompute(100, budget=30) à chaque cycle -> nouvelles annonces
        estimées automatiquement ; le cache data/hydro.db persiste entre releases
      - estimate(solve=False) = lecture cache seule (aucun captcha) ;
        GET /api/hydro cache-only par défaut, solve=1 pour forcer
      - fiche : le bloc s affiche AUTOMATIQUEMENT quand l estimation est en cache,
        sinon bouton de calcul à la demande
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 2 files +32 −20
    3. hydro : flux live fonctionnel (2captcha) — structure API réelle
      …
      - lieu-consommation : clé listeLieuxConsommation + cleUnique au niveau racine,
        code postal reformaté avec espace (exigé), idConso = item.id
      - estimation : {cleUnique, idConso} -> montantAnnuel + consommationAnnuelle
      - expose kwh_annuel ; testé live : 20 rue Lockwell = 283 $/an / 1100 kWh (12 s),
        2e appel servi du cache
      Activé via HQ_CAPTCHA_KEY (2captcha) dans .env.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 2 files +5 −4
    4. Fiche : estimation du coût d electricite Hydro-Quebec (a la demande)
      …
      - louka/hydro.py : parcours PUBLIC rétro-conçu de l outil « Estimer les coûts
        d électricité à une résidence » — 2 étapes (lieu-consommation -> estimation)
        sur services-cl.solutions.hydroquebec.com, jeton reCAPTCHA v2 via solveur
        enfichable (2captcha/CapSolver, clé HQ_CAPTCHA_KEY), sortie par proxy
        résidentiel CA (Oxylabs/Bright Data), cache 6 mois data/hydro.db ; sans clé
        captcha -> {disponible:false} et bloc masqué (jamais d estimation inventée)
      - GET /api/hydro?adresse= ; bloc fiche à la demande (bouton, 1 captcha/appel)
        affichant le coût mensuel et annuel estimés
      
      Activation : définir HQ_CAPTCHA_KEY (+ HQ_CAPTCHA_PROVIDER) dans .env.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 4 files +93
    5. Cartes : lignes de métro/REM aux couleurs officielles + transit hors ligne
      …
      - MetroLignes.tsx : couche Ka Maps (useKaMap) qui trace metro-lignes.geojson
        (lignes verte/orange/jaune/bleue + REM, extraites d OSM avec leurs couleurs
        officielles, liseré blanc de lisibilité) sur la carte de recherche, la
        vue carte et la carte 3D de la fiche
      - commerces : transit servi par data/transit.db (extrait OSM pré-calculé,
        37 237 arrêts de bus + 75 stations de métro + 57 REM + 106 gares au
        Québec — les miroirs Overpass refusent l IP du cluster) ; ajoute Station
        REM et Gare de train au bloc Commerces et transport
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 6 files +63 −1
    6. Fiche : bloc Commerces et transport (Mapbox Search Box + cache POI/OSM)
      …
      - louka/commerces.py : point de vente le plus proche de 14 grandes bannières
        (Costco, Walmart, Metro, IGA, Maxi, Super C, Provigo, Canadian Tire,
        Dollarama, SAQ, Pharmaprix, Jean Coutu, Home Depot, RONA) via l API Mapbox
        Search Box (jeton public kamaps, validation du nom retourné, anti
        « Station Métro »), cache par cellule ~1 km TTL 30 j ; station de métro et
        arrêt de bus les plus proches repris du cache POI du projet (repli
        Overpass) ; GET /api/commerces
      - bloc fiche : pastilles SVG monogrammes aux couleurs des bannières,
        nom du point de vente et distance — métro/bus en tête
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 4 files +115
    7. Fiche : qualité de l air (RSQAQ/PST) + essence à proximité (gazquebec.ca)
      …
      - louka/air.py : agrégats annuels par station du RSQAQ (MELCCFP) — horaires
        2024-2025 (PM2.5, NO2, O3, SO2, CO) + séquentielles PST/PM10 (<LD -> LD/2),
        data/air.db minuscule, station la plus proche ≤ 60 km ; bloc fiche avec
        badge global et barres vs repères OMS 2021 / norme RAA (PST 60 µg/m³)
      - louka/gaz.py : copie locale des ~2 450 stations de gazquebec.ca (prix
        Régulier/Super/Diesel, TTL 4 h, auto-refresh au lookup) ; bloc fiche avec
        KPI (stations, médiane du secteur, meilleur prix) et tableau des stations
        les plus proches, la moins chère mise en évidence
      - run.py air-refresh / gaz-refresh, GET /api/air et /api/gaz
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 5 files +219
    8. Quartier : criminalité SPVM détaillée par catégorie (12 mois, tendance)
      …
      _crime_mtl ventile désormais les actes par catégorie (vol dans/sur véhicule,
      introduction, vol de véhicule, méfait, vol qualifié, infractions mortelles) ;
      le bloc quartier affiche des barres par catégorie avec la variation vs les
      12 mois précédents (flèches chiffrées, jamais la couleur seule).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +55 −9
    9. Risque d inondation (BDZI) + Registre des loyers v2 (visuel)
      …
      - louka/inondation.py : base locale data/inondation.db construite du GeoPackage
        BDZI officiel (25 k polygones éclatés + R*Tree, couverture Carto_ZI_S),
        lookup point-dans-polygone shapely (0-40 ms), statuts en_zone / a_proximite
        (≤100 m) / hors_zone / non_cartographie ; run.py inondation-build,
        GET /api/inondation — bloc fiche avec badge de sévérité (grand courant
        0-20 ans = élevé, faible courant 20-100 ans = modéré) et rappel que la
        cartographie officielle fait foi (CMM non couverte par la BDZI)
      - Registre des loyers v2 : tuiles KPI (volume, médiane secteur, médiane même
        nombre de chambres), bande de position p10-p90/boîte p25-p75/médiane vs le
        loyer demandé, barres des médianes par chambres (celle de l annonce
        surlignée + étiquette), date de la valeur = année du loyer (mois seulement
        si le bail débute la même année), quartiles côté API
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 5 files +253 −26
    10. Registre des loyers : extraction pancanadienne (57 433 déclarations géocodées) + bloc fiche
      …
      - louka/rdl.py : balayage par boîtes de l API publique de registre-des-loyers.ca
        (subdivision récursive sur erreur ou volume suspect), base séparée data/rdl.db,
        requête de proximité (bbox + haversine) avec médianes globale/récente/par chambres
      - run.py rdl + GET /api/rdl?lat&lng&radius
      - fiche : bloc « Registre des loyers » sous l analyse de prix — médiane du secteur,
        écart du loyer demandé vs les déclarations du même nombre de chambres,
        8 déclarations les plus proches avec la date de la valeur (année du loyer,
        mois si le bail débute la même année), crédit Vivre en ville
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 4 files +156
    11. ka-agent : balise analytics KA (collect vers administration-ka.com)
      …
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +2
  4. Sat, Aug 22, 2026 5

    1. Simon-Pierre Boucher · 8 files +1,168
    2. Simon-Pierre Boucher · 1 file +4 −4
    3. Simon-Pierre Boucher · 2 files +17 −14
    4. Simon-Pierre Boucher · 1 file +1 −1
  5. Wed, Aug 19, 2026 5

    1. fix(fiche): ordre des sections = ordre du DOM sur tous les breakpoints
      …
      Sur mobile, PriceAnalysis (.f-fairvalue), la carte (.f-carte) et les KA
      Scores (.f-kascores) n avaient pas de règle order: et retombaient à
      order:0 — ils s affichaient AVANT la galerie, le prix et l adresse.
      
      - Listing.tsx : DOM restructuré en ordre logique unique (galerie → prix/
        adresse/PDF → description → inclusions → détails pratiques → analyse
        de prix → carte 3D → KA Scores → quartier → à proximité)
      - styles.css : suppression de tous les order:/display:contents — mobile
        empile les colonnes en flux naturel, desktop garde la grid 2 colonnes
      - scripts/check-order.mjs : validation Playwright (iPhone + desktop) de
        l ordre visuel, du scroll initial et de l absence d order CSS
      
      Validé Chromium + WebKit (iPhone 14) et desktop 1440px sur 2 fiches.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +110 −61
    2. Simon-Pierre Boucher · 1 file +4 −1
    3. Stats v2 : dashboard ultra complet + 5 rapports PDF (module Groupe KA v2)
      …
      - louka/statsdash.py : jauges de couverture (geo/prix/photos/publiees/completude),
        sparklines KPI, serie des retraits + loyer moyen d entree (area), multi-courbes
        loyer median par taille, barres empilees par source, distribution des loyers,
        heatmap horaire 7x24, calendrier 26 semaines, tables loyers par taille et
        baisses de loyer, records enrichis (villes chere/abordable, hausse, heure de
        pointe) - donnees reelles seulement, cache 5 min conserve
      - louka/kapdf.py + frontend/src/ka/stats/* : module canonique v2 (5 modes PDF)
      - /api/stats/report : mode=complet|synthese|tendances|repartitions|donnees,
        filename(mode) ; inconnu -> complet (retrocompatible v1)
      - pages/Stats.tsx : rendu des nouvelles sections dans l ordre du SPEC v2 +
        PdfButton menu 5 rapports
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 4 files +954 −179
    4. Mobile : backdrop du menu compte via createPortal, verrou scroll de la feuille filtres, champs ≥16 px, logo tactile, socle mobile tokens.css, ka-agent corrigé
      …
      - frontend/src/App.tsx : .account-backdrop rendu à la racine via createPortal
        (le backdrop-filter du header re-parentait le position:fixed → voile de
        66 px) + fermeture du menu compte à Escape.
      - frontend/src/pages/Home.tsx : feuille de filtres mobile (sheetOpen) — gel du
        scroll d arrière-plan (pattern du hamburger) + fermeture à Escape.
      - frontend/src/styles.css : backdrop compte plein écran sous le header (z-40,
        le menu ancré dans le header reste au-dessus) ; champs de filtres ≥16 px sur
        mobile (f-search, f-native, f-ctl select, ms-sort) ; zone tactile ≥44 px du
        logo .brand (::after inset -8px, rendu inchangé).
      - frontend/src/ka/tokens.css : socle mobile obligatoire (z-index communs,
        --vh100, .ka-scroll-lock, .ka-bottombar, filet anti-zoom iOS 16 px).
      - frontend/public/ka-agent.js : safe-areas, textarea 16 px, plein écran
        ≤640 px + verrou, pas de focus clavier forcé.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 5 files +153 −16
  6. Tue, Aug 18, 2026 5

    1. Rapport de validation sync liste↔carte + KA Scores (25/25 E2E) + chrome mobile
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +3
    2. KA Scores — suite géographique maison (Walk/Transit/Bike/Calme/Services)
      …
      · environment.py : inventaire OSM par tuile (Overpass) — routes majeures,
        rails, aéroports, zones industrielles, bars, pistes cyclables (géométrie
        densifiée) et TOUS les POI par catégorie ; cache env_tiles ~3 mois.
      · kascores.py : 5 scores 0-100 par immeuble + global pondéré, barème
        versionné (2026.08-v1), détails honnêtes par score, « Données
        insuffisantes »/« Non desservi » plutôt que des 0 trompeurs ; Transit =
        proximité des arrêts × percentile PMD StatCan ; calcul incrémental
        (7 900 immeubles en ~8 s), distribution de calibration en sortie.
      · API : ks_* joints à /api/listings et /api/search (tri « ka », filtre
        kascore_min), détail complet sur la fiche, /api/kascores/stats.
      · Frontend : pastille KA sur les cartes d annonces, section KA Scores de
        la fiche (5 jauges + détail dépliable + date/version), page /ka-scores
        (méthodologie publique + pondérations personnelles en curseurs), tri
        « Meilleur KA Score » dans la vue carte, filtre « KA Score minimal ».
      · Boucle watch : env (4 tuiles max) + kascores incrémental à chaque sync.
      · Tests : test_kascores.py (barème, honnêteté, rendement décroissant,
        cohérence spatiale sur le parc réel).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 10 files +563 −6
    3. Recherche synchronisée liste ↔ carte (une seule vérité partagée)
      …
      · /api/search : une réponse = page de liste + tous les points carte,
        même tri — compteur liste = marqueurs par construction ; bbox, polygone
        dessiné, tris (prix/récent/affaires), include=liste, annonces sans
        position comptées honnêtement.
      · MapSearch.tsx : état unique filtres+zone+tri+page, miroirs survol/clic
        < 100 ms dans les deux sens, page ajustée au clic marqueur + pulsation,
        « Rechercher quand je déplace la carte », « Rechercher dans cette zone »,
        recadrage animé respectant l intention (byUser), « Recadrer sur les
        résultats », zone dessinée en puce retirable + URL, carrousel mobile
        synchronisé aux marqueurs, états vides propres, URL complète partageable.
      · Géolocalisation d accueil : arrivée sur le site → demande de position →
        vue carte centrée sur l utilisateur (une fois par session, lien partagé
        respecté, refus silencieux).
      · Marqueurs « déjà vu » atténués (localStorage), fourchette de prix des
        clusters au survol, spiderfy discret des unités d un même immeuble.
      · Tests : scripts/test-sync.mjs (25 vérifications E2E Playwright, critères
        1-9), tests/test_search.py (9 tests API).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 7 files +1,129 −41
    4. Garde-fou overflow-x: clip (débordement transitoire 360 px au chargement)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +5
    5. Qualité des données + solidité mobile + framework de juste valeur (fair value)
      …
      Mission 1 — enrichissement des connecteurs et qualité :
      - quality.py : score de complétude 0-100 + seuil de publication (quarantaine
        des annonces sans prix plausible / localisation / contenu exploitable)
      - imgcheck.py : audit des images (liens morts 404/410, minuscules, placeholders
        multi-adresses, doublons) -> galeries nettoyées images_ok, cache image_checks,
        politesse 3 requêtes/hôte, écriture hors transaction réseau
      - 26 connecteurs enrichis (galeries complètes, descriptions, prix, adresses) :
        kangalou, royal_lepage, medway, remax_quebec, groupe_maurice, mellem, sutton,
        lespac, heafey, kijiji, fb_marketplace, zumper, equinoxe_batimo, logis_experts,
        quartier_sila, msi, summum, quartier_plus, urban_services, cosoltec, garic,
        lakle, matinale, huma, jutras, groupe_theoret, ferrovia
      - normalize : clean_city/clean_sector (rues et entités HTML retirées des menus),
        kijiji : adresses françaises « 89, rue X » correctement découpées
      - geocode : virgule après le n° civique corrigée (lot AQ), base en WAL
      - dedup : une annonce en quarantaine ne masque jamais un doublon publié
      
      Mission 2 — mobile :
      - /api/img : miniatures WebP servies à la taille de l écran (cache disque)
      - SmartImg : miniature -> original -> visuel de secours Lou-Ka (jamais d icône cassée)
      - lightbox tactile : balayage scroll-snap + pincement + double-tape
      - bannière témoins : ne recouvre plus le bouton Filtres (--consent-h)
      - cibles tactiles >= 44 px (pointer: coarse) ; KA Agent plein écran à l ouverture
      - stats : complétude moyenne, quarantaine par source
      
      Mission 3 — juste valeur locative (fairvalue.py, fv-logement-1.0) :
      - 3 niveaux : segments médians (repli en échelle) + coefficients de
        caractéristiques appris et centrés + comparables kNN géographiques (médiane
        pondérée) ; couloir de sécurité, fourchette, indice de confiance
      - prudence : pas de verdict si confiance faible, prix « à partir de »,
        prix non mensuel, écart hors plausible ; chambres/coloc = segment dédié
      - pastilles sous/dans/au-dessus du marché (cartes + fiche), bloc Analyse de
        prix avec histogramme, filtre « Sous le marché » + tri, page /juste-valeur
      - API : champs fv_* + deal/sort, /api/fairvalue/{uid} ; stats + PDF ;
        historisation fv_segments ; tests synthétiques ; docs/FAIRVALUE*.md
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 13 files +583 −26
Menu

Theme