SPB Git

Repository Public

History of tests Clear filter
Page 1
  1. Fri, Aug 21, 20261 commit

    1. quality: porte de pertinence — quarantaine des stationnements, garages, locaux commerciaux et locations à la nuit
      ···
      Certaines sources mêlent aux logements des cases de stationnement (~200 $),
      garages/entreposage, locaux commerciaux/bureaux, objets divers et tarifs à la
      nuit. relevance_reason() les détecte (titre + description + seuils de prix,
      sans faux positif sur les logements « avec stationnement inclus ») et evaluate()
      les met en quarantaine (published=0). Backfill appliqué : 78 annonces retirées.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher 1 file +102
  2. Tue, Aug 18, 20263 commits

    1. 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 2 files +231
    2. 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 1 file +87
    3. 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 20 files +1,522 −1,664
  3. Sun, Aug 9, 202610 commits

    1. Expansion P3 — Estrie (6 connecteurs +24 annonces, 17 non-connectables)
      ···
      terater (12) · alexcellence (4e Houzez, sous-classe Dynamic) · oxford ·
      immeubles_pm (plogg vivant) · majestic (Granby) · lequerre (OBNL).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher 49 files +53,323
    2. Expansion P3 — Est & Nord + Chaudière-Appalaches (7 connecteurs +98 annonces, 9 non-connectables)
      ···
      quartier_plus (Thetford, 59) · immeubles_bois (Rimouski, catalogue 23) ·
      louer_saguenay · luxuor · beaulieu_groupe · gestion_jdm · alias_appartements.
      LM Gestion et Alexandre Pelletier re-vérifiés (sites toujours morts).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher 32 files +28,807
    3. Expansion P3 — Mauricie/CdQ/Lanaudière (6 connecteurs +53 annonces, 8 non-connectables)
      ···
      moderno · acceslogis_gb · ferrovia (23, prix non publiés) · habitations_sf ·
      lambert · fournelle. Non-connectables documentés (parcs pleins, vitrines
      sans unités, renvois Facebook).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher 33 files +41,782
    4. Expansion P3 — Outaouais (5 connecteurs +41 annonces, 10 non-connectables)
      ···
      wandji (API /api/buildings découverte, 29) · gio (crawl-delay 3 respecté) ·
      immnasr · quanta · leviu (portail Magex). Registre fusionné.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher 20 files +9,687
    5. Expansion P2 — Estrie (15 connecteurs, +279 annonces)
      ···
      Famille Houzez factorisée (dynamic -> gestimmo_estrie, agence_sherbrooke) ·
      uptimo (51) · dynamic (49) · matinale (42, Crawl-Delay 20 respecté) ·
      gestimmo (41) · montagnais (6 campus étudiants) · floria (Livya) + 8 autres.
      6 non-connectables documentés (plateforme plogg morte, vitrines sans prix).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher 304 files +429,316
    6. Expansion P2 — Outaouais (10 connecteurs, +136 annonces)
      ···
      garic (admin-ajax JSON avec GPS, 47) · aalto (RentCafe/Zibi via Firecrawl,
      28) · desmarais (14) · souleymane (13) · elite (12) · lacite (crawl-delay 10
      respecté, prix non publiés) + 4 autres. Aucune exclusion nécessaire.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher 130 files +89,737
    7. Expansion P2 — Est & Nord (19 connecteurs, +633 annonces)
      ···
      medway (494 — Lévis 343, Québec 81, La Malbaie, Pont-Rouge, Rivière-du-Loup) ·
      immeubles_aeb (26, Saguenay) · location_saguenay (21, crawl-delay 10 respecté) ·
      appartements_rimouski (17, GPS permutés corrigés) · habitations_jeanne (14,
      Baie-Comeau) · stb_immobilier (11, correctif : Matane pas Lévis) ·
      immeubles_dcl (9, API FleetCart) + 12 autres. Non-connectables documentés :
      habitat_honguedo (Gaspé, vide depuis 2020), immofidelite (RPA hors périmètre).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher 201 files +251,215
    8. Expansion P2 — Mauricie/Centre-du-Québec/Lanaudière (17 connecteurs, +423 annonces)
      ···
      evoludev (Laravel+JSON-LD, 125) · groupe_robin (admin-ajax, 65) · cosoltec
      (Planpoint x3 vitrines, 51) · info_logement (45) · jutras (35) · gestion_isr
      (API Supabase découverte, 21) + 11 autres. 3 non-connectables documentés
      (nicolyn, gestion_traversy, proplex).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher 211 files +321,481
    9. Expansion P2 — Chaudière-Appalaches (le_baronet, girs, +11 annonces)
      ···
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher 29 files +24,366
    10. Expansion provinciale P1 : 26 nouveaux connecteurs + 8 extensions (+1 358 annonces)
      ···
      Lot 0 extensions : girescom +Beauce, msi +Thetford, utile +Trois-Rivières/
      Rimouski, cogir/realstar/centurion/plan_a +Gatineau/Sherbrooke.
      Lot 1 plateformes maîtrisées : thrace (Livya, 181), lr_gestion (Rentsync),
      urban_services + immobilia (Building Stack).
      Lot 2 Est & Nord : immeubles_bc (Rimouski), tri_logis (Rouyn), devcore
      (Sept-Îles/Outaouais), multi_logis (Côte-Nord+Lévis), courtemanche (Saguenay).
      Lot 3 Estrie : lachance (82), gesteco (API Umbraco), savouet, laureat_richard,
      desroches. Lot 4 Mauricie/CdQ : location_di, cap_gestion (122), capital_rdr,
      gestion_tb, summum (93). Lot 5 Outaouais/Ch-App : halfred (165), heafey (245),
      brigil (Firecrawl), mellem, quartier_oree, le_st_georges, place_florimay.
      
      Enrichissement complet appliqué : géocodage provincial (+616), POI 1 756
      immeubles, quartier 1 088 annonces jointes (0 hors-zone), normalize corrigé
      (frontières de mots des mois). Registre : 114 sources, 108 connecteurs,
      ~7 350 annonces. Secrets tiers caviardés des fixtures (jetons Mapbox +
      caviardage automatique à l'enregistrement).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher 836 files +731,391 −499
  4. Sat, Aug 8, 202610 commits

    1. Text mining des descriptions : nettoyage, extraction, sections, En bref
      ···
      louka/textmine.py (déterministe, ~1 ms/annonce, aucune dépendance) :
      - A nettoyage : TITRES EN MAJUSCULES -> sections, doublons (« Disponible
        disponible »), phrases collées, typographie québécoise (insécables $/%)
      - B extraction : bail minimum, occupants (« 11 chambreurs »), sdb/cuisine
        commune-privée, électros, dépôt, ~40 quartiers (réutilise normalize.py)
      - C sections jamais reformulées ; « En bref » par gabarit strict à partir
        des faits haute-confiance seulement (aucune invention)
      - D confiance par fait, incohérences (quartier mentionné ≠ secteur),
        complétude 0-100 — 25 tests dont un test d'or sur le 2435 boul. Laurier
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher 1 file +357
    2. Sécurité : caviardage des clés API tierces dans les fixtures de test
      ···
      Les pages HTML archivées des sites sources contenaient leurs clés Google Maps
      (publiques par nature côté client, mais republiées inutilement sur GitHub).
      Toutes caviardées ; l'enregistreur les caviarde désormais automatiquement.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher 1,329 files +1,598 −1,598
    3. Mission 3 (suite) — 13 nouveaux connecteurs Québec/Lévis (+747 annonces)
      ···
      somex_saintnicolas (145) · quartier_sila (200) · edifia (184 : Le Vital,
      Capella, Cardinal N/S) · aula (69) · girescom (38) · mercini (35) ·
      quartier_mosaique (24) · la_cour (20) · louis14 (18, prix réels via widget
      Livya jamais affichés sur leur site) · immeubles_guillot (7) · sig (4
      résidences étudiantes UL) · promenade_des_forts (2) · centurion (Quartier QB,
      684 unités — 'No Vacancy' actuellement, se peuplera automatiquement).
      
      Découverte transverse : 4 sites (Somex, Sila, Louis XIV, Le Vital) utilisent
      le module Livya (ex-RealVuu) dont le flux RSC Next.js rendu serveur expose
      l'inventaire JSON complet. La Cour + AULA partagent le parseur do-selecteur
      (REST wp-json), déjà éprouvé chez Immostar.
      
      Registre : 88 sources, 82 connecteurs. 191 tests verts.
      Couverture GPS : 95,6 % global · 97,5 % des annonces avec adresse.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher 219 files +160,977
    4. Mission 1b (lot 8) — logisbourg, logisco, logisma, lokalia, lynk_olymbec
      ···
      - lokalia : +12 annonces (variantes « + DEN » dédupliquées à tort), GPS 100 %
      - logisco : adresse complète JSON-LD, superficie/étage structurés, 4 sections
        de commodités, pages unité en cache
      - lynk_olymbec : valeurs semi-inventées supprimées, prix/dispo réels RentCafe
      - normalize.py : non-chauffé avec trait d'union, branchements combinés,
        « refusés sauf un chat » -> conditions, « (sans utilisation) » neutralisé,
        fourchettes « de X $ à Y $ » = prix plancher
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher 299 files +502,704
    5. Mission 1b (lot 5) — gestipro, gimcote, gparadis, groupe_dallaire, hazelview
      ···
      - groupe_dallaire : superficie 49 % -> 100 %, inclusions réelles par unité,
        fiches en cache (180 requêtes/sync évitées)
      - gestipro : GPS 100 %, animaux 92 %, inclusions depuis « Frais et charge »
      - gimcote : description/animaux/meublé 100 %, GPS 100 %
      - gparadis : +1 immeuble Saint-Roch (regex pluriels)
      - normalize.py : « à la charge des locataires » -> non inclus,
        « actuellement vacant » -> disponible maintenant
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher 378 files +569,572
    6. Mission 1b (lot 6) — headway, huma, immomarketing, immostar, interrent
      ···
      - interrent : bug amenities (champ inexistant) corrigé, animaux 0 -> 203
      - immostar : commodités 0 -> 100 % sur les 6 micro-sites, superficie 100 %
      - huma : dates de dispo réelles par unité, adresses et GPS par phase
      - immomarketing : GPS 100 %, cache detail, animaux 53/82
      - normalize.py : animal au singulier, promos neutralisées, prix stationnement
        complet (formats 150 $ et $85)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher 306 files +386,472
    7. Mission 1b (lots 4,7,9-13) + mission 2 — 37 connecteurs mis à niveau, Logis-Experts activé
      ···
      Nouveau connecteur logis_experts (logis-experts.com, API JSON) : 516 annonces,
      188 immeubles, prix/adresse/code postal/secteur/lat-lng à 100 %, superficie et
      commodités via pages détail en cache.
      
      Faits saillants de l'audit :
      - lakle : +20 unités (phases 2-3 ignorées), superficie terrasse->habitable
      - dma_locago : +11 unités Tour Frontenac, correction des disponibilités
      - equinoxe_batimo : adresses 0 % -> 100 % (602 annonces)
      - sgiq : lat/lng 88 %, animaux 100 %, sync 83 s -> 4 s
      - msi/picard/progim/capreit… : pages détail migrées vers le cache BD
      - utile : statut hero corrigé (2 annonces faussement « Complet »)
      - per : « Animaux permis : Non » inversé corrigé
      
      normalize.py : ~20 nouveaux cas génériques remontés par les agents (dates
      anglaises mois-jour, animaux singulier/poids/interdits, aires communes,
      piscine/stationnement « chauffé », balcon négatif, vélo, « ($) », semi-meublé,
      superficies balcon/terrasse ignorées, milliers avec virgule, hydro/heat/terrace
      anglais, nombres en toutes lettres) — chaque cas couvert par un test.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher 1,338 files +1,400,896 −2,158
    8. Mission 1b (lot 1) — akelius, app_urbains, axia, beaudoin, boardwalk, bribourg
      ···
      - akelius : JSON détail découvert (pets 221/247, meublé, inclusions, photos HD)
      - boardwalk : superficie 100 %, dispo réelle, sync 210 s -> 54 s (cache detail)
      - beaudoin : commodités 100 % (additional_features), superficie 67 %
      - app_urbains : superficie 100 %, adresse Le Charlie corrigée
      - normalize.py : « chiens et chats acceptés » -> oui (priorité sur conditions)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher 227 files +329,569
    9. Mission 1b (lots 2-3) — audit et mise à niveau de 10 connecteurs + correctifs normalisation
      ···
      Connecteurs : brio, brivia_1sp, brochu, capreit, cogir, contraste, copley,
      cromwell, denux, devimco — fixtures + tests + rapports d'audit.
      
      Faits saillants :
      - cogir : collision d'uid corrigée (283 annonces au lieu de 270), annonces
        fantômes « liste d'attente » exclues
      - capreit : lat/lng 100 %, fiches derrière cache detail (sync 75 s -> 0,4 s)
      - devimco : adresses 84 % -> 100 %, superficie structurée
      - contraste : commodités 0 % -> 100 %, faux « 0 $/mois » supprimés
      - brivia_1sp : API AJAX des plans découverte (dispo réelle, superficies)
      
      normalize.py : négations chauffage/éclairage, « chiens non permis » -> pets
      conditions, options payantes neutralisées (optionnel/en sus), stationnement
      mixte int+ext, étage restreint aux commodités, refrigerator/cooling anglais.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher 339 files +574,113
    10. Mission 1a — couche commune : schéma enrichi, normalisation centrale, robustesse, tests
      ···
      - schema.Listing : availability_date (ISO/now), area_sqft, pets, furnished,
        details (JSON structuré) + finalize() appliqué à toutes les sources
      - normalize.py : dates FR/EN → ISO, superficies pi²/m², prix robuste,
        types d'unité (chambres→½, 6½+, MDV…), commodités → tags canoniques,
        stationnement/animaux/fumeur/contact extraits du texte
      - db.py : migration auto, délai de grâce (2 syncs) avant désactivation,
        détection de dérive (volume + taux de prix null) avec retraits suspendus,
        cache des pages détail, cache de géocodage (préparé pour la carte)
      - fixtures.py + run.py record : enregistrement/rejeu des réponses HTTP,
        tests de régression pytest par connecteur (snapshot + validité schéma)
      - web.py : nouveaux filtres pets/furnished/available_by/area_min
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher 60 files +165,077
Menu

Theme