SPB Git

spb/lou-ka Public

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

HTML 99.7%
  1. Simon-Pierre Boucher committed yesterday (Aug 9, 2026) · 3 files changed +234 −4
  2. 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 committed yesterday (Aug 9, 2026) · 84 files changed +54,661
  3. 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 committed yesterday (Aug 9, 2026) · 46 files changed +29,930
  4. 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 committed yesterday (Aug 9, 2026) · 45 files changed +42,985
  5. 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 committed yesterday (Aug 9, 2026) · 82 files changed +12,412 −1
  6. 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 committed yesterday (Aug 9, 2026) · 349 files changed +432,335
  7. Page Stats en 5 onglets + rapport PDF enrichi (source unique marketstats.py)
    - louka/marketstats.py : tous les agrégats du marché (régions, offre,
      inclusions, prix au pi², baisses de prix 30 j, santé des sources) —
      partagés entre /api/stats/detailed et le rapport PDF
    - Onglets : Vue d'ensemble (tuiles + régions + histogramme) · Loyers
      (histogramme, par taille, prix au pi², baisses de prix cliquables) ·
      Régions & villes · L'offre (inclusions %, dispo, animaux, superficie) ·
      Gestionnaires (top 20 + santé des syncs + alertes 24 h)
    - Rapport PDF : page « Offre » ajoutée (barres d'inclusions, prix au pi²,
      baisses de prix), 4 pages, mêmes chiffres que le site
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    Simon-Pierre Boucher committed yesterday (Aug 9, 2026) · 6 files changed +706 −311
  8. 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 committed yesterday (Aug 9, 2026) · 160 files changed +92,105
  9. PDF légendaires : fiche de propriété par annonce + rapport global du marché
    - louka/pdfgen.py (reportlab) au style éditorial sharp : logo Lou·Ka dessiné
      (boîte lime tournée), tuiles à ombre décalée, chips encre/lime
    - Fiche (/api/listings/{uid}/pdf, 2 pages) : prix géant + badge « vs le
      secteur », chips clés, photos encadrées, encadré « En bref » (text mining),
      description structurée, inclusions ✓, tuiles du quartier + barres de
      proximité + badges chaleur/criminalité, à proximité avec temps de marche,
      QR code vers la fiche en ligne, attributions de licences
    - Rapport global (/api/stats/rapport.pdf, 3 pages) : grands chiffres,
      couverture par région avec barres, histogramme des loyers, par taille,
      top 20 villes et gestionnaires
    - Boutons : « Télécharger la fiche (PDF) » sur chaque annonce, « Télécharger
      le rapport global (PDF) » sur la page Stats
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    Simon-Pierre Boucher committed yesterday (Aug 9, 2026) · 6 files changed +778
  10. 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 committed yesterday (Aug 9, 2026) · 259 files changed +255,406
  11. 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 committed yesterday (Aug 9, 2026) · 265 files changed +325,255
  12. Expansion P2 — Chaudière-Appalaches (le_baronet, girs, +11 annonces)
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    Simon-Pierre Boucher committed yesterday (Aug 9, 2026) · 35 files changed +24,826
  13. 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 committed yesterday (Aug 9, 2026) · 937 files changed +738,569 −561
  14. Expansion provinciale : bornes géographiques élargies (géocodage + recensement)
    Le garde-fou du géocodeur et la bbox des aires de diffusion excluaient
    Gatineau, l'Abitibi, le Saguenay, le Bas-Saint-Laurent, la Côte-Nord et la
    Gaspésie. Élargis à la province habitée (44,5-63 / -80 à -56) ;
    reconstruction du recensement provincial lancée.
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    Simon-Pierre Boucher committed yesterday (Aug 9, 2026) · 2 files changed +8 −3
  15. Simon-Pierre Boucher committed yesterday (Aug 9, 2026) · 3 files changed +25 −3
  16. Phase 1 expansion provinciale : recensement 173 gestionnaires (33 P1) + plan de déploiement
    5 rapports régionaux vérifiés site par site (techno, robots.txt, CGU) +
    familles de plateformes + exclusions documentées + ordre de construction.
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    Simon-Pierre Boucher committed yesterday (Aug 9, 2026) · 6 files changed +611
  17. Page /bot (transparence LouKaBot) + User-Agent pointant dessus
    Explique le robot aux gestionnaires : cadence, respect de robots.txt, aucune
    donnée personnelle, contact pour flux officiel/retrait, consigne de blocage.
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    Simon-Pierre Boucher committed yesterday (Aug 9, 2026) · 3 files changed +61 −1
  18. Passerelle de sortie vers l'annonce originale (à la Centris)
    /passerelle/:uid — Lou-Ka -> gestionnaire avec points animés, barre de
    progression (2,2 s) puis redirection ; boutons « Y aller maintenant » et
    « Rester sur Lou-Ka ». Sécurité : uid seulement, l'URL de destination vient
    de l'API (aucune redirection ouverte). CTAs de la fiche (desktop + sticky)
    rebranchés ; prefers-reduced-motion respecté.
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed yesterday (Aug 9, 2026) · 4 files changed +163 −2
  19. 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 committed 2 days ago (Aug 9, 2026) · 3 files changed +1,424
  20. Fiche v2 mobile-first : essentiel d'abord, badge marché, CTA sticky, historique de prix
    - Ordre mobile : galerie (balayage natif + compteur) -> prix + badge
      « vs le secteur » (seuils -15 %/+10 %) -> chips clés défilantes -> ancres ->
      description -> inclusions (confirmées ✓ vs mentionnées, badge 0 $ de frais
      cachés) -> détails pratiques -> quartier -> à proximité groupé repliable
      avec temps de marche estimés
    - Desktop : 2 colonnes (logement | synthèse+quartier) via display:contents
    - CTA source sticky en bas d'écran mobile (toujours visible)
    - Criminalité reformulée (« 15 % sous la moyenne canadienne ✅ »)
    - Backend : table price_log (historique de prix aux changements), colonne
      digest (description structurée, pipeline en cours), « en ligne depuis X
      jours », plomberie schema/db/web
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 9, 2026) · 7 files changed +504 −142
  21. Quartier : scripts de construction des données + centiles PMD + correctif débordement mobile
    - scripts/build_{recensement,contexte,environnement}.py : pipelines rejouables
      (StatCan recensement 2021 + limites AD, PMD, INSPQ défavorisation, écoles
      MEQ/IMSE, îlots de chaleur INSPQ, actes criminels SPVM, IGC WDS)
    - merge_quartier.py : fusion + rangs centiles québécois des scores PMD
      (l'échelle nationale brute écrasait les valeurs urbaines)
    - data/quartier.db (51 Mo, gitignoré) : déployé par rsync, reconstruit par
      scripts — 11 317 AD, 49 791 actes SPVM 24 mois, 1 249 immeubles chaleur
    - min-width:0 sur les enfants de .detail-grid (débordement mobile)
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 9, 2026) · 9 files changed +1,657
  22. Stats de quartier (à la Centris) — runtime + fiche « Le quartier »
    - louka/quartier.py : jointure lat/lng -> aire de diffusion 2021 (point-dans-
      polygone local, préfiltre bbox), assemblage fiche (démographie recensement,
      scores de proximité StatCan, défavorisation INSPQ, îlot de chaleur,
      criminalité SPVM <500 m sur l'île / indice IGC ailleurs), enrichissement
      listings.dauid dans la boucle watch
    - data/quartier.db : base statique construite par scripts/ (fusion via
      scripts/merge_quartier.py), défensif si absente
    - fiche : section « Le quartier » (tuiles démographiques, barres de proximité
      0-100, badges chaleur/criminalité, attributions licences ouvertes)
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 9, 2026) · 10 files changed +495
  23. Recherche : enrichissements de quartier à la Centris (26 sources documentées)
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 9, 2026) · 1 file changed +209
  24. Mobile : menu déroulant animé + sélecteur de consentement témoins + page confidentialité
    - Header : hamburger animé (-> X), panneau déroulant avec liens en cascade
      (Logements, Carte, Stats, Sources, Confidentialité), backdrop flouté,
      verrouillage du défilement, fermeture à la navigation
    - CookieConsent : bandeau au premier chargement (aucun témoin tiers — honnête),
      3 choix (tout accepter / essentiels / personnaliser avec cases préférences
      et statistiques), mémorisé en localStorage, ré-ouvrable depuis le pied de
      page et la page confidentialité
    - /confidentialite : politique de confidentialité et de témoins
    - Vue carte synchronisée avec l'URL (?view=carte depuis le menu)
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 9, 2026) · 5 files changed +333 −2
  25. POI : stratégie par tuiles Overpass (11 requêtes pour 1249 immeubles, 4 min)
    L'union d'around() par immeuble était intenable (~13 s/immeuble, throttling).
    On télécharge tous les POI des catégories par tuile de 0,5° (marge 4 km),
    puis calcul local du plus proche par catégorie (préfiltre rectangulaire +
    haversine). Miroir kumi.systems avec rotation vers l'instance officielle.
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 9, 2026) · 1 file changed +107 −38
  26. Commodités de proximité par immeuble (Overpass/OSM) sur chaque fiche
    - louka/poi.py : une requête Overpass par immeuble (13 catégories : épicerie,
      dépanneur, pharmacie, école, garderie, parc, bus, métro, gym, café,
      clinique, hôpital, bibliothèque), plus proche par catégorie avec distance,
      cache permanent par coordonnées arrondies (~11 m), politesse 1 req/s,
      rafraîchissement aux 3 mois
    - run.py poi [n] + intégration à la boucle watch (80 nouveaux immeubles/cycle)
    - /api/listings/{uid} : champ poi[] joint depuis le cache
    - fiche : section « À proximité » (icône, nom réel, distance formatée),
      mention données OpenStreetMap
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 9, 2026) · 8 files changed +277 −3
  27. gitignore : brouillons de correspondance
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 9, 2026) · 1 file changed +1
  28. 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 committed 2 days ago (Aug 9, 2026) · 1,330 files changed +1,616 −1,600
  29. 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 committed 2 days ago (Aug 8, 2026) · 260 files changed +164,397 −3
  30. Géocodage : User-Agent ASCII (le serveur ArcGIS d'Adresses Québec 500 sur les accents)
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 8, 2026) · 1 file changed +3 −1
  31. Géocodage : repli Adresses Québec (MERN) + nettoyage « bureau »/« (Québec) »
    Les rues trop récentes pour OpenStreetMap (Courchevel, L'Amont, Étienne-
    Dallaire — développements neufs de Lévis) sont résolues par le géocodeur
    officiel du gouvernement (ArcGIS findAddressCandidates, seuil de score 75).
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 8, 2026) · 1 file changed +46 −1
  32. Géocodage : requêtes Nominatim structurées (street/city/state) + repli centroïde de rue
    La recherche libre confondait « Québec » ville/province (141 rue Saint-Paul
    -> Repentigny, rejeté par la bbox). Stratégies en cascade : structurée
    civique+rue, libre complète, rue seule. Double civique « 6275 et 6375 » géré.
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 8, 2026) · 1 file changed +36 −10
  33. Mission 4 — géocodage Nominatim + carte interactive MapLibre GL
    Géocodage (louka/geocode.py) :
    - Nominatim 1 req/s, User-Agent identifié, cache SQLite par immeuble
      (adresse normalisée sans n° d'unité) — une adresse n'est géocodée qu'une fois
    - nettoyages QC : préfixe d'unité « 101-2905 », « Montréal - Laval »,
      cardinales abrégées ; repli civique+rue en 2e tentative
    - validation bounding-box (Québec/Lévis resserrée, garde-fou provincial),
      flag geocode_failed, ré-essai des échecs après 30 jours
    - intégré à la boucle watch (nouvelles adresses géocodées à chaque sync)
    - finalize() rejette aussi les coordonnées invalides fournies par les sources
      (annonce de Limoilou qui pointait au Kazakhstan)
    
    Carte (frontend) :
    - /api/listings.geojson : GeoJSON filtré (mêmes filtres que /api/listings)
    - MapView MapLibre GL : chargement paresseux (254 ko gzip hors du bundle
      principal), clustering natif, marqueurs-prix, popup fiche (photo, prix,
      type, dispo, gestionnaire, lien), synchro avec les filtres, fitBounds
    - bascule Liste/Carte : côte à côte sur desktop, plein écran sur mobile
    - tuiles vectorielles OpenFreeMap (positron), style Lou-Ka (encre + lime)
    - worker MapLibre v6 copié par plugin Vite (imports relatifs préservés)
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 8, 2026) · 12 files changed +819 −8
  34. Mission 3 — recensement des gestionnaires manquants (13 candidats, top 10 priorisé)
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 8, 2026) · 1 file changed +130
  35. Rapport d'audit global (68 connecteurs) + badges README à jour
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    simon-pierre boucher committed 2 days ago (Aug 8, 2026) · 2 files changed +77 −3
  36. 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 committed 2 days ago (Aug 8, 2026) · 310 files changed +503,775 −148
  37. 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 committed 2 days ago (Aug 8, 2026) · 389 files changed +570,255 −49
  38. 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 committed 2 days ago (Aug 8, 2026) · 317 files changed +387,286 −137
  39. 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 committed 2 days ago (Aug 8, 2026) · 1,415 files changed +1,405,975 −2,920
  40. 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 committed 2 days ago (Aug 8, 2026) · 240 files changed +330,294 −80